X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpspp-sheet-view.c;h=534409ebb583cbabce8d709bd6590182a7fe9b55;hb=ed25e8236ce220a86c20c51636771ac160a07581;hp=9dbec5916b364507f24069e1fb7bf8b34010775e;hpb=811c669032a18cfff53291a98e5803afdf39db36;p=pspp diff --git a/src/ui/gui/pspp-sheet-view.c b/src/ui/gui/pspp-sheet-view.c index 9dbec5916b..534409ebb5 100644 --- a/src/ui/gui/pspp-sheet-view.c +++ b/src/ui/gui/pspp-sheet-view.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2011, 2012 Free Software Foundation, Inc. + Copyright (C) 2011, 2012, 2013 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -256,7 +256,8 @@ static gboolean pspp_sheet_view_real_move_cursor (PsppSheetView * static gboolean pspp_sheet_view_real_select_all (PsppSheetView *tree_view); static gboolean pspp_sheet_view_real_unselect_all (PsppSheetView *tree_view); static gboolean pspp_sheet_view_real_select_cursor_row (PsppSheetView *tree_view, - gboolean start_editing); + gboolean start_editing, + PsppSheetSelectMode mode); static gboolean pspp_sheet_view_real_toggle_cursor_row (PsppSheetView *tree_view); static void pspp_sheet_view_row_changed (GtkTreeModel *model, GtkTreePath *path, @@ -316,19 +317,27 @@ static gboolean pspp_sheet_view_maybe_begin_dragging_row (PsppSheetView GdkEventMotion *event); static void pspp_sheet_view_focus_to_cursor (PsppSheetView *tree_view); static gboolean pspp_sheet_view_move_cursor_up_down (PsppSheetView *tree_view, - gint count); + gint count, + PsppSheetSelectMode mode); static void pspp_sheet_view_move_cursor_page_up_down (PsppSheetView *tree_view, - gint count); + gint count, + PsppSheetSelectMode mode); static void pspp_sheet_view_move_cursor_left_right (PsppSheetView *tree_view, - gint count); + gint count, + PsppSheetSelectMode mode); +static void pspp_sheet_view_move_cursor_line_start_end (PsppSheetView *tree_view, + gint count, + PsppSheetSelectMode mode); static void pspp_sheet_view_move_cursor_tab (PsppSheetView *tree_view, gint count); static void pspp_sheet_view_move_cursor_start_end (PsppSheetView *tree_view, - gint count); + gint count, + PsppSheetSelectMode mode); static void pspp_sheet_view_real_set_cursor (PsppSheetView *tree_view, GtkTreePath *path, gboolean clear_and_select, - gboolean clamp_node); + gboolean clamp_node, + PsppSheetSelectMode mode); static gboolean pspp_sheet_view_has_special_cell (PsppSheetView *tree_view); static void pspp_sheet_view_stop_rubber_band (PsppSheetView *tree_view); static void update_prelight (PsppSheetView *tree_view, @@ -854,8 +863,8 @@ pspp_sheet_view_class_init (PsppSheetViewClass *class) G_STRUCT_OFFSET (PsppSheetViewClass, select_cursor_row), NULL, NULL, psppire_marshal_BOOLEAN__BOOLEAN, - G_TYPE_BOOLEAN, 1, - G_TYPE_BOOLEAN); + G_TYPE_BOOLEAN, 2, + G_TYPE_BOOLEAN, G_TYPE_INT); tree_view_signals[TOGGLE_CURSOR_ROW] = g_signal_new ("toggle-cursor-row", @@ -895,14 +904,14 @@ pspp_sheet_view_class_init (PsppSheetViewClass *class) GTK_MOVEMENT_DISPLAY_LINES, 1); pspp_sheet_view_add_move_binding (binding_set[i], GDK_Home, 0, TRUE, - GTK_MOVEMENT_BUFFER_ENDS, -1); + GTK_MOVEMENT_DISPLAY_LINE_ENDS, -1); pspp_sheet_view_add_move_binding (binding_set[i], GDK_KP_Home, 0, TRUE, - GTK_MOVEMENT_BUFFER_ENDS, -1); + GTK_MOVEMENT_DISPLAY_LINE_ENDS, -1); pspp_sheet_view_add_move_binding (binding_set[i], GDK_End, 0, TRUE, - GTK_MOVEMENT_BUFFER_ENDS, 1); + GTK_MOVEMENT_DISPLAY_LINE_ENDS, 1); pspp_sheet_view_add_move_binding (binding_set[i], GDK_KP_End, 0, TRUE, - GTK_MOVEMENT_BUFFER_ENDS, 1); + GTK_MOVEMENT_DISPLAY_LINE_ENDS, 1); pspp_sheet_view_add_move_binding (binding_set[i], GDK_Page_Up, 0, TRUE, GTK_MOVEMENT_PAGES, -1); @@ -915,6 +924,14 @@ pspp_sheet_view_class_init (PsppSheetViewClass *class) GTK_MOVEMENT_PAGES, 1); + gtk_binding_entry_add_signal (binding_set[i], GDK_Up, GDK_CONTROL_MASK, "move-cursor", 2, + G_TYPE_ENUM, GTK_MOVEMENT_BUFFER_ENDS, + G_TYPE_INT, -1); + + gtk_binding_entry_add_signal (binding_set[i], GDK_Down, GDK_CONTROL_MASK, "move-cursor", 2, + G_TYPE_ENUM, GTK_MOVEMENT_BUFFER_ENDS, + G_TYPE_INT, 1); + gtk_binding_entry_add_signal (binding_set[i], GDK_Right, 0, "move-cursor", 2, G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS, G_TYPE_INT, 1); @@ -932,21 +949,21 @@ pspp_sheet_view_class_init (PsppSheetViewClass *class) G_TYPE_INT, -1); gtk_binding_entry_add_signal (binding_set[i], GDK_KP_Right, 0, "move-cursor", 2, - G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS, + G_TYPE_ENUM, GTK_MOVEMENT_DISPLAY_LINE_ENDS, G_TYPE_INT, 1); gtk_binding_entry_add_signal (binding_set[i], GDK_KP_Left, 0, "move-cursor", 2, - G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS, + G_TYPE_ENUM, GTK_MOVEMENT_DISPLAY_LINE_ENDS, G_TYPE_INT, -1); gtk_binding_entry_add_signal (binding_set[i], GDK_Right, GDK_CONTROL_MASK, "move-cursor", 2, - G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS, + G_TYPE_ENUM, GTK_MOVEMENT_DISPLAY_LINE_ENDS, G_TYPE_INT, 1); gtk_binding_entry_add_signal (binding_set[i], GDK_Left, GDK_CONTROL_MASK, "move-cursor", 2, - G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS, + G_TYPE_ENUM, GTK_MOVEMENT_DISPLAY_LINE_ENDS, G_TYPE_INT, -1); gtk_binding_entry_add_signal (binding_set[i], GDK_KP_Right, GDK_CONTROL_MASK, @@ -974,20 +991,27 @@ pspp_sheet_view_class_init (PsppSheetViewClass *class) gtk_binding_entry_add_signal (binding_set[0], GDK_backslash, GDK_CONTROL_MASK, "unselect-all", 0); gtk_binding_entry_add_signal (binding_set[0], GDK_space, GDK_SHIFT_MASK, "select-cursor-row", 1, - G_TYPE_BOOLEAN, TRUE); + G_TYPE_BOOLEAN, TRUE, + G_TYPE_INT, PSPP_SHEET_SELECT_MODE_EXTEND); gtk_binding_entry_add_signal (binding_set[0], GDK_KP_Space, GDK_SHIFT_MASK, "select-cursor-row", 1, - G_TYPE_BOOLEAN, TRUE); + G_TYPE_BOOLEAN, TRUE, + G_TYPE_INT, PSPP_SHEET_SELECT_MODE_EXTEND); gtk_binding_entry_add_signal (binding_set[0], GDK_space, 0, "select-cursor-row", 1, - G_TYPE_BOOLEAN, TRUE); + G_TYPE_BOOLEAN, TRUE, + G_TYPE_INT, 0); gtk_binding_entry_add_signal (binding_set[0], GDK_KP_Space, 0, "select-cursor-row", 1, - G_TYPE_BOOLEAN, TRUE); + G_TYPE_BOOLEAN, TRUE, + G_TYPE_INT, 0); gtk_binding_entry_add_signal (binding_set[0], GDK_Return, 0, "select-cursor-row", 1, - G_TYPE_BOOLEAN, TRUE); + G_TYPE_BOOLEAN, TRUE, + G_TYPE_INT, 0); gtk_binding_entry_add_signal (binding_set[0], GDK_ISO_Enter, 0, "select-cursor-row", 1, - G_TYPE_BOOLEAN, TRUE); + G_TYPE_BOOLEAN, TRUE, + G_TYPE_INT, 0); gtk_binding_entry_add_signal (binding_set[0], GDK_KP_Enter, 0, "select-cursor-row", 1, - G_TYPE_BOOLEAN, TRUE); + G_TYPE_BOOLEAN, TRUE, + G_TYPE_INT, 0); gtk_binding_entry_add_signal (binding_set[0], GDK_BackSpace, 0, "select-cursor-parent", 0); gtk_binding_entry_add_signal (binding_set[0], GDK_BackSpace, GDK_CONTROL_MASK, "select-cursor-parent", 0); @@ -2360,10 +2384,12 @@ pspp_sheet_view_button_press (GtkWidget *widget, */ if (event->type == GDK_BUTTON_PRESS) { + PsppSheetSelectionMode mode = 0; + if ((event->state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK) - tree_view->priv->ctrl_pressed = TRUE; + mode |= PSPP_SHEET_SELECT_MODE_TOGGLE; if ((event->state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK) - tree_view->priv->shift_pressed = TRUE; + mode |= PSPP_SHEET_SELECT_MODE_EXTEND; focus_cell = _pspp_sheet_view_column_get_cell_at_pos (column, event->x - background_area.x); if (focus_cell) @@ -2371,17 +2397,17 @@ pspp_sheet_view_button_press (GtkWidget *widget, if (event->state & GDK_CONTROL_MASK) { - pspp_sheet_view_real_set_cursor (tree_view, path, FALSE, TRUE); + pspp_sheet_view_real_set_cursor (tree_view, path, FALSE, TRUE, mode); pspp_sheet_view_real_toggle_cursor_row (tree_view); } else if (event->state & GDK_SHIFT_MASK) { - pspp_sheet_view_real_set_cursor (tree_view, path, TRUE, TRUE); - pspp_sheet_view_real_select_cursor_row (tree_view, FALSE); + pspp_sheet_view_real_set_cursor (tree_view, path, TRUE, TRUE, mode); + pspp_sheet_view_real_select_cursor_row (tree_view, FALSE, mode); } else { - pspp_sheet_view_real_set_cursor (tree_view, path, TRUE, TRUE); + pspp_sheet_view_real_set_cursor (tree_view, path, TRUE, TRUE, 0); } if (tree_view->priv->anchor_column == NULL || @@ -2391,9 +2417,6 @@ pspp_sheet_view_button_press (GtkWidget *widget, pspp_sheet_selection_select_column_range (tree_view->priv->selection, tree_view->priv->anchor_column, column); - - tree_view->priv->ctrl_pressed = FALSE; - tree_view->priv->shift_pressed = FALSE; } /* the treeview may have been scrolled because of _set_cursor, @@ -2683,7 +2706,7 @@ pspp_sheet_view_button_release_edit (PsppSheetView *tree_view, return FALSE; pspp_sheet_view_real_set_cursor (tree_view, path, - TRUE, TRUE); + TRUE, TRUE, 0); /* XXX mode? */ gtk_widget_queue_draw (GTK_WIDGET (tree_view)); area = cell_area; @@ -2801,7 +2824,7 @@ prelight_or_select (PsppSheetView *tree_view, if (pspp_sheet_view_node_is_selected (tree_view, node)) { PSPP_SHEET_VIEW_UNSET_FLAG (tree_view, PSPP_SHEET_VIEW_DRAW_KEYFOCUS); - pspp_sheet_view_real_set_cursor (tree_view, path, FALSE, FALSE); + pspp_sheet_view_real_set_cursor (tree_view, path, FALSE, FALSE, 0); /* XXX mode? */ } gtk_tree_path_free (path); } @@ -3293,7 +3316,7 @@ pspp_sheet_view_stop_rubber_band (PsppSheetView *tree_view) /* ... and the cursor to the end path */ tmp_path = _pspp_sheet_view_find_path (tree_view, tree_view->priv->rubber_band_end_node); - pspp_sheet_view_real_set_cursor (PSPP_SHEET_VIEW (tree_view), tmp_path, FALSE, FALSE); + pspp_sheet_view_real_set_cursor (PSPP_SHEET_VIEW (tree_view), tmp_path, FALSE, FALSE, 0); /* XXX mode? */ gtk_tree_path_free (tmp_path); _pspp_sheet_selection_emit_changed (tree_view->priv->selection); @@ -6712,13 +6735,16 @@ pspp_sheet_view_header_focus (PsppSheetView *tree_view, break; } column = tmp_list->data; - if (column->button && - column->visible && + if (column->visible && pspp_sheet_view_column_can_focus (column)) - { - pspp_sheet_view_focus_column (tree_view, column, - clamp_column_visible); - return TRUE; + { + pspp_sheet_view_column_set_need_button (column, TRUE); + if (column->button) + { + pspp_sheet_view_focus_column (tree_view, column, + clamp_column_visible); + return TRUE; + } } } return FALSE; @@ -6957,6 +6983,7 @@ pspp_sheet_view_real_move_cursor (PsppSheetView *tree_view, GtkMovementStep step, gint count) { + PsppSheetSelectMode mode; GdkModifierType state; g_return_val_if_fail (PSPP_IS_SHEET_VIEW (tree_view), FALSE); @@ -6964,7 +6991,8 @@ pspp_sheet_view_real_move_cursor (PsppSheetView *tree_view, step == GTK_MOVEMENT_VISUAL_POSITIONS || step == GTK_MOVEMENT_DISPLAY_LINES || step == GTK_MOVEMENT_PAGES || - step == GTK_MOVEMENT_BUFFER_ENDS, FALSE); + step == GTK_MOVEMENT_BUFFER_ENDS || + step == GTK_MOVEMENT_DISPLAY_LINE_ENDS, FALSE); if (tree_view->priv->row_count == 0) return FALSE; @@ -6975,12 +7003,13 @@ pspp_sheet_view_real_move_cursor (PsppSheetView *tree_view, PSPP_SHEET_VIEW_SET_FLAG (tree_view, PSPP_SHEET_VIEW_DRAW_KEYFOCUS); gtk_widget_grab_focus (GTK_WIDGET (tree_view)); + mode = 0; if (gtk_get_current_event_state (&state)) { if ((state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK) - tree_view->priv->ctrl_pressed = TRUE; + mode |= PSPP_SHEET_SELECT_MODE_TOGGLE; if ((state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK) - tree_view->priv->shift_pressed = TRUE; + mode |= PSPP_SHEET_SELECT_MODE_EXTEND; } /* else we assume not pressed */ @@ -6990,24 +7019,24 @@ pspp_sheet_view_real_move_cursor (PsppSheetView *tree_view, pspp_sheet_view_move_cursor_tab (tree_view, count); break; case GTK_MOVEMENT_VISUAL_POSITIONS: - pspp_sheet_view_move_cursor_left_right (tree_view, count); + pspp_sheet_view_move_cursor_left_right (tree_view, count, mode); break; case GTK_MOVEMENT_DISPLAY_LINES: - pspp_sheet_view_move_cursor_up_down (tree_view, count); + pspp_sheet_view_move_cursor_up_down (tree_view, count, mode); break; case GTK_MOVEMENT_PAGES: - pspp_sheet_view_move_cursor_page_up_down (tree_view, count); + pspp_sheet_view_move_cursor_page_up_down (tree_view, count, mode); break; case GTK_MOVEMENT_BUFFER_ENDS: - pspp_sheet_view_move_cursor_start_end (tree_view, count); + pspp_sheet_view_move_cursor_start_end (tree_view, count, mode); + break; + case GTK_MOVEMENT_DISPLAY_LINE_ENDS: + pspp_sheet_view_move_cursor_line_start_end (tree_view, count, mode); break; default: g_assert_not_reached (); } - tree_view->priv->ctrl_pressed = FALSE; - tree_view->priv->shift_pressed = FALSE; - return TRUE; } @@ -7773,9 +7802,9 @@ pspp_sheet_view_focus_to_cursor (PsppSheetView *tree_view) { if (tree_view->priv->selection->type == PSPP_SHEET_SELECTION_MULTIPLE || tree_view->priv->selection->type == PSPP_SHEET_SELECTION_RECTANGLE) - pspp_sheet_view_real_set_cursor (tree_view, cursor_path, FALSE, FALSE); + pspp_sheet_view_real_set_cursor (tree_view, cursor_path, FALSE, FALSE, 0); else - pspp_sheet_view_real_set_cursor (tree_view, cursor_path, TRUE, FALSE); + pspp_sheet_view_real_set_cursor (tree_view, cursor_path, TRUE, FALSE, 0); } } @@ -7807,7 +7836,8 @@ pspp_sheet_view_focus_to_cursor (PsppSheetView *tree_view) static gboolean pspp_sheet_view_move_cursor_up_down (PsppSheetView *tree_view, - gint count) + gint count, + PsppSheetSelectMode mode) { gint selection_count; int cursor_node = -1; @@ -7834,7 +7864,7 @@ pspp_sheet_view_move_cursor_up_down (PsppSheetView *tree_view, if (selection_count == 0 && tree_view->priv->selection->type != PSPP_SHEET_SELECTION_NONE - && !tree_view->priv->ctrl_pressed) + && !(mode & PSPP_SHEET_SELECT_MODE_TOGGLE)) { /* Don't move the cursor, but just select the current node */ new_cursor_node = cursor_node; @@ -7888,14 +7918,14 @@ pspp_sheet_view_move_cursor_up_down (PsppSheetView *tree_view, if (new_cursor_node >= 0) { cursor_path = _pspp_sheet_view_find_path (tree_view, new_cursor_node); - pspp_sheet_view_real_set_cursor (tree_view, cursor_path, TRUE, TRUE); + pspp_sheet_view_real_set_cursor (tree_view, cursor_path, TRUE, TRUE, mode); gtk_tree_path_free (cursor_path); } else { pspp_sheet_view_clamp_node_visible (tree_view, cursor_node); - if (!tree_view->priv->shift_pressed) + if (!(mode & PSPP_SHEET_SELECT_MODE_EXTEND)) { if (! gtk_widget_keynav_failed (GTK_WIDGET (tree_view), count < 0 ? @@ -7926,7 +7956,8 @@ pspp_sheet_view_move_cursor_up_down (PsppSheetView *tree_view, static void pspp_sheet_view_move_cursor_page_up_down (PsppSheetView *tree_view, - gint count) + gint count, + PsppSheetSelectMode mode) { int cursor_node = -1; GtkTreePath *old_cursor_path = NULL; @@ -8000,7 +8031,7 @@ pspp_sheet_view_move_cursor_page_up_down (PsppSheetView *tree_view, /* update y */ y = pspp_sheet_view_node_find_offset (tree_view, cursor_node); - pspp_sheet_view_real_set_cursor (tree_view, cursor_path, TRUE, FALSE); + pspp_sheet_view_real_set_cursor (tree_view, cursor_path, TRUE, FALSE, mode); y -= window_y; pspp_sheet_view_scroll_to_point (tree_view, -1, y); @@ -8019,7 +8050,8 @@ cleanup: static void pspp_sheet_view_move_cursor_left_right (PsppSheetView *tree_view, - gint count) + gint count, + PsppSheetSelectMode mode) { int cursor_node = -1; GtkTreePath *cursor_path = NULL; @@ -8110,6 +8142,96 @@ pspp_sheet_view_move_cursor_left_right (PsppSheetView *tree_view, tree_view->priv->focus_column, TRUE); } +static void +pspp_sheet_view_move_cursor_line_start_end (PsppSheetView *tree_view, + gint count, + PsppSheetSelectMode mode) +{ + int cursor_node = -1; + GtkTreePath *cursor_path = NULL; + PsppSheetViewColumn *column; + PsppSheetViewColumn *found_column; + GtkTreeIter iter; + GList *list; + gboolean rtl; + + rtl = (gtk_widget_get_direction (GTK_WIDGET (tree_view)) == GTK_TEXT_DIR_RTL); + + if (!gtk_widget_has_focus (GTK_WIDGET (tree_view))) + return; + + if (gtk_tree_row_reference_valid (tree_view->priv->cursor)) + cursor_path = gtk_tree_row_reference_get_path (tree_view->priv->cursor); + else + return; + + _pspp_sheet_view_find_node (tree_view, cursor_path, &cursor_node); + if (cursor_node < 0) + return; + if (gtk_tree_model_get_iter (tree_view->priv->model, &iter, cursor_path) == FALSE) + { + gtk_tree_path_free (cursor_path); + return; + } + gtk_tree_path_free (cursor_path); + + list = rtl ? g_list_last (tree_view->priv->columns) : g_list_first (tree_view->priv->columns); + if (tree_view->priv->focus_column) + { + for (; list; list = (rtl ? list->prev : list->next)) + { + if (list->data == tree_view->priv->focus_column) + break; + } + } + + found_column = NULL; + while (list) + { + gboolean left, right; + + column = list->data; + if (column->visible == FALSE || column->row_head) + goto loop_end; + + pspp_sheet_view_column_cell_set_cell_data (column, + tree_view->priv->model, + &iter); + + if (rtl) + { + right = list->prev ? TRUE : FALSE; + left = list->next ? TRUE : FALSE; + } + else + { + left = list->prev ? TRUE : FALSE; + right = list->next ? TRUE : FALSE; + } + + if (column->tabbable + && _pspp_sheet_view_column_cell_focus (column, count, left, right)) + found_column = column; + + loop_end: + if (count == 1) + list = rtl ? list->prev : list->next; + else + list = rtl ? list->next : list->prev; + } + + if (found_column) + { + tree_view->priv->focus_column = found_column; + _pspp_sheet_view_queue_draw_node (tree_view, cursor_node, NULL); + g_signal_emit (tree_view, tree_view_signals[CURSOR_CHANGED], 0); + gtk_widget_grab_focus (GTK_WIDGET (tree_view)); + } + + pspp_sheet_view_clamp_column_visible (tree_view, + tree_view->priv->focus_column, TRUE); +} + static gboolean try_move_cursor_tab (PsppSheetView *tree_view, gboolean start_at_focus_column, @@ -8210,12 +8332,7 @@ pspp_sheet_view_move_cursor_tab (PsppSheetView *tree_view, if (!try_move_cursor_tab (tree_view, TRUE, count)) { - /* Shift+Tab goes backward, but Shift isn't supposed to act as Shift does - for other movement commands, that is, it shouldn't cause the selection - to be extended, so we need to act as though it is off. */ - tree_view->priv->shift_pressed = FALSE; - - if (pspp_sheet_view_move_cursor_up_down (tree_view, count) + if (pspp_sheet_view_move_cursor_up_down (tree_view, count, 0) && !try_move_cursor_tab (tree_view, FALSE, count)) gtk_widget_error_bell (GTK_WIDGET (tree_view)); } @@ -8226,7 +8343,8 @@ pspp_sheet_view_move_cursor_tab (PsppSheetView *tree_view, static void pspp_sheet_view_move_cursor_start_end (PsppSheetView *tree_view, - gint count) + gint count, + PsppSheetSelectMode mode) { int cursor_node; GtkTreePath *path; @@ -8259,7 +8377,7 @@ pspp_sheet_view_move_cursor_start_end (PsppSheetView *tree_view, if (gtk_tree_path_compare (old_path, path)) { - pspp_sheet_view_real_set_cursor (tree_view, path, TRUE, TRUE); + pspp_sheet_view_real_set_cursor (tree_view, path, TRUE, TRUE, mode); gtk_widget_grab_focus (GTK_WIDGET (tree_view)); } else @@ -8304,12 +8422,12 @@ pspp_sheet_view_real_unselect_all (PsppSheetView *tree_view) static gboolean pspp_sheet_view_real_select_cursor_row (PsppSheetView *tree_view, - gboolean start_editing) + gboolean start_editing, + PsppSheetSelectMode mode) { int new_node = -1; int cursor_node = -1; GtkTreePath *cursor_path = NULL; - GtkTreeSelectMode mode = 0; if (!gtk_widget_has_focus (GTK_WIDGET (tree_view))) return FALSE; @@ -8329,7 +8447,7 @@ pspp_sheet_view_real_select_cursor_row (PsppSheetView *tree_view, return FALSE; } - if (!tree_view->priv->shift_pressed && start_editing && + if (!(mode & PSPP_SHEET_SELECT_MODE_EXTEND) && start_editing && tree_view->priv->focus_column) { if (pspp_sheet_view_start_editing (tree_view, cursor_path)) @@ -8339,11 +8457,6 @@ pspp_sheet_view_real_select_cursor_row (PsppSheetView *tree_view, } } - if (tree_view->priv->ctrl_pressed) - mode |= GTK_TREE_SELECT_MODE_TOGGLE; - if (tree_view->priv->shift_pressed) - mode |= GTK_TREE_SELECT_MODE_EXTEND; - _pspp_sheet_selection_internal_select_node (tree_view->priv->selection, cursor_node, cursor_path, @@ -8364,7 +8477,7 @@ pspp_sheet_view_real_select_cursor_row (PsppSheetView *tree_view, gtk_widget_grab_focus (GTK_WIDGET (tree_view)); _pspp_sheet_view_queue_draw_node (tree_view, cursor_node, NULL); - if (!tree_view->priv->shift_pressed) + if (!(mode & PSPP_SHEET_SELECT_MODE_EXTEND)) pspp_sheet_view_row_activated (tree_view, cursor_path, tree_view->priv->focus_column); @@ -8400,7 +8513,7 @@ pspp_sheet_view_real_toggle_cursor_row (PsppSheetView *tree_view) _pspp_sheet_selection_internal_select_node (tree_view->priv->selection, cursor_node, cursor_path, - GTK_TREE_SELECT_MODE_TOGGLE, + PSPP_SHEET_SELECT_MODE_TOGGLE, FALSE); /* We bail out if the original (tree, node) don't exist anymore after @@ -9902,7 +10015,8 @@ static void pspp_sheet_view_real_set_cursor (PsppSheetView *tree_view, GtkTreePath *path, gboolean clear_and_select, - gboolean clamp_node) + gboolean clamp_node, + PsppSheetSelectMode mode) { int node = -1; @@ -9927,19 +10041,10 @@ pspp_sheet_view_real_set_cursor (PsppSheetView *tree_view, { int new_node = -1; - if (clear_and_select && !tree_view->priv->ctrl_pressed) - { - GtkTreeSelectMode mode = 0; - - if (tree_view->priv->ctrl_pressed) - mode |= GTK_TREE_SELECT_MODE_TOGGLE; - if (tree_view->priv->shift_pressed) - mode |= GTK_TREE_SELECT_MODE_EXTEND; - - _pspp_sheet_selection_internal_select_node (tree_view->priv->selection, + if (clear_and_select && !(mode & PSPP_SHEET_SELECT_MODE_TOGGLE)) + _pspp_sheet_selection_internal_select_node (tree_view->priv->selection, node, path, mode, FALSE); - } /* We have to re-find tree and node here again, somebody might have * cleared the node or the whole tree in the PsppSheetSelection::changed @@ -10073,7 +10178,7 @@ pspp_sheet_view_set_cursor_on_cell (PsppSheetView *tree_view, tree_view->priv->edited_column->editable_widget) pspp_sheet_view_stop_editing (tree_view, TRUE); - pspp_sheet_view_real_set_cursor (tree_view, path, TRUE, TRUE); + pspp_sheet_view_real_set_cursor (tree_view, path, TRUE, TRUE, 0); if (focus_column && focus_column->visible) { @@ -11993,7 +12098,7 @@ pspp_sheet_view_search_iter (GtkTreeModel *model, pspp_sheet_view_scroll_to_cell (tree_view, path, NULL, TRUE, 0.5, 0.0); pspp_sheet_selection_select_iter (selection, iter); - pspp_sheet_view_real_set_cursor (tree_view, path, FALSE, TRUE); + pspp_sheet_view_real_set_cursor (tree_view, path, FALSE, TRUE, 0); if (path) gtk_tree_path_free (path); @@ -12254,7 +12359,6 @@ pspp_sheet_view_event (GtkWidget *widget, gboolean handled; gboolean cancel; guint keyval; - guint state; gint row; /* Intercept only key press events. @@ -12265,53 +12369,84 @@ pspp_sheet_view_event (GtkWidget *widget, if (event->type != GDK_KEY_PRESS) return FALSE; - if (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK | GDK_MOD1_MASK)) - { - /* Pass through most keys that include modifiers. */ - if ((event->keyval == GDK_Tab || event->keyval == GDK_ISO_Left_Tab) - && !(event->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK))) - { - /* Special case for Shift-Tab. */ - } - else - return FALSE; - } - keyval = event->keyval; - state = event->state & ~(GDK_CONTROL_MASK | GDK_SHIFT_MASK | GDK_MOD1_MASK); cancel = FALSE; - switch (event->keyval) + switch (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK | GDK_MOD1_MASK)) { - case GDK_Left: case GDK_KP_Left: - if (!is_all_selected (widget) && !is_at_left (widget)) - return FALSE; + case 0: + switch (event->keyval) + { + case GDK_Left: case GDK_KP_Left: + case GDK_Home: case GDK_KP_Home: + if (!is_all_selected (widget) && !is_at_left (widget)) + return FALSE; + break; + + case GDK_Right: case GDK_KP_Right: + case GDK_End: case GDK_KP_End: + if (!is_all_selected (widget) && !is_at_right (widget)) + return FALSE; + break; + + case GDK_Up: case GDK_KP_Up: + case GDK_Down: case GDK_KP_Down: + break; + + case GDK_Page_Up: case GDK_KP_Page_Up: + case GDK_Page_Down: case GDK_KP_Page_Down: + break; + + case GDK_Escape: + cancel = TRUE; + break; + + case GDK_Return: + keyval = GDK_Down; + break; + + case GDK_Tab: case GDK_KP_Tab: + case GDK_ISO_Left_Tab: + keyval = GDK_Tab; + break; + + default: + return FALSE; + } break; - case GDK_Right: case GDK_KP_Right: - if (!is_all_selected (widget) && !is_at_right (widget)) - return FALSE; - break; + case GDK_SHIFT_MASK: + switch (event->keyval) + { + case GDK_Tab: + case GDK_ISO_Left_Tab: + keyval = GDK_Tab; + break; - case GDK_Up: case GDK_KP_Up: - case GDK_Down: case GDK_KP_Down: + default: + return FALSE; + } break; - case GDK_Page_Up: case GDK_KP_Page_Up: - case GDK_Page_Down: case GDK_KP_Page_Down: - break; + case GDK_CONTROL_MASK: + switch (event->keyval) + { + case GDK_Left: case GDK_KP_Left: + if (!is_all_selected (widget) && !is_at_left (widget)) + return FALSE; + break; - case GDK_Escape: - cancel = TRUE; - break; + case GDK_Right: case GDK_KP_Right: + if (!is_all_selected (widget) && !is_at_right (widget)) + return FALSE; + break; - case GDK_Return: - keyval = GDK_Down; - break; + case GDK_Up: case GDK_KP_Up: + case GDK_Down: case GDK_KP_Down: + break; - case GDK_Tab: case GDK_KP_Tab: - case GDK_ISO_Left_Tab: - keyval = GDK_Tab; - state |= event->state & GDK_SHIFT_MASK; + default: + return FALSE; + } break; default: @@ -12328,7 +12463,7 @@ pspp_sheet_view_event (GtkWidget *widget, pspp_sheet_view_set_cursor (tree_view, path, column, FALSE); gtk_tree_path_free (path); - handled = gtk_binding_set_activate (edit_bindings, keyval, state, + handled = gtk_binding_set_activate (edit_bindings, keyval, event->state, GTK_OBJECT (tree_view)); if (handled) g_signal_stop_emission_by_name (widget, "event"); @@ -12377,7 +12512,7 @@ pspp_sheet_view_real_start_editing (PsppSheetView *tree_view, row = gtk_tree_path_get_indices (path)[0]; tree_view->priv->edited_row = row; - pspp_sheet_view_real_set_cursor (tree_view, path, FALSE, TRUE); + pspp_sheet_view_real_set_cursor (tree_view, path, FALSE, TRUE, 0); cell_area->y += pre_val - (int)tree_view->priv->vadjustment->value; pspp_sheet_selection_unselect_all_columns (tree_view->priv->selection);