X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fgtksheet%2Fgtksheet.c;h=9e12bc92522fe1eedbaca9f140b640b5bcbdac02;hb=ff0677b2004db6ef79acde96ecbb72d146edf7c8;hp=5917aca995b0b791c3c528d3265cceaff5f7dd3e;hpb=ce4935f67b1d7ad165f3d349fbe318b0a6fb63f9;p=pspp diff --git a/lib/gtksheet/gtksheet.c b/lib/gtksheet/gtksheet.c index 5917aca995..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 */ @@ -376,14 +401,14 @@ rectangle_from_range (GtkSheet *sheet, const GtkSheetRange *range, g_return_val_if_fail (range, FALSE); r->x = g_sheet_column_start_pixel (sheet->column_geometry, range->col0); - r->x -= sheet->hadjustment->value; + 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 -= sheet->vadjustment->value; + r->y -= round (sheet->vadjustment->value); if ( sheet->column_titles_visible) r->y += sheet->column_title_area.height; @@ -460,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, @@ -478,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, @@ -495,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, @@ -535,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); @@ -548,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); @@ -581,7 +591,6 @@ enum RESIZE_RANGE, MOVE_RANGE, TRAVERSE, - DEACTIVATE, ACTIVATE, CHANGED, LAST_SIGNAL @@ -925,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", @@ -1029,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; } @@ -1052,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; @@ -1076,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; @@ -1134,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); @@ -1166,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); @@ -1191,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 ) ) @@ -1343,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 @@ -1420,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); } } @@ -1522,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; - - gdk_drawable_get_size (sheet->sheet_window, &width, &height); - - /* 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); - - if (adjust >= height) - { - break; - } - min_row--; - } - min_row = MAX (min_row, 0); + g_return_if_fail (row_align >= 0); + g_return_if_fail (col_align >= 0); - min_row ++; + g_return_if_fail (row_align <= 1); + g_return_if_fail (col_align <= 1); - y = g_sheet_row_start_pixel (sheet->row_geometry, min_row) + - g_sheet_row_get_height (sheet->row_geometry, min_row) - 1; - } + 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 (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); + } } @@ -1655,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; @@ -1682,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; @@ -2015,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); } @@ -2112,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); } @@ -2142,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); } } @@ -2174,8 +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) { + PangoLayout *layout; + PangoRectangle text; + gint font_height; + + gchar *label; + GtkSheetCellAttr attributes; GdkRectangle area; @@ -2212,46 +2157,14 @@ gtk_sheet_cell_draw_bg (GtkSheet *sheet, gint row, gint col) area.x, area.y, area.width, area.height); } -} - - -static void -gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col) -{ - GtkWidget *widget; - GdkRectangle area; - GtkSheetCellAttr attributes; - PangoLayout *layout; - PangoRectangle text; - gint font_height; - gchar *label; - - g_return_if_fail (sheet != NULL); + // gtk_sheet_cell_draw_label (sheet, row, col); - if (!GTK_WIDGET_DRAWABLE (sheet)) - return; label = gtk_sheet_cell_get_text (sheet, row, col); - if (!label) - return; - - if (row < 0 || row >= g_sheet_row_get_row_count (sheet->row_geometry)) + if (NULL == label) 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); - - rectangle_from_cell (sheet, row, col, &area); layout = gtk_widget_create_pango_layout (GTK_WIDGET (sheet), label); dispose_string (sheet, label); @@ -2295,6 +2208,8 @@ gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col) g_object_unref (layout); } + + static void gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range) { @@ -2331,6 +2246,7 @@ gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range) rectangle_from_range (sheet, &drawing_range, &area); } + gdk_draw_rectangle (sheet->sheet_window, GTK_WIDGET (sheet)->style->white_gc, TRUE, @@ -2340,8 +2256,7 @@ gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range) 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 && @@ -2456,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); @@ -2503,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) { @@ -2662,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 @@ -2740,54 +2642,6 @@ 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) { @@ -2812,36 +2666,38 @@ gtk_sheet_hide_active_cell (GtkSheet *sheet) area.x, area.y, area.width, area.height); - gtk_sheet_cell_draw_bg (sheet, sheet->active_cell.row, + gtk_sheet_cell_draw (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); } -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; @@ -2855,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 @@ -2871,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); @@ -2895,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 ) @@ -2905,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); @@ -2923,6 +2783,7 @@ gtk_sheet_show_active_cell (GtkSheet *sheet) gtk_widget_grab_focus (GTK_WIDGET (sheet_entry)); dispose_string (sheet, text); + } static void @@ -3265,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; @@ -3290,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); } @@ -3448,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) { @@ -3459,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); @@ -3554,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; @@ -3582,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; @@ -3671,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; } @@ -3707,8 +3569,7 @@ gtk_sheet_click_cell (GtkSheet *sheet, gint row, gint column) } else { - gtk_sheet_deactivate_cell (sheet); - gtk_sheet_activate_cell (sheet, row, column); + change_active_cell (sheet, row, column); } sheet->active_cell.row = row; @@ -3826,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); } @@ -4292,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) { @@ -4369,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; @@ -4461,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) @@ -4522,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: @@ -4562,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; @@ -4574,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; @@ -4601,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) @@ -4677,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; @@ -4699,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; @@ -4751,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; @@ -4801,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; - const gchar *text; + if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return; if (!GTK_WIDGET_MAPPED (GTK_WIDGET (sheet))) return; @@ -4819,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)); - - previous_style = GTK_WIDGET (sheet_entry)->style; + GtkStyle *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; @@ -4837,148 +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); + rectangle_from_cell (sheet, sheet->active_cell.row, + sheet->active_cell.col, &entry_alloc); - row = sheet->active_cell.row; - col = sheet->active_cell.col; - - - rectangle_from_cell (sheet, row, col, &shentry_allocation); - - size = MIN (text_size, max_size); - size = MAX (size, shentry_allocation.width - 2 * COLUMN_TITLES_HEIGHT); - - 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 += shentry_allocation.width / 2 - size / 2; - break; - case GTK_JUSTIFY_RIGHT: - shentry_allocation.x += shentry_allocation.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; - } - - 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); } @@ -5001,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 { @@ -5010,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); } @@ -5027,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); } @@ -5133,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], @@ -5289,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; @@ -5310,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; @@ -5322,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; @@ -5334,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; @@ -5348,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); } @@ -5365,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); @@ -5372,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); } @@ -5499,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; } @@ -5530,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; } @@ -5555,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); @@ -5586,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); @@ -5594,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, @@ -5668,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;