static gint move_selection (ESelectionModel *selection, gboolean up, GdkModifierType state) { int row = e_selection_model_cursor_row(selection); int col = e_selection_model_cursor_col(selection); int row_count; /* there is no selected row when row is -1 */ if (row != -1) row = e_sorter_model_to_sorted (selection->sorter, row); if (up) row--; else row++; if (row < 0) row = 0; row_count = e_selection_model_row_count(selection); if (row >= row_count) row = row_count - 1; row = e_sorter_sorted_to_model(selection->sorter, row); e_selection_model_select_as_key_press (selection, row, col, state); return TRUE; }
/** * e_selection_model_do_something * @selection: #ESelectionModel to do something to. * @row: The row to do something in. * @col: The col to do something in. * @state: The state in which to do something. * * This routine does whatever is appropriate as if the user clicked * the mouse in the given row and column. */ void e_selection_model_do_something (ESelectionModel *selection, guint row, guint col, GdkModifierType state) { gint shift_p = state & GDK_SHIFT_MASK; gint ctrl_p = state & GDK_CONTROL_MASK; int row_count; selection->old_selection = -1; if (row == -1 && col != -1) row = 0; if (col == -1 && row != -1) col = 0; row_count = e_selection_model_row_count(selection); if (row_count >= 0 && row < row_count) { switch (selection->mode) { case GTK_SELECTION_SINGLE: e_selection_model_select_single_row (selection, row); break; case GTK_SELECTION_BROWSE: case GTK_SELECTION_MULTIPLE: if (shift_p) { e_selection_model_set_selection_end (selection, row); } else { if (ctrl_p) { e_selection_model_toggle_single_row (selection, row); } else { e_selection_model_select_single_row (selection, row); } } break; default: g_return_if_reached(); break; } e_selection_model_change_cursor(selection, row, col); g_signal_emit(selection, e_selection_model_signals[CURSOR_CHANGED], 0, row, col); g_signal_emit(selection, e_selection_model_signals[CURSOR_ACTIVATED], 0, row, col); } }
static gboolean tree_selection_model_is_row_selected (ESelectionModel *selection, gint row) { ETreeSelectionModel *etsm = E_TREE_SELECTION_MODEL (selection); ETreePath path; g_return_val_if_fail ( row < e_selection_model_row_count (selection), FALSE); g_return_val_if_fail (row >= 0, FALSE); g_return_val_if_fail (etsm != NULL, FALSE); path = e_tree_table_adapter_node_at_row (etsm->priv->etta, row); if (path == NULL) return FALSE; return g_hash_table_contains (etsm->priv->paths, path); }
/** * e_selection_model_key_press * @selection: #ESelectionModel to affect. * @key: The event. * * This routine does whatever is appropriate as if the user pressed * the given key. * * Returns: %TRUE if the #ESelectionModel used the key. */ gint e_selection_model_key_press (ESelectionModel *selection, GdkEventKey *key) { selection->old_selection = -1; switch (key->keyval) { case GDK_Up: case GDK_KP_Up: return move_selection(selection, TRUE, key->state); case GDK_Down: case GDK_KP_Down: return move_selection(selection, FALSE, key->state); case GDK_space: case GDK_KP_Space: if (selection->mode != GTK_SELECTION_SINGLE) { int row = e_selection_model_cursor_row(selection); int col = e_selection_model_cursor_col(selection); if (row == -1) break; e_selection_model_toggle_single_row (selection, row); g_signal_emit(selection, e_selection_model_signals[CURSOR_ACTIVATED], 0, row, col); return TRUE; } break; case GDK_Return: case GDK_KP_Enter: if (selection->mode != GTK_SELECTION_SINGLE) { int row = e_selection_model_cursor_row(selection); int col = e_selection_model_cursor_col(selection); e_selection_model_select_single_row (selection, row); g_signal_emit(selection, e_selection_model_signals[CURSOR_ACTIVATED], 0, row, col); return TRUE; } break; case GDK_Home: case GDK_KP_Home: if (selection->cursor_mode == E_CURSOR_LINE) { int row = 0; int cursor_col = e_selection_model_cursor_col(selection); row = e_sorter_sorted_to_model(selection->sorter, row); e_selection_model_select_as_key_press (selection, row, cursor_col, key->state); return TRUE; } break; case GDK_End: case GDK_KP_End: if (selection->cursor_mode == E_CURSOR_LINE) { int row = e_selection_model_row_count(selection) - 1; int cursor_col = e_selection_model_cursor_col(selection); row = e_sorter_sorted_to_model(selection->sorter, row); e_selection_model_select_as_key_press (selection, row, cursor_col, key->state); return TRUE; } break; } return FALSE; }