/*
- Copyright (C) 2006, 2008, 2009 Free Software Foundation
+ Copyright (C) 2006, 2008, 2009, 2011, 2012 Free Software Foundation
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
static void psppire_sheet_class_init (PsppireSheetClass *klass);
static void psppire_sheet_init (PsppireSheet *sheet);
static void psppire_sheet_dispose (GObject *object);
-static void psppire_sheet_finalize (GObject *object);
static void psppire_sheet_style_set (GtkWidget *widget,
GtkStyle *previous_style);
static void psppire_sheet_realize (GtkWidget *widget);
static void size_allocate_global_button (PsppireSheet *sheet);
-static void psppire_sheet_button_size_request (PsppireSheet *sheet,
- const PsppireSheetButton *button,
- GtkRequisition *requisition);
static void psppire_sheet_real_cell_clear (PsppireSheet *sheet,
gint row,
container_class->set_focus_child = NULL;
object_class->dispose = psppire_sheet_dispose;
- object_class->finalize = psppire_sheet_finalize;
cell_padding_spec =
g_param_spec_boxed ("cell-padding",
return TRUE;
}
-static void
-psppire_sheet_finalize (GObject *object)
-{
- PsppireSheet *sheet;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (PSPPIRE_IS_SHEET (object));
-
- sheet = PSPPIRE_SHEET (object);
-
- if (G_OBJECT_CLASS (parent_class)->finalize)
- (*G_OBJECT_CLASS (parent_class)->finalize) (object);
-}
-
static void
psppire_sheet_dispose (GObject *object)
{
void
psppire_sheet_unselect_range (PsppireSheet *sheet)
{
- GdkRectangle area;
sheet->select_status = PSPPIRE_SHEET_NORMAL;
- rectangle_from_range (sheet, &sheet->range, &area);
- area.x++;
- area.y++;
- gdk_window_invalidate_rect (sheet->sheet_window, &area, FALSE);
+ if (sheet->sheet_window != NULL)
+ {
+ GdkRectangle area;
+
+ rectangle_from_range (sheet, &sheet->range, &area);
+ area.x++;
+ area.y++;
+ gdk_window_invalidate_rect (sheet->sheet_window, &area, FALSE);
+ }
g_signal_emit (sheet, sheet_signals [SELECT_COLUMN], 0, -1);
g_signal_emit (sheet, sheet_signals [SELECT_ROW], 0, -1);
}
+/* Move to row 0 keeping the current column */
+static void
+row0 (PsppireSheet *sheet)
+{
+ gtk_adjustment_set_value (sheet->vadjustment,
+ sheet->vadjustment->lower);
+
+ change_active_cell (sheet, 0, sheet->active_cell.col);
+}
+
+/* Move to column 0 keeping the current row */
+static void
+col0 (PsppireSheet *sheet)
+{
+ gtk_adjustment_set_value (sheet->hadjustment,
+ sheet->hadjustment->lower);
+
+ change_active_cell (sheet, sheet->active_cell.row, 0);
+}
+
+/* Move to last column keeping the current row */
+static void
+col_last (PsppireSheet *sheet)
+{
+ glong last_col = psppire_axis_unit_count (sheet->haxis) - 1;
+
+ gtk_adjustment_set_value (sheet->hadjustment,
+ sheet->hadjustment->upper - sheet->hadjustment->page_size);
+
+ change_active_cell (sheet, sheet->active_cell.row,
+ last_col);
+}
+
+
+/* Move to last row keeping the current column */
+static void
+row_last (PsppireSheet *sheet)
+{
+ glong last_row = psppire_axis_unit_count (sheet->vaxis) - 1;
+
+ gtk_adjustment_set_value (sheet->vadjustment,
+ sheet->vadjustment->upper- sheet->vadjustment->page_size);
+
+ change_active_cell (sheet,
+ last_row,
+ sheet->active_cell.col);
+}
+
+
+
static gboolean
psppire_sheet_key_press (GtkWidget *widget,
GdkEventKey *key)
case GDK_Tab:
step_sheet (sheet, GTK_SCROLL_STEP_FORWARD);
break;
+
case GDK_Right:
- step_sheet (sheet, GTK_SCROLL_STEP_RIGHT);
+ if (key->state & GDK_CONTROL_MASK)
+ col_last (sheet);
+ else
+ step_sheet (sheet, GTK_SCROLL_STEP_RIGHT);
break;
+
case GDK_ISO_Left_Tab:
step_sheet (sheet, GTK_SCROLL_STEP_BACKWARD);
break;
+
case GDK_Left:
- step_sheet (sheet, GTK_SCROLL_STEP_LEFT);
+ if (key->state & GDK_CONTROL_MASK)
+ col0 (sheet);
+ else
+ step_sheet (sheet, GTK_SCROLL_STEP_LEFT);
break;
+
case GDK_Return:
- case GDK_Down:
step_sheet (sheet, GTK_SCROLL_STEP_DOWN);
break;
+
+ case GDK_Down:
+ if (key->state & GDK_CONTROL_MASK)
+ row_last (sheet);
+ else
+ step_sheet (sheet, GTK_SCROLL_STEP_DOWN);
+ break;
+
case GDK_Up:
- step_sheet (sheet, GTK_SCROLL_STEP_UP);
+ if (key->state & GDK_CONTROL_MASK)
+ row0 (sheet);
+ else
+ step_sheet (sheet, GTK_SCROLL_STEP_UP);
break;
case GDK_Page_Down:
break;
case GDK_Home:
- gtk_adjustment_set_value (sheet->vadjustment,
- sheet->vadjustment->lower);
-
- change_active_cell (sheet, 0,
- sheet->active_cell.col);
-
+ col0 (sheet);
break;
case GDK_End:
- gtk_adjustment_set_value (sheet->vadjustment,
- sheet->vadjustment->upper -
- sheet->vadjustment->page_size -
- sheet->vadjustment->page_increment);
-
- /*
- change_active_cellx (sheet,
- psppire_axis_unit_count (sheet->vaxis) - 1,
- sheet->active_cell.col);
- */
+ col_last (sheet);
break;
+
case GDK_Delete:
psppire_sheet_real_cell_clear (sheet, sheet->active_cell.row, sheet->active_cell.col);
break;
+
default:
return FALSE;
break;
GdkRectangle allocation)
{
GtkShadowType shadow_type;
- gint text_width = 0, text_height = 0;
+ gint text_width = 0;
PangoAlignment align = PANGO_ALIGN_LEFT;
gboolean rtl ;
if (button->label_visible)
{
- text_height = DEFAULT_ROW_HEIGHT -
- 2 * COLUMN_TITLES_HEIGHT;
-
gdk_gc_set_clip_rectangle (GTK_WIDGET (sheet)->style->fg_gc[button->state],
&allocation);
gdk_gc_set_clip_rectangle (GTK_WIDGET (sheet)->style->white_gc,
return TRUE;
}
-static void
-psppire_sheet_button_size_request (PsppireSheet *sheet,
- const PsppireSheetButton *button,
- GtkRequisition *button_requisition)
-{
- GtkRequisition requisition;
- GtkRequisition label_requisition;
-
- label_requisition.height = DEFAULT_ROW_HEIGHT;
- label_requisition.width = COLUMN_MIN_WIDTH;
-
- requisition.height = DEFAULT_ROW_HEIGHT;
- requisition.width = COLUMN_MIN_WIDTH;
-
-
- *button_requisition = requisition;
- button_requisition->width = MAX (requisition.width, label_requisition.width);
- button_requisition->height = MAX (requisition.height, label_requisition.height);
-
-}
-
static void
psppire_sheet_forall (GtkContainer *container,
gboolean include_internals,