X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fgtk-contrib%2Fpsppire-sheet.c;h=19406edc9c9418d344a343e232a64cb42c61299b;hb=9d9870db0d89e8f7f72de8ff5c9d37c8d9eb15c2;hp=e09022bb3d4adbc352b03faea8d514263e6bec95;hpb=db0ab43d34135721e7e82ba62d413681e462f801;p=pspp diff --git a/lib/gtk-contrib/psppire-sheet.c b/lib/gtk-contrib/psppire-sheet.c index e09022bb3d..19406edc9c 100644 --- a/lib/gtk-contrib/psppire-sheet.c +++ b/lib/gtk-contrib/psppire-sheet.c @@ -1,5 +1,5 @@ /* - 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 @@ -54,8 +54,6 @@ #include #include -#include -#include #include #include #include @@ -72,8 +70,6 @@ #include #include -#include - /* sheet flags */ enum { @@ -85,9 +81,7 @@ enum of making a selection - ie while the mouse button is depressed. */ - PSPPIRE_SHEET_IN_SELECTION = 1 << 4, - - PSPPIRE_SHEET_IN_RESIZE = 1 << 5 + PSPPIRE_SHEET_IN_SELECTION = 1 << 4 }; #define PSPPIRE_SHEET_FLAGS(sheet) (PSPPIRE_SHEET (sheet)->flags) @@ -98,7 +92,6 @@ enum #define PSPPIRE_SHEET_IN_YDRAG(sheet) (PSPPIRE_SHEET_FLAGS (sheet) & PSPPIRE_SHEET_IN_YDRAG) #define PSPPIRE_SHEET_IN_DRAG(sheet) (PSPPIRE_SHEET_FLAGS (sheet) & PSPPIRE_SHEET_IN_DRAG) #define PSPPIRE_SHEET_IN_SELECTION(sheet) (PSPPIRE_SHEET_FLAGS (sheet) & PSPPIRE_SHEET_IN_SELECTION) -#define PSPPIRE_SHEET_IN_RESIZE(sheet) (PSPPIRE_SHEET_FLAGS (sheet) & PSPPIRE_SHEET_IN_RESIZE) #define CELL_SPACING 1 @@ -394,30 +387,33 @@ POSSIBLE_RESIZE (const PsppireSheet *sheet, gint x, gint y, } -static gboolean -rectangle_from_range (PsppireSheet *sheet, const PsppireSheetRange *input, +static void +rectangle_from_range (PsppireSheet *sheet, const PsppireSheetRange *range, GdkRectangle *r) { - PsppireSheetRange range = *input; + gint col0 = MIN (range->col0, range->coli); + gint coli = MAX (range->col0, range->coli); + gint row0 = MIN (range->row0, range->rowi); + gint rowi = MAX (range->row0, range->rowi); - if ( range.row0 == -1 ) range.row0 = min_visible_row (sheet); - if ( range.rowi == -1 ) range.rowi = max_visible_row (sheet); - if ( range.col0 == -1 ) range.col0 = min_visible_column (sheet); - if ( range.coli == -1 ) range.coli = max_visible_column (sheet); + if ( row0 == -1 ) row0 = min_visible_row (sheet); + if ( rowi == -1 ) rowi = max_visible_row (sheet); + if ( col0 == -1 ) col0 = min_visible_column (sheet); + if ( coli == -1 ) coli = max_visible_column (sheet); - r->x = psppire_axis_start_pixel (sheet->haxis, range.col0); + r->x = psppire_axis_start_pixel (sheet->haxis, col0); r->x -= round (sheet->hadjustment->value); - r->y = psppire_axis_start_pixel (sheet->vaxis, range.row0); + r->y = psppire_axis_start_pixel (sheet->vaxis, row0); r->y -= round (sheet->vadjustment->value); - r->width = psppire_axis_start_pixel (sheet->haxis, range.coli) - - psppire_axis_start_pixel (sheet->haxis, range.col0) + - psppire_axis_unit_size (sheet->haxis, range.coli); + r->width = psppire_axis_start_pixel (sheet->haxis, coli) - + psppire_axis_start_pixel (sheet->haxis, col0) + + psppire_axis_unit_size (sheet->haxis, coli); - r->height = psppire_axis_start_pixel (sheet->vaxis, range.rowi) - - psppire_axis_start_pixel (sheet->vaxis, range.row0) + - psppire_axis_unit_size (sheet->vaxis, range.rowi); + r->height = psppire_axis_start_pixel (sheet->vaxis, rowi) - + psppire_axis_start_pixel (sheet->vaxis, row0) + + psppire_axis_unit_size (sheet->vaxis, rowi); if ( sheet->column_titles_visible) { @@ -428,29 +424,26 @@ rectangle_from_range (PsppireSheet *sheet, const PsppireSheetRange *input, { r->x += sheet->row_title_area.width; } - - return TRUE; } -static gboolean +static void rectangle_from_cell (PsppireSheet *sheet, gint row, gint col, GdkRectangle *r) { PsppireSheetRange range; - g_return_val_if_fail (row >= 0, FALSE); - g_return_val_if_fail (col >= 0, FALSE); + g_return_if_fail (row >= 0); + g_return_if_fail (col >= 0); range.row0 = range.rowi = row; range.col0 = range.coli = col; - return rectangle_from_range (sheet, &range, r); + rectangle_from_range (sheet, &range, r); } 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); @@ -551,9 +544,6 @@ static void draw_row_title_buttons (PsppireSheet *sheet); 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, @@ -855,7 +845,7 @@ psppire_sheet_class_init (PsppireSheetClass *klass) /** * PsppireSheet::select-row * @sheet: the sheet widget that emitted the signal - * @row: the newly selected row index + * @row: the newly selected row index, or -1 if no row is selected. * * A row has been selected. */ @@ -874,7 +864,7 @@ psppire_sheet_class_init (PsppireSheetClass *klass) /** * PsppireSheet::select - column * @sheet: the sheet widget that emitted the signal - * @column: the newly selected column index + * @column: the newly selected column index, or -1 if no column is selected. * * A column has been selected. */ @@ -1045,7 +1035,6 @@ psppire_sheet_class_init (PsppireSheetClass *klass) 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", @@ -1397,7 +1386,7 @@ psppire_sheet_set_model (PsppireSheet *sheet, PsppireSheetModel *model) void -psppire_sheet_change_entry (PsppireSheet *sheet, GtkType entry_type) +psppire_sheet_change_entry (PsppireSheet *sheet, GType entry_type) { g_return_if_fail (sheet != NULL); g_return_if_fail (PSPPIRE_IS_SHEET (sheet)); @@ -1704,20 +1693,6 @@ psppire_sheet_set_scroll_adjustments (PsppireSheet *sheet, 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) { @@ -2260,17 +2235,6 @@ draw_sheet_region (PsppireSheet *sheet, GdkRegion *region) psppire_sheet_show_entry_widget (sheet); } - - -static inline gint -safe_strcmp (const gchar *s1, const gchar *s2) -{ - if ( !s1 && !s2) return 0; - if ( !s1) return -1; - if ( !s2) return +1; - return strcmp (s1, s2); -} - static void psppire_sheet_set_cell (PsppireSheet *sheet, gint row, gint col, GtkJustification justification, @@ -2292,7 +2256,7 @@ psppire_sheet_set_cell (PsppireSheet *sheet, gint row, gint col, old_text = psppire_sheet_model_get_string (model, row, col); - if (0 != safe_strcmp (old_text, text)) + if (0 != g_strcmp0 (old_text, text)) { g_signal_handler_block (sheet->model, sheet->update_handler_id); psppire_sheet_model_set_string (model, text, row, col); @@ -2700,6 +2664,8 @@ psppire_sheet_select_row (PsppireSheet *sheet, gint row) area.y++; gdk_window_invalidate_rect (sheet->sheet_window, &area, FALSE); + + g_signal_emit (sheet, sheet_signals [SELECT_ROW], 0, row); } void @@ -2716,6 +2682,8 @@ psppire_sheet_select_column (PsppireSheet *sheet, gint column) area.y++; gdk_window_invalidate_rect (sheet->sheet_window, &area, FALSE); + + g_signal_emit (sheet, sheet_signals [SELECT_COLUMN], 0, column); } @@ -2737,34 +2705,22 @@ psppire_sheet_select_range (PsppireSheet *sheet, const PsppireSheetRange *range) 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); -} - -static void -psppire_sheet_real_select_range (PsppireSheet *sheet, - const PsppireSheetRange *range) -{ - g_return_if_fail (sheet != NULL); - - if (range == NULL) range = &sheet->range; - - memcpy (&sheet->range, range, sizeof (*range)); - - if (range->row0 < 0 || range->rowi < 0) return; - if (range->col0 < 0 || range->coli < 0) return; + if (sheet->sheet_window != NULL) + { + GdkRectangle area; - psppire_sheet_update_primary_selection (sheet); + 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_RANGE], 0, &sheet->range); + g_signal_emit (sheet, sheet_signals [SELECT_COLUMN], 0, -1); + g_signal_emit (sheet, sheet_signals [SELECT_ROW], 0, -1); } - void psppire_sheet_get_selected_range (PsppireSheet *sheet, PsppireSheetRange *range) { @@ -2806,30 +2762,15 @@ psppire_sheet_expose (GtkWidget *widget, GdkEventExpose *event) if (sheet->select_status != PSPPIRE_SHEET_NORMAL) { -#if 0 - if (psppire_sheet_range_isvisible (sheet, &sheet->range)) - psppire_sheet_range_draw (sheet, &sheet->range); + GdkRectangle area; - if (PSPPIRE_SHEET_IN_RESIZE (sheet) || PSPPIRE_SHEET_IN_DRAG (sheet)) - psppire_sheet_range_draw (sheet, &sheet->drag_range); -#endif - - { - GdkRectangle area; - - rectangle_from_range (sheet, &sheet->range, &area); + rectangle_from_range (sheet, &sheet->range, &area); - gdk_draw_rectangle (sheet->sheet_window, - sheet->xor_gc, - TRUE, - area.x + 1, area.y + 1, - area.width, area.height); - } - -#if 0 - if (PSPPIRE_SHEET_IN_RESIZE (sheet) || PSPPIRE_SHEET_IN_DRAG (sheet)) - draw_xor_rectangle (sheet, sheet->drag_range); -#endif + gdk_draw_rectangle (sheet->sheet_window, + sheet->xor_gc, + TRUE, + area.x + 1, area.y + 1, + area.width, area.height); } @@ -3066,9 +3007,7 @@ psppire_sheet_click_cell (PsppireSheet *sheet, gint row, gint column) sheet->range.row0 = 0; sheet->range.col0 = 0; sheet->range.rowi = psppire_axis_unit_count (sheet->vaxis) - 1; - sheet->range.coli = - psppire_axis_unit_count (sheet->haxis) - 1; - psppire_sheet_select_range (sheet, NULL); + sheet->range.coli = psppire_axis_unit_count (sheet->haxis) - 1; return TRUE; } @@ -3142,27 +3081,6 @@ psppire_sheet_button_release (GtkWidget *widget, psppire_sheet_select_range (sheet, &sheet->range); } - if (PSPPIRE_SHEET_IN_RESIZE (sheet)) - { - PsppireSheetRange old_range; - draw_xor_rectangle (sheet, sheet->drag_range); - PSPPIRE_SHEET_UNSET_FLAGS (sheet, PSPPIRE_SHEET_IN_RESIZE); - gdk_display_pointer_ungrab (display, event->time); - - psppire_sheet_unselect_range (sheet); - - old_range = sheet->range; - sheet->range = sheet->drag_range; - sheet->drag_range = old_range; - - if (sheet->select_status == PSPPIRE_SHEET_NORMAL) - sheet->select_status = PSPPIRE_SHEET_RANGE_SELECTED; - - g_signal_emit (sheet, sheet_signals[RESIZE_RANGE], 0, - &sheet->drag_range, &sheet->range); - psppire_sheet_select_range (sheet, &sheet->range); - } - if (PSPPIRE_SHEET_IN_SELECTION (sheet)) { PSPPIRE_SHEET_UNSET_FLAGS (sheet, PSPPIRE_SHEET_IN_SELECTION); @@ -3435,7 +3353,6 @@ psppire_sheet_motion (GtkWidget *widget, GdkEventMotion *event) !POSSIBLE_DRAG (sheet, x, y, &row, &column) && !PSPPIRE_SHEET_IN_DRAG (sheet) && !POSSIBLE_RESIZE (sheet, x, y, &row, &column) && - !PSPPIRE_SHEET_IN_RESIZE (sheet) && new_cursor != sheet->cursor_drag->type) { gdk_cursor_unref (sheet->cursor_drag); @@ -3445,8 +3362,7 @@ psppire_sheet_motion (GtkWidget *widget, GdkEventMotion *event) new_cursor = GDK_TOP_LEFT_ARROW; if ( event->window == sheet->sheet_window && - ! (POSSIBLE_RESIZE (sheet, x, y, &row, &column) || - PSPPIRE_SHEET_IN_RESIZE (sheet)) && + ! (POSSIBLE_RESIZE (sheet, x, y, &row, &column) ) && (POSSIBLE_DRAG (sheet, x, y, &row, &column) || PSPPIRE_SHEET_IN_DRAG (sheet)) && new_cursor != sheet->cursor_drag->type) @@ -3511,80 +3427,6 @@ psppire_sheet_motion (GtkWidget *widget, GdkEventMotion *event) return TRUE; } - if (PSPPIRE_SHEET_IN_RESIZE (sheet)) - { - PsppireSheetRange aux; - gint v_h, current_col, current_row, col_threshold, row_threshold; - v_h = 1; - if (abs (x - psppire_axis_start_pixel (sheet->haxis, sheet->drag_cell.col)) > - abs (y - psppire_axis_start_pixel (sheet->vaxis, sheet->drag_cell.row))) v_h = 2; - - current_col = column_from_xpixel (sheet, x); - current_row = row_from_ypixel (sheet, y); - column = current_col - sheet->drag_cell.col; - row = current_row - sheet->drag_cell.row; - - /*use half of column width resp. row height as threshold to - expand selection*/ - col_threshold = psppire_axis_start_pixel (sheet->haxis, current_col) + - psppire_axis_unit_size (sheet->haxis, current_col) / 2; - if (column > 0) - { - if (x < col_threshold) - column -= 1; - } - else if (column < 0) - { - if (x > col_threshold) - column +=1; - } - row_threshold = psppire_axis_start_pixel (sheet->vaxis, current_row) + - psppire_axis_unit_size (sheet->vaxis, current_row)/2; - if (row > 0) - { - if (y < row_threshold) - row -= 1; - } - else if (row < 0) - { - if (y > row_threshold) - row +=1; - } - - if (sheet->select_status == PSPPIRE_SHEET_COLUMN_SELECTED) row = 0; - if (sheet->select_status == PSPPIRE_SHEET_ROW_SELECTED) column = 0; - sheet->x_drag = x; - sheet->y_drag = y; - aux = sheet->range; - - if (v_h == 1) - column = 0; - else - row = 0; - - if (aux.row0 + row >= 0 && aux.rowi + row < psppire_axis_unit_count (sheet->vaxis) && - aux.col0 + column >= 0 && aux.coli + column < psppire_axis_unit_count (sheet->haxis)) - { - aux = sheet->drag_range; - sheet->drag_range = sheet->range; - - if (row < 0) sheet->drag_range.row0 = sheet->range.row0 + row; - if (row > 0) sheet->drag_range.rowi = sheet->range.rowi + row; - if (column < 0) sheet->drag_range.col0 = sheet->range.col0 + column; - if (column > 0) sheet->drag_range.coli = sheet->range.coli + column; - - if (aux.row0 != sheet->drag_range.row0 || - aux.rowi != sheet->drag_range.rowi || - aux.col0 != sheet->drag_range.col0 || - aux.coli != sheet->drag_range.coli) - { - draw_xor_rectangle (sheet, aux); - draw_xor_rectangle (sheet, sheet->drag_range); - } - } - return TRUE; - } - psppire_sheet_get_pixel_info (sheet, x, y, &row, &column); if (sheet->select_status == PSPPIRE_SHEET_NORMAL && row == sheet->active_cell.row && @@ -3811,6 +3653,56 @@ step_sheet (PsppireSheet *sheet, GtkScrollType dir) } +/* 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) @@ -3824,21 +3716,41 @@ psppire_sheet_key_press (GtkWidget *widget, 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: @@ -3849,29 +3761,17 @@ psppire_sheet_key_press (GtkWidget *widget, 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; @@ -4225,7 +4125,7 @@ draw_button (PsppireSheet *sheet, GdkWindow *window, GdkRectangle allocation) { GtkShadowType shadow_type; - gint text_width = 0, text_height = 0; + gint text_width = 0; PangoAlignment align = PANGO_ALIGN_LEFT; gboolean rtl ; @@ -4290,9 +4190,6 @@ draw_button (PsppireSheet *sheet, GdkWindow *window, 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, @@ -4821,27 +4718,6 @@ psppire_sheet_get_attributes (const PsppireSheet *sheet, gint row, gint col, 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,