X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fgtksheet%2Fgtksheet.c;h=69b551749afc98488c81b732b9a6176866002224;hb=88eb1ede60522d3893dfe1c75cbab2d03f5cb2d5;hp=6132046f4fc5b0a6456433ae1efb31cb5ee00ed0;hpb=e157e5043740f7798250d475a602f43e6f82799b;p=pspp-builds.git diff --git a/lib/gtksheet/gtksheet.c b/lib/gtksheet/gtksheet.c index 6132046f..69b55174 100644 --- a/lib/gtksheet/gtksheet.c +++ b/lib/gtksheet/gtksheet.c @@ -202,11 +202,10 @@ column_from_xpixel (const GtkSheet *sheet, gint x) i < g_sheet_column_get_column_count (sheet->column_geometry); i++) { if (x >= cx && - x <= (cx + g_sheet_column_get_width (sheet->column_geometry, i)) && - g_sheet_column_get_visibility (sheet->column_geometry, i)) + x <= (cx + g_sheet_column_get_width (sheet->column_geometry, i))) return i; - if ( g_sheet_column_get_visibility (sheet->column_geometry, i)) - cx += g_sheet_column_get_width (sheet->column_geometry, i); + + cx += g_sheet_column_get_width (sheet->column_geometry, i); } /* no match */ @@ -270,7 +269,6 @@ POSSIBLE_YDRAG (const GtkSheet *sheet, gint y, gint *drag_row) ydrag = g_sheet_row_start_pixel (sheet->row_geometry, row) + CELL_SPACING; if (y <= ydrag + DRAG_WIDTH / 2 && row != 0) { - while (!g_sheet_row_get_visibility (sheet->row_geometry, row - 1) && row > 0) row--; *drag_row = row - 1; return g_sheet_row_get_sensitivity (sheet->row_geometry, row - 1); } @@ -370,6 +368,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 -= 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 -= 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); @@ -504,12 +548,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, @@ -1516,8 +1554,7 @@ gtk_sheet_moveto (GtkSheet *sheet, { while (min_row >= 0 && min_row > min_visible_row (sheet)) { - if (g_sheet_row_get_visibility (sheet->row_geometry, min_row)) - adjust += g_sheet_row_get_height (sheet->row_geometry, min_row); + adjust += g_sheet_row_get_height (sheet->row_geometry, min_row); if (adjust >= height) { @@ -1557,8 +1594,7 @@ gtk_sheet_moveto (GtkSheet *sheet, { while (min_col >= 0 && min_col > min_visible_column (sheet)) { - if (g_sheet_column_get_visibility (sheet->column_geometry, min_col)) - adjust += g_sheet_column_get_width (sheet->column_geometry, min_col); + adjust += g_sheet_column_get_width (sheet->column_geometry, min_col); if (adjust >= width) { @@ -2134,7 +2170,6 @@ gtk_sheet_unmap (GtkWidget *widget) static void gtk_sheet_cell_draw_bg (GtkSheet *sheet, gint row, gint col) { - GdkGC *fg_gc, *bg_gc; GtkSheetCellAttr attributes; GdkRectangle area; @@ -2151,34 +2186,13 @@ gtk_sheet_cell_draw_bg (GtkSheet *sheet, gint row, gint col) col >= g_sheet_column_get_column_count (sheet->column_geometry)) return; - if (! g_sheet_column_get_visibility (sheet->column_geometry, col)) - return; - - if (! g_sheet_row_get_visibility (sheet->row_geometry, row)) - return; - 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); - - 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); @@ -2200,18 +2214,10 @@ 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; + PangoRectangle text; + gint font_height; gchar *label; @@ -2224,10 +2230,12 @@ gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col) if (!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; - if (! g_sheet_column_get_visibility (sheet->column_geometry, col)) return; - if (!g_sheet_row_get_visibility (sheet->row_geometry, row)) 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); @@ -2237,145 +2245,56 @@ gtk_sheet_cell_draw_label (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); - + rectangle_from_cell (sheet, row, col, &area); 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); + pango_layout_get_pixel_extents (layout, NULL, &text); - /* Align primarily for locale's ascent / descent */ + gdk_gc_set_clip_rectangle (sheet->fg_gc, &area); - logical_rect.height /= PANGO_SCALE; - logical_rect.y /= PANGO_SCALE; - 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; - 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; - - 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); @@ -2392,8 +2311,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 { @@ -2402,26 +2321,15 @@ 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.row0); - y = g_sheet_row_start_pixel (sheet->row_geometry, - drawing_range.col0); - - - width = g_sheet_column_start_pixel (sheet->column_geometry, - drawing_range.rowi + 1) - x; - - - height = g_sheet_row_start_pixel (sheet->row_geometry, - drawing_range.rowi + 1) - y; + 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++) @@ -2472,25 +2380,9 @@ gtk_sheet_range_draw_selection (GtkSheet *sheet, GtkSheetRange range) { for (j = range.col0; j <= range.coli; j++) { - - if (gtk_sheet_cell_get_state (sheet, i, j) == GTK_STATE_SELECTED && - g_sheet_column_get_visibility (sheet->column_geometry, j) && g_sheet_row_get_visibility (sheet->row_geometry, i)) + 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) { @@ -2541,57 +2433,30 @@ gtk_sheet_set_cell (GtkSheet *sheet, gint row, gint col, const gchar *text) { GSheetModel *model ; - gboolean changed ; + gboolean changed = FALSE; gchar *old_text ; - GtkSheetRange range; - gint text_width; - GtkSheetCellAttr attributes; - g_return_if_fail (sheet != NULL); g_return_if_fail (GTK_IS_SHEET (sheet)); - if (col >= g_sheet_column_get_column_count (sheet->column_geometry) || row >= g_sheet_row_get_row_count (sheet->row_geometry)) return; - if (col < 0 || row < 0) return; - gtk_sheet_get_attributes (sheet, row, col, &attributes); + if (col >= g_sheet_column_get_column_count (sheet->column_geometry) + || row >= g_sheet_row_get_row_count (sheet->row_geometry)) + return; - attributes.justification = justification; + if (col < 0 || row < 0) return; model = gtk_sheet_get_model (sheet); old_text = g_sheet_model_get_string (model, row, col); - changed = FALSE; - if (0 != safe_strcmp (old_text, text)) changed = g_sheet_model_set_string (model, text, row, col); if ( g_sheet_model_free_strings (model)) g_free (old_text); - - if (changed && attributes.is_visible) - { - gchar *s = gtk_sheet_cell_get_text (sheet, row, col); - text_width = 0; - if (s && strlen (s) > 0) - { - text_width = STRING_WIDTH (GTK_WIDGET (sheet), - attributes.font_desc, text); - } - dispose_string (sheet, s); - - range.row0 = row; - range.rowi = row; - range.col0 = min_visible_column (sheet); - range.coli = max_visible_column (sheet); - - gtk_sheet_range_draw (sheet, &range); - } - if ( changed ) g_signal_emit (sheet, sheet_signals[CHANGED], 0, row, col); - } @@ -2733,12 +2598,16 @@ gtk_sheet_get_pixel_info (GtkSheet *sheet, y += sheet->vadjustment->value; - if ( y < 0) - return FALSE; - - trow = yyy_row_ypixel_to_row (sheet, y); - if (trow > g_sheet_row_get_row_count (sheet->row_geometry)) - return FALSE; + if ( y < 0 && sheet->column_titles_visible) + { + trow = -1; + } + else + { + trow = yyy_row_ypixel_to_row (sheet, y); + if (trow > g_sheet_row_get_row_count (sheet->row_geometry)) + return FALSE; + } *row = trow; @@ -2747,9 +2616,16 @@ gtk_sheet_get_pixel_info (GtkSheet *sheet, x += sheet->hadjustment->value; - tcol = column_from_xpixel (sheet, x); - if (tcol > g_sheet_column_get_column_count (sheet->column_geometry)) - return FALSE; + if ( x < 0 && sheet->row_titles_visible) + { + tcol = -1; + } + else + { + tcol = column_from_xpixel (sheet, x); + if (tcol > g_sheet_column_get_column_count (sheet->column_geometry)) + return FALSE; + } *column = tcol; @@ -2877,7 +2753,7 @@ gtk_sheet_deactivate_cell (GtkSheet *sheet) GtkSheetRange r; r.col0 = r.coli = sheet->active_cell.col; - r.row0 = r.rowi = sheet->active_cell.row; + r.row0 = r.rowi = sheet->active_cell.row; gtk_sheet_range_draw (sheet, &r); */ @@ -2904,9 +2780,13 @@ gtk_sheet_deactivate_cell (GtkSheet *sheet) #endif } + + static void gtk_sheet_hide_active_cell (GtkSheet *sheet) { + GdkRectangle area; + if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; @@ -2916,9 +2796,21 @@ 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_bg (sheet, sheet->active_cell.row, sheet->active_cell.col); + gtk_sheet_cell_draw_label (sheet, sheet->active_cell.row, + sheet->active_cell.col); GTK_WIDGET_UNSET_FLAGS (GTK_WIDGET (sheet->entry_widget), GTK_VISIBLE); } @@ -3041,7 +2933,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; @@ -3090,7 +2983,6 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) j <= new_range.coli && j >= new_range.col0) ? TRUE : FALSE; if (state == GTK_STATE_SELECTED && selected && - g_sheet_column_get_visibility (sheet->column_geometry, j) && g_sheet_row_get_visibility (sheet->row_geometry, i) && (i == sheet->range.row0 || i == sheet->range.rowi || j == sheet->range.col0 || j == sheet->range.coli || i == new_range.row0 || i == new_range.rowi || @@ -3170,8 +3062,7 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) selected= (i <= new_range.rowi && i >= new_range.row0 && j <= new_range.coli && j >= new_range.col0) ? TRUE : FALSE; - if (state == GTK_STATE_SELECTED && !selected && - g_sheet_column_get_visibility (sheet->column_geometry, j) && g_sheet_row_get_visibility (sheet->row_geometry, i)) + if (state == GTK_STATE_SELECTED && !selected) { x = g_sheet_column_start_pixel (sheet->column_geometry, j); @@ -3206,7 +3097,6 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) j <= new_range.coli && j >= new_range.col0) ? TRUE : FALSE; if (state != GTK_STATE_SELECTED && selected && - g_sheet_column_get_visibility (sheet->column_geometry, j) && g_sheet_row_get_visibility (sheet->row_geometry, i) && (i != sheet->active_cell.row || j != sheet->active_cell.col)) { @@ -3243,57 +3133,52 @@ gtk_sheet_new_selection (GtkSheet *sheet, GtkSheetRange *range) { for (j = aux_range.col0; j <= aux_range.coli; j++) { + state = gtk_sheet_cell_get_state (sheet, i, j); - if (g_sheet_column_get_visibility (sheet->column_geometry, j) && g_sheet_row_get_visibility (sheet->row_geometry, i)) - { - - state = gtk_sheet_cell_get_state (sheet, i, j); - - mask1 = i == sheet->range.row0 ? 1 : 0; - mask1 = i == sheet->range.rowi ? mask1 + 2 : mask1; - mask1 = j == sheet->range.col0 ? mask1 + 4 : mask1; - mask1 = j == sheet->range.coli ? mask1 + 8 : mask1; + mask1 = i == sheet->range.row0 ? 1 : 0; + mask1 = i == sheet->range.rowi ? mask1 + 2 : mask1; + mask1 = j == sheet->range.col0 ? mask1 + 4 : mask1; + mask1 = j == sheet->range.coli ? mask1 + 8 : mask1; - mask2 = i == new_range.row0 ? 1 : 0; - mask2 = i == new_range.rowi ? mask2 + 2 : mask2; - mask2 = j == new_range.col0 ? mask2 + 4 : mask2; - mask2 = j == new_range.coli ? mask2 + 8 : mask2; - if (mask2 != mask1 || (mask2 == mask1 && state != GTK_STATE_SELECTED)) - { - x = g_sheet_column_start_pixel (sheet->column_geometry, j); - y = g_sheet_row_start_pixel (sheet->row_geometry, i); - width = g_sheet_column_get_width (sheet->column_geometry, j); - height = g_sheet_row_get_height (sheet->row_geometry, i); - if (mask2 & 1) - gdk_draw_rectangle (sheet->sheet_window, - sheet->xor_gc, - TRUE, - x + 1, y - 1, - width, 3); - - - if (mask2 & 2) - gdk_draw_rectangle (sheet->sheet_window, - sheet->xor_gc, - TRUE, - x + 1, y + height - 1, - width, 3); - - if (mask2 & 4) - gdk_draw_rectangle (sheet->sheet_window, - sheet->xor_gc, - TRUE, - x - 1, y + 1, - 3, height); - - - if (mask2 & 8) - gdk_draw_rectangle (sheet->sheet_window, - sheet->xor_gc, - TRUE, - x + width - 1, y + 1, - 3, height); - } + mask2 = i == new_range.row0 ? 1 : 0; + mask2 = i == new_range.rowi ? mask2 + 2 : mask2; + mask2 = j == new_range.col0 ? mask2 + 4 : mask2; + mask2 = j == new_range.coli ? mask2 + 8 : mask2; + if (mask2 != mask1 || (mask2 == mask1 && state != GTK_STATE_SELECTED)) + { + x = g_sheet_column_start_pixel (sheet->column_geometry, j); + y = g_sheet_row_start_pixel (sheet->row_geometry, i); + width = g_sheet_column_get_width (sheet->column_geometry, j); + height = g_sheet_row_get_height (sheet->row_geometry, i); + if (mask2 & 1) + gdk_draw_rectangle (sheet->sheet_window, + sheet->xor_gc, + TRUE, + x + 1, y - 1, + width, 3); + + + if (mask2 & 2) + gdk_draw_rectangle (sheet->sheet_window, + sheet->xor_gc, + TRUE, + x + 1, y + height - 1, + width, 3); + + if (mask2 & 4) + gdk_draw_rectangle (sheet->sheet_window, + sheet->xor_gc, + TRUE, + x - 1, y + 1, + 3, height); + + + if (mask2 & 8) + gdk_draw_rectangle (sheet->sheet_window, + sheet->xor_gc, + TRUE, + x + width - 1, y + 1, + 3, height); } } } @@ -3305,56 +3190,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); } @@ -3570,7 +3415,8 @@ gtk_sheet_button_press (GtkWidget *widget, { GtkSheet *sheet; GdkModifierType mods; - gint x, y, row, column; + gint x, y; + gint row, column; gboolean veto; g_return_val_if_fail (widget != NULL, FALSE); @@ -3807,15 +3653,6 @@ gtk_sheet_click_cell (GtkSheet *sheet, gint row, gint column) return FALSE; } - if (column >= 0 && row >= 0) - { - if (! g_sheet_column_get_visibility (sheet->column_geometry, column) - || !g_sheet_row_get_visibility (sheet->row_geometry, row)) - { - return FALSE; - } - } - g_signal_emit (sheet, sheet_signals[TRAVERSE], 0, sheet->active_cell.row, sheet->active_cell.col, &row, &column, &forbid_move); @@ -3857,34 +3694,29 @@ 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 + { + gtk_sheet_deactivate_cell (sheet); + gtk_sheet_activate_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 @@ -4004,6 +3836,7 @@ gtk_sheet_button_release (GtkWidget *widget, + /* Shamelessly lifted from gtktooltips */ static gboolean gtk_sheet_subtitle_paint_window (GtkWidget *tip_window) @@ -4141,7 +3974,7 @@ motion_timeout_callback (gpointer data) text = g_sheet_column_get_subtitle (col_geo, column); - show_subtitle (sheet, -1, column, text ); + show_subtitle (sheet, -1, column, text); g_free (text); } @@ -4187,7 +4020,8 @@ gtk_sheet_motion (GtkWidget *widget, GdkEventMotion *event) if ( gtk_sheet_get_pixel_info (sheet, wx, wy, &row, &column) ) { - if ( row != sheet->hover_window->row || column != sheet->hover_window->column) + if ( row != sheet->hover_window->row || + column != sheet->hover_window->column) { gtk_widget_hide (sheet->hover_window->window); } @@ -4966,7 +4800,7 @@ gtk_sheet_size_allocate_entry (GtkSheet *sheet) GtkEntry *sheet_entry; GtkStyle *style = NULL, *previous_style = NULL; gint row, col; - gint size, max_size, text_size, column_width; + gint size, max_size, text_size; const gchar *text; if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; @@ -5026,28 +4860,14 @@ gtk_sheet_size_allocate_entry (GtkSheet *sheet) 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; + rectangle_from_cell (sheet, row, col, &shentry_allocation); - shentry_allocation.width = column_width; - shentry_allocation.height = g_sheet_row_get_height (sheet->row_geometry, sheet->active_cell.row); + size = MIN (text_size, max_size); + size = MAX (size, shentry_allocation.width - 2 * COLUMN_TITLES_HEIGHT); if (GTK_IS_ITEM_ENTRY (sheet->entry_widget)) { @@ -5058,10 +4878,10 @@ gtk_sheet_size_allocate_entry (GtkSheet *sheet) switch (GTK_ITEM_ENTRY (sheet_entry)->justification) { case GTK_JUSTIFY_CENTER: - shentry_allocation.x += column_width / 2 - size / 2; + shentry_allocation.x += shentry_allocation.width / 2 - size / 2; break; case GTK_JUSTIFY_RIGHT: - shentry_allocation.x += column_width - size - COLUMN_TITLES_HEIGHT; + shentry_allocation.x += shentry_allocation.width - size - COLUMN_TITLES_HEIGHT; break; case GTK_JUSTIFY_LEFT: case GTK_JUSTIFY_FILL: @@ -5400,7 +5220,6 @@ gtk_sheet_column_title_button_draw (GtkSheet *sheet, gint column) if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; if (!sheet->column_titles_visible) return; - if (!g_sheet_column_get_visibility (sheet->column_geometry, column)) return; if (column < min_visible_column (sheet)) return; if (column > max_visible_column (sheet)) return; @@ -5430,7 +5249,6 @@ gtk_sheet_row_title_button_draw (GtkSheet *sheet, gint row) if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; if (!sheet->row_titles_visible) return; - if (!g_sheet_row_get_visibility (sheet->row_geometry, row)) return; if (row < min_visible_row (sheet)) return; if (row > max_visible_row (sheet)) return; @@ -5486,6 +5304,9 @@ 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; @@ -5507,6 +5328,9 @@ 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; @@ -5764,72 +5588,64 @@ 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); + attr->foreground = GTK_WIDGET (sheet)->style->black; + attr->background = sheet->color[BG_COLOR]; - if ( !sheet->model) - return FALSE; + 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; - 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->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; + } j = g_sheet_model_get_justification (sheet->model, row, col); - if (j) attributes->justification = *j; + attr->justification = j ? *j : GTK_JUSTIFY_LEFT; 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, @@ -6089,4 +5905,3 @@ gtk_sheet_update_primary_selection (GtkSheet *sheet) gtk_clipboard_clear (clipboard); } } -