X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fgtksheet%2Fgtksheet.c;h=bab70950ae887e3ae110e045e8b1b88fc77421c7;hb=256b80a60ad7ade8c7ac947d3602f89120f37522;hp=feeeaafa920e16aa55847487b5f7ad12ed84432b;hpb=889d227953626cc1c5d24800861aa6fc5ccd0580;p=pspp-builds.git diff --git a/lib/gtksheet/gtksheet.c b/lib/gtksheet/gtksheet.c index feeeaafa..bab70950 100644 --- a/lib/gtksheet/gtksheet.c +++ b/lib/gtksheet/gtksheet.c @@ -53,7 +53,7 @@ #include #include #include "gtksheet.h" -#include "gtkextra-marshal.h" +#include #include "gsheetmodel.h" #include #include @@ -86,6 +86,8 @@ enum #define DEFAULT_COLUMN_WIDTH 80 #define DEFAULT_ROW_HEIGHT 25 +static void set_entry_widget_font (GtkSheet *sheet); + static void gtk_sheet_update_primary_selection (GtkSheet *sheet); static void draw_column_title_buttons_range (GtkSheet *sheet, gint first, gint n); static void draw_row_title_buttons_range (GtkSheet *sheet, gint first, gint n); @@ -152,9 +154,7 @@ min_fully_visible_row (const GtkSheet *sheet) static inline glong max_visible_row (const GtkSheet *sheet) { - return row_from_ypixel (sheet, - sheet->vadjustment->value + - sheet->vadjustment->page_size); + return row_from_ypixel (sheet, sheet->vadjustment->value + sheet->vadjustment->page_size); } @@ -198,9 +198,7 @@ min_fully_visible_column (const GtkSheet *sheet) static inline glong max_visible_column (const GtkSheet *sheet) { - return column_from_xpixel (sheet, - sheet->hadjustment->value + - sheet->hadjustment->page_size); + return column_from_xpixel (sheet, sheet->hadjustment->value + sheet->hadjustment->page_size); } static inline glong @@ -392,6 +390,7 @@ static void gtk_sheet_map (GtkWidget *widget); static void gtk_sheet_unmap (GtkWidget *widget); static gint gtk_sheet_expose (GtkWidget *widget, GdkEventExpose *event); + static void gtk_sheet_forall (GtkContainer *container, gboolean include_internals, GtkCallback callback, @@ -421,7 +420,7 @@ static void gtk_sheet_size_allocate (GtkWidget *widget, /* Sheet queries */ static gboolean gtk_sheet_range_isvisible (const GtkSheet *sheet, - GtkSheetRange range); + const GtkSheetRange *range); static gboolean gtk_sheet_cell_isvisible (GtkSheet *sheet, gint row, gint column); /* Drawing Routines */ @@ -455,11 +454,11 @@ static void gtk_sheet_draw_border (GtkSheet *sheet, static void gtk_sheet_entry_changed (GtkWidget *widget, gpointer data); -static void gtk_sheet_hide_active_cell (GtkSheet *sheet); +static void gtk_sheet_hide_entry_widget (GtkSheet *sheet); static void change_active_cell (GtkSheet *sheet, gint row, gint col); static void gtk_sheet_draw_active_cell (GtkSheet *sheet); -static void gtk_sheet_show_active_cell (GtkSheet *sheet); +static void gtk_sheet_show_entry_widget (GtkSheet *sheet); static gboolean gtk_sheet_click_cell (GtkSheet *sheet, gint row, gint column); @@ -836,7 +835,7 @@ gtk_sheet_class_init (GtkSheetClass *klass) G_SIGNAL_RUN_LAST, 0, NULL, NULL, - gtkextra_VOID__INT_POINTER, + psppire_marshal_VOID__INT_POINTER, G_TYPE_NONE, 2, G_TYPE_INT, @@ -857,7 +856,7 @@ gtk_sheet_class_init (GtkSheetClass *klass) G_SIGNAL_RUN_LAST, 0, NULL, NULL, - gtkextra_VOID__INT_POINTER, + psppire_marshal_VOID__INT_POINTER, G_TYPE_NONE, 2, G_TYPE_INT, @@ -883,7 +882,7 @@ gtk_sheet_class_init (GtkSheetClass *klass) G_SIGNAL_RUN_LAST, offsetof (GtkSheetClass, resize_range), NULL, NULL, - gtkextra_VOID__BOXED_BOXED, + psppire_marshal_VOID__BOXED_BOXED, G_TYPE_NONE, 2, GTK_TYPE_SHEET_RANGE, GTK_TYPE_SHEET_RANGE @@ -895,7 +894,7 @@ gtk_sheet_class_init (GtkSheetClass *klass) G_SIGNAL_RUN_LAST, offsetof (GtkSheetClass, move_range), NULL, NULL, - gtkextra_VOID__BOXED_BOXED, + psppire_marshal_VOID__BOXED_BOXED, G_TYPE_NONE, 2, GTK_TYPE_SHEET_RANGE, GTK_TYPE_SHEET_RANGE @@ -907,7 +906,7 @@ gtk_sheet_class_init (GtkSheetClass *klass) G_SIGNAL_RUN_LAST, offsetof (GtkSheetClass, traverse), NULL, NULL, - gtkextra_BOOLEAN__BOXED_POINTER, + psppire_marshal_BOOLEAN__BOXED_POINTER, G_TYPE_BOOLEAN, 2, GTK_TYPE_SHEET_CELL, G_TYPE_POINTER); @@ -919,7 +918,7 @@ gtk_sheet_class_init (GtkSheetClass *klass) G_SIGNAL_RUN_LAST, offsetof (GtkSheetClass, activate), NULL, NULL, - gtkextra_VOID__INT_INT_INT_INT, + psppire_marshal_VOID__INT_INT_INT_INT, G_TYPE_NONE, 4, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT); @@ -930,7 +929,7 @@ gtk_sheet_class_init (GtkSheetClass *klass) G_SIGNAL_RUN_LAST, offsetof (GtkSheetClass, set_scroll_adjustments), NULL, NULL, - gtkextra_VOID__OBJECT_OBJECT, + psppire_marshal_VOID__OBJECT_OBJECT, G_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT); @@ -1063,9 +1062,6 @@ gtk_sheet_init (GtkSheet *sheet) sheet->motion_timer = 0; - sheet->columns_resizable = TRUE; - sheet->rows_resizable = TRUE; - sheet->row_titles_visible = TRUE; sheet->row_title_area.width = DEFAULT_COLUMN_WIDTH; @@ -1162,13 +1158,6 @@ range_update_callback (GSheetModel *m, gint row0, gint col0, if ( !GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; - if ( max_visible_row (sheet) > g_sheet_model_get_row_count (sheet->model) - || - max_visible_column (sheet) > g_sheet_model_get_column_count (sheet->model)) - { - gtk_sheet_moveto (sheet, 0, 0, 0, 0); - } - if ( ( row0 < 0 && col0 < 0 ) || ( rowi < 0 && coli < 0 ) ) { gtk_sheet_range_draw (sheet, NULL); @@ -1268,7 +1257,7 @@ gtk_sheet_change_entry (GtkSheet *sheet, GtkType entry_type) state = sheet->state; if (sheet->state == GTK_SHEET_NORMAL) - gtk_sheet_hide_active_cell (sheet); + gtk_sheet_hide_entry_widget (sheet); sheet->entry_type = entry_type; @@ -1276,7 +1265,7 @@ gtk_sheet_change_entry (GtkSheet *sheet, GtkType entry_type) if (state == GTK_SHEET_NORMAL) { - gtk_sheet_show_active_cell (sheet); + gtk_sheet_show_entry_widget (sheet); } } @@ -1463,26 +1452,6 @@ gtk_sheet_moveto (GtkSheet *sheet, } -static gboolean -gtk_sheet_columns_resizable (GtkSheet *sheet) -{ - g_return_val_if_fail (sheet != NULL, FALSE); - g_return_val_if_fail (GTK_IS_SHEET (sheet), FALSE); - - return sheet->columns_resizable; -} - - -static gboolean -gtk_sheet_rows_resizable (GtkSheet *sheet) -{ - g_return_val_if_fail (sheet != NULL, FALSE); - g_return_val_if_fail (GTK_IS_SHEET (sheet), FALSE); - - return sheet->rows_resizable; -} - - void gtk_sheet_select_row (GtkSheet *sheet, gint row) { @@ -1537,32 +1506,32 @@ gtk_sheet_select_column (GtkSheet *sheet, gint column) static gboolean gtk_sheet_range_isvisible (const GtkSheet *sheet, - GtkSheetRange range) + const GtkSheetRange *range) { g_return_val_if_fail (sheet != NULL, FALSE); - if (range.row0 < 0 || range.row0 >= psppire_axis_unit_count (sheet->vaxis)) + if (range->row0 < 0 || range->row0 >= psppire_axis_unit_count (sheet->vaxis)) return FALSE; - if (range.rowi < 0 || range.rowi >= psppire_axis_unit_count (sheet->vaxis)) + if (range->rowi < 0 || range->rowi >= psppire_axis_unit_count (sheet->vaxis)) return FALSE; - if (range.col0 < 0 || range.col0 >= psppire_axis_unit_count (sheet->haxis)) + if (range->col0 < 0 || range->col0 >= psppire_axis_unit_count (sheet->haxis)) return FALSE; - if (range.coli < 0 || range.coli >= psppire_axis_unit_count (sheet->haxis)) + if (range->coli < 0 || range->coli >= psppire_axis_unit_count (sheet->haxis)) return FALSE; - if (range.rowi < min_visible_row (sheet)) + if (range->rowi < min_visible_row (sheet)) return FALSE; - if (range.row0 > max_visible_row (sheet)) + if (range->row0 > max_visible_row (sheet)) return FALSE; - if (range.coli < min_visible_column (sheet)) + if (range->coli < min_visible_column (sheet)) return FALSE; - if (range.col0 > max_visible_column (sheet)) + if (range->col0 > max_visible_column (sheet)) return FALSE; return TRUE; @@ -1579,7 +1548,7 @@ gtk_sheet_cell_isvisible (GtkSheet *sheet, range.rowi = row; range.coli = column; - return gtk_sheet_range_isvisible (sheet, range); + return gtk_sheet_range_isvisible (sheet, &range); } void @@ -1707,8 +1676,11 @@ gtk_sheet_style_set (GtkWidget *widget, gtk_style_set_background (widget->style, widget->window, widget->state); } + set_entry_widget_font (sheet); } +#define BORDER_WIDTH 2 + static void gtk_sheet_realize (GtkWidget *widget) { @@ -1717,7 +1689,7 @@ gtk_sheet_realize (GtkWidget *widget) const gint attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP | GDK_WA_CURSOR; - GdkGCValues values, auxvalues; + GdkGCValues values; GdkColormap *colormap; GdkDisplay *display; @@ -1814,12 +1786,10 @@ gtk_sheet_realize (GtkWidget *widget) sheet->fg_gc = gdk_gc_new (widget->window); sheet->bg_gc = gdk_gc_new (widget->window); - gdk_gc_get_values (sheet->fg_gc, &auxvalues); - values.foreground = widget->style->white; values.function = GDK_INVERT; values.subwindow_mode = GDK_INCLUDE_INFERIORS; - values.line_width = 3; + values.line_width = BORDER_WIDTH; sheet->xor_gc = gdk_gc_new_with_values (widget->window, &values, @@ -1888,7 +1858,6 @@ static void global_button_clicked (GtkWidget *widget, gpointer data) { gtk_sheet_click_cell (GTK_SHEET (data), -1, -1); - gtk_widget_grab_focus (GTK_WIDGET (data)); } @@ -2009,6 +1978,7 @@ gtk_sheet_cell_draw (GtkSheet *sheet, gint row, gint col) { PangoLayout *layout; PangoRectangle text; + PangoFontDescription *font_desc = GTK_WIDGET (sheet)->style->font_desc; gint font_height; gchar *label; @@ -2050,8 +2020,6 @@ gtk_sheet_cell_draw (GtkSheet *sheet, gint row, gint col) area.width, area.height); } - // gtk_sheet_cell_draw_label (sheet, row, col); - label = gtk_sheet_cell_get_text (sheet, row, col); if (NULL == label) @@ -2060,15 +2028,16 @@ gtk_sheet_cell_draw (GtkSheet *sheet, gint row, gint col) layout = gtk_widget_create_pango_layout (GTK_WIDGET (sheet), label); dispose_string (sheet, label); - pango_layout_set_font_description (layout, attributes.font_desc); + pango_layout_set_font_description (layout, font_desc); + pango_layout_get_pixel_extents (layout, NULL, &text); gdk_gc_set_clip_rectangle (sheet->fg_gc, &area); - font_height = pango_font_description_get_size (attributes.font_desc); - if ( !pango_font_description_get_size_is_absolute (attributes.font_desc)) + font_height = pango_font_description_get_size (font_desc); + if ( !pango_font_description_get_size_is_absolute (font_desc)) font_height /= PANGO_SCALE; /* Centre the text vertically */ @@ -2134,16 +2103,13 @@ gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range) drawing_range.rowi = MIN (range->rowi, max_visible_row (sheet)); drawing_range.coli = MIN (range->coli, max_visible_column (sheet)); - rectangle_from_range (sheet, &drawing_range, &area); } + g_return_if_fail (drawing_range.rowi >= drawing_range.row0); + g_return_if_fail (drawing_range.coli >= drawing_range.col0); - gdk_draw_rectangle (sheet->sheet_window, - GTK_WIDGET (sheet)->style->white_gc, - TRUE, - area.x, area.y, - area.width, area.height); + gdk_window_begin_paint_rect (sheet->sheet_window, &area); for (i = drawing_range.row0; i <= drawing_range.rowi; i++) for (j = drawing_range.col0; j <= drawing_range.coli; j++) @@ -2152,7 +2118,7 @@ gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range) } if (sheet->state != GTK_SHEET_NORMAL && - gtk_sheet_range_isvisible (sheet, sheet->range)) + gtk_sheet_range_isvisible (sheet, &sheet->range)) gtk_sheet_range_draw_selection (sheet, drawing_range); if (sheet->state == GTK_STATE_NORMAL && @@ -2160,7 +2126,9 @@ gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range) sheet->active_cell.row <= drawing_range.rowi && sheet->active_cell.col >= drawing_range.col0 && sheet->active_cell.col <= drawing_range.coli) - gtk_sheet_show_active_cell (sheet); + gtk_sheet_show_entry_widget (sheet); + + gdk_window_end_paint (sheet->sheet_window); } static void @@ -2174,7 +2142,7 @@ gtk_sheet_range_draw_selection (GtkSheet *sheet, GtkSheetRange range) range.row0 > sheet->range.rowi || range.rowi < sheet->range.row0) return; - if (!gtk_sheet_range_isvisible (sheet, range)) return; + if (!gtk_sheet_range_isvisible (sheet, &range)) return; if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; aux = range; @@ -2467,7 +2435,7 @@ gtk_sheet_set_active_cell (GtkSheet *sheet, gint row, gint col) if ( row == -1 || col == -1) { - gtk_sheet_hide_active_cell (sheet); + gtk_sheet_hide_entry_widget (sheet); return; } @@ -2524,10 +2492,8 @@ gtk_sheet_entry_changed (GtkWidget *widget, gpointer data) static void -gtk_sheet_hide_active_cell (GtkSheet *sheet) +gtk_sheet_hide_entry_widget (GtkSheet *sheet) { - GdkRectangle area; - if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; @@ -2537,19 +2503,6 @@ gtk_sheet_hide_active_cell (GtkSheet *sheet) gtk_widget_hide (sheet->entry_widget); gtk_widget_unmap (sheet->entry_widget); - rectangle_from_cell (sheet, - sheet->active_cell.row, sheet->active_cell.col, - &area); - - gdk_draw_rectangle (sheet->sheet_window, - GTK_WIDGET (sheet)->style->white_gc, - TRUE, - area.x, area.y, - area.width, area.height); - - gtk_sheet_cell_draw (sheet, sheet->active_cell.row, - sheet->active_cell.col); - GTK_WIDGET_UNSET_FLAGS (GTK_WIDGET (sheet->entry_widget), GTK_VISIBLE); } @@ -2574,11 +2527,30 @@ change_active_cell (GtkSheet *sheet, gint row, gint col) gtk_sheet_real_unselect_range (sheet, NULL); } + g_signal_handler_block (sheet->entry_widget, sheet->entry_handler_id); old_row = sheet->active_cell.row; old_col = sheet->active_cell.col; + { + /* Redraw the neighbourhood of the old active cell */ + GtkSheetRange r; + r.col0 = old_col - 1; + r.coli = old_col + 1; + r.row0 = old_row - 1; + r.rowi = old_row + 1; + + maximize_int (&r.row0, 0); + maximize_int (&r.col0, 0); + minimize_int (&r.rowi, psppire_axis_unit_count (sheet->vaxis) - 1); + minimize_int (&r.coli, psppire_axis_unit_count (sheet->haxis) - 1); + + + if ( gtk_sheet_range_isvisible (sheet, &r)) + gtk_sheet_range_draw (sheet, &r); + } + sheet->range.row0 = row; sheet->range.col0 = col; sheet->range.rowi = row; @@ -2590,7 +2562,8 @@ change_active_cell (GtkSheet *sheet, gint row, gint col) GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION); - gtk_sheet_show_active_cell (sheet); + gtk_sheet_draw_active_cell (sheet); + gtk_sheet_show_entry_widget (sheet); g_signal_emit (sheet, sheet_signals [ACTIVATE], 0, @@ -2601,7 +2574,7 @@ change_active_cell (GtkSheet *sheet, gint row, gint col) } static void -gtk_sheet_show_active_cell (GtkSheet *sheet) +gtk_sheet_show_entry_widget (GtkSheet *sheet) { GtkEntry *sheet_entry; GtkSheetCellAttr attributes; @@ -2633,9 +2606,6 @@ gtk_sheet_show_active_cell (GtkSheet *sheet) if ( ! text ) text = g_strdup (""); - gtk_entry_set_visibility (sheet_entry, attributes.is_visible); - - if ( GTK_IS_ENTRY (sheet_entry)) { const gchar *old_text = gtk_entry_get_text (GTK_ENTRY (sheet_entry)); @@ -2664,8 +2634,6 @@ gtk_sheet_show_active_cell (GtkSheet *sheet) row, col)); gtk_widget_map (sheet->entry_widget); - gtk_widget_grab_focus (GTK_WIDGET (sheet_entry)); - dispose_string (sheet, text); } @@ -2936,6 +2904,8 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) *range = new_range; } + + static void gtk_sheet_draw_border (GtkSheet *sheet, GtkSheetRange new_range) { @@ -2946,10 +2916,10 @@ gtk_sheet_draw_border (GtkSheet *sheet, GtkSheetRange new_range) gdk_draw_rectangle (sheet->sheet_window, sheet->xor_gc, FALSE, - area.x + 1, - area.y + 1, - area.width - 2, - area.height - 2); + area.x, + area.y, + area.width + 1, + area.height + 1); } @@ -3053,11 +3023,6 @@ gtk_sheet_real_unselect_range (GtkSheet *sheet, g_signal_emit (sheet, sheet_signals[SELECT_COLUMN], 0, -1); g_signal_emit (sheet, sheet_signals[SELECT_ROW], 0, -1); -#if 0 - if (gtk_sheet_range_isvisible (sheet, *range)) - gtk_sheet_draw_backing_pixmap (sheet, *range); -#endif - sheet->range.row0 = -1; sheet->range.rowi = -1; sheet->range.col0 = -1; @@ -3099,27 +3064,27 @@ gtk_sheet_expose (GtkWidget *widget, } - range.row0 = - row_from_ypixel (sheet, - event->area.y + sheet->vadjustment->value); - range.row0--; + { + gint y = event->area.y + sheet->vadjustment->value; + gint x = event->area.x + sheet->hadjustment->value; + + if ( sheet->column_titles_visible) + y -= sheet->column_title_area.height; + + if ( sheet->row_titles_visible) + x -= sheet->row_title_area.width; - range.rowi = - row_from_ypixel (sheet, - event->area.y + - event->area.height + sheet->vadjustment->value); - range.rowi++; + maximize_int (&x, 0); + maximize_int (&y, 0); - range.col0 = - column_from_xpixel (sheet, - event->area.x + sheet->hadjustment->value); - range.col0--; + range.row0 = row_from_ypixel (sheet, y); - range.coli = - column_from_xpixel (sheet, - event->area.x + event->area.width + - sheet->hadjustment->value); - range.coli++; + range.rowi = row_from_ypixel (sheet, y + event->area.height); + + range.col0 = column_from_xpixel (sheet, x); + + range.coli = column_from_xpixel (sheet, x + event->area.width); + } if (event->window == sheet->sheet_window) { @@ -3127,13 +3092,13 @@ gtk_sheet_expose (GtkWidget *widget, if (sheet->state != GTK_SHEET_NORMAL) { - if (gtk_sheet_range_isvisible (sheet, sheet->range)) + if (gtk_sheet_range_isvisible (sheet, &sheet->range)) gtk_sheet_range_draw (sheet, &sheet->range); if (GTK_SHEET_IN_RESIZE (sheet) || GTK_SHEET_IN_DRAG (sheet)) gtk_sheet_range_draw (sheet, &sheet->drag_range); - if (gtk_sheet_range_isvisible (sheet, sheet->range)) + if (gtk_sheet_range_isvisible (sheet, &sheet->range)) gtk_sheet_range_draw_selection (sheet, sheet->range); if (GTK_SHEET_IN_RESIZE (sheet) || GTK_SHEET_IN_DRAG (sheet)) draw_xor_rectangle (sheet, sheet->drag_range); @@ -3146,9 +3111,6 @@ gtk_sheet_expose (GtkWidget *widget, } } - if (sheet->state != GTK_SHEET_NORMAL && GTK_SHEET_IN_SELECTION (sheet)) - gtk_widget_grab_focus (GTK_WIDGET (sheet)); - (* GTK_WIDGET_CLASS (parent_class)->expose_event) (widget, event); return FALSE; @@ -3215,8 +3177,7 @@ gtk_sheet_button_press (GtkWidget *widget, /* press on resize windows */ - if (event->window == sheet->column_title_window && - gtk_sheet_columns_resizable (sheet)) + if (event->window == sheet->column_title_window) { #if 0 gtk_widget_get_pointer (widget, &sheet->x_drag, NULL); @@ -3242,7 +3203,7 @@ gtk_sheet_button_press (GtkWidget *widget, } } - if (event->window == sheet->row_title_window && gtk_sheet_rows_resizable (sheet)) + if (event->window == sheet->row_title_window) { gtk_widget_get_pointer (widget, NULL, &sheet->y_drag); @@ -3279,12 +3240,6 @@ gtk_sheet_button_press (GtkWidget *widget, NULL, NULL, event->time); gtk_grab_add (GTK_WIDGET (sheet)); - /* This seems to be a kludge to work around a problem where the sheet - scrolls to another position. The timeout scrolls it back to its - original posn. JMD 3 July 2007 - */ - gtk_widget_grab_focus (GTK_WIDGET (sheet)); - if (sheet->selection_mode != GTK_SELECTION_SINGLE && sheet->selection_mode != GTK_SELECTION_NONE && sheet->cursor_drag->type == GDK_SIZING && @@ -3360,7 +3315,6 @@ gtk_sheet_button_press (GtkWidget *widget, { veto = gtk_sheet_click_cell (sheet, -1, column); gtk_grab_add (GTK_WIDGET (sheet)); - gtk_widget_grab_focus (GTK_WIDGET (sheet)); GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_SELECTION); } } @@ -3378,7 +3332,6 @@ gtk_sheet_button_press (GtkWidget *widget, { veto = gtk_sheet_click_cell (sheet, row, -1); gtk_grab_add (GTK_WIDGET (sheet)); - gtk_widget_grab_focus (GTK_WIDGET (sheet)); GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_SELECTION); } } @@ -3463,7 +3416,11 @@ gtk_sheet_click_cell (GtkSheet *sheet, gint row, gint column) sheet->range.coli = column; sheet->state = GTK_SHEET_NORMAL; GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_SELECTION); + gtk_sheet_draw_active_cell (sheet); + + gtk_widget_grab_focus (GTK_WIDGET (sheet->entry_widget)); + return TRUE; } @@ -3771,8 +3728,7 @@ gtk_sheet_motion (GtkWidget *widget, GdkEventMotion *event) } } - if (event->window == sheet->column_title_window && - gtk_sheet_columns_resizable (sheet)) + if (event->window == sheet->column_title_window) { if (!GTK_SHEET_IN_SELECTION (sheet) && on_column_boundary (sheet, x, &column)) @@ -3800,8 +3756,7 @@ gtk_sheet_motion (GtkWidget *widget, GdkEventMotion *event) } } - if (event->window == sheet->row_title_window && - gtk_sheet_rows_resizable (sheet)) + if (event->window == sheet->row_title_window) { #if AXIS_TRANSITION if (!GTK_SHEET_IN_SELECTION (sheet) && POSSIBLE_YDRAG (sheet, y, &column)) @@ -4189,6 +4144,7 @@ step_sheet (GtkSheet *sheet, GtkScrollType dir) change_active_cell (sheet, new_cell.row, new_cell.col); + if ( new_cell.col > max_fully_visible_column (sheet)) { glong hpos = @@ -4229,6 +4185,8 @@ step_sheet (GtkSheet *sheet, GtkScrollType dir) gtk_adjustment_set_value (sheet->vadjustment, vpos); } + + gtk_widget_grab_focus (GTK_WIDGET (sheet->entry_widget)); } @@ -4345,14 +4303,6 @@ gtk_sheet_size_allocate (GtkWidget *widget, allocation->width - 2 * border_width, allocation->height - 2 * border_width); - /* use internal allocation structure for all the math - * because it's easier than always subtracting the container - * border width */ - sheet->internal_allocation.x = 0; - sheet->internal_allocation.y = 0; - sheet->internal_allocation.width = allocation->width - 2 * border_width; - sheet->internal_allocation.height = allocation->height - 2 * border_width; - sheet_allocation.x = 0; sheet_allocation.y = 0; sheet_allocation.width = allocation->width - 2 * border_width; @@ -4522,7 +4472,6 @@ gtk_sheet_size_allocate_entry (GtkSheet *sheet) GtkSheetCellAttr attributes = { 0 }; GtkEntry *sheet_entry; - if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; if (!GTK_WIDGET_MAPPED (GTK_WIDGET (sheet))) return; @@ -4533,8 +4482,6 @@ gtk_sheet_size_allocate_entry (GtkSheet *sheet) &attributes) ) return ; - gtk_widget_ensure_style (GTK_WIDGET (sheet_entry)); - if ( GTK_WIDGET_REALIZED (sheet->entry_widget) ) { GtkStyle *style = GTK_WIDGET (sheet_entry)->style; @@ -4545,21 +4492,37 @@ gtk_sheet_size_allocate_entry (GtkSheet *sheet) style->bg[GTK_STATE_ACTIVE] = attributes.background; style->fg[GTK_STATE_ACTIVE] = attributes.foreground; style->text[GTK_STATE_ACTIVE] = attributes.foreground; - - pango_font_description_free (style->font_desc); - g_assert (attributes.font_desc); - style->font_desc = pango_font_description_copy (attributes.font_desc); } rectangle_from_cell (sheet, sheet->active_cell.row, sheet->active_cell.col, &entry_alloc); + entry_alloc.width -= BORDER_WIDTH; + entry_alloc.height -= BORDER_WIDTH; + entry_alloc.x += BORDER_WIDTH / 2; + entry_alloc.y += BORDER_WIDTH / 2; + + gtk_widget_set_size_request (sheet->entry_widget, entry_alloc.width, entry_alloc.height); gtk_widget_size_allocate (sheet->entry_widget, &entry_alloc); } +/* Copy the sheet's font to the entry widget */ +static void +set_entry_widget_font (GtkSheet *sheet) +{ + GtkRcStyle *style = gtk_widget_get_modifier_style (sheet->entry_widget); + + pango_font_description_free (style->font_desc); + style->font_desc = pango_font_description_copy (GTK_WIDGET (sheet)->style->font_desc); + + gtk_widget_modify_style (sheet->entry_widget, style); +} + + + static void create_sheet_entry (GtkSheet *sheet) { @@ -4573,6 +4536,13 @@ create_sheet_entry (GtkSheet *sheet) gtk_widget_size_request (sheet->entry_widget, NULL); + if ( GTK_IS_ENTRY (sheet->entry_widget)) + { + g_object_set (sheet->entry_widget, + "has-frame", FALSE, + NULL); + } + if (GTK_WIDGET_REALIZED (sheet)) { gtk_widget_set_parent_window (sheet->entry_widget, sheet->sheet_window); @@ -4590,6 +4560,8 @@ create_sheet_entry (GtkSheet *sheet) G_CALLBACK (gtk_sheet_entry_changed), sheet); + set_entry_widget_font (sheet); + gtk_widget_show (sheet->entry_widget); } @@ -4692,7 +4664,7 @@ draw_button (GtkSheet *sheet, GdkWindow *window, allocation.y += 2 * sheet->button->style->ythickness; - if (button->label && strlen (button->label)>0) + if (button->label && strlen (button->label) > 0) { PangoRectangle rect; gchar *line = button->label; @@ -4748,7 +4720,7 @@ draw_button (GtkSheet *sheet, GdkWindow *window, static void draw_column_title_buttons_range (GtkSheet *sheet, gint first, gint last) { - GdkRegion *region; + GdkRectangle rect; gint col; if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; @@ -4757,10 +4729,18 @@ draw_column_title_buttons_range (GtkSheet *sheet, gint first, gint last) g_return_if_fail (first >= min_visible_column (sheet)); g_return_if_fail (last <= max_visible_column (sheet)); - region = - gdk_drawable_get_visible_region (GDK_DRAWABLE (sheet->column_title_window)); + rect.y = 0; + rect.height = sheet->column_title_area.height; + rect.x = psppire_axis_pixel_start (sheet->haxis, first) + CELL_SPACING; + rect.width = psppire_axis_pixel_start (sheet->haxis, last) + CELL_SPACING + + psppire_axis_unit_size (sheet->haxis, last); + + rect.x -= sheet->hadjustment->value; + + minimize_int (&rect.width, sheet->column_title_area.width); + maximize_int (&rect.x, 0); - gdk_window_begin_paint_region (sheet->column_title_window, region); + gdk_window_begin_paint_rect (sheet->column_title_window, &rect); for (col = first ; col <= last ; ++col) { @@ -4789,7 +4769,7 @@ draw_column_title_buttons_range (GtkSheet *sheet, gint first, gint last) static void draw_row_title_buttons_range (GtkSheet *sheet, gint first, gint last) { - GdkRegion *region; + GdkRectangle rect; gint row; if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; @@ -4798,13 +4778,18 @@ draw_row_title_buttons_range (GtkSheet *sheet, gint first, gint last) g_return_if_fail (first >= min_visible_row (sheet)); g_return_if_fail (last <= max_visible_row (sheet)); + rect.x = 0; + rect.width = sheet->row_title_area.width; + rect.y = psppire_axis_pixel_start (sheet->vaxis, first) + CELL_SPACING; + rect.height = psppire_axis_pixel_start (sheet->vaxis, last) + CELL_SPACING + + psppire_axis_unit_size (sheet->vaxis, last); - region = - gdk_drawable_get_visible_region (GDK_DRAWABLE (sheet->row_title_window)); - - gdk_window_begin_paint_region (sheet->row_title_window, region); + rect.y -= sheet->vadjustment->value; + minimize_int (&rect.height, sheet->row_title_area.height); + maximize_int (&rect.y, 0); + gdk_window_begin_paint_rect (sheet->row_title_window, &rect); for (row = first; row <= last; ++row) { GdkRectangle allocation; @@ -4836,6 +4821,38 @@ draw_row_title_buttons_range (GtkSheet *sheet, gint first, gint last) * vadjustment_value_changed * hadjustment_value_changed */ + +static void +update_adjustment (GtkAdjustment *adj, PsppireAxis *axis, gint page_size) +{ + double position = + (adj->value + adj->page_size) + / + (adj->upper - adj->lower); + + const glong last_item = psppire_axis_unit_count (axis) - 1; + + if (isnan (position) || position < 0) + position = 0; + + adj->upper = + psppire_axis_pixel_start (axis, last_item) + + + psppire_axis_unit_size (axis, last_item) + ; + + adj->lower = 0; + adj->page_size = page_size; + + adj->value = position * (adj->upper - adj->lower) - adj->page_size; + + if ( adj->value < adj->lower) + adj->value = adj->lower; + + gtk_adjustment_changed (adj); +} + + static void adjust_scrollbars (GtkSheet *sheet) { @@ -4865,39 +4882,23 @@ adjust_scrollbars (GtkSheet *sheet) sheet->column_title_area.height - psppire_axis_unit_size (sheet->vaxis, last_row); - - - sheet->vadjustment->upper = - psppire_axis_pixel_start (sheet->vaxis, last_row) - + - psppire_axis_unit_size (sheet->vaxis, last_row) - ; - - sheet->vadjustment->lower = 0; - sheet->vadjustment->page_size = height; - - g_signal_emit_by_name (sheet->vadjustment, "changed"); + update_adjustment (sheet->vadjustment, sheet->vaxis, height); } if (sheet->hadjustment) { - gint last_col; + gint last_col = psppire_axis_unit_count (sheet->haxis) - 1; sheet->hadjustment->step_increment = 1; sheet->hadjustment->page_increment = width; - last_col = psppire_axis_unit_count (sheet->haxis) - 1; - sheet->hadjustment->upper = psppire_axis_pixel_start (sheet->haxis, last_col) + psppire_axis_unit_size (sheet->haxis, last_col) ; - sheet->hadjustment->lower = 0; - sheet->hadjustment->page_size = width; - - g_signal_emit_by_name (sheet->hadjustment, "changed"); + update_adjustment (sheet->hadjustment, sheet->haxis, width); } } @@ -4924,6 +4925,7 @@ vadjustment_value_changed (GtkAdjustment *adjustment, gtk_sheet_range_draw (sheet, NULL); draw_row_title_buttons (sheet); // size_allocate_global_button (sheet); + gtk_sheet_draw_active_cell (sheet); gdk_window_end_paint (sheet->sheet_window); } @@ -4952,6 +4954,8 @@ hadjustment_value_changed (GtkAdjustment *adjustment, draw_column_title_buttons (sheet); // size_allocate_global_button (sheet); + gtk_sheet_draw_active_cell (sheet); + gdk_window_end_paint (sheet->sheet_window); } @@ -5183,8 +5187,6 @@ gtk_sheet_get_attributes (const GtkSheet *sheet, gint row, gint col, { GdkColor *fg, *bg; const GtkJustification *j ; - const PangoFontDescription *font_desc ; - const GtkSheetCellBorder *border ; GdkColormap *colormap; g_return_val_if_fail (sheet != NULL, FALSE); @@ -5192,7 +5194,6 @@ gtk_sheet_get_attributes (const GtkSheet *sheet, gint row, gint col, if (row < 0 || col < 0) return FALSE; - attr->foreground = GTK_WIDGET (sheet)->style->black; attr->background = sheet->color[BG_COLOR]; @@ -5202,11 +5203,8 @@ gtk_sheet_get_attributes (const GtkSheet *sheet, gint row, gint col, attr->border.join_style = GDK_JOIN_MITER; attr->border.mask = 0; attr->border.color = GTK_WIDGET (sheet)->style->black; - attr->font_desc = GTK_WIDGET (sheet)->style->font_desc; attr->is_editable = g_sheet_model_is_editable (sheet->model, row, col); - attr->is_visible = g_sheet_model_is_visible (sheet->model, row, col); - colormap = gtk_widget_get_colormap (GTK_WIDGET (sheet)); fg = g_sheet_model_get_foreground (sheet->model, row, col); @@ -5230,13 +5228,6 @@ gtk_sheet_get_attributes (const GtkSheet *sheet, gint row, gint col, if (j) attr->justification = *j; - font_desc = g_sheet_model_get_font_desc (sheet->model, row, col); - if ( font_desc ) attr->font_desc = font_desc; - - border = g_sheet_model_get_cell_border (sheet->model, row, col); - - if ( border ) attr->border = *border; - return TRUE; } @@ -5367,7 +5358,7 @@ range_to_text (const GtkSheet *sheet) gint r, c; GString *string; - if ( !gtk_sheet_range_isvisible (sheet, sheet->range)) + if ( !gtk_sheet_range_isvisible (sheet, &sheet->range)) return NULL; string = g_string_sized_new (80); @@ -5393,7 +5384,7 @@ range_to_html (const GtkSheet *sheet) gint r, c; GString *string; - if ( !gtk_sheet_range_isvisible (sheet, sheet->range)) + if ( !gtk_sheet_range_isvisible (sheet, &sheet->range)) return NULL; string = g_string_sized_new (480); @@ -5484,7 +5475,7 @@ gtk_sheet_update_primary_selection (GtkSheet *sheet) clipboard = gtk_widget_get_clipboard (GTK_WIDGET (sheet), GDK_SELECTION_PRIMARY); - if (gtk_sheet_range_isvisible (sheet, sheet->range)) + if (gtk_sheet_range_isvisible (sheet, &sheet->range)) { if (!gtk_clipboard_set_with_owner (clipboard, targets, G_N_ELEMENTS (targets),