X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fgtksheet%2Fgtksheet.c;h=9e12bc92522fe1eedbaca9f140b640b5bcbdac02;hb=ff0677b2004db6ef79acde96ecbb72d146edf7c8;hp=dc9bf25bcf616f232d1725c88861a8b892712fe3;hpb=c5bf90ff8baa7a81274421acb24a915c953e560f;p=pspp diff --git a/lib/gtksheet/gtksheet.c b/lib/gtksheet/gtksheet.c index dc9bf25bcf..9e12bc9252 100644 --- a/lib/gtksheet/gtksheet.c +++ b/lib/gtksheet/gtksheet.c @@ -1,7 +1,3 @@ -#define GDK_MULTIHEAD_SAFE 1 -#define GLIB_DISABLE_DEPRECATED 1 -#define GDK_DISABLE_DEPRECATED 1 -#define GTK_DISABLE_DEPRECATED 1 /* * Copyright (C) 2006, 2008 Free Software Foundation * @@ -56,15 +52,15 @@ #include #include #include -#include "gtkitementry.h" #include "gtksheet.h" #include "gtkextra-marshal.h" #include "gsheetmodel.h" +#include +#include /* sheet flags */ enum { - GTK_SHEET_REDRAW_PENDING = 1 << 0, GTK_SHEET_IN_XDRAG = 1 << 1, GTK_SHEET_IN_YDRAG = 1 << 2, GTK_SHEET_IN_DRAG = 1 << 3, @@ -81,7 +77,6 @@ enum #define GTK_SHEET_IN_DRAG(sheet) (GTK_SHEET_FLAGS (sheet) & GTK_SHEET_IN_DRAG) #define GTK_SHEET_IN_SELECTION(sheet) (GTK_SHEET_FLAGS (sheet) & GTK_SHEET_IN_SELECTION) #define GTK_SHEET_IN_RESIZE(sheet) (GTK_SHEET_FLAGS (sheet) & GTK_SHEET_IN_RESIZE) -#define GTK_SHEET_REDRAW_PENDING(sheet) (GTK_SHEET_FLAGS (sheet) & GTK_SHEET_REDRAW_PENDING) #define CELL_SPACING 1 @@ -89,6 +84,7 @@ enum #define COLUMN_MIN_WIDTH 10 #define COLUMN_TITLES_HEIGHT 4 #define DEFAULT_COLUMN_WIDTH 80 +#define DEFAULT_ROW_HEIGHT 25 static void gtk_sheet_update_primary_selection (GtkSheet *sheet); static void gtk_sheet_column_title_button_draw (GtkSheet *sheet, gint column); @@ -99,8 +95,6 @@ static void gtk_sheet_set_row_height (GtkSheet *sheet, gint row, guint height); -static gboolean gtk_sheet_cell_empty (const GtkSheet *, gint, gint); - static void destroy_hover_window (GtkSheetHoverTitle *); static GtkSheetHoverTitle *create_hover_window (void); @@ -119,29 +113,6 @@ dispose_string (const GtkSheet *sheet, gchar *text) g_free (text); } -static guint -default_row_height (const GtkSheet *sheet) -{ - GtkWidget *widget = GTK_WIDGET (sheet); - - if (!widget->style->font_desc) return 25; - else - { - PangoContext *context = gtk_widget_get_pango_context (widget); - PangoFontMetrics *metrics = - pango_context_get_metrics (context, - widget->style->font_desc, - pango_context_get_language (context)); - - guint val = pango_font_metrics_get_descent (metrics) + - pango_font_metrics_get_ascent (metrics); - - pango_font_metrics_unref (metrics); - - return PANGO_PIXELS (val) + 2 * COLUMN_TITLES_HEIGHT; - } -} - static guint STRING_WIDTH (GtkWidget *widget, const PangoFontDescription *font, const gchar *text) @@ -164,22 +135,31 @@ yyy_row_ypixel_to_row (const GtkSheet *sheet, gint y) { GSheetRow *geo = sheet->row_geometry; - if (y < 0) - { - g_error ("This shouldnt happen"); - return -1; - } + g_return_val_if_fail (y >= 0, -1); return g_sheet_row_pixel_to_row (geo, y); } - +/* Return the lowest row number which is wholly or partially on + the visible range of the sheet */ static inline glong min_visible_row (const GtkSheet *sheet) { return yyy_row_ypixel_to_row (sheet, sheet->vadjustment->value); } +static inline glong +min_fully_visible_row (const GtkSheet *sheet) +{ + glong row = yyy_row_ypixel_to_row (sheet, sheet->vadjustment->value); + + if ( g_sheet_row_start_pixel (sheet->row_geometry, row) < sheet->vadjustment->value) + row++; + + return row; +} + + static inline glong max_visible_row (const GtkSheet *sheet) @@ -190,6 +170,21 @@ max_visible_row (const GtkSheet *sheet) } +static inline glong +max_fully_visible_row (const GtkSheet *sheet) +{ + glong row = max_visible_row (sheet); + + if ( g_sheet_row_start_pixel (sheet->row_geometry, row) + + + g_sheet_row_get_height (sheet->row_geometry, row) + > sheet->vadjustment->value) + row--; + + return row; +} + + /* returns the column index from a x pixel location */ static inline gint column_from_xpixel (const GtkSheet *sheet, gint x) @@ -213,13 +208,28 @@ column_from_xpixel (const GtkSheet *sheet, gint x) } +/* Returns the lowest column number which is wholly or partially + on the sheet */ static inline glong min_visible_column (const GtkSheet *sheet) { return column_from_xpixel (sheet, sheet->hadjustment->value); } +static inline glong +min_fully_visible_column (const GtkSheet *sheet) +{ + glong col = min_visible_column (sheet); + + if ( g_sheet_column_start_pixel (sheet->column_geometry, col) < sheet->hadjustment->value) + col++; + + return col; +} + +/* Returns the highest column number which is wholly or partially + on the sheet */ static inline glong max_visible_column (const GtkSheet *sheet) { @@ -228,6 +238,21 @@ max_visible_column (const GtkSheet *sheet) sheet->hadjustment->page_size); } +static inline glong +max_fully_visible_column (const GtkSheet *sheet) +{ + glong col = max_visible_column (sheet); + + if ( g_sheet_column_start_pixel (sheet->column_geometry, col) + + + g_sheet_column_get_width (sheet->column_geometry, col) + > sheet->hadjustment->value) + col--; + + return col; +} + + /* The size of the region (in pixels) around the row/column boundaries where the height/width may be grabbed to change size */ @@ -368,6 +393,52 @@ POSSIBLE_RESIZE (const GtkSheet *sheet, gint x, gint y, return FALSE; } + +static gboolean +rectangle_from_range (GtkSheet *sheet, const GtkSheetRange *range, + GdkRectangle *r) +{ + g_return_val_if_fail (range, FALSE); + + r->x = g_sheet_column_start_pixel (sheet->column_geometry, range->col0); + r->x -= round (sheet->hadjustment->value); + + if ( sheet->row_titles_visible) + r->x += sheet->row_title_area.width; + + + r->y = g_sheet_row_start_pixel (sheet->row_geometry, range->row0); + r->y -= round (sheet->vadjustment->value); + + if ( sheet->column_titles_visible) + r->y += sheet->column_title_area.height; + + r->width = g_sheet_column_start_pixel (sheet->column_geometry, range->coli) - + g_sheet_column_start_pixel (sheet->column_geometry, range->col0) + + g_sheet_column_get_width (sheet->column_geometry, range->coli); + + r->height = g_sheet_row_start_pixel (sheet->row_geometry, range->rowi) - + g_sheet_row_start_pixel (sheet->row_geometry, range->row0) + + g_sheet_row_get_height (sheet->row_geometry, range->rowi); + + return TRUE; +} + +static gboolean +rectangle_from_cell (GtkSheet *sheet, gint row, gint col, + GdkRectangle *r) +{ + GtkSheetRange range; + g_return_val_if_fail (row >= 0, FALSE); + g_return_val_if_fail (col >= 0, FALSE); + + range.row0 = range.rowi = row; + range.col0 = range.coli = col; + + return rectangle_from_range (sheet, &range, r); +} + + static void gtk_sheet_class_init (GtkSheetClass *klass); static void gtk_sheet_init (GtkSheet *sheet); static void gtk_sheet_dispose (GObject *object); @@ -414,13 +485,9 @@ static gboolean gtk_sheet_cell_isvisible (GtkSheet *sheet, gint row, gint column); /* Drawing Routines */ -/* draw cell background and frame */ -static void gtk_sheet_cell_draw_bg (GtkSheet *sheet, - gint row, gint column); +/* draw cell */ +static void gtk_sheet_cell_draw (GtkSheet *sheet, gint row, gint column); -/* draw cell contents */ -static void gtk_sheet_cell_draw_label (GtkSheet *sheet, - gint row, gint column); /* draw visible part of range. If range == NULL then draw the whole screen */ static void gtk_sheet_range_draw (GtkSheet *sheet, @@ -432,8 +499,6 @@ static void gtk_sheet_range_draw_selection (GtkSheet *sheet, /* Selection */ -static gboolean gtk_sheet_move_query (GtkSheet *sheet, - gint row, gint column); static void gtk_sheet_real_select_range (GtkSheet *sheet, const GtkSheetRange *range); static void gtk_sheet_real_unselect_range (GtkSheet *sheet, @@ -449,10 +514,9 @@ static void gtk_sheet_draw_border (GtkSheet *sheet, static void gtk_sheet_entry_changed (GtkWidget *widget, gpointer data); -static void gtk_sheet_deactivate_cell (GtkSheet *sheet); static void gtk_sheet_hide_active_cell (GtkSheet *sheet); -static gboolean gtk_sheet_activate_cell (GtkSheet *sheet, - gint row, gint col); +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 gboolean gtk_sheet_click_cell (GtkSheet *sheet, @@ -489,12 +553,11 @@ static void global_button_clicked (GtkWidget *widget, static void create_sheet_entry (GtkSheet *sheet); static void gtk_sheet_size_allocate_entry (GtkSheet *sheet); -static void gtk_sheet_entry_set_max_size (GtkSheet *sheet); /* Sheet button gadgets */ -static void size_allocate_column_title_buttons (GtkSheet *sheet); -static void size_allocate_row_title_buttons (GtkSheet *sheet); +static void draw_column_title_buttons (GtkSheet *sheet); +static void draw_row_title_buttons (GtkSheet *sheet); static void size_allocate_global_button (GtkSheet *sheet); @@ -502,13 +565,6 @@ static void gtk_sheet_button_size_request (GtkSheet *sheet, const GtkSheetButton *button, GtkRequisition *requisition); -/* Attributes routines */ -static void init_attributes (const GtkSheet *sheet, - gint col, - GtkSheetCellAttr *attributes); - - -/* Memory allocation routines */ static void gtk_sheet_real_cell_clear (GtkSheet *sheet, gint row, gint column); @@ -535,7 +591,6 @@ enum RESIZE_RANGE, MOVE_RANGE, TRAVERSE, - DEACTIVATE, ACTIVATE, CHANGED, LAST_SIGNAL @@ -879,23 +934,16 @@ gtk_sheet_class_init (GtkSheetClass *klass) G_TYPE_POINTER, G_TYPE_POINTER); - sheet_signals[DEACTIVATE] = - g_signal_new ("deactivate", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST, - offsetof (GtkSheetClass, deactivate), - NULL, NULL, - gtkextra_VOID__INT_INT, - G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT); - sheet_signals[ACTIVATE] = g_signal_new ("activate", G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, offsetof (GtkSheetClass, activate), NULL, NULL, - gtkextra_BOOLEAN__INT_INT, - G_TYPE_BOOLEAN, 2, G_TYPE_INT, G_TYPE_INT); + gtkextra_VOID__INT_INT_INT_INT, + G_TYPE_NONE, 4, + G_TYPE_INT, G_TYPE_INT, + G_TYPE_INT, G_TYPE_INT); sheet_signals[CHANGED] = g_signal_new ("changed", @@ -983,7 +1031,6 @@ gtk_sheet_class_init (GtkSheetClass *klass) klass->resize_range = NULL; klass->move_range = NULL; klass->traverse = NULL; - klass->deactivate = NULL; klass->activate = NULL; klass->changed = NULL; } @@ -1006,7 +1053,7 @@ gtk_sheet_init (GtkSheet *sheet) sheet->column_title_area.x = 0; sheet->column_title_area.y = 0; sheet->column_title_area.width = 0; - sheet->column_title_area.height = default_row_height (sheet); + sheet->column_title_area.height = DEFAULT_ROW_HEIGHT; sheet->row_title_window = NULL; sheet->row_title_area.x = 0; @@ -1030,6 +1077,7 @@ gtk_sheet_init (GtkSheet *sheet) sheet->sheet_window = NULL; sheet->entry_widget = NULL; sheet->entry_container = NULL; + sheet->entry_handler_id = 0; sheet->button = NULL; sheet->hadjustment = NULL; @@ -1088,7 +1136,7 @@ columns_inserted_deleted_callback (GSheetModel *model, gint first_column, adjust_scrollbars (sheet); if (sheet->active_cell.col >= model_columns) - gtk_sheet_activate_cell (sheet, sheet->active_cell.row, model_columns - 1); + change_active_cell (sheet, sheet->active_cell.row, model_columns - 1); for (i = first_column; i <= max_visible_column (sheet); i++) gtk_sheet_column_title_button_draw (sheet, i); @@ -1120,7 +1168,7 @@ rows_inserted_deleted_callback (GSheetModel *model, gint first_row, adjust_scrollbars (sheet); if (sheet->active_cell.row >= model_rows) - gtk_sheet_activate_cell (sheet, model_rows - 1, sheet->active_cell.col); + change_active_cell (sheet, model_rows - 1, sheet->active_cell.col); for (i = first_row; i <= max_visible_row (sheet); i++) gtk_sheet_row_title_button_draw (sheet, i); @@ -1145,13 +1193,14 @@ range_update_callback (GSheetModel *m, gint row0, gint col0, range.rowi = rowi; range.coli = coli; - if ( max_visible_row (sheet) > - g_sheet_model_get_row_count (sheet->model) + 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)) + max_visible_column (sheet) > g_sheet_model_get_column_count (sheet->model)) { - gtk_sheet_move_query (sheet, 0, 0); + gtk_sheet_moveto (sheet, 0, 0, 0, 0); } if ( ( row0 < 0 && col0 < 0 ) || ( rowi < 0 && coli < 0 ) ) @@ -1297,11 +1346,8 @@ gtk_sheet_change_entry (GtkSheet *sheet, GtkType entry_type) if (state == GTK_SHEET_NORMAL) { gtk_sheet_show_active_cell (sheet); - g_signal_connect (gtk_sheet_get_entry (sheet), - "changed", - G_CALLBACK (gtk_sheet_entry_changed), - sheet); } + } void @@ -1374,7 +1420,6 @@ gtk_sheet_autoresize_column (GtkSheet *sheet, gint column) if (text_width > g_sheet_column_get_width (sheet->column_geometry, column) ) { gtk_sheet_set_column_width (sheet, column, text_width); - GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_REDRAW_PENDING); } } @@ -1476,105 +1521,50 @@ gtk_sheet_hide_row_titles (GtkSheet *sheet) } +/* Scroll the sheet so that the cell ROW, COLUMN is visible. + If {ROW,COL}_ALIGN is zero, then the cell will be placed + at the {top,left} of the sheet. If it's 1, then it'll + be placed at the {bottom,right}. + ROW or COL may be -1, in which case scrolling in that dimension + does not occur. + */ void gtk_sheet_moveto (GtkSheet *sheet, gint row, - gint column, + gint col, gfloat row_align, gfloat col_align) { - gint x, y; gint width, height; - gint adjust; - gint min_row, min_col; - - g_return_if_fail (sheet != NULL); - g_return_if_fail (GTK_IS_SHEET (sheet)); - g_return_if_fail (sheet->hadjustment != NULL); - g_return_if_fail (sheet->vadjustment != NULL); - if (row < 0 || row >= g_sheet_row_get_row_count (sheet->row_geometry)) - return; - if (column < 0 || column >= g_sheet_column_get_column_count (sheet->column_geometry)) - return; + g_return_if_fail (row_align >= 0); + g_return_if_fail (col_align >= 0); - gdk_drawable_get_size (sheet->sheet_window, &width, &height); + g_return_if_fail (row_align <= 1); + g_return_if_fail (col_align <= 1); - /* adjust vertical scrollbar */ - if (row >= 0 && row_align >= 0.0) - { - y = g_sheet_row_start_pixel (sheet->row_geometry, row) - - (gint) ( row_align * height + (1.0 - row_align) - * g_sheet_row_get_height (sheet->row_geometry, row)); - - /* This forces the sheet to scroll when you don't see the entire cell */ - min_row = row; - adjust = 0; - if (row_align >= 1.0) - { - while (min_row >= 0 && min_row > min_visible_row (sheet)) - { - adjust += g_sheet_row_get_height (sheet->row_geometry, min_row); + g_return_if_fail (col < + g_sheet_column_get_column_count (sheet->column_geometry)); + g_return_if_fail (row < + g_sheet_row_get_row_count (sheet->row_geometry)); - if (adjust >= height) - { - break; - } - min_row--; - } - min_row = MAX (min_row, 0); - - min_row ++; - - y = g_sheet_row_start_pixel (sheet->row_geometry, min_row) + - g_sheet_row_get_height (sheet->row_geometry, min_row) - 1; - } - - if (y < 0) - sheet->vadjustment->value = 0.0; - else - sheet->vadjustment->value = y; + gdk_drawable_get_size (sheet->sheet_window, &width, &height); - g_signal_emit_by_name (sheet->vadjustment, - "value_changed"); - } + if (row >= 0) + { + gint y = g_sheet_row_start_pixel (sheet->row_geometry, row); - /* adjust horizontal scrollbar */ - if (column >= 0 && col_align >= 0.0) - { - x = g_sheet_column_start_pixel (sheet->column_geometry, column) - - (gint) ( col_align*width + (1.0 - col_align)* - g_sheet_column_get_width (sheet->column_geometry, column)); - - /* This forces the sheet to scroll when you don't see the entire cell */ - min_col = column; - adjust = 0; - if (col_align == 1.0) - { - while (min_col >= 0 && min_col > min_visible_column (sheet)) - { - adjust += g_sheet_column_get_width (sheet->column_geometry, min_col); + gtk_adjustment_set_value (sheet->vadjustment, y - height * row_align); + } - if (adjust >= width) - { - break; - } - min_col--; - } - min_col = MAX (min_col, 0); - x = g_sheet_column_start_pixel (sheet->column_geometry, min_col) + - g_sheet_column_get_width (sheet->column_geometry, min_col) - 1; - } - if (x < 0) - sheet->hadjustment->value = 0.0; - else - sheet->hadjustment->value = x; + if (col >= 0) + { + gint x = g_sheet_column_start_pixel (sheet->column_geometry, col); - g_signal_emit_by_name (sheet->hadjustment, - "value_changed"); - } + gtk_adjustment_set_value (sheet->hadjustment, x - width * col_align); + } } @@ -1609,8 +1599,6 @@ gtk_sheet_select_row (GtkSheet *sheet, gint row) if (sheet->state != GTK_SHEET_NORMAL) gtk_sheet_real_unselect_range (sheet, NULL); - else - gtk_sheet_deactivate_cell (sheet); sheet->state = GTK_SHEET_ROW_SELECTED; sheet->range.row0 = row; @@ -1636,9 +1624,6 @@ gtk_sheet_select_column (GtkSheet *sheet, gint column) if (sheet->state != GTK_SHEET_NORMAL) gtk_sheet_real_unselect_range (sheet, NULL); - else - gtk_sheet_deactivate_cell (sheet); - sheet->state = GTK_SHEET_COLUMN_SELECTED; sheet->range.row0 = 0; @@ -1969,8 +1954,8 @@ gtk_sheet_realize (GtkWidget *widget) sheet->hover_window = create_hover_window (); - size_allocate_row_title_buttons (sheet); - size_allocate_column_title_buttons (sheet); + draw_row_title_buttons (sheet); + draw_column_title_buttons (sheet); gtk_sheet_update_primary_selection (sheet); } @@ -2066,12 +2051,12 @@ gtk_sheet_map (GtkWidget *widget) if (sheet->column_titles_visible) { - size_allocate_column_title_buttons (sheet); + draw_column_title_buttons (sheet); gdk_window_show (sheet->column_title_window); } if (sheet->row_titles_visible) { - size_allocate_row_title_buttons (sheet); + draw_row_title_buttons (sheet); gdk_window_show (sheet->row_title_window); } @@ -2096,9 +2081,9 @@ gtk_sheet_map (GtkWidget *widget) gtk_widget_map (GTK_BIN (sheet->button)->child); gtk_sheet_range_draw (sheet, NULL); - gtk_sheet_activate_cell (sheet, - sheet->active_cell.row, - sheet->active_cell.col); + change_active_cell (sheet, + sheet->active_cell.row, + sheet->active_cell.col); } } @@ -2128,9 +2113,14 @@ gtk_sheet_unmap (GtkWidget *widget) static void -gtk_sheet_cell_draw_bg (GtkSheet *sheet, gint row, gint col) +gtk_sheet_cell_draw (GtkSheet *sheet, gint row, gint col) { - GdkGC *fg_gc, *bg_gc; + PangoLayout *layout; + PangoRectangle text; + gint font_height; + + gchar *label; + GtkSheetCellAttr attributes; GdkRectangle area; @@ -2153,22 +2143,7 @@ gtk_sheet_cell_draw_bg (GtkSheet *sheet, gint row, gint col) gdk_gc_set_foreground (sheet->fg_gc, &attributes.foreground); gdk_gc_set_foreground (sheet->bg_gc, &attributes.background); - fg_gc = sheet->fg_gc; - bg_gc = sheet->bg_gc; - - area.x = g_sheet_column_start_pixel (sheet->column_geometry, col); - area.x -= sheet->hadjustment->value; - - area.y = g_sheet_row_start_pixel (sheet->row_geometry, row); - area.y -= sheet->vadjustment->value; - - area.width = g_sheet_column_get_width (sheet->column_geometry, col); - area.height = g_sheet_row_get_height (sheet->row_geometry, row); - - if (sheet->row_titles_visible) - area.x += sheet->row_title_area.width; - if (sheet->column_titles_visible) - area.y += sheet->column_title_area.height; + rectangle_from_cell (sheet, row, col, &area); gdk_gc_set_line_attributes (sheet->fg_gc, 1, 0, 0, 0); @@ -2182,188 +2157,65 @@ gtk_sheet_cell_draw_bg (GtkSheet *sheet, gint row, gint col) area.x, area.y, area.width, area.height); } -} + // gtk_sheet_cell_draw_label (sheet, row, col); -static void -gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col) -{ - GtkWidget *widget; - GdkRectangle area; - gint i; - gint text_width, text_height, y; - gint size, sizel, sizer; - GdkGC *fg_gc, *bg_gc; - GtkSheetCellAttr attributes; - PangoLayout *layout; - PangoRectangle rect; - PangoRectangle logical_rect; - PangoLayoutLine *line; - PangoFontMetrics *metrics; - PangoContext *context = gtk_widget_get_pango_context (GTK_WIDGET (sheet)); - gint ascent, descent, y_pos; - - gchar *label; - - g_return_if_fail (sheet != NULL); - - if (!GTK_WIDGET_DRAWABLE (sheet)) - return; label = gtk_sheet_cell_get_text (sheet, row, col); - if (!label) + if (NULL == label) return; - if (row < 0 || row >= g_sheet_row_get_row_count (sheet->row_geometry)) return; - if (col < 0 || col >= g_sheet_column_get_column_count (sheet->column_geometry)) return; - - widget = GTK_WIDGET (sheet); - - gtk_sheet_get_attributes (sheet, row, col, &attributes); - - /* select GC for background rectangle */ - gdk_gc_set_foreground (sheet->fg_gc, &attributes.foreground); - gdk_gc_set_foreground (sheet->bg_gc, &attributes.background); - - fg_gc = sheet->fg_gc; - bg_gc = sheet->bg_gc; - - area.x = g_sheet_column_start_pixel (sheet->column_geometry, col); - area.x -= sheet->hadjustment->value; - - area.y = g_sheet_row_start_pixel (sheet->row_geometry, row); - area.y -= sheet->vadjustment->value; - - area.width = g_sheet_column_get_width (sheet->column_geometry, col); - area.height = g_sheet_row_get_height (sheet->row_geometry, row); - 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_get_pixel_extents (layout, NULL, &rect); - - line = pango_layout_get_lines (layout)->data; - pango_layout_line_get_extents (line, NULL, &logical_rect); - - metrics = pango_context_get_metrics (context, - attributes.font_desc, - pango_context_get_language (context)); - - ascent = pango_font_metrics_get_ascent (metrics) / PANGO_SCALE; - descent = pango_font_metrics_get_descent (metrics) / PANGO_SCALE; - - pango_font_metrics_unref (metrics); - /* Align primarily for locale's ascent / descent */ + pango_layout_get_pixel_extents (layout, NULL, &text); - logical_rect.height /= PANGO_SCALE; - logical_rect.y /= PANGO_SCALE; - y_pos = area.height - logical_rect.height; + gdk_gc_set_clip_rectangle (sheet->fg_gc, &area); - if (logical_rect.height > area.height) - y_pos = (logical_rect.height - area.height - 2 * COLUMN_TITLES_HEIGHT) / 2; - else if (y_pos < 0) - y_pos = 0; - else if (y_pos + logical_rect.height > area.height) - y_pos = area.height - logical_rect.height; + font_height = pango_font_description_get_size (attributes.font_desc); + if ( !pango_font_description_get_size_is_absolute (attributes.font_desc)) + font_height /= PANGO_SCALE; - text_width = rect.width; - text_height = rect.height; - y = area.y + y_pos - COLUMN_TITLES_HEIGHT; + /* Centre the text vertically */ + area.y += (area.height - font_height) / 2.0; switch (attributes.justification) { case GTK_JUSTIFY_RIGHT: - size = area.width; - area.x +=area.width; - { - for (i = col - 1; i >= min_visible_column (sheet); i--) - { - if ( !gtk_sheet_cell_empty (sheet, row, i)) break; - if (size >= text_width + COLUMN_TITLES_HEIGHT) break; - size += g_sheet_column_get_width (sheet->column_geometry, i); - g_sheet_column_set_right_text_column (sheet->column_geometry, i, - MAX (col, - g_sheet_column_get_right_text_column (sheet->column_geometry, i))); - } - area.width = size; - } - area.x -= size; + area.x += area.width - text.width; break; case GTK_JUSTIFY_CENTER: - sizel = area.width / 2; - sizer = area.width / 2; - area.x += area.width / 2; - { - for (i = col + 1; i <= max_visible_column (sheet); i++) - { - if ( ! gtk_sheet_cell_empty (sheet, row, i)) break; - if (sizer >= text_width / 2) break; - sizer += g_sheet_column_get_width (sheet->column_geometry, i); - g_sheet_column_set_left_text_column (sheet->column_geometry, i, - MIN ( - col, - g_sheet_column_get_left_text_column (sheet->column_geometry, i))); - } - for (i = col - 1; i >= min_visible_column (sheet); i--) - { - if ( ! gtk_sheet_cell_empty (sheet, row, i)) break; - if (sizel >= text_width / 2) break; - sizel += g_sheet_column_get_width (sheet->column_geometry, i); - g_sheet_column_set_right_text_column (sheet->column_geometry, i, - MAX (col, - g_sheet_column_get_right_text_column (sheet->column_geometry, i))); - } - size = MIN (sizel, sizer); - } - area.x -= sizel; - area.width = sizel + sizer; + area.x += (area.width - text.width) / 2.0; break; case GTK_JUSTIFY_LEFT: + /* Do nothing */ + break; default: - size = area.width; - { - for (i = col + 1; i <= max_visible_column (sheet); i++) - { - if (! gtk_sheet_cell_empty (sheet, row, i)) break; - if (size >= text_width + COLUMN_TITLES_HEIGHT) break; - size += g_sheet_column_get_width (sheet->column_geometry, i); - g_sheet_column_set_left_text_column (sheet->column_geometry, i, - MIN ( - col, - g_sheet_column_get_left_text_column (sheet->column_geometry, i))); - - } - area.width = size; - } + g_critical ("Unhandled justification %d in column %d\n", + attributes.justification, col); break; } - if (sheet->row_titles_visible) - area.x += sheet->row_title_area.width; - if (sheet->column_titles_visible) - area.y += sheet->column_title_area.height; - - gdk_gc_set_clip_rectangle (fg_gc, &area); - - gdk_draw_layout (sheet->sheet_window, fg_gc, + gdk_draw_layout (sheet->sheet_window, sheet->fg_gc, area.x, area.y, layout); - gdk_gc_set_clip_rectangle (fg_gc, NULL); + gdk_gc_set_clip_rectangle (sheet->fg_gc, NULL); g_object_unref (layout); - } + + static void gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range) { gint i, j; - gint width, height; - gint x, y; + + GdkRectangle area; GtkSheetRange drawing_range; g_return_if_fail (sheet != NULL); @@ -2380,8 +2232,8 @@ gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range) drawing_range.rowi = MIN (max_visible_row (sheet), g_sheet_row_get_row_count (sheet->row_geometry) - 1); drawing_range.coli = max_visible_column (sheet); - gdk_drawable_get_size (sheet->sheet_window, &width, &height); - x = y = 0; + gdk_drawable_get_size (sheet->sheet_window, &area.width, &area.height); + area.x = area.y = 0; } else { @@ -2390,37 +2242,21 @@ 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)); - x = g_sheet_column_start_pixel (sheet->column_geometry, - drawing_range.col0); - - y = g_sheet_row_start_pixel (sheet->row_geometry, - drawing_range.row0); - - - width = g_sheet_column_start_pixel (sheet->column_geometry, - drawing_range.coli + 1) - x; - height = g_sheet_row_start_pixel (sheet->row_geometry, - drawing_range.rowi + 1) - y; - - if ( sheet->column_titles_visible) - y += sheet->column_title_area.height; - - if ( sheet->row_titles_visible) - x += sheet->row_title_area.width; + rectangle_from_range (sheet, &drawing_range, &area); } + gdk_draw_rectangle (sheet->sheet_window, GTK_WIDGET (sheet)->style->white_gc, TRUE, - x, y, - width, height); + area.x, area.y, + area.width, area.height); for (i = drawing_range.row0; i <= drawing_range.rowi; i++) for (j = drawing_range.col0; j <= drawing_range.coli; j++) { - gtk_sheet_cell_draw_bg (sheet, i, j); - gtk_sheet_cell_draw_label (sheet, i, j); + gtk_sheet_cell_draw (sheet, i, j); } if (sheet->state != GTK_SHEET_NORMAL && @@ -2467,21 +2303,7 @@ gtk_sheet_range_draw_selection (GtkSheet *sheet, GtkSheetRange range) { if (gtk_sheet_cell_get_state (sheet, i, j) == GTK_STATE_SELECTED) { - area.x = g_sheet_column_start_pixel (sheet->column_geometry, j); - if ( sheet->row_titles_visible) - area.x += sheet->row_title_area.width; - - area.x -= sheet->hadjustment->value; - - area.y = g_sheet_row_start_pixel (sheet->row_geometry, i); - if ( sheet->column_titles_visible) - area.y += sheet->column_title_area.height; - - area.y -= sheet->vadjustment->value; - - - area.width= g_sheet_column_get_width (sheet->column_geometry, j); - area.height = g_sheet_row_get_height (sheet->row_geometry, i); + rectangle_from_cell (sheet, i, j, &area); if (i == sheet->range.row0) { @@ -2549,7 +2371,9 @@ gtk_sheet_set_cell (GtkSheet *sheet, gint row, gint col, old_text = g_sheet_model_get_string (model, row, col); if (0 != safe_strcmp (old_text, text)) - changed = g_sheet_model_set_string (model, text, row, col); + { + changed = g_sheet_model_set_string (model, text, row, col); + } if ( g_sheet_model_free_strings (model)) g_free (old_text); @@ -2596,21 +2420,6 @@ gtk_sheet_real_cell_clear (GtkSheet *sheet, gint row, gint column) dispose_string (sheet, old_text); } - - -static gboolean -gtk_sheet_cell_empty (const GtkSheet *sheet, gint row, gint col) -{ - gboolean empty; - char *text = gtk_sheet_cell_get_text (sheet, row, col); - empty = (text == NULL ); - - dispose_string (sheet, text); - - return empty; -} - - gchar * gtk_sheet_cell_get_text (const GtkSheet *sheet, gint row, gint col) { @@ -2755,33 +2564,33 @@ gtk_sheet_get_cell_area (GtkSheet *sheet, return TRUE; } -gboolean +void gtk_sheet_set_active_cell (GtkSheet *sheet, gint row, gint col) { - g_return_val_if_fail (sheet != NULL, 0); - g_return_val_if_fail (GTK_IS_SHEET (sheet), 0); + g_return_if_fail (sheet != NULL); + g_return_if_fail (GTK_IS_SHEET (sheet)); + + if (row < -1 || col < -1) + return; - if (row < -1 || col < -1) return FALSE; if (row >= g_sheet_row_get_row_count (sheet->row_geometry) || col >= g_sheet_column_get_column_count (sheet->column_geometry)) - return FALSE; + return; sheet->active_cell.row = row; sheet->active_cell.col = col; if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) - return TRUE; - - gtk_sheet_deactivate_cell (sheet); + return; if ( row == -1 || col == -1) { gtk_sheet_hide_active_cell (sheet); - return TRUE; + return; } - return gtk_sheet_activate_cell (sheet, row, col); + change_active_cell (sheet, row, col); } void @@ -2833,55 +2642,11 @@ gtk_sheet_entry_changed (GtkWidget *widget, gpointer data) } -static void -gtk_sheet_deactivate_cell (GtkSheet *sheet) -{ - g_return_if_fail (sheet != NULL); - g_return_if_fail (GTK_IS_SHEET (sheet)); - - if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return ; - if (sheet->state != GTK_SHEET_NORMAL) return ; - - - if ( sheet->active_cell.row == -1 || sheet->active_cell.col == -1 ) - return ; - - /* - g_print ("%s\n", __FUNCTION__); - - - GtkSheetRange r; - r.col0 = r.coli = sheet->active_cell.col; - r.row0 = r.rowi = sheet->active_cell.row; - gtk_sheet_range_draw (sheet, &r); - */ - - - g_signal_emit (sheet, sheet_signals[DEACTIVATE], 0, - sheet->active_cell.row, - sheet->active_cell.col); - - - g_signal_handlers_disconnect_by_func (gtk_sheet_get_entry (sheet), - G_CALLBACK (gtk_sheet_entry_changed), - sheet); - - gtk_sheet_hide_active_cell (sheet); - sheet->active_cell.row = -1; - sheet->active_cell.col = -1; - -#if 0 - if (GTK_SHEET_REDRAW_PENDING (sheet)) - { - GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_REDRAW_PENDING); - gtk_sheet_range_draw (sheet, NULL); - } -#endif -} - static void gtk_sheet_hide_active_cell (GtkSheet *sheet) { + GdkRectangle area; + if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; @@ -2891,34 +2656,48 @@ gtk_sheet_hide_active_cell (GtkSheet *sheet) gtk_widget_hide (sheet->entry_widget); gtk_widget_unmap (sheet->entry_widget); - gtk_sheet_cell_draw_bg (sheet, sheet->active_cell.row, - sheet->active_cell.col); + 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); } -static gboolean -gtk_sheet_activate_cell (GtkSheet *sheet, gint row, gint col) +static void +change_active_cell (GtkSheet *sheet, gint row, gint col) { - gboolean veto = TRUE; + gint old_row, old_col; + glong old_handler_id = sheet->entry_handler_id; - g_return_val_if_fail (sheet != NULL, FALSE); - g_return_val_if_fail (GTK_IS_SHEET (sheet), FALSE); + g_return_if_fail (GTK_IS_SHEET (sheet)); - if (row < 0 || col < 0) return FALSE; + if (row < 0 || col < 0) + return; if ( row > g_sheet_row_get_row_count (sheet->row_geometry) || col > g_sheet_column_get_column_count (sheet->column_geometry)) - return FALSE; + return; - if (!veto) return FALSE; if (sheet->state != GTK_SHEET_NORMAL) { sheet->state = GTK_SHEET_NORMAL; 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; + sheet->range.row0 = row; sheet->range.col0 = col; sheet->range.rowi = row; @@ -2932,14 +2711,12 @@ gtk_sheet_activate_cell (GtkSheet *sheet, gint row, gint col) gtk_sheet_show_active_cell (sheet); - g_signal_connect (gtk_sheet_get_entry (sheet), - "changed", - G_CALLBACK (gtk_sheet_entry_changed), - sheet); - g_signal_emit (sheet, sheet_signals [ACTIVATE], 0, row, col, &veto); + g_signal_emit (sheet, sheet_signals [ACTIVATE], 0, + row, col, old_row, old_col); - return TRUE; + if ( old_handler_id == sheet->entry_handler_id) + g_signal_handler_unblock (sheet->entry_widget, sheet->entry_handler_id); } static void @@ -2948,8 +2725,6 @@ gtk_sheet_show_active_cell (GtkSheet *sheet) GtkEntry *sheet_entry; GtkSheetCellAttr attributes; gchar *text = NULL; - const gchar *old_text; - GtkJustification justification; gint row, col; g_return_if_fail (sheet != NULL); @@ -2972,8 +2747,6 @@ gtk_sheet_show_active_cell (GtkSheet *sheet) gtk_sheet_get_attributes (sheet, row, col, &attributes); - justification = GTK_JUSTIFY_LEFT; - text = gtk_sheet_cell_get_text (sheet, row, col); if ( ! text ) @@ -2982,17 +2755,27 @@ gtk_sheet_show_active_cell (GtkSheet *sheet) gtk_entry_set_visibility (GTK_ENTRY (sheet_entry), attributes.is_visible); - /*** Added by John Gotts. Mar 25, 2005 *********/ - old_text = gtk_entry_get_text (GTK_ENTRY (sheet_entry)); - if (strcmp (old_text, text) != 0) + if ( GTK_IS_ENTRY (sheet_entry)) { - if (!GTK_IS_ITEM_ENTRY (sheet_entry)) + const gchar *old_text = gtk_entry_get_text (GTK_ENTRY (sheet_entry)); + if (strcmp (old_text, text) != 0) gtk_entry_set_text (GTK_ENTRY (sheet_entry), text); - else - gtk_item_entry_set_text (GTK_ITEM_ENTRY (sheet_entry), text, justification); + + switch (attributes.justification) + { + case GTK_JUSTIFY_RIGHT: + gtk_entry_set_alignment (GTK_ENTRY (sheet_entry), 1.0); + break; + case GTK_JUSTIFY_CENTER: + gtk_entry_set_alignment (GTK_ENTRY (sheet_entry), 0.5); + break; + case GTK_JUSTIFY_LEFT: + default: + gtk_entry_set_alignment (GTK_ENTRY (sheet_entry), 0.0); + break; + } } - gtk_sheet_entry_set_max_size (sheet); gtk_sheet_size_allocate_entry (sheet); gtk_widget_map (sheet->entry_widget); @@ -3000,6 +2783,7 @@ gtk_sheet_show_active_cell (GtkSheet *sheet) gtk_widget_grab_focus (GTK_WIDGET (sheet_entry)); dispose_string (sheet, text); + } static void @@ -3016,7 +2800,8 @@ gtk_sheet_draw_active_cell (GtkSheet *sheet) if (row < 0 || col < 0) return; - if (!gtk_sheet_cell_isvisible (sheet, row, col)) return; + if (!gtk_sheet_cell_isvisible (sheet, row, col)) + return; range.col0 = range.coli = col; range.row0 = range.rowi = row; @@ -3272,56 +3057,16 @@ static void gtk_sheet_draw_border (GtkSheet *sheet, GtkSheetRange new_range) { GdkRectangle area; - gint width, height; - - gint x = g_sheet_column_start_pixel (sheet->column_geometry, new_range.col0); - gint y = g_sheet_row_start_pixel (sheet->row_geometry, new_range.row0); - - if ( sheet->row_titles_visible) - x += sheet->row_title_area.width; - - x -= sheet->hadjustment->value; - - if ( sheet->column_titles_visible) - y += sheet->column_title_area.height; - - y -= sheet->vadjustment->value; - - width = g_sheet_column_start_pixel (sheet->column_geometry, new_range.coli) - - g_sheet_column_start_pixel (sheet->column_geometry, new_range.col0) - + - g_sheet_column_get_width (sheet->column_geometry, new_range.coli); - - height = g_sheet_row_start_pixel (sheet->row_geometry, new_range.rowi) - - g_sheet_row_start_pixel (sheet->row_geometry, new_range.row0) - + - g_sheet_row_get_height (sheet->row_geometry, new_range.rowi); - - area.x = g_sheet_column_start_pixel (sheet->column_geometry, min_visible_column (sheet)); - if ( sheet->row_titles_visible) - area.x += sheet->row_title_area.width; - area.x -= sheet->hadjustment->value; - - area.y = g_sheet_row_start_pixel (sheet->row_geometry, min_visible_row (sheet)); - if ( sheet->column_titles_visible) - area.y += sheet->column_title_area.height; - - area.y -= sheet->vadjustment->value; - - - gdk_drawable_get_size (sheet->sheet_window, &area.width, &area.height); - - gdk_gc_set_clip_rectangle (sheet->xor_gc, &area); + rectangle_from_range (sheet, &new_range, &area); gdk_draw_rectangle (sheet->sheet_window, sheet->xor_gc, FALSE, - x, y, - width - 2, - height - 2); - - gdk_gc_set_clip_rectangle (sheet->xor_gc, NULL); + area.x + 1, + area.y + 1, + area.width - 2, + area.height - 2); } @@ -3381,8 +3126,6 @@ gtk_sheet_select_range (GtkSheet *sheet, const GtkSheetRange *range) if (sheet->state != GTK_SHEET_NORMAL) gtk_sheet_real_unselect_range (sheet, NULL); - else - gtk_sheet_deactivate_cell (sheet); sheet->range.row0 = range->row0; sheet->range.rowi = range->rowi; @@ -3406,8 +3149,8 @@ gtk_sheet_unselect_range (GtkSheet *sheet) gtk_sheet_real_unselect_range (sheet, NULL); sheet->state = GTK_STATE_NORMAL; - gtk_sheet_activate_cell (sheet, - sheet->active_cell.row, sheet->active_cell.col); + change_active_cell (sheet, + sheet->active_cell.row, sheet->active_cell.col); } @@ -3564,10 +3307,12 @@ gtk_sheet_button_press (GtkWidget *widget, sheet_signals[BUTTON_EVENT_COLUMN], 0, column, event); - if ( event->type == GDK_2BUTTON_PRESS && event->button == 1) - g_signal_emit (sheet, - sheet_signals[DOUBLE_CLICK_COLUMN], 0, column); - + if (g_sheet_column_get_sensitivity (sheet->column_geometry, column)) + { + if ( event->type == GDK_2BUTTON_PRESS && event->button == 1) + g_signal_emit (sheet, + sheet_signals[DOUBLE_CLICK_COLUMN], 0, column); + } } else if (event->window == sheet->row_title_window) { @@ -3575,11 +3320,14 @@ gtk_sheet_button_press (GtkWidget *widget, sheet_signals[BUTTON_EVENT_ROW], 0, row, event); - if ( event->type == GDK_2BUTTON_PRESS && event->button == 1) - g_signal_emit (sheet, - sheet_signals[DOUBLE_CLICK_ROW], 0, row); - } + if (g_sheet_row_get_sensitivity (sheet->row_geometry, row)) + { + if ( event->type == GDK_2BUTTON_PRESS && event->button == 1) + g_signal_emit (sheet, + sheet_signals[DOUBLE_CLICK_ROW], 0, row); + } + } gdk_window_get_pointer (widget->window, NULL, NULL, &mods); @@ -3670,7 +3418,6 @@ gtk_sheet_button_press (GtkWidget *widget, { row = sheet->active_cell.row; column = sheet->active_cell.col; - gtk_sheet_deactivate_cell (sheet); sheet->active_cell.row = row; sheet->active_cell.col = column; sheet->drag_range = sheet->range; @@ -3698,7 +3445,6 @@ gtk_sheet_button_press (GtkWidget *widget, { row = sheet->active_cell.row; column = sheet->active_cell.col; - gtk_sheet_deactivate_cell (sheet); sheet->active_cell.row = row; sheet->active_cell.col = column; sheet->drag_range = sheet->range; @@ -3787,7 +3533,7 @@ gtk_sheet_click_cell (GtkSheet *sheet, gint row, gint column) row = sheet->active_cell.row; column = sheet->active_cell.col; - gtk_sheet_activate_cell (sheet, row, column); + change_active_cell (sheet, row, column); return FALSE; } @@ -3816,34 +3562,28 @@ gtk_sheet_click_cell (GtkSheet *sheet, gint row, gint column) return TRUE; } - if (row != -1 && column != -1) + if (sheet->state != GTK_SHEET_NORMAL) { - if (sheet->state != GTK_SHEET_NORMAL) - { - sheet->state = GTK_SHEET_NORMAL; - gtk_sheet_real_unselect_range (sheet, NULL); - } - else - { - gtk_sheet_deactivate_cell (sheet); - gtk_sheet_activate_cell (sheet, row, column); - } - - sheet->active_cell.row = row; - sheet->active_cell.col = column; - sheet->selection_cell.row = row; - sheet->selection_cell.col = column; - sheet->range.row0 = row; - sheet->range.col0 = column; - sheet->range.rowi = row; - sheet->range.coli = column; sheet->state = GTK_SHEET_NORMAL; - GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_SELECTION); - gtk_sheet_draw_active_cell (sheet); - return TRUE; + gtk_sheet_real_unselect_range (sheet, NULL); + } + else + { + change_active_cell (sheet, row, column); } - g_assert_not_reached (); + sheet->active_cell.row = row; + sheet->active_cell.col = column; + sheet->selection_cell.row = row; + sheet->selection_cell.col = column; + sheet->range.row0 = row; + sheet->range.col0 = column; + sheet->range.rowi = row; + sheet->range.coli = column; + sheet->state = GTK_SHEET_NORMAL; + GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_SELECTION); + gtk_sheet_draw_active_cell (sheet); + return TRUE; } static gint @@ -3947,7 +3687,7 @@ gtk_sheet_button_release (GtkWidget *widget, { GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION); gdk_display_pointer_ungrab (display, event->time); - gtk_sheet_activate_cell (sheet, sheet->active_cell.row, + change_active_cell (sheet, sheet->active_cell.row, sheet->active_cell.col); } @@ -4413,71 +4153,6 @@ gtk_sheet_crossing_notify (GtkWidget *widget, return TRUE; } - -static gboolean -gtk_sheet_move_query (GtkSheet *sheet, gint row, gint column) -{ - gint height, width; - gint new_row = row; - gint new_col = column; - - gint row_move = FALSE; - gint column_move = FALSE; - gfloat row_align = -1.0; - gfloat col_align = -1.0; - - if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) - return FALSE; - - gdk_drawable_get_size (sheet->sheet_window, &width, &height); - - if (row >= max_visible_row (sheet) && - sheet->state != GTK_SHEET_COLUMN_SELECTED) - { - row_align = 1.; - new_row = MIN (g_sheet_row_get_row_count (sheet->row_geometry) - 1, row + 1); - row_move = TRUE; - if (max_visible_row (sheet) == g_sheet_row_get_row_count (sheet->row_geometry) - 1 && - g_sheet_row_start_pixel (sheet->row_geometry, g_sheet_row_get_row_count (sheet->row_geometry) - 1) + - g_sheet_row_get_height (sheet->row_geometry, g_sheet_row_get_row_count (sheet->row_geometry) - 1) < height) - { - row_move = FALSE; - row_align = -1.; - } - } - - if (row < min_visible_row (sheet) && sheet->state != GTK_SHEET_COLUMN_SELECTED) - { - row_align= 0.; - row_move = TRUE; - } - if (column >= max_visible_column (sheet) && sheet->state != GTK_SHEET_ROW_SELECTED) - { - col_align = 1.; - new_col = MIN (g_sheet_column_get_column_count (sheet->column_geometry) - 1, column + 1); - column_move = TRUE; - if (max_visible_column (sheet) == (g_sheet_column_get_column_count (sheet->column_geometry) - 1) && - g_sheet_column_start_pixel (sheet->column_geometry, g_sheet_column_get_column_count (sheet->column_geometry) - 1) + - g_sheet_column_get_width (sheet->column_geometry, g_sheet_column_get_column_count (sheet->column_geometry) - 1) < width) - { - column_move = FALSE; - col_align = -1.; - } - } - if (column < min_visible_column (sheet) && sheet->state != GTK_SHEET_ROW_SELECTED) - { - col_align = 0.0; - column_move = TRUE; - } - - if (row_move || column_move) - { - gtk_sheet_moveto (sheet, new_row, new_col, row_align, col_align); - } - - return (row_move || column_move); -} - static void gtk_sheet_extend_selection (GtkSheet *sheet, gint row, gint column) { @@ -4490,7 +4165,6 @@ gtk_sheet_extend_selection (GtkSheet *sheet, gint row, gint column) if (sheet->selection_mode == GTK_SELECTION_SINGLE) return; - gtk_sheet_move_query (sheet, row, column); gtk_widget_grab_focus (GTK_WIDGET (sheet)); if (GTK_SHEET_IN_DRAG (sheet)) return; @@ -4582,55 +4256,101 @@ page_vertical (GtkSheet *sheet, GtkScrollType dir) new_row = yyy_row_ypixel_to_row (sheet, vpixel); - gtk_sheet_activate_cell (sheet, new_row, + change_active_cell (sheet, new_row, sheet->active_cell.col); } static void -step_horizontal (GtkSheet *sheet, GtkScrollType dir) +step_sheet (GtkSheet *sheet, GtkScrollType dir) { + gint current_row = sheet->active_cell.row; + gint current_col = sheet->active_cell.col; + gint new_row = current_row; + gint new_col = current_col; + gboolean forbidden = FALSE; + switch ( dir) { + case GTK_SCROLL_STEP_DOWN: + new_row++; + break; + case GTK_SCROLL_STEP_UP: + new_row--; + break; case GTK_SCROLL_STEP_RIGHT: - - gtk_sheet_activate_cell (sheet, - sheet->active_cell.row, - sheet->active_cell.col + 1); + new_col++; break; case GTK_SCROLL_STEP_LEFT: - - gtk_sheet_activate_cell (sheet, - sheet->active_cell.row, - sheet->active_cell.col - 1); + new_col--; break; - default: g_assert_not_reached (); break; } - if ( sheet->active_cell.col >= max_visible_column (sheet)) + + maximize_int (&new_row, 0); + maximize_int (&new_col, 0); + + minimize_int (&new_row, + g_sheet_row_get_row_count (sheet->row_geometry) - 1); + + minimize_int (&new_col, + g_sheet_column_get_column_count (sheet->column_geometry) - 1); + + g_signal_emit (sheet, sheet_signals[TRAVERSE], 0, + current_row, current_col, + &new_row, &new_col, &forbidden); + + if (forbidden) + return; + + change_active_cell (sheet, new_row, new_col); + + if ( new_col > max_fully_visible_column (sheet)) { glong hpos = g_sheet_column_start_pixel (sheet->column_geometry, - sheet->active_cell.col + 1); + new_col + 1); hpos -= sheet->hadjustment->page_size; gtk_adjustment_set_value (sheet->hadjustment, hpos); } - else if ( sheet->active_cell.col <= min_visible_column (sheet)) + else if ( new_col < min_fully_visible_column (sheet)) { glong hpos = g_sheet_column_start_pixel (sheet->column_geometry, - sheet->active_cell.col); + new_col); gtk_adjustment_set_value (sheet->hadjustment, hpos); } + + + if ( new_row > max_fully_visible_row (sheet)) + { + glong vpos = + g_sheet_row_start_pixel (sheet->row_geometry, + new_row + 1); + vpos -= sheet->vadjustment->page_size; + + gtk_adjustment_set_value (sheet->vadjustment, + vpos); + } + else if ( new_row < min_fully_visible_row (sheet)) + { + glong vpos = + g_sheet_row_start_pixel (sheet->row_geometry, + new_row); + + gtk_adjustment_set_value (sheet->vadjustment, + vpos); + } } + static gboolean gtk_sheet_key_press (GtkWidget *widget, GdkEventKey *key) @@ -4643,33 +4363,18 @@ gtk_sheet_key_press (GtkWidget *widget, { case GDK_Tab: case GDK_Right: - step_horizontal (sheet, GTK_SCROLL_STEP_RIGHT); + step_sheet (sheet, GTK_SCROLL_STEP_RIGHT); break; case GDK_ISO_Left_Tab: case GDK_Left: - step_horizontal (sheet, GTK_SCROLL_STEP_LEFT); + step_sheet (sheet, GTK_SCROLL_STEP_LEFT); break; - case GDK_Return: case GDK_Down: - gtk_sheet_activate_cell (sheet, - sheet->active_cell.row + ROWS_PER_STEP, - sheet->active_cell.col); - - if ( sheet->active_cell.row >= max_visible_row (sheet)) - gtk_adjustment_set_value (sheet->vadjustment, - sheet->vadjustment->value + - sheet->vadjustment->step_increment); + step_sheet (sheet, GTK_SCROLL_STEP_DOWN); break; case GDK_Up: - gtk_sheet_activate_cell (sheet, - sheet->active_cell.row - ROWS_PER_STEP, - sheet->active_cell.col); - - if ( sheet->active_cell.row < min_visible_row (sheet)) - gtk_adjustment_set_value (sheet->vadjustment, - sheet->vadjustment->value - - sheet->vadjustment->step_increment); + step_sheet (sheet, GTK_SCROLL_STEP_UP); break; case GDK_Page_Down: @@ -4683,7 +4388,7 @@ gtk_sheet_key_press (GtkWidget *widget, gtk_adjustment_set_value (sheet->vadjustment, sheet->vadjustment->lower); - gtk_sheet_activate_cell (sheet, 0, + change_active_cell (sheet, 0, sheet->active_cell.col); break; @@ -4695,11 +4400,13 @@ gtk_sheet_key_press (GtkWidget *widget, sheet->vadjustment->page_increment); /* - gtk_sheet_activate_cell (sheet, + change_active_cellx (sheet, g_sheet_row_get_row_count (sheet->row_geometry) - 1, sheet->active_cell.col); */ - + break; + case GDK_Delete: + gtk_sheet_real_cell_clear (sheet, sheet->active_cell.row, sheet->active_cell.col); break; default: return FALSE; @@ -4722,7 +4429,7 @@ gtk_sheet_size_request (GtkWidget *widget, sheet = GTK_SHEET (widget); requisition->width = 3 * DEFAULT_COLUMN_WIDTH; - requisition->height = 3 * default_row_height (sheet); + requisition->height = 3 * DEFAULT_ROW_HEIGHT; /* compute the size of the column title area */ if (sheet->column_titles_visible) @@ -4798,7 +4505,7 @@ gtk_sheet_size_allocate (GtkWidget *widget, /* column button allocation */ - size_allocate_column_title_buttons (sheet); + draw_column_title_buttons (sheet); /* position the window which holds the row title buttons */ sheet->row_title_area.x = 0; @@ -4820,15 +4527,15 @@ gtk_sheet_size_allocate (GtkWidget *widget, /* row button allocation */ - size_allocate_row_title_buttons (sheet); - size_allocate_column_title_buttons (sheet); + draw_row_title_buttons (sheet); + draw_column_title_buttons (sheet); /* set the scrollbars adjustments */ adjust_scrollbars (sheet); } static void -size_allocate_column_title_buttons (GtkSheet *sheet) +draw_column_title_buttons (GtkSheet *sheet) { gint i; gint x, width; @@ -4872,7 +4579,7 @@ size_allocate_column_title_buttons (GtkSheet *sheet) } static void -size_allocate_row_title_buttons (GtkSheet *sheet) +draw_row_title_buttons (GtkSheet *sheet) { gint i; gint y = 0; @@ -4922,13 +4629,10 @@ size_allocate_row_title_buttons (GtkSheet *sheet) static void gtk_sheet_size_allocate_entry (GtkSheet *sheet) { - GtkAllocation shentry_allocation; + GtkAllocation entry_alloc; GtkSheetCellAttr attributes = { 0 }; GtkEntry *sheet_entry; - GtkStyle *style = NULL, *previous_style = NULL; - gint row, col; - gint size, max_size, text_size, column_width; - const gchar *text; + if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; if (!GTK_WIDGET_MAPPED (GTK_WIDGET (sheet))) return; @@ -4940,14 +4644,12 @@ gtk_sheet_size_allocate_entry (GtkSheet *sheet) &attributes) ) return ; + gtk_widget_ensure_style (GTK_WIDGET (sheet_entry)); + if ( GTK_WIDGET_REALIZED (sheet->entry_widget) ) { - if (!GTK_WIDGET (sheet_entry)->style) - gtk_widget_ensure_style (GTK_WIDGET (sheet_entry)); + GtkStyle *style = GTK_WIDGET (sheet_entry)->style; - previous_style = GTK_WIDGET (sheet_entry)->style; - - style = gtk_style_copy (previous_style); style->bg[GTK_STATE_NORMAL] = attributes.background; style->fg[GTK_STATE_NORMAL] = attributes.foreground; style->text[GTK_STATE_NORMAL] = attributes.foreground; @@ -4958,162 +4660,14 @@ gtk_sheet_size_allocate_entry (GtkSheet *sheet) pango_font_description_free (style->font_desc); g_assert (attributes.font_desc); style->font_desc = pango_font_description_copy (attributes.font_desc); - - GTK_WIDGET (sheet_entry)->style = style; - gtk_widget_size_request (sheet->entry_widget, NULL); - GTK_WIDGET (sheet_entry)->style = previous_style; - - if (style != previous_style) - { - if (!GTK_IS_ITEM_ENTRY (sheet->entry_widget)) - { - style->bg[GTK_STATE_NORMAL] = previous_style->bg[GTK_STATE_NORMAL]; - style->fg[GTK_STATE_NORMAL] = previous_style->fg[GTK_STATE_NORMAL]; - style->bg[GTK_STATE_ACTIVE] = previous_style->bg[GTK_STATE_ACTIVE]; - style->fg[GTK_STATE_ACTIVE] = previous_style->fg[GTK_STATE_ACTIVE]; - } - gtk_widget_set_style (GTK_WIDGET (sheet_entry), style); - g_object_unref (style); - } - } - - if (GTK_IS_ITEM_ENTRY (sheet_entry)) - max_size = GTK_ITEM_ENTRY (sheet_entry)->text_max_size; - else - max_size = 0; - - text_size = 0; - text = gtk_entry_get_text (GTK_ENTRY (sheet_entry)); - if (text && strlen (text) > 0) - text_size = STRING_WIDTH (GTK_WIDGET (sheet), attributes.font_desc, text); - - column_width = g_sheet_column_get_width (sheet->column_geometry, sheet->active_cell.col); - - size = MIN (text_size, max_size); - size = MAX (size, column_width - 2 * COLUMN_TITLES_HEIGHT); - - row = sheet->active_cell.row; - col = sheet->active_cell.col; - - shentry_allocation.x = g_sheet_column_start_pixel (sheet->column_geometry, sheet->active_cell.col); - shentry_allocation.y = g_sheet_row_start_pixel (sheet->row_geometry, sheet->active_cell.row); - if ( sheet->column_titles_visible) - shentry_allocation.y += sheet->column_title_area.height; - - shentry_allocation.y -= sheet->vadjustment->value; - - if ( sheet->row_titles_visible) - shentry_allocation.x += sheet->row_title_area.width; - - shentry_allocation.x -= sheet->hadjustment->value; - - shentry_allocation.width = column_width; - shentry_allocation.height = g_sheet_row_get_height (sheet->row_geometry, sheet->active_cell.row); - - if (GTK_IS_ITEM_ENTRY (sheet->entry_widget)) - { - shentry_allocation.height -= 2 * COLUMN_TITLES_HEIGHT; - shentry_allocation.y += COLUMN_TITLES_HEIGHT; - shentry_allocation.width = size; - - switch (GTK_ITEM_ENTRY (sheet_entry)->justification) - { - case GTK_JUSTIFY_CENTER: - shentry_allocation.x += column_width / 2 - size / 2; - break; - case GTK_JUSTIFY_RIGHT: - shentry_allocation.x += column_width - size - COLUMN_TITLES_HEIGHT; - break; - case GTK_JUSTIFY_LEFT: - case GTK_JUSTIFY_FILL: - shentry_allocation.x += COLUMN_TITLES_HEIGHT; - break; - } - } - - if (!GTK_IS_ITEM_ENTRY (sheet->entry_widget)) - { - shentry_allocation.x += 2; - shentry_allocation.y += 2; - shentry_allocation.width -= MIN (shentry_allocation.width, 3); - shentry_allocation.height -= MIN (shentry_allocation.height, 3); } - gtk_widget_size_allocate (sheet->entry_widget, &shentry_allocation); - - if (previous_style == style) g_object_unref (previous_style); -} - -static void -gtk_sheet_entry_set_max_size (GtkSheet *sheet) -{ - gint i; - gint size = 0; - gint sizel = 0, sizer = 0; - gint row, col; - GtkJustification justification; - gchar *s = NULL; - gint width; - - row = sheet->active_cell.row; - col = sheet->active_cell.col; - - if ( ! GTK_IS_ITEM_ENTRY (sheet->entry_widget) ) - return; - - justification = GTK_ITEM_ENTRY (sheet->entry_widget)->justification; - - gdk_drawable_get_size (sheet->sheet_window, &width, NULL); - - switch (justification) - { - case GTK_JUSTIFY_FILL: - case GTK_JUSTIFY_LEFT: - for (i = col + 1; i <= max_visible_column (sheet); i++) - { - if ((s = gtk_sheet_cell_get_text (sheet, row, i))) - { - g_free (s); - break; - } - size += g_sheet_column_get_width (sheet->column_geometry, i); - } - - size = MIN (size, width - - g_sheet_column_start_pixel (sheet->column_geometry, col)); - break; - case GTK_JUSTIFY_RIGHT: - for (i = col - 1; i >= min_visible_column (sheet); i--) - { - if ((s = gtk_sheet_cell_get_text (sheet, row, i))) - { - g_free (s); - break; - } - size += g_sheet_column_get_width (sheet->column_geometry, i); - } - break; - case GTK_JUSTIFY_CENTER: - for (i = col + 1; i <= max_visible_column (sheet); i++) - { - sizer += g_sheet_column_get_width (sheet->column_geometry, i); - } - for (i = col - 1; i >= min_visible_column (sheet); i--) - { - if ((s = gtk_sheet_cell_get_text (sheet, row, i))) - { - g_free (s); - break; - } - sizel += g_sheet_column_get_width (sheet->column_geometry, i); - } - size = 2 * MIN (sizel, sizer); - break; - } + rectangle_from_cell (sheet, sheet->active_cell.row, + sheet->active_cell.col, &entry_alloc); - if (size != 0) - size += g_sheet_column_get_width (sheet->column_geometry, col); - GTK_ITEM_ENTRY (sheet->entry_widget)->text_max_size = size; + gtk_widget_set_size_request (sheet->entry_widget, entry_alloc.width, + entry_alloc.height); + gtk_widget_size_allocate (sheet->entry_widget, &entry_alloc); } @@ -5136,7 +4690,7 @@ create_sheet_entry (GtkSheet *sheet) g_warning ("Entry type is %s. It must be GtkEntry subclass, or a widget containing one. " "Using default", g_type_name (sheet->entry_type)); g_object_unref (sheet->entry_container); - sheet->entry_widget = sheet->entry_container = gtk_item_entry_new (); + sheet->entry_widget = sheet->entry_container = gtk_entry_new (); } else { @@ -5145,7 +4699,7 @@ create_sheet_entry (GtkSheet *sheet) } else { - sheet->entry_widget = sheet->entry_container = gtk_item_entry_new (); + sheet->entry_widget = sheet->entry_container = gtk_entry_new (); g_object_ref_sink (sheet->entry_container); } @@ -5162,6 +4716,12 @@ create_sheet_entry (GtkSheet *sheet) G_CALLBACK (gtk_sheet_entry_key_press), sheet); + sheet->entry_handler_id = + g_signal_connect (sheet->entry_widget, + "changed", + G_CALLBACK (gtk_sheet_entry_changed), + sheet); + gtk_widget_show (sheet->entry_widget); } @@ -5268,7 +4828,7 @@ gtk_sheet_button_draw (GtkSheet *sheet, GdkWindow *window, if (button->label_visible) { - text_height = default_row_height (sheet) - + text_height = DEFAULT_ROW_HEIGHT - 2 * COLUMN_TITLES_HEIGHT; gdk_gc_set_clip_rectangle (GTK_WIDGET (sheet)->style->fg_gc[button->state], @@ -5424,6 +4984,12 @@ adjust_scrollbars (GtkSheet *sheet) gdk_drawable_get_size (sheet->sheet_window, &width, &height); + if ( sheet->row_titles_visible) + width -= sheet->row_title_area.width; + + if (sheet->column_titles_visible) + height -= sheet->column_title_area.height; + if (sheet->vadjustment) { glong last_row = g_sheet_row_get_row_count (sheet->row_geometry) - 1; @@ -5445,9 +5011,6 @@ adjust_scrollbars (GtkSheet *sheet) g_sheet_row_get_height (sheet->row_geometry, last_row) ; - if (sheet->column_titles_visible) - sheet->vadjustment->upper += sheet->column_title_area.height; - sheet->vadjustment->lower = 0; sheet->vadjustment->page_size = height; @@ -5457,7 +5020,7 @@ adjust_scrollbars (GtkSheet *sheet) if (sheet->hadjustment) { gint last_col; - sheet->hadjustment->step_increment = 1 ; //DEFAULT_COLUMN_WIDTH; + sheet->hadjustment->step_increment = 1; sheet->hadjustment->page_increment = width; @@ -5469,9 +5032,6 @@ adjust_scrollbars (GtkSheet *sheet) g_sheet_column_get_width (sheet->column_geometry, last_col) ; - if (sheet->row_titles_visible) - sheet->hadjustment->upper += sheet->row_title_area.width; - sheet->hadjustment->lower = 0; sheet->hadjustment->page_size = width; @@ -5483,16 +5043,27 @@ static void vadjustment_value_changed (GtkAdjustment *adjustment, gpointer data) { + GdkRegion *region; GtkSheet *sheet = GTK_SHEET (data); g_return_if_fail (adjustment != NULL); if ( ! GTK_WIDGET_REALIZED (sheet)) return; + gtk_widget_hide (sheet->entry_widget); + + region = + gdk_drawable_get_visible_region (GDK_DRAWABLE (sheet->sheet_window)); + + gdk_window_begin_paint_region (sheet->sheet_window, region); + + gtk_sheet_range_draw (sheet, NULL); - size_allocate_row_title_buttons (sheet); + draw_row_title_buttons (sheet); // size_allocate_global_button (sheet); + + gdk_window_end_paint (sheet->sheet_window); } @@ -5500,6 +5071,7 @@ static void hadjustment_value_changed (GtkAdjustment *adjustment, gpointer data) { + GdkRegion *region; GtkSheet *sheet = GTK_SHEET (data); g_return_if_fail (adjustment != NULL); @@ -5507,9 +5079,18 @@ hadjustment_value_changed (GtkAdjustment *adjustment, if ( ! GTK_WIDGET_REALIZED (sheet)) return; gtk_widget_hide (sheet->entry_widget); + + + region = + gdk_drawable_get_visible_region (GDK_DRAWABLE (sheet->sheet_window)); + + gdk_window_begin_paint_region (sheet->sheet_window, region); + gtk_sheet_range_draw (sheet, NULL); - size_allocate_column_title_buttons (sheet); + draw_column_title_buttons (sheet); // size_allocate_global_button (sheet); + + gdk_window_end_paint (sheet->sheet_window); } @@ -5634,7 +5215,7 @@ new_column_width (GtkSheet *sheet, gint column, gint *x) g_sheet_column_set_width (sheet->column_geometry, column, width); - size_allocate_column_title_buttons (sheet); + draw_column_title_buttons (sheet); return width; } @@ -5665,7 +5246,7 @@ new_row_height (GtkSheet *sheet, gint row, gint *y) height = min_height; g_sheet_row_set_height (sheet->row_geometry, row, height); - size_allocate_row_title_buttons (sheet); + draw_row_title_buttons (sheet); return height; } @@ -5690,7 +5271,7 @@ gtk_sheet_set_column_width (GtkSheet *sheet, if (GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) { - size_allocate_column_title_buttons (sheet); + draw_column_title_buttons (sheet); adjust_scrollbars (sheet); gtk_sheet_size_allocate_entry (sheet); gtk_sheet_range_draw (sheet, NULL); @@ -5721,7 +5302,7 @@ gtk_sheet_set_row_height (GtkSheet *sheet, if (GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)) ) { - size_allocate_row_title_buttons (sheet); + draw_row_title_buttons (sheet); adjust_scrollbars (sheet); gtk_sheet_size_allocate_entry (sheet); gtk_sheet_range_draw (sheet, NULL); @@ -5729,72 +5310,70 @@ gtk_sheet_set_row_height (GtkSheet *sheet, g_signal_emit (sheet, sheet_signals[CHANGED], 0, row, - 1); } + gboolean gtk_sheet_get_attributes (const GtkSheet *sheet, gint row, gint col, - GtkSheetCellAttr *attributes) + GtkSheetCellAttr *attr) { - const GdkColor *fg, *bg; + GdkColor *fg, *bg; const GtkJustification *j ; const PangoFontDescription *font_desc ; const GtkSheetCellBorder *border ; + GdkColormap *colormap; g_return_val_if_fail (sheet != NULL, FALSE); g_return_val_if_fail (GTK_IS_SHEET (sheet), FALSE); if (row < 0 || col < 0) return FALSE; - init_attributes (sheet, col, attributes); - if ( !sheet->model) - return FALSE; + attr->foreground = GTK_WIDGET (sheet)->style->black; + attr->background = sheet->color[BG_COLOR]; - attributes->is_editable = g_sheet_model_is_editable (sheet->model, row, col); - attributes->is_visible = g_sheet_model_is_visible (sheet->model, row, col); + attr->border.width = 0; + attr->border.line_style = GDK_LINE_SOLID; + attr->border.cap_style = GDK_CAP_NOT_LAST; + 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); if ( fg ) - attributes->foreground = *fg; + { + gdk_colormap_alloc_color (colormap, fg, TRUE, TRUE); + attr->foreground = *fg; + } bg = g_sheet_model_get_background (sheet->model, row, col); if ( bg ) - attributes->background = *bg; + { + gdk_colormap_alloc_color (colormap, bg, TRUE, TRUE); + attr->background = *bg; + } + + attr->justification = + g_sheet_column_get_justification (sheet->column_geometry, col); j = g_sheet_model_get_justification (sheet->model, row, col); - if (j) attributes->justification = *j; + if (j) + attr->justification = *j; font_desc = g_sheet_model_get_font_desc (sheet->model, row, col); - if ( font_desc ) attributes->font_desc = font_desc; + if ( font_desc ) attr->font_desc = font_desc; border = g_sheet_model_get_cell_border (sheet->model, row, col); - if ( border ) attributes->border = *border; + if ( border ) attr->border = *border; return TRUE; } -static void -init_attributes (const GtkSheet *sheet, gint col, GtkSheetCellAttr *attributes) -{ - /* DEFAULT VALUES */ - attributes->foreground = GTK_WIDGET (sheet)->style->black; - attributes->background = sheet->color[BG_COLOR]; - if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) - { - attributes->background = sheet->color[BG_COLOR]; - } - attributes->justification = g_sheet_column_get_justification (sheet->column_geometry, col); - attributes->border.width = 0; - attributes->border.line_style = GDK_LINE_SOLID; - attributes->border.cap_style = GDK_CAP_NOT_LAST; - attributes->border.join_style = GDK_JOIN_MITER; - attributes->border.mask = 0; - attributes->border.color = GTK_WIDGET (sheet)->style->black; - attributes->is_editable = TRUE; - attributes->is_visible = TRUE; - attributes->font_desc = GTK_WIDGET (sheet)->style->font_desc; -} - - static void gtk_sheet_button_size_request (GtkSheet *sheet, const GtkSheetButton *button, @@ -5803,10 +5382,10 @@ gtk_sheet_button_size_request (GtkSheet *sheet, GtkRequisition requisition; GtkRequisition label_requisition; - label_requisition.height = default_row_height (sheet); + label_requisition.height = DEFAULT_ROW_HEIGHT; label_requisition.width = COLUMN_MIN_WIDTH; - requisition.height = default_row_height (sheet); + requisition.height = DEFAULT_ROW_HEIGHT; requisition.width = COLUMN_MIN_WIDTH; @@ -6054,4 +5633,3 @@ gtk_sheet_update_primary_selection (GtkSheet *sheet) gtk_clipboard_clear (clipboard); } } -