static void set_row_height (GtkSheet *sheet,
gint row,
- guint height);
+ gint height);
static void destroy_hover_window (GtkSheetHoverTitle *);
static GtkSheetHoverTitle *create_hover_window (void);
static inline gint
column_from_xpixel (const GtkSheet *sheet, gint pixel)
{
- return psppire_axis_get_unit_at_pixel (sheet->haxis, pixel);
+ return psppire_axis_unit_at_pixel (sheet->haxis, pixel);
}
static inline gint
row_from_ypixel (const GtkSheet *sheet, gint pixel)
{
- return psppire_axis_get_unit_at_pixel (sheet->vaxis, pixel);
+ return psppire_axis_unit_at_pixel (sheet->vaxis, pixel);
}
{
glong row = min_visible_row (sheet);
- if ( psppire_axis_pixel_start (sheet->vaxis, row) < sheet->vadjustment->value)
+ if ( psppire_axis_start_pixel (sheet->vaxis, row) < sheet->vadjustment->value)
row++;
return row;
{
glong row = max_visible_row (sheet);
- if ( psppire_axis_pixel_start (sheet->vaxis, row)
+ if ( psppire_axis_start_pixel (sheet->vaxis, row)
+
psppire_axis_unit_size (sheet->vaxis, row)
> sheet->vadjustment->value)
{
glong col = min_visible_column (sheet);
- if ( psppire_axis_pixel_start (sheet->haxis, col) < sheet->hadjustment->value)
+ if ( psppire_axis_start_pixel (sheet->haxis, col) < sheet->hadjustment->value)
col++;
return col;
{
glong col = max_visible_column (sheet);
- if ( psppire_axis_pixel_start (sheet->haxis, col)
+ if ( psppire_axis_start_pixel (sheet->haxis, col)
+
psppire_axis_unit_size (sheet->haxis, col)
> sheet->hadjustment->value)
*drag_column = column_from_xpixel (sheet, x);
*drag_row = row_from_ypixel (sheet, y);
- if (x >= psppire_axis_pixel_start (sheet->haxis, sheet->range.col0) - DRAG_WIDTH / 2 &&
- x <= psppire_axis_pixel_start (sheet->haxis, sheet->range.coli) +
+ if (x >= psppire_axis_start_pixel (sheet->haxis, sheet->range.col0) - DRAG_WIDTH / 2 &&
+ x <= psppire_axis_start_pixel (sheet->haxis, sheet->range.coli) +
psppire_axis_unit_size (sheet->haxis, sheet->range.coli) + DRAG_WIDTH / 2)
{
- ydrag = psppire_axis_pixel_start (sheet->vaxis, sheet->range.row0);
+ ydrag = psppire_axis_start_pixel (sheet->vaxis, sheet->range.row0);
if (y >= ydrag - DRAG_WIDTH / 2 && y <= ydrag + DRAG_WIDTH / 2)
{
*drag_row = sheet->range.row0;
return TRUE;
}
- ydrag = psppire_axis_pixel_start (sheet->vaxis, sheet->range.rowi) +
+ ydrag = psppire_axis_start_pixel (sheet->vaxis, sheet->range.rowi) +
psppire_axis_unit_size (sheet->vaxis, sheet->range.rowi);
if (y >= ydrag - DRAG_WIDTH / 2 && y <= ydrag + DRAG_WIDTH / 2)
{
}
}
- if (y >= psppire_axis_pixel_start (sheet->vaxis, sheet->range.row0) - DRAG_WIDTH / 2 &&
- y <= psppire_axis_pixel_start (sheet->vaxis, sheet->range.rowi) +
+ if (y >= psppire_axis_start_pixel (sheet->vaxis, sheet->range.row0) - DRAG_WIDTH / 2 &&
+ y <= psppire_axis_start_pixel (sheet->vaxis, sheet->range.rowi) +
psppire_axis_unit_size (sheet->vaxis, sheet->range.rowi) + DRAG_WIDTH / 2)
{
- xdrag = psppire_axis_pixel_start (sheet->haxis, sheet->range.col0);
+ xdrag = psppire_axis_start_pixel (sheet->haxis, sheet->range.col0);
if (x >= xdrag - DRAG_WIDTH / 2 && x <= xdrag + DRAG_WIDTH / 2)
{
*drag_column = sheet->range.col0;
return TRUE;
}
- xdrag = psppire_axis_pixel_start (sheet->haxis, sheet->range.coli) +
+ xdrag = psppire_axis_start_pixel (sheet->haxis, sheet->range.coli) +
psppire_axis_unit_size (sheet->haxis, sheet->range.coli);
if (x >= xdrag - DRAG_WIDTH / 2 && x <= xdrag + DRAG_WIDTH / 2)
{
sheet->range.col0 < 0 || sheet->range.coli < 0 )
return FALSE;
- xdrag = psppire_axis_pixel_start (sheet->haxis, sheet->range.coli)+
+ xdrag = psppire_axis_start_pixel (sheet->haxis, sheet->range.coli)+
psppire_axis_unit_size (sheet->haxis, sheet->range.coli);
- ydrag = psppire_axis_pixel_start (sheet->vaxis, sheet->range.rowi) +
+ ydrag = psppire_axis_start_pixel (sheet->vaxis, sheet->range.rowi) +
psppire_axis_unit_size (sheet->vaxis, sheet->range.rowi);
if (sheet->state == GTK_SHEET_COLUMN_SELECTED)
- ydrag = psppire_axis_pixel_start (sheet->vaxis, min_visible_row (sheet));
+ ydrag = psppire_axis_start_pixel (sheet->vaxis, min_visible_row (sheet));
if (sheet->state == GTK_SHEET_ROW_SELECTED)
- xdrag = psppire_axis_pixel_start (sheet->haxis, min_visible_column (sheet));
+ xdrag = psppire_axis_start_pixel (sheet->haxis, min_visible_column (sheet));
*drag_column = column_from_xpixel (sheet, x);
*drag_row = row_from_ypixel (sheet, y);
{
g_return_val_if_fail (range, FALSE);
- r->x = psppire_axis_pixel_start (sheet->haxis, range->col0);
+ r->x = psppire_axis_start_pixel (sheet->haxis, range->col0);
r->x -= round (sheet->hadjustment->value);
if ( sheet->row_titles_visible)
r->x += sheet->row_title_area.width;
- r->y = psppire_axis_pixel_start (sheet->vaxis, range->row0);
+ r->y = psppire_axis_start_pixel (sheet->vaxis, range->row0);
r->y -= round (sheet->vadjustment->value);
if ( sheet->column_titles_visible)
r->y += sheet->column_title_area.height;
- r->width = psppire_axis_pixel_start (sheet->haxis, range->coli) -
- psppire_axis_pixel_start (sheet->haxis, range->col0) +
+ r->width = psppire_axis_start_pixel (sheet->haxis, range->coli) -
+ psppire_axis_start_pixel (sheet->haxis, range->col0) +
psppire_axis_unit_size (sheet->haxis, range->coli);
- r->height = psppire_axis_pixel_start (sheet->vaxis, range->rowi) -
- psppire_axis_pixel_start (sheet->vaxis, range->row0) +
+ r->height = psppire_axis_start_pixel (sheet->vaxis, range->rowi) -
+ psppire_axis_start_pixel (sheet->vaxis, range->row0) +
psppire_axis_unit_size (sheet->vaxis, range->rowi);
return TRUE;
static void gtk_sheet_cell_draw (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,
- const GtkSheetRange *range);
+/* draw visible part of range. */
+static void draw_sheet_region (GtkSheet *sheet, GdkRegion *region);
+
/* highlight the visible part of the selected range */
static void gtk_sheet_range_draw_selection (GtkSheet *sheet,
/* Active Cell handling */
-static void gtk_sheet_entry_changed (GtkWidget *widget,
- gpointer data);
static void gtk_sheet_hide_entry_widget (GtkSheet *sheet);
-static void change_active_cell (GtkSheet *sheet,
- gint row, gint col);
-static gboolean gtk_sheet_draw_active_cell (GtkSheet *sheet);
+static void change_active_cell (GtkSheet *sheet, gint row, gint col);
+static gboolean gtk_sheet_draw_active_cell (GtkSheet *sheet);
static void gtk_sheet_show_entry_widget (GtkSheet *sheet);
static gboolean gtk_sheet_click_cell (GtkSheet *sheet,
gint row,
static void draw_xor_rectangle (GtkSheet *sheet,
GtkSheetRange range);
-static guint new_column_width (GtkSheet *sheet,
- gint column,
- gint *x);
-static guint new_row_height (GtkSheet *sheet,
- gint row,
- gint *y);
/* Sheet Button */
static void create_global_button (GtkSheet *sheet);
gint column);
-static void gtk_sheet_column_size_request (GtkSheet *sheet,
- gint col,
- guint *requisition);
static void gtk_sheet_row_size_request (GtkSheet *sheet,
gint row,
guint *requisition);
sheet->sheet_window = NULL;
sheet->entry_widget = NULL;
- sheet->entry_handler_id = 0;
sheet->button = NULL;
sheet->hadjustment = NULL;
}
+/* Cause RANGE to be redrawn. If RANGE is null, then the
+ entire visible range will be redrawn.
+ */
+static void
+redraw_range (GtkSheet *sheet, GtkSheetRange *range)
+{
+ GdkRectangle rect;
+
+ if ( ! GTK_WIDGET_REALIZED (sheet))
+ return;
+
+ if ( NULL != range )
+ rectangle_from_range (sheet, range, &rect);
+ else
+ {
+ GdkRegion *r = gdk_drawable_get_visible_region (sheet->sheet_window);
+ gdk_region_get_clipbox (r, &rect);
+ }
+
+ gdk_window_invalidate_rect (sheet->sheet_window, &rect, FALSE);
+}
+
+
/* Callback which occurs whenever columns are inserted / deleted in the model */
static void
columns_inserted_deleted_callback (GSheetModel *model, gint first_column,
draw_column_title_buttons_range (sheet,
first_column, max_visible_column (sheet));
- gtk_sheet_range_draw (sheet, &range);
+
+ redraw_range (sheet, &range);
}
+
+
/* Callback which occurs whenever rows are inserted / deleted in the model */
static void
rows_inserted_deleted_callback (GSheetModel *model, gint first_row,
draw_row_title_buttons_range (sheet, first_row, max_visible_row (sheet));
- gtk_sheet_range_draw (sheet, &range);
+ redraw_range (sheet, &range);
}
/*
if ( ( row0 < 0 && col0 < 0 ) || ( rowi < 0 && coli < 0 ) )
{
- gtk_sheet_range_draw (sheet, NULL);
+ redraw_range (sheet, NULL);
adjust_scrollbars (sheet);
draw_row_title_buttons_range (sheet, min_visible_row (sheet),
range.coli = max_visible_column (sheet);
}
- gtk_sheet_range_draw (sheet, &range);
+ redraw_range (sheet, &range);
}
{
g_object_ref (model);
- g_signal_connect (model, "range_changed",
- G_CALLBACK (range_update_callback), sheet);
+ sheet->update_handler_id = g_signal_connect (model, "range_changed",
+ G_CALLBACK (range_update_callback),
+ sheet);
g_signal_connect (model, "rows_inserted",
G_CALLBACK (rows_inserted_deleted_callback), sheet);
sheet->show_grid = show;
- gtk_sheet_range_draw (sheet, NULL);
+ redraw_range (sheet, NULL);
}
gboolean
return psppire_axis_unit_count (sheet->haxis);
}
-static void
-set_column_width (GtkSheet *sheet,
- gint column,
- guint width);
+static void set_column_width (GtkSheet *sheet,
+ gint column,
+ gint width);
void
if (row >= 0)
{
- gint y = psppire_axis_pixel_start (sheet->vaxis, row);
+ gint y = psppire_axis_start_pixel (sheet->vaxis, row);
gtk_adjustment_set_value (sheet->vadjustment, y - height * row_align);
}
if (col >= 0)
{
- gint x = psppire_axis_pixel_start (sheet->haxis, col);
+ gint x = psppire_axis_start_pixel (sheet->haxis, col);
gtk_adjustment_set_value (sheet->hadjustment, x - width * col_align);
}
sheet->fg_gc = gdk_gc_new (widget->window);
sheet->bg_gc = gdk_gc_new (widget->window);
- values.foreground = widget->style->black;
- values.function = GDK_COPY;
+ values.foreground = widget->style->white;
+ values.function = GDK_INVERT;
values.subwindow_mode = GDK_INCLUDE_INFERIORS;
values.line_width = BORDER_WIDTH;
!GTK_WIDGET_MAPPED (GTK_BIN (sheet->button)->child))
gtk_widget_map (GTK_BIN (sheet->button)->child);
- gtk_sheet_range_draw (sheet, NULL);
+ redraw_range (sheet, NULL);
change_active_cell (sheet,
sheet->active_cell.row,
sheet->active_cell.col);
}
-
static void
-gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range)
+draw_sheet_region (GtkSheet *sheet, GdkRegion *region)
{
+ GtkSheetRange range;
+ GdkRectangle area;
+ gint y, x;
gint i, j;
- GdkRectangle area;
GtkSheetRange drawing_range;
+ gdk_region_get_clipbox (region, &area);
+
+ y = area.y + sheet->vadjustment->value;
+ x = area.x + sheet->hadjustment->value;
+
+ if ( sheet->column_titles_visible)
+ y -= sheet->column_title_area.height;
+
+ if ( sheet->row_titles_visible)
+ x -= sheet->row_title_area.width;
+
+ maximize_int (&x, 0);
+ maximize_int (&y, 0);
+
+ range.row0 = row_from_ypixel (sheet, y);
+ range.rowi = row_from_ypixel (sheet, y + area.height);
+
+ range.col0 = column_from_xpixel (sheet, x);
+ range.coli = column_from_xpixel (sheet, x + area.width);
+
g_return_if_fail (sheet != NULL);
g_return_if_fail (GTK_SHEET (sheet));
if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return;
if (!GTK_WIDGET_MAPPED (GTK_WIDGET (sheet))) return;
- if (range == NULL)
- {
- drawing_range.row0 = min_visible_row (sheet);
- drawing_range.col0 = min_visible_column (sheet);
- drawing_range.rowi = MIN (max_visible_row (sheet),
- psppire_axis_unit_count (sheet->vaxis) - 1);
- drawing_range.coli = max_visible_column (sheet);
- gdk_drawable_get_size (sheet->sheet_window, &area.width, &area.height);
- area.x = area.y = 0;
- }
- else
- {
- drawing_range.row0 = MAX (range->row0, min_visible_row (sheet));
- drawing_range.col0 = MAX (range->col0, min_visible_column (sheet));
- drawing_range.rowi = MIN (range->rowi, max_visible_row (sheet));
- drawing_range.coli = MIN (range->coli, max_visible_column (sheet));
- rectangle_from_range (sheet, &drawing_range, &area);
- }
+ drawing_range.row0 = MAX (range.row0, min_visible_row (sheet));
+ drawing_range.col0 = MAX (range.col0, min_visible_column (sheet));
+ drawing_range.rowi = MIN (range.rowi, max_visible_row (sheet));
+ drawing_range.coli = MIN (range.coli, max_visible_column (sheet));
g_return_if_fail (drawing_range.rowi >= drawing_range.row0);
g_return_if_fail (drawing_range.coli >= drawing_range.col0);
- gdk_window_begin_paint_rect (sheet->sheet_window, &area);
-
for (i = drawing_range.row0; i <= drawing_range.rowi; i++)
- for (j = drawing_range.col0; j <= drawing_range.coli; j++)
- {
+ {
+ for (j = drawing_range.col0; j <= drawing_range.coli; j++)
gtk_sheet_cell_draw (sheet, i, j);
- }
+ }
if (sheet->state != GTK_SHEET_NORMAL &&
gtk_sheet_range_isvisible (sheet, &sheet->range))
gtk_sheet_range_draw_selection (sheet, drawing_range);
+
if (sheet->state == GTK_STATE_NORMAL &&
sheet->active_cell.row >= drawing_range.row0 &&
sheet->active_cell.row <= drawing_range.rowi &&
sheet->active_cell.col >= drawing_range.col0 &&
sheet->active_cell.col <= drawing_range.coli)
gtk_sheet_show_entry_widget (sheet);
-
- gdk_window_end_paint (sheet->sheet_window);
}
+
static void
gtk_sheet_range_draw_selection (GtkSheet *sheet, GtkSheetRange range)
{
old_text = g_sheet_model_get_string (model, row, col);
if (0 != safe_strcmp (old_text, text))
- g_sheet_model_set_string (model, text, row, col);
+ {
+ g_signal_handler_block (sheet->model, sheet->update_handler_id);
+ g_sheet_model_set_string (model, text, row, col);
+ g_signal_handler_unblock (sheet->model, sheet->update_handler_id);
+ }
if ( g_sheet_model_free_strings (model))
g_free (old_text);
gtk_sheet_real_cell_clear (sheet, row, column);
- gtk_sheet_range_draw (sheet, &range);
+ redraw_range (sheet, &range);
}
static void
if (row >= psppire_axis_unit_count (sheet->vaxis) || column >= psppire_axis_unit_count (sheet->haxis))
return FALSE;
- area->x = (column == -1) ? 0 : psppire_axis_pixel_start (sheet->haxis, column);
- area->y = (row == -1) ? 0 : psppire_axis_pixel_start (sheet->vaxis, row);
+ area->x = (column == -1) ? 0 : psppire_axis_start_pixel (sheet->haxis, column);
+ area->y = (row == -1) ? 0 : psppire_axis_start_pixel (sheet->vaxis, row);
area->width= (column == -1) ? sheet->row_title_area.width
: psppire_axis_unit_size (sheet->haxis, column);
}
static void
-gtk_sheet_entry_changed (GtkWidget *widget, gpointer data)
+entry_load_text (GtkSheet *sheet)
{
- GtkSheet *sheet;
gint row, col;
const char *text;
GtkJustification justification;
GtkSheetCellAttr attributes;
- g_return_if_fail (data != NULL);
- g_return_if_fail (GTK_IS_SHEET (data));
-
- sheet = GTK_SHEET (data);
-
- if (!GTK_WIDGET_VISIBLE (widget)) return;
+ if (!GTK_WIDGET_VISIBLE (sheet->entry_widget)) return;
if (sheet->state != GTK_STATE_NORMAL) return;
row = sheet->active_cell.row;
if (row < 0 || col < 0) return;
- sheet->active_cell.row = -1;
- sheet->active_cell.col = -1;
-
text = gtk_entry_get_text (gtk_sheet_get_entry (sheet));
if (text && strlen (text) > 0)
justification = attributes.justification;
gtk_sheet_set_cell (sheet, row, col, justification, text);
}
-
- sheet->active_cell.row = row;;
- sheet->active_cell.col = col;
}
change_active_cell (GtkSheet *sheet, gint row, gint col)
{
gint old_row, old_col;
- glong old_handler_id = sheet->entry_handler_id;
g_return_if_fail (GTK_IS_SHEET (sheet));
gtk_sheet_real_unselect_range (sheet, NULL);
}
-
- g_signal_handler_block (sheet->entry_widget, sheet->entry_handler_id);
-
old_row = sheet->active_cell.row;
old_col = sheet->active_cell.col;
- {
- /* Redraw the neighbourhood of the old active cell */
- GtkSheetRange r;
- r.col0 = old_col - 1;
- r.coli = old_col + 1;
- r.row0 = old_row - 1;
- r.rowi = old_row + 1;
-
- maximize_int (&r.row0, 0);
- maximize_int (&r.col0, 0);
- minimize_int (&r.rowi, psppire_axis_unit_count (sheet->vaxis) - 1);
- minimize_int (&r.coli, psppire_axis_unit_count (sheet->haxis) - 1);
-
+ /* Erase the old cell */
+ gtk_sheet_draw_active_cell (sheet);
- if ( gtk_sheet_range_isvisible (sheet, &r))
- gtk_sheet_range_draw (sheet, &r);
- }
+ entry_load_text (sheet);
sheet->range.row0 = row;
sheet->range.col0 = col;
GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
+ GTK_WIDGET_UNSET_FLAGS (sheet->entry_widget, GTK_HAS_FOCUS);
+
gtk_sheet_draw_active_cell (sheet);
gtk_sheet_show_entry_widget (sheet);
+ GTK_WIDGET_SET_FLAGS (sheet->entry_widget, GTK_HAS_FOCUS);
g_signal_emit (sheet, sheet_signals [ACTIVATE], 0,
row, col, old_row, old_col);
- if ( old_handler_id == sheet->entry_handler_id)
- g_signal_handler_unblock (sheet->entry_widget, sheet->entry_handler_id);
}
static void
{
GtkEntry *sheet_entry;
GtkSheetCellAttr attributes;
- gchar *text = NULL;
+
gint row, col;
- g_return_if_fail (sheet != NULL);
g_return_if_fail (GTK_IS_SHEET (sheet));
row = sheet->active_cell.row;
gtk_sheet_get_attributes (sheet, row, col, &attributes);
-
- text = gtk_sheet_cell_get_text (sheet, row, col);
- if ( ! text )
- text = g_strdup ("");
-
- if ( GTK_IS_ENTRY (sheet_entry))
+ if (GTK_IS_ENTRY (sheet_entry))
{
+ gchar *text = gtk_sheet_cell_get_text (sheet, row, col);
const gchar *old_text = gtk_entry_get_text (GTK_ENTRY (sheet_entry));
+
+ if ( ! text )
+ text = g_strdup ("");
+
if (strcmp (old_text, text) != 0)
gtk_entry_set_text (sheet_entry, text);
+
+ dispose_string (sheet, text);
- 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;
+ 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;
+ }
}
}
g_sheet_model_is_editable (sheet->model,
row, col));
gtk_widget_map (sheet->entry_widget);
-
- dispose_string (sheet, text);
}
static gboolean
if (mask1 != mask2)
{
- x = psppire_axis_pixel_start (sheet->haxis, j);
- y = psppire_axis_pixel_start (sheet->vaxis, i);
- width = psppire_axis_pixel_start (sheet->haxis, j)- x+
+ x = psppire_axis_start_pixel (sheet->haxis, j);
+ y = psppire_axis_start_pixel (sheet->vaxis, i);
+ width = psppire_axis_start_pixel (sheet->haxis, j)- x+
psppire_axis_unit_size (sheet->haxis, j);
- height = psppire_axis_pixel_start (sheet->vaxis, i) - y + psppire_axis_unit_size (sheet->vaxis, i);
+ height = psppire_axis_start_pixel (sheet->vaxis, i) - y + psppire_axis_unit_size (sheet->vaxis, i);
if (i == sheet->range.row0)
{
if (i != sheet->active_cell.row || j != sheet->active_cell.col)
{
- x = psppire_axis_pixel_start (sheet->haxis, j);
- y = psppire_axis_pixel_start (sheet->vaxis, i);
- width = psppire_axis_pixel_start (sheet->haxis, j)- x+
+ x = psppire_axis_start_pixel (sheet->haxis, j);
+ y = psppire_axis_start_pixel (sheet->vaxis, i);
+ width = psppire_axis_start_pixel (sheet->haxis, j)- x+
psppire_axis_unit_size (sheet->haxis, j);
- height = psppire_axis_pixel_start (sheet->vaxis, i) - y + psppire_axis_unit_size (sheet->vaxis, i);
+ height = psppire_axis_start_pixel (sheet->vaxis, i) - y + psppire_axis_unit_size (sheet->vaxis, i);
if (i == new_range.row0)
{
if (state == GTK_STATE_SELECTED && !selected)
{
- x = psppire_axis_pixel_start (sheet->haxis, j);
- y = psppire_axis_pixel_start (sheet->vaxis, i);
- width = psppire_axis_pixel_start (sheet->haxis, j) - x + psppire_axis_unit_size (sheet->haxis, j);
- height = psppire_axis_pixel_start (sheet->vaxis, i) - y + psppire_axis_unit_size (sheet->vaxis, i);
+ x = psppire_axis_start_pixel (sheet->haxis, j);
+ y = psppire_axis_start_pixel (sheet->vaxis, i);
+ width = psppire_axis_start_pixel (sheet->haxis, j) - x + psppire_axis_unit_size (sheet->haxis, j);
+ height = psppire_axis_start_pixel (sheet->vaxis, i) - y + psppire_axis_unit_size (sheet->vaxis, i);
if (i == sheet->range.row0)
{
(i != sheet->active_cell.row || j != sheet->active_cell.col))
{
- x = psppire_axis_pixel_start (sheet->haxis, j);
- y = psppire_axis_pixel_start (sheet->vaxis, i);
- width = psppire_axis_pixel_start (sheet->haxis, j) - x + psppire_axis_unit_size (sheet->haxis, j);
- height = psppire_axis_pixel_start (sheet->vaxis, i) - y + psppire_axis_unit_size (sheet->vaxis, i);
+ x = psppire_axis_start_pixel (sheet->haxis, j);
+ y = psppire_axis_start_pixel (sheet->vaxis, i);
+ width = psppire_axis_start_pixel (sheet->haxis, j) - x + psppire_axis_unit_size (sheet->haxis, j);
+ height = psppire_axis_start_pixel (sheet->vaxis, i) - y + psppire_axis_unit_size (sheet->vaxis, i);
if (i == new_range.row0)
{
mask2 = j == new_range.coli ? mask2 + 8 : mask2;
if (mask2 != mask1 || (mask2 == mask1 && state != GTK_STATE_SELECTED))
{
- x = psppire_axis_pixel_start (sheet->haxis, j);
- y = psppire_axis_pixel_start (sheet->vaxis, i);
+ x = psppire_axis_start_pixel (sheet->haxis, j);
+ y = psppire_axis_start_pixel (sheet->vaxis, i);
width = psppire_axis_unit_size (sheet->haxis, j);
height = psppire_axis_unit_size (sheet->vaxis, i);
if (mask2 & 1)
gtk_sheet_expose (GtkWidget *widget,
GdkEventExpose *event)
{
- GtkSheet *sheet;
- GtkSheetRange range;
+ GtkSheet *sheet = GTK_SHEET (widget);
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (GTK_IS_SHEET (widget), FALSE);
g_return_val_if_fail (event != NULL, FALSE);
- sheet = GTK_SHEET (widget);
-
if (!GTK_WIDGET_DRAWABLE (widget))
return FALSE;
max_visible_column (sheet));
}
-
- {
- gint y = event->area.y + sheet->vadjustment->value;
- gint x = event->area.x + sheet->hadjustment->value;
-
- if ( sheet->column_titles_visible)
- y -= sheet->column_title_area.height;
-
- if ( sheet->row_titles_visible)
- x -= sheet->row_title_area.width;
-
- maximize_int (&x, 0);
- maximize_int (&y, 0);
-
- range.row0 = row_from_ypixel (sheet, y);
-
- range.rowi = row_from_ypixel (sheet, y + event->area.height);
-
- range.col0 = column_from_xpixel (sheet, x);
-
- range.coli = column_from_xpixel (sheet, x + event->area.width);
- }
-
if (event->window == sheet->sheet_window)
{
- gtk_sheet_range_draw (sheet, &range);
+ draw_sheet_region (sheet, event->region);
+#if 0
if (sheet->state != GTK_SHEET_NORMAL)
{
if (gtk_sheet_range_isvisible (sheet, &sheet->range))
if (GTK_SHEET_IN_RESIZE (sheet) || GTK_SHEET_IN_DRAG (sheet))
draw_xor_rectangle (sheet, sheet->drag_range);
}
+#endif
if ((!GTK_SHEET_IN_XDRAG (sheet)) && (!GTK_SHEET_IN_YDRAG (sheet)))
{
- if (sheet->state == GTK_SHEET_NORMAL)
- g_idle_add (gtk_sheet_draw_active_cell, sheet);
+ GdkRectangle rect;
+ GtkSheetRange range;
+ range.row0 = range.rowi = sheet->active_cell.row;
+ range.col0 = range.coli = sheet->active_cell.col;
+
+ rectangle_from_range (sheet, &range, &rect);
+
+ if (GDK_OVERLAP_RECTANGLE_OUT !=
+ gdk_region_rect_in (event->region, &rect))
+ {
+ gtk_sheet_draw_active_cell (sheet);
+ }
}
+
}
(* GTK_WIDGET_CLASS (parent_class)->expose_event) (widget, event);
if (event->window == sheet->column_title_window)
{
+ sheet->x_drag = event->x;
g_signal_emit (sheet,
sheet_signals[BUTTON_EVENT_COLUMN], 0,
column, event);
if (on_column_boundary (sheet, sheet->x_drag, &sheet->drag_cell.col))
{
- guint req;
- gtk_sheet_column_size_request (sheet, sheet->drag_cell.col, &req);
GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_XDRAG);
gdk_pointer_grab (sheet->column_title_window, FALSE,
GDK_POINTER_MOTION_HINT_MASK |
if (on_row_boundary (sheet, sheet->y_drag, &sheet->drag_cell.row))
{
- guint req;
- gtk_sheet_row_size_request (sheet, sheet->drag_cell.row, &req);
GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_YDRAG);
gdk_pointer_grab (sheet->row_title_window, FALSE,
GDK_POINTER_MOTION_HINT_MASK |
sheet->state = GTK_SHEET_NORMAL;
GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
- gtk_sheet_draw_active_cell (sheet);
-
gtk_widget_grab_focus (GTK_WIDGET (sheet->entry_widget));
return TRUE;
/* release on resize windows */
if (GTK_SHEET_IN_XDRAG (sheet))
{
- gint xpos = event->x;
gint width;
GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_XDRAG);
GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
gdk_display_pointer_ungrab (display, event->time);
draw_xor_vline (sheet);
- width = new_column_width (sheet, sheet->drag_cell.col, &xpos);
+ width = event->x -
+ psppire_axis_start_pixel (sheet->haxis, sheet->drag_cell.col)
+ + sheet->hadjustment->value;
set_column_width (sheet, sheet->drag_cell.col, width);
+
return TRUE;
}
if (GTK_SHEET_IN_YDRAG (sheet))
{
- gint ypos = event->y;
gint height;
GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_YDRAG);
GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
gdk_display_pointer_ungrab (display, event->time);
draw_xor_hline (sheet);
- height = new_row_height (sheet, sheet->drag_cell.row, &ypos);
+ height = event->y -
+ psppire_axis_start_pixel (sheet->vaxis, sheet->drag_cell.row) +
+ sheet->vadjustment->value;
+
set_row_height (sheet, sheet->drag_cell.row, height);
+
return TRUE;
}
static gboolean
gtk_sheet_motion (GtkWidget *widget, GdkEventMotion *event)
{
- GtkSheet *sheet;
+ GtkSheet *sheet = GTK_SHEET (widget);
GdkModifierType mods;
GdkCursorType new_cursor;
gint x, y;
gint row, column;
GdkDisplay *display;
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (GTK_IS_SHEET (widget), FALSE);
g_return_val_if_fail (event != NULL, FALSE);
- sheet = GTK_SHEET (widget);
-
display = gtk_widget_get_display (widget);
/* selections on the sheet */
if (GTK_SHEET_IN_XDRAG (sheet))
{
- x = event->x;
-
- new_column_width (sheet, sheet->drag_cell.col, &x);
-#if 0
- if (x != sheet->x_drag)
+ if (event->x != sheet->x_drag)
{
draw_xor_vline (sheet);
- sheet->x_drag = x;
+ sheet->x_drag = event->x;
draw_xor_vline (sheet);
}
-#endif
+
return TRUE;
}
if (GTK_SHEET_IN_YDRAG (sheet))
{
- if (event->is_hint || event->window != widget->window)
- gtk_widget_get_pointer (widget, NULL, &y);
- else
- y = event->y;
-
- new_row_height (sheet, sheet->drag_cell.row, &y);
- if (y != sheet->y_drag)
+ if (event->y != sheet->y_drag)
{
draw_xor_hline (sheet);
- sheet->y_drag = y;
+ sheet->y_drag = event->y;
draw_xor_hline (sheet);
}
+
return TRUE;
}
GtkSheetRange aux;
gint v_h, current_col, current_row, col_threshold, row_threshold;
v_h = 1;
- if (abs (x - psppire_axis_pixel_start (sheet->haxis, sheet->drag_cell.col)) >
- abs (y - psppire_axis_pixel_start (sheet->vaxis, sheet->drag_cell.row))) v_h = 2;
+ if (abs (x - psppire_axis_start_pixel (sheet->haxis, sheet->drag_cell.col)) >
+ abs (y - psppire_axis_start_pixel (sheet->vaxis, sheet->drag_cell.row))) v_h = 2;
current_col = column_from_xpixel (sheet, x);
current_row = row_from_ypixel (sheet, y);
/*use half of column width resp. row height as threshold to
expand selection*/
- col_threshold = psppire_axis_pixel_start (sheet->haxis, current_col) +
+ col_threshold = psppire_axis_start_pixel (sheet->haxis, current_col) +
psppire_axis_unit_size (sheet->haxis, current_col) / 2;
if (column > 0)
{
if (x > col_threshold)
column +=1;
}
- row_threshold = psppire_axis_pixel_start (sheet->vaxis, current_row) +
+ row_threshold = psppire_axis_start_pixel (sheet->vaxis, current_row) +
psppire_axis_unit_size (sheet->vaxis, current_row)/2;
if (row > 0)
{
page_vertical (GtkSheet *sheet, GtkScrollType dir)
{
gint old_row = sheet->active_cell.row ;
- glong vpixel = psppire_axis_pixel_start (sheet->vaxis, old_row);
+ glong vpixel = psppire_axis_start_pixel (sheet->vaxis, old_row);
gint new_row;
- vpixel -= psppire_axis_pixel_start (sheet->vaxis,
+ vpixel -= psppire_axis_start_pixel (sheet->vaxis,
min_visible_row (sheet));
switch ( dir)
}
- vpixel += psppire_axis_pixel_start (sheet->vaxis,
+ vpixel += psppire_axis_start_pixel (sheet->vaxis,
min_visible_row (sheet));
new_row = row_from_ypixel (sheet, vpixel);
if ( new_cell.col > max_fully_visible_column (sheet))
{
glong hpos =
- psppire_axis_pixel_start (sheet->haxis,
+ psppire_axis_start_pixel (sheet->haxis,
new_cell.col + 1);
hpos -= sheet->hadjustment->page_size;
else if ( new_cell.col < min_fully_visible_column (sheet))
{
glong hpos =
- psppire_axis_pixel_start (sheet->haxis,
+ psppire_axis_start_pixel (sheet->haxis,
new_cell.col);
gtk_adjustment_set_value (sheet->hadjustment,
if ( new_cell.row > max_fully_visible_row (sheet))
{
glong vpos =
- psppire_axis_pixel_start (sheet->vaxis,
+ psppire_axis_start_pixel (sheet->vaxis,
new_cell.row + 1);
vpos -= sheet->vadjustment->page_size;
else if ( new_cell.row < min_fully_visible_row (sheet))
{
glong vpos =
- psppire_axis_pixel_start (sheet->vaxis,
+ psppire_axis_start_pixel (sheet->vaxis,
new_cell.row);
gtk_adjustment_set_value (sheet->vadjustment,
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);
-
set_entry_widget_font (sheet);
gtk_widget_show (sheet->entry_widget);
rect.y = 0;
rect.height = sheet->column_title_area.height;
- rect.x = psppire_axis_pixel_start (sheet->haxis, first) + CELL_SPACING;
- rect.width = psppire_axis_pixel_start (sheet->haxis, last) + CELL_SPACING
+ rect.x = psppire_axis_start_pixel (sheet->haxis, first) + CELL_SPACING;
+ rect.width = psppire_axis_start_pixel (sheet->haxis, last) + CELL_SPACING
+ psppire_axis_unit_size (sheet->haxis, last);
rect.x -= sheet->hadjustment->value;
GtkSheetButton *
button = g_sheet_model_get_column_button (sheet->model, col);
allocation.y = 0;
- allocation.x = psppire_axis_pixel_start (sheet->haxis, col)
+ allocation.x = psppire_axis_start_pixel (sheet->haxis, col)
+ CELL_SPACING;
allocation.x -= sheet->hadjustment->value;
rect.x = 0;
rect.width = sheet->row_title_area.width;
- rect.y = psppire_axis_pixel_start (sheet->vaxis, first) + CELL_SPACING;
- rect.height = psppire_axis_pixel_start (sheet->vaxis, last) + CELL_SPACING
+ rect.y = psppire_axis_start_pixel (sheet->vaxis, first) + CELL_SPACING;
+ rect.height = psppire_axis_start_pixel (sheet->vaxis, last) + CELL_SPACING
+ psppire_axis_unit_size (sheet->vaxis, last);
rect.y -= sheet->vadjustment->value;
GtkSheetButton *button =
g_sheet_model_get_row_button (sheet->model, row);
allocation.x = 0;
- allocation.y = psppire_axis_pixel_start (sheet->vaxis, row)
+ allocation.y = psppire_axis_start_pixel (sheet->vaxis, row)
+ CELL_SPACING;
allocation.y -= sheet->vadjustment->value;
position = 0;
adj->upper =
- psppire_axis_pixel_start (axis, last_item)
+ psppire_axis_start_pixel (axis, last_item)
+
psppire_axis_unit_size (axis, last_item)
;
sheet->hadjustment->page_increment = width;
sheet->hadjustment->upper =
- psppire_axis_pixel_start (sheet->haxis, last_col)
+ psppire_axis_start_pixel (sheet->haxis, last_col)
+
psppire_axis_unit_size (sheet->haxis, last_col)
;
if ( ! GTK_WIDGET_REALIZED (sheet)) return;
-
gtk_widget_hide (sheet->entry_widget);
region =
gdk_window_begin_paint_region (sheet->sheet_window, region);
+ draw_sheet_region (sheet, region);
- gtk_sheet_range_draw (sheet, NULL);
draw_row_title_buttons (sheet);
// size_allocate_global_button (sheet);
gtk_sheet_draw_active_cell (sheet);
gdk_window_end_paint (sheet->sheet_window);
+ gdk_region_destroy (region);
}
gdk_window_begin_paint_region (sheet->sheet_window, region);
- gtk_sheet_range_draw (sheet, NULL);
+ draw_sheet_region (sheet, region);
+
draw_column_title_buttons (sheet);
// size_allocate_global_button (sheet);
gtk_sheet_draw_active_cell (sheet);
gdk_window_end_paint (sheet->sheet_window);
+
+ gdk_region_destroy (region);
}
gdk_drawable_get_size (sheet->sheet_window,
NULL, &height);
-
if (sheet->row_titles_visible)
xpos += sheet->row_title_area.width;
GdkRectangle clip_area, area;
GdkGCValues values;
- area.x = psppire_axis_pixel_start (sheet->haxis, range.col0);
- area.y = psppire_axis_pixel_start (sheet->vaxis, range.row0);
- area.width = psppire_axis_pixel_start (sheet->haxis, range.coli)- area.x+
+ area.x = psppire_axis_start_pixel (sheet->haxis, range.col0);
+ area.y = psppire_axis_start_pixel (sheet->vaxis, range.row0);
+ area.width = psppire_axis_start_pixel (sheet->haxis, range.coli)- area.x+
psppire_axis_unit_size (sheet->haxis, range.coli);
- area.height = psppire_axis_pixel_start (sheet->vaxis, range.rowi)- area.y +
+ area.height = psppire_axis_start_pixel (sheet->vaxis, range.rowi)- area.y +
psppire_axis_unit_size (sheet->vaxis, range.rowi);
clip_area.x = sheet->row_title_area.width;
}
-/* this function returns the new width of the column being resized given
- * the COLUMN and X position of the cursor; the x cursor position is passed
- * in as a pointer and automaticaly corrected if it's outside the acceptable
- * range */
-static guint
-new_column_width (GtkSheet *sheet, gint column, gint *x)
-{
- gint left_pos = psppire_axis_pixel_start (sheet->haxis, column)
- - sheet->hadjustment->value;
-
- gint width = *x - left_pos;
-
- if ( width < sheet->column_requisition)
- {
- width = sheet->column_requisition;
- *x = left_pos + width;
- }
-
-#if AXIS_TRANSITION
- g_sheet_column_set_width (sheet->column_geometry, column, width);
-#endif
-
- draw_column_title_buttons (sheet);
-
- return width;
-}
-
-/* this function returns the new height of the row being resized given
- * the row and y position of the cursor; the y cursor position is passed
- * in as a pointer and automaticaly corrected if it's beyond min / max limits */
-static guint
-new_row_height (GtkSheet *sheet, gint row, gint *y)
-{
- gint height;
- guint min_height;
-
- gint cy = *y;
- min_height = sheet->row_requisition;
-
- /* you can't shrink a row to less than its minimum height */
- if (cy < psppire_axis_pixel_start (sheet->vaxis, row) + min_height)
-
- {
- *y = cy = psppire_axis_pixel_start (sheet->vaxis, row) + min_height;
- }
-
- /* calculate new row height making sure it doesn't end up
- * less than the minimum height */
- height = (cy - psppire_axis_pixel_start (sheet->vaxis, row));
- if (height < min_height)
- height = min_height;
-
-#if AXIS_TRANSITION
- g_sheet_row_set_height (sheet->row_geometry, row, height);
-#endif
- draw_row_title_buttons (sheet);
-
- return height;
-}
-
static void
set_column_width (GtkSheet *sheet,
gint column,
- guint width)
+ gint width)
{
- guint min_width;
-
g_return_if_fail (sheet != NULL);
g_return_if_fail (GTK_IS_SHEET (sheet));
if (column < 0 || column >= psppire_axis_unit_count (sheet->haxis))
return;
- gtk_sheet_column_size_request (sheet, column, &min_width);
- if (width < min_width) return;
-
- psppire_axis_impl_resize (sheet->haxis, column, width);
+ psppire_axis_resize (sheet->haxis, column, width);
if (GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)))
{
draw_column_title_buttons (sheet);
adjust_scrollbars (sheet);
gtk_sheet_size_allocate_entry (sheet);
- gtk_sheet_range_draw (sheet, NULL);
+ redraw_range (sheet, NULL);
}
}
-
static void
set_row_height (GtkSheet *sheet,
gint row,
- guint height)
+ gint height)
{
- guint min_height;
-
g_return_if_fail (sheet != NULL);
g_return_if_fail (GTK_IS_SHEET (sheet));
if (row < 0 || row >= psppire_axis_unit_count (sheet->vaxis))
return;
- gtk_sheet_row_size_request (sheet, row, &min_height);
- if (height < min_height) return;
-
- psppire_axis_impl_resize (sheet->vaxis, row, height);
+ psppire_axis_resize (sheet->vaxis, row, height);
if (GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)) )
{
draw_row_title_buttons (sheet);
adjust_scrollbars (sheet);
gtk_sheet_size_allocate_entry (sheet);
- gtk_sheet_range_draw (sheet, NULL);
+ redraw_range (sheet, NULL);
}
}
}
-static void
-gtk_sheet_row_size_request (GtkSheet *sheet,
- gint row,
- guint *requisition)
-{
- GtkRequisition button_requisition;
-
- gtk_sheet_button_size_request (sheet,
- g_sheet_model_get_row_button (sheet->model, row),
- &button_requisition);
-
- *requisition = button_requisition.height;
-
- sheet->row_requisition = *requisition;
-}
-
-static void
-gtk_sheet_column_size_request (GtkSheet *sheet,
- gint col,
- guint *requisition)
-{
- GtkRequisition button_requisition;
-
- GtkSheetButton *button = g_sheet_model_get_column_button (sheet->model, col);
-
- gtk_sheet_button_size_request (sheet,
- button,
- &button_requisition);
-
- gtk_sheet_button_free (button);
-
- *requisition = button_requisition.width;
-
- sheet->column_requisition = *requisition;
-}
-
-
static void
gtk_sheet_forall (GtkContainer *container,
gboolean include_internals,