X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fgtk-contrib%2Fpsppire-sheet.c;h=c84d898984fbac6bfeaedfde639860183c4f0b19;hb=00396b2d6cb415f19cefda552e3edd571a71ac93;hp=46719927e0cff14260efddc39d15d8542712b2c7;hpb=54a782bed8c1d1c02b9d6cc192df5ec4840796df;p=pspp-builds.git diff --git a/lib/gtk-contrib/psppire-sheet.c b/lib/gtk-contrib/psppire-sheet.c index 46719927..c84d8989 100644 --- a/lib/gtk-contrib/psppire-sheet.c +++ b/lib/gtk-contrib/psppire-sheet.c @@ -123,9 +123,6 @@ static void set_row_height (PsppireSheet *sheet, static void destroy_hover_window (PsppireSheetHoverTitle *); static PsppireSheetHoverTitle *create_hover_window (void); -static GtkStateType psppire_sheet_cell_get_state (PsppireSheet *sheet, gint row, gint col); - - static inline void dispose_string (const PsppireSheet *sheet, gchar *text) { @@ -398,24 +395,29 @@ POSSIBLE_RESIZE (const PsppireSheet *sheet, gint x, gint y, static gboolean -rectangle_from_range (PsppireSheet *sheet, const PsppireSheetRange *range, +rectangle_from_range (PsppireSheet *sheet, const PsppireSheetRange *input, GdkRectangle *r) { - g_return_val_if_fail (range, FALSE); + PsppireSheetRange range = *input; - r->x = psppire_axis_start_pixel (sheet->haxis, range->col0); + 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); + + r->x = psppire_axis_start_pixel (sheet->haxis, range.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, range.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, range.coli) - + psppire_axis_start_pixel (sheet->haxis, range.col0) + + psppire_axis_unit_size (sheet->haxis, range.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, range.rowi) - + psppire_axis_start_pixel (sheet->vaxis, range.row0) + + psppire_axis_unit_size (sheet->vaxis, range.rowi); if ( sheet->column_titles_visible) { @@ -504,11 +506,6 @@ static void draw_sheet_region (PsppireSheet *sheet, GdkRegion *region); /* Selection */ - -static void psppire_sheet_real_select_range (PsppireSheet *sheet, - const PsppireSheetRange *range); -static void psppire_sheet_real_unselect_range (PsppireSheet *sheet, - const PsppireSheetRange *range); static void psppire_sheet_draw_border (PsppireSheet *sheet, PsppireSheetRange range); @@ -1605,52 +1602,6 @@ psppire_sheet_moveto (PsppireSheet *sheet, } -void -psppire_sheet_select_row (PsppireSheet *sheet, gint row) -{ - g_return_if_fail (sheet != NULL); - g_return_if_fail (PSPPIRE_IS_SHEET (sheet)); - - if (row < 0 || row >= psppire_axis_unit_count (sheet->vaxis)) - return; - - if (sheet->select_status != PSPPIRE_SHEET_NORMAL) - psppire_sheet_real_unselect_range (sheet, NULL); - - sheet->select_status = PSPPIRE_SHEET_ROW_SELECTED; - sheet->range.row0 = row; - sheet->range.col0 = 0; - sheet->range.rowi = row; - sheet->range.coli = psppire_axis_unit_count (sheet->haxis) - 1; - - g_signal_emit (sheet, sheet_signals[SELECT_ROW], 0, row); - psppire_sheet_real_select_range (sheet, NULL); -} - - -void -psppire_sheet_select_column (PsppireSheet *sheet, gint column) -{ - g_return_if_fail (sheet != NULL); - g_return_if_fail (PSPPIRE_IS_SHEET (sheet)); - - if (column < 0 || column >= psppire_axis_unit_count (sheet->haxis)) - return; - - if (sheet->select_status != PSPPIRE_SHEET_NORMAL) - psppire_sheet_real_unselect_range (sheet, NULL); - - sheet->select_status = PSPPIRE_SHEET_COLUMN_SELECTED; - sheet->range.row0 = 0; - sheet->range.col0 = column; - sheet->range.rowi = psppire_axis_unit_count (sheet->vaxis) - 1; - sheet->range.coli = column; - - g_signal_emit (sheet, sheet_signals[SELECT_COLUMN], 0, column); - psppire_sheet_real_select_range (sheet, NULL); -} - - static gboolean @@ -2411,40 +2362,6 @@ psppire_sheet_cell_get_text (const PsppireSheet *sheet, gint row, gint col) } -static GtkStateType -psppire_sheet_cell_get_state (PsppireSheet *sheet, gint row, gint col) -{ - PsppireSheetRange *range; - - g_return_val_if_fail (sheet != NULL, 0); - g_return_val_if_fail (PSPPIRE_IS_SHEET (sheet), 0); - if (col >= psppire_axis_unit_count (sheet->haxis) || row >= psppire_axis_unit_count (sheet->vaxis)) return 0; - if (col < 0 || row < 0) return 0; - - range = &sheet->range; - - switch (sheet->select_status) - { - case PSPPIRE_SHEET_NORMAL: - return GTK_STATE_NORMAL; - break; - case PSPPIRE_SHEET_ROW_SELECTED: - if (row >= range->row0 && row <= range->rowi) - return GTK_STATE_SELECTED; - break; - case PSPPIRE_SHEET_COLUMN_SELECTED: - if (col >= range->col0 && col <= range->coli) - return GTK_STATE_SELECTED; - break; - case PSPPIRE_SHEET_RANGE_SELECTED: - if (row >= range->row0 && row <= range->rowi && \ - col >= range->col0 && col <= range->coli) - return GTK_STATE_SELECTED; - break; - } - return GTK_STATE_NORMAL; -} - /* Convert X, Y (in pixels) to *ROW, *COLUMN If the function returns FALSE, then the results will be unreliable. */ @@ -2766,91 +2683,97 @@ psppire_sheet_draw_border (PsppireSheet *sheet, PsppireSheetRange new_range) gdk_gc_set_clip_rectangle (sheet->xor_gc, NULL); } + -static void -psppire_sheet_real_select_range (PsppireSheet *sheet, - const PsppireSheetRange *range) -{ - g_return_if_fail (sheet != NULL); - - if (range == NULL) range = &sheet->range; +/* Selection related functions */ - memcpy (&sheet->range, range, sizeof (*range)); +void +psppire_sheet_select_row (PsppireSheet *sheet, gint row) +{ + GdkRectangle area; + sheet->select_status = PSPPIRE_SHEET_ROW_SELECTED; - if (range->row0 < 0 || range->rowi < 0) return; - if (range->col0 < 0 || range->coli < 0) return; + sheet->range.col0 = sheet->range.coli = -1; + sheet->range.row0 = sheet->range.rowi = row; - psppire_sheet_update_primary_selection (sheet); + rectangle_from_range (sheet, &sheet->range, &area); + area.x++; + area.y++; - g_signal_emit (sheet, sheet_signals[SELECT_RANGE], 0, &sheet->range); + gdk_window_invalidate_rect (sheet->sheet_window, &area, FALSE); } - void -psppire_sheet_get_selected_range (PsppireSheet *sheet, PsppireSheetRange *range) +psppire_sheet_select_column (PsppireSheet *sheet, gint column) { - g_return_if_fail (sheet != NULL); - *range = sheet->range; + GdkRectangle area; + sheet->select_status = PSPPIRE_SHEET_COLUMN_SELECTED; + + sheet->range.col0 = sheet->range.coli = column; + sheet->range.row0 = sheet->range.rowi = -1; + + rectangle_from_range (sheet, &sheet->range, &area); + area.x++; + area.y++; + + gdk_window_invalidate_rect (sheet->sheet_window, &area, FALSE); } void psppire_sheet_select_range (PsppireSheet *sheet, const PsppireSheetRange *range) { - g_return_if_fail (sheet != NULL); - - if (range == NULL) range=&sheet->range; - - if (range->row0 < 0 || range->rowi < 0) return; - if (range->col0 < 0 || range->coli < 0) return; - - - if (sheet->select_status != PSPPIRE_SHEET_NORMAL) - psppire_sheet_real_unselect_range (sheet, NULL); + GdkRectangle area; + sheet->select_status = PSPPIRE_SHEET_RANGE_SELECTED; - sheet->range.row0 = range->row0; - sheet->range.rowi = range->rowi; - sheet->range.col0 = range->col0; - sheet->range.coli = range->coli; + sheet->range = *range; - sheet->select_status = PSPPIRE_SHEET_RANGE_SELECTED; - psppire_sheet_real_select_range (sheet, NULL); + rectangle_from_range (sheet, range, &area); + area.x++; + area.y++; + gdk_window_invalidate_rect (sheet->sheet_window, &area, FALSE); } + void psppire_sheet_unselect_range (PsppireSheet *sheet) { - if (! GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) - return; - - psppire_sheet_real_unselect_range (sheet, NULL); + 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_unselect_range (PsppireSheet *sheet, - const PsppireSheetRange *range) +psppire_sheet_real_select_range (PsppireSheet *sheet, + const PsppireSheetRange *range) { g_return_if_fail (sheet != NULL); - g_return_if_fail (GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))); - if ( range == NULL) - range = &sheet->range; + 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; - g_signal_emit (sheet, sheet_signals[SELECT_COLUMN], 0, -1); - g_signal_emit (sheet, sheet_signals[SELECT_ROW], 0, -1); + psppire_sheet_update_primary_selection (sheet); - sheet->range.row0 = -1; - sheet->range.rowi = -1; - sheet->range.col0 = -1; - sheet->range.coli = -1; + g_signal_emit (sheet, sheet_signals[SELECT_RANGE], 0, &sheet->range); } +void +psppire_sheet_get_selected_range (PsppireSheet *sheet, PsppireSheetRange *range) +{ + g_return_if_fail (sheet != NULL); + *range = sheet->range; +} + + static gint psppire_sheet_expose (GtkWidget *widget, GdkEventExpose *event) { @@ -2892,7 +2815,6 @@ psppire_sheet_expose (GtkWidget *widget, GdkEventExpose *event) psppire_sheet_range_draw (sheet, &sheet->drag_range); #endif - if (psppire_sheet_range_isvisible (sheet, &sheet->range)) { GdkRectangle area; @@ -2976,7 +2898,8 @@ psppire_sheet_button_press (GtkWidget *widget, GdkEventButton *event) sheet_signals[DOUBLE_CLICK_COLUMN], 0, column); } } - else if (event->window == sheet->row_title_window) + + if (event->window == sheet->row_title_window) { g_signal_emit (sheet, sheet_signals[BUTTON_EVENT_ROW], 0, @@ -3047,18 +2970,16 @@ psppire_sheet_button_press (GtkWidget *widget, GdkEventButton *event) NULL, NULL, event->time); gtk_grab_add (GTK_WIDGET (sheet)); - if (psppire_sheet_click_cell (sheet, row, column)) + if ( sheet->select_status == PSPPIRE_SHEET_NORMAL) { - if ( sheet->select_status == PSPPIRE_SHEET_NORMAL) - { - sheet->range.row0 = row; - sheet->range.col0 = column; - } - else - { - sheet->select_status = PSPPIRE_SHEET_NORMAL; - } + sheet->range.row0 = row; + sheet->range.col0 = column; } + else + { + psppire_sheet_unselect_range (sheet); + } + psppire_sheet_click_cell (sheet, row, column); } if (event->window == sheet->column_title_window) @@ -3212,7 +3133,7 @@ psppire_sheet_button_release (GtkWidget *widget, PSPPIRE_SHEET_UNSET_FLAGS (sheet, PSPPIRE_SHEET_IN_DRAG); gdk_display_pointer_ungrab (display, event->time); - psppire_sheet_real_unselect_range (sheet, NULL); + psppire_sheet_unselect_range (sheet); old_range = sheet->range; sheet->range = sheet->drag_range; @@ -3229,7 +3150,7 @@ psppire_sheet_button_release (GtkWidget *widget, PSPPIRE_SHEET_UNSET_FLAGS (sheet, PSPPIRE_SHEET_IN_RESIZE); gdk_display_pointer_ungrab (display, event->time); - psppire_sheet_real_unselect_range (sheet, NULL); + psppire_sheet_unselect_range (sheet); old_range = sheet->range; sheet->range = sheet->drag_range; @@ -3688,13 +3609,14 @@ psppire_sheet_motion (GtkWidget *widget, GdkEventMotion *event) { if (PSPPIRE_SHEET_IN_SELECTION (sheet) ) { - GdkRectangle area; + /* Redraw the old range */ + psppire_sheet_unselect_range (sheet); + sheet->range.rowi = row; sheet->range.coli = column; - sheet->select_status = PSPPIRE_SHEET_RANGE_SELECTED; - rectangle_from_range (sheet, &sheet->range, &area); - gdk_window_invalidate_rect (sheet->sheet_window, &area, FALSE); + /* Redraw the new range */ + psppire_sheet_select_range (sheet, &sheet->range); } else { @@ -5098,7 +5020,7 @@ primary_clear_cb (GtkClipboard *clipboard, if ( ! GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; - psppire_sheet_real_unselect_range (sheet, NULL); + psppire_sheet_unselect_range (sheet); } static void