X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fgtk-contrib%2Fpsppire-sheet.c;h=dc0f4080ec36d5629a19327312f3168b5f1a55d7;hb=4d880bd78462726d84bae8a1c6d593d06af2d61f;hp=2dd31f767b82c542424247679b0ce49d551c78c8;hpb=da8273b1311e75a7d2fb3a2ce0baa1ff4c07775f;p=pspp-builds.git diff --git a/lib/gtk-contrib/psppire-sheet.c b/lib/gtk-contrib/psppire-sheet.c index 2dd31f76..dc0f4080 100644 --- a/lib/gtk-contrib/psppire-sheet.c +++ b/lib/gtk-contrib/psppire-sheet.c @@ -85,9 +85,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 +96,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 @@ -123,9 +120,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 +392,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 +503,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); @@ -858,7 +852,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. */ @@ -877,7 +871,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. */ @@ -1132,7 +1126,6 @@ psppire_sheet_init (PsppireSheet *sheet) sheet->vaxis = NULL; sheet->flags = 0; - sheet->selection_mode = GTK_SELECTION_NONE; sheet->select_status = PSPPIRE_SHEET_NORMAL; GTK_WIDGET_UNSET_FLAGS (sheet, GTK_NO_WINDOW); @@ -1605,52 +1598,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 @@ -2302,7 +2249,7 @@ draw_sheet_region (PsppireSheet *sheet, GdkRegion *region) psppire_sheet_cell_draw (sheet, i, j); } - if (sheet->select_status == GTK_STATE_NORMAL && + if (sheet->select_status == PSPPIRE_SHEET_NORMAL && sheet->active_cell.row >= drawing_range.row0 && sheet->active_cell.row <= drawing_range.rowi && sheet->active_cell.col >= drawing_range.col0 && @@ -2411,40 +2358,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. */ @@ -2578,7 +2491,7 @@ entry_load_text (PsppireSheet *sheet) PsppireSheetCellAttr attributes; if (!GTK_WIDGET_VISIBLE (sheet->entry_widget)) return; - if (sheet->select_status != GTK_STATE_NORMAL) return; + if (sheet->select_status != PSPPIRE_SHEET_NORMAL) return; row = sheet->active_cell.row; col = sheet->active_cell.col; @@ -2766,90 +2679,84 @@ 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); +/* Selection related functions */ - if (range == NULL) range = &sheet->range; +void +psppire_sheet_select_row (PsppireSheet *sheet, gint row) +{ + GdkRectangle area; + sheet->select_status = PSPPIRE_SHEET_ROW_SELECTED; - memcpy (&sheet->range, range, sizeof (*range)); + sheet->range.col0 = sheet->range.coli = -1; + sheet->range.row0 = sheet->range.rowi = row; - if (range->row0 < 0 || range->rowi < 0) return; - if (range->col0 < 0 || range->coli < 0) return; + rectangle_from_range (sheet, &sheet->range, &area); + area.x++; + area.y++; - psppire_sheet_update_primary_selection (sheet); + 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_ROW], 0, row); } - 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; -void -psppire_sheet_select_range (PsppireSheet *sheet, const PsppireSheetRange *range) -{ - g_return_if_fail (sheet != NULL); + rectangle_from_range (sheet, &sheet->range, &area); + area.x++; + area.y++; - if (range == NULL) range=&sheet->range; + gdk_window_invalidate_rect (sheet->sheet_window, &area, FALSE); - 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, column); +} - if (sheet->select_status != PSPPIRE_SHEET_NORMAL) - psppire_sheet_real_unselect_range (sheet, NULL); +void +psppire_sheet_select_range (PsppireSheet *sheet, const PsppireSheetRange *range) +{ + 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; + GdkRectangle area; + sheet->select_status = PSPPIRE_SHEET_NORMAL; - psppire_sheet_real_unselect_range (sheet, NULL); - sheet->select_status = GTK_STATE_NORMAL; -} + 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); +} -static void -psppire_sheet_real_unselect_range (PsppireSheet *sheet, - const PsppireSheetRange *range) +void +psppire_sheet_get_selected_range (PsppireSheet *sheet, 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->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); - - sheet->range.row0 = -1; - sheet->range.rowi = -1; - sheet->range.col0 = -1; - sheet->range.coli = -1; + *range = sheet->range; } - + static gint psppire_sheet_expose (GtkWidget *widget, GdkEventExpose *event) @@ -2892,7 +2799,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 +2882,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 +2954,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) @@ -3119,7 +3024,7 @@ psppire_sheet_click_cell (PsppireSheet *sheet, gint row, gint column) if (forbid_move) { - if (sheet->select_status == GTK_STATE_NORMAL) + if (sheet->select_status == PSPPIRE_SHEET_NORMAL) return FALSE; row = sheet->active_cell.row; @@ -3212,7 +3117,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; @@ -3222,27 +3127,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_real_unselect_range (sheet, NULL); - - old_range = sheet->range; - sheet->range = sheet->drag_range; - sheet->drag_range = old_range; - - if (sheet->select_status == GTK_STATE_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); @@ -3515,7 +3399,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); @@ -3525,8 +3408,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) @@ -3536,20 +3418,6 @@ psppire_sheet_motion (GtkWidget *widget, GdkEventMotion *event) gdk_window_set_cursor (sheet->sheet_window, sheet->cursor_drag); } - new_cursor = GDK_SIZING; - if ( event->window == sheet->sheet_window && - sheet->selection_mode != GTK_SELECTION_NONE && - !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); - sheet->cursor_drag = gdk_cursor_new_for_display (display, GDK_SIZING); - gdk_window_set_cursor (sheet->sheet_window, sheet->cursor_drag); - } - - gdk_window_get_pointer (widget->window, &x, &y, &mods); if (! (mods & GDK_BUTTON1_MASK)) return FALSE; @@ -3605,80 +3473,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 && @@ -3688,13 +3482,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 +4893,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