#define DEFAULT_COLUMN_WIDTH 80
#define DEFAULT_ROW_HEIGHT 25
+static void set_entry_widget_font (GtkSheet *sheet);
+
static void gtk_sheet_update_primary_selection (GtkSheet *sheet);
static void draw_column_title_buttons_range (GtkSheet *sheet, gint first, gint n);
static void draw_row_title_buttons_range (GtkSheet *sheet, gint first, gint n);
-static void gtk_sheet_set_row_height (GtkSheet *sheet,
- gint row,
- guint height);
+static void set_row_height (GtkSheet *sheet,
+ gint row,
+ guint height);
static void destroy_hover_window (GtkSheetHoverTitle *);
static GtkSheetHoverTitle *create_hover_window (void);
static inline glong
max_visible_row (const GtkSheet *sheet)
{
- return row_from_ypixel (sheet,
- sheet->vadjustment->value +
- sheet->vadjustment->page_size);
+ return row_from_ypixel (sheet, sheet->vadjustment->value + sheet->vadjustment->page_size);
}
static inline glong
max_visible_column (const GtkSheet *sheet)
{
- return column_from_xpixel (sheet,
- sheet->hadjustment->value +
- sheet->hadjustment->page_size);
+ return column_from_xpixel (sheet, sheet->hadjustment->value + sheet->hadjustment->page_size);
}
static inline glong
glong col = max_visible_column (sheet);
if ( psppire_axis_pixel_start (sheet->haxis, col)
- +
+ +
psppire_axis_unit_size (sheet->haxis, col)
> sheet->hadjustment->value)
col--;
return FALSE;
}
+static gboolean
+on_row_boundary (const GtkSheet *sheet, gint y, gint *row)
+{
+ gint r;
+
+ y += sheet->vadjustment->value;
+
+ r = row_from_ypixel (sheet, y);
+
+ if ( row_from_ypixel (sheet, y - DRAG_WIDTH / 2) < r )
+ {
+ *row = r - 1;
+ return TRUE;
+ }
+
+ if ( row_from_ypixel (sheet, y + DRAG_WIDTH / 2) > r )
+ {
+ *row = r;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
static inline gboolean
POSSIBLE_DRAG (const GtkSheet *sheet, gint x, gint y,
gint *drag_row, gint *drag_column)
static void gtk_sheet_unmap (GtkWidget *widget);
static gint gtk_sheet_expose (GtkWidget *widget,
GdkEventExpose *event);
+
static void gtk_sheet_forall (GtkContainer *container,
gboolean include_internals,
GtkCallback callback,
/* Sheet queries */
static gboolean gtk_sheet_range_isvisible (const GtkSheet *sheet,
- GtkSheetRange range);
+ const GtkSheetRange *range);
static gboolean gtk_sheet_cell_isvisible (GtkSheet *sheet,
gint row, gint column);
/* Drawing Routines */
static void gtk_sheet_entry_changed (GtkWidget *widget,
gpointer data);
-static void gtk_sheet_hide_active_cell (GtkSheet *sheet);
+static void gtk_sheet_hide_entry_widget (GtkSheet *sheet);
static void change_active_cell (GtkSheet *sheet,
gint row, gint col);
-static void gtk_sheet_draw_active_cell (GtkSheet *sheet);
-static void gtk_sheet_show_active_cell (GtkSheet *sheet);
+static 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,
gint column);
sheet->motion_timer = 0;
- sheet->columns_resizable = TRUE;
- sheet->rows_resizable = TRUE;
-
sheet->row_titles_visible = TRUE;
sheet->row_title_area.width = DEFAULT_COLUMN_WIDTH;
if ( !GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)))
return;
- if ( max_visible_row (sheet) > g_sheet_model_get_row_count (sheet->model)
- ||
- max_visible_column (sheet) > g_sheet_model_get_column_count (sheet->model))
- {
- gtk_sheet_moveto (sheet, 0, 0, 0, 0);
- }
-
if ( ( row0 < 0 && col0 < 0 ) || ( rowi < 0 && coli < 0 ) )
{
gtk_sheet_range_draw (sheet, NULL);
state = sheet->state;
if (sheet->state == GTK_SHEET_NORMAL)
- gtk_sheet_hide_active_cell (sheet);
+ gtk_sheet_hide_entry_widget (sheet);
sheet->entry_type = entry_type;
if (state == GTK_SHEET_NORMAL)
{
- gtk_sheet_show_active_cell (sheet);
+ gtk_sheet_show_entry_widget (sheet);
}
}
}
static void
-gtk_sheet_set_column_width (GtkSheet *sheet,
+set_column_width (GtkSheet *sheet,
gint column,
guint width);
}
-static gboolean
-gtk_sheet_columns_resizable (GtkSheet *sheet)
-{
- g_return_val_if_fail (sheet != NULL, FALSE);
- g_return_val_if_fail (GTK_IS_SHEET (sheet), FALSE);
-
- return sheet->columns_resizable;
-}
-
-
-static gboolean
-gtk_sheet_rows_resizable (GtkSheet *sheet)
-{
- g_return_val_if_fail (sheet != NULL, FALSE);
- g_return_val_if_fail (GTK_IS_SHEET (sheet), FALSE);
-
- return sheet->rows_resizable;
-}
-
-
void
gtk_sheet_select_row (GtkSheet *sheet, gint row)
{
static gboolean
gtk_sheet_range_isvisible (const GtkSheet *sheet,
- GtkSheetRange range)
+ const GtkSheetRange *range)
{
g_return_val_if_fail (sheet != NULL, FALSE);
- if (range.row0 < 0 || range.row0 >= psppire_axis_unit_count (sheet->vaxis))
+ if (range->row0 < 0 || range->row0 >= psppire_axis_unit_count (sheet->vaxis))
return FALSE;
- if (range.rowi < 0 || range.rowi >= psppire_axis_unit_count (sheet->vaxis))
+ if (range->rowi < 0 || range->rowi >= psppire_axis_unit_count (sheet->vaxis))
return FALSE;
- if (range.col0 < 0 || range.col0 >= psppire_axis_unit_count (sheet->haxis))
+ if (range->col0 < 0 || range->col0 >= psppire_axis_unit_count (sheet->haxis))
return FALSE;
- if (range.coli < 0 || range.coli >= psppire_axis_unit_count (sheet->haxis))
+ if (range->coli < 0 || range->coli >= psppire_axis_unit_count (sheet->haxis))
return FALSE;
- if (range.rowi < min_visible_row (sheet))
+ if (range->rowi < min_visible_row (sheet))
return FALSE;
- if (range.row0 > max_visible_row (sheet))
+ if (range->row0 > max_visible_row (sheet))
return FALSE;
- if (range.coli < min_visible_column (sheet))
+ if (range->coli < min_visible_column (sheet))
return FALSE;
- if (range.col0 > max_visible_column (sheet))
+ if (range->col0 > max_visible_column (sheet))
return FALSE;
return TRUE;
range.rowi = row;
range.coli = column;
- return gtk_sheet_range_isvisible (sheet, range);
+ return gtk_sheet_range_isvisible (sheet, &range);
}
void
gtk_style_set_background (widget->style, widget->window, widget->state);
}
+ set_entry_widget_font (sheet);
}
-#define BORDER_WIDTH 4
+#define BORDER_WIDTH 3
static void
gtk_sheet_realize (GtkWidget *widget)
sheet->fg_gc = gdk_gc_new (widget->window);
sheet->bg_gc = gdk_gc_new (widget->window);
- values.foreground = widget->style->white;
- values.function = GDK_INVERT;
+ values.foreground = widget->style->black;
+ values.function = GDK_COPY;
values.subwindow_mode = GDK_INCLUDE_INFERIORS;
values.line_width = BORDER_WIDTH;
global_button_clicked (GtkWidget *widget, gpointer data)
{
gtk_sheet_click_cell (GTK_SHEET (data), -1, -1);
- gtk_widget_grab_focus (GTK_WIDGET (data));
}
{
PangoLayout *layout;
PangoRectangle text;
+ PangoFontDescription *font_desc = GTK_WIDGET (sheet)->style->font_desc;
gint font_height;
gchar *label;
layout = gtk_widget_create_pango_layout (GTK_WIDGET (sheet), label);
dispose_string (sheet, label);
- pango_layout_set_font_description (layout, attributes.font_desc);
+ pango_layout_set_font_description (layout, font_desc);
+
pango_layout_get_pixel_extents (layout, NULL, &text);
gdk_gc_set_clip_rectangle (sheet->fg_gc, &area);
- font_height = pango_font_description_get_size (attributes.font_desc);
- if ( !pango_font_description_get_size_is_absolute (attributes.font_desc))
+ font_height = pango_font_description_get_size (font_desc);
+ if ( !pango_font_description_get_size_is_absolute (font_desc))
font_height /= PANGO_SCALE;
/* Centre the text vertically */
drawing_range.rowi = MIN (range->rowi, max_visible_row (sheet));
drawing_range.coli = MIN (range->coli, max_visible_column (sheet));
-
rectangle_from_range (sheet, &drawing_range, &area);
}
+ g_return_if_fail (drawing_range.rowi >= drawing_range.row0);
+ g_return_if_fail (drawing_range.coli >= drawing_range.col0);
- gdk_draw_rectangle (sheet->sheet_window,
- GTK_WIDGET (sheet)->style->white_gc,
- TRUE,
- area.x, area.y,
- area.width, area.height);
+ gdk_window_begin_paint_rect (sheet->sheet_window, &area);
for (i = drawing_range.row0; i <= drawing_range.rowi; i++)
for (j = drawing_range.col0; j <= drawing_range.coli; j++)
}
if (sheet->state != GTK_SHEET_NORMAL &&
- gtk_sheet_range_isvisible (sheet, sheet->range))
+ gtk_sheet_range_isvisible (sheet, &sheet->range))
gtk_sheet_range_draw_selection (sheet, drawing_range);
if (sheet->state == GTK_STATE_NORMAL &&
sheet->active_cell.row <= drawing_range.rowi &&
sheet->active_cell.col >= drawing_range.col0 &&
sheet->active_cell.col <= drawing_range.coli)
- gtk_sheet_show_active_cell (sheet);
+ gtk_sheet_show_entry_widget (sheet);
+
+ gdk_window_end_paint (sheet->sheet_window);
}
static void
range.row0 > sheet->range.rowi || range.rowi < sheet->range.row0)
return;
- if (!gtk_sheet_range_isvisible (sheet, range)) return;
+ if (!gtk_sheet_range_isvisible (sheet, &range)) return;
if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return;
aux = range;
if ( row == -1 || col == -1)
{
- gtk_sheet_hide_active_cell (sheet);
+ gtk_sheet_hide_entry_widget (sheet);
return;
}
static void
-gtk_sheet_hide_active_cell (GtkSheet *sheet)
+gtk_sheet_hide_entry_widget (GtkSheet *sheet)
{
- GdkRectangle area;
-
if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)))
return;
gtk_widget_hide (sheet->entry_widget);
gtk_widget_unmap (sheet->entry_widget);
- rectangle_from_cell (sheet,
- sheet->active_cell.row, sheet->active_cell.col,
- &area);
-
- gdk_draw_rectangle (sheet->sheet_window,
- GTK_WIDGET (sheet)->style->white_gc,
- TRUE,
- area.x, area.y,
- area.width, area.height);
-
- gtk_sheet_cell_draw (sheet, sheet->active_cell.row,
- sheet->active_cell.col);
-
GTK_WIDGET_UNSET_FLAGS (GTK_WIDGET (sheet->entry_widget), GTK_VISIBLE);
}
gtk_sheet_real_unselect_range (sheet, NULL);
}
+
g_signal_handler_block (sheet->entry_widget, sheet->entry_handler_id);
old_row = sheet->active_cell.row;
old_col = sheet->active_cell.col;
+ {
+ /* Redraw the neighbourhood of the old active cell */
+ GtkSheetRange r;
+ r.col0 = old_col - 1;
+ r.coli = old_col + 1;
+ r.row0 = old_row - 1;
+ r.rowi = old_row + 1;
+
+ maximize_int (&r.row0, 0);
+ maximize_int (&r.col0, 0);
+ minimize_int (&r.rowi, psppire_axis_unit_count (sheet->vaxis) - 1);
+ minimize_int (&r.coli, psppire_axis_unit_count (sheet->haxis) - 1);
+
+
+ if ( gtk_sheet_range_isvisible (sheet, &r))
+ gtk_sheet_range_draw (sheet, &r);
+ }
+
sheet->range.row0 = row;
sheet->range.col0 = col;
sheet->range.rowi = row;
GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
- gtk_sheet_show_active_cell (sheet);
+ gtk_sheet_draw_active_cell (sheet);
+ gtk_sheet_show_entry_widget (sheet);
g_signal_emit (sheet, sheet_signals [ACTIVATE], 0,
}
static void
-gtk_sheet_show_active_cell (GtkSheet *sheet)
+gtk_sheet_show_entry_widget (GtkSheet *sheet)
{
GtkEntry *sheet_entry;
GtkSheetCellAttr attributes;
row, col));
gtk_widget_map (sheet->entry_widget);
- gtk_widget_grab_focus (GTK_WIDGET (sheet_entry));
-
dispose_string (sheet, text);
}
-static void
+static gboolean
gtk_sheet_draw_active_cell (GtkSheet *sheet)
{
gint row, col;
GtkSheetRange range;
- if (!GTK_WIDGET_DRAWABLE (GTK_WIDGET (sheet))) return;
- if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return;
-
row = sheet->active_cell.row;
col = sheet->active_cell.col;
- if (row < 0 || col < 0) return;
+ if (row < 0 || col < 0) return FALSE;
if (!gtk_sheet_cell_isvisible (sheet, row, col))
- return;
+ return FALSE;
range.col0 = range.coli = col;
range.row0 = range.rowi = row;
gtk_sheet_draw_border (sheet, range);
+
+ return FALSE;
}
gdk_draw_rectangle (sheet->sheet_window,
sheet->xor_gc,
FALSE,
- area.x - BORDER_WIDTH / 2,
- area.y - BORDER_WIDTH / 2,
- area.width + BORDER_WIDTH,
- area.height + BORDER_WIDTH);
+ area.x, area.y,
+ area.width, area.height);
}
g_signal_emit (sheet, sheet_signals[SELECT_COLUMN], 0, -1);
g_signal_emit (sheet, sheet_signals[SELECT_ROW], 0, -1);
-#if 0
- if (gtk_sheet_range_isvisible (sheet, *range))
- gtk_sheet_draw_backing_pixmap (sheet, *range);
-#endif
-
sheet->range.row0 = -1;
sheet->range.rowi = -1;
sheet->range.col0 = -1;
}
- range.row0 =
- row_from_ypixel (sheet,
- event->area.y + sheet->vadjustment->value);
- range.row0--;
+ {
+ gint y = event->area.y + sheet->vadjustment->value;
+ gint x = event->area.x + sheet->hadjustment->value;
+
+ if ( sheet->column_titles_visible)
+ y -= sheet->column_title_area.height;
+
+ if ( sheet->row_titles_visible)
+ x -= sheet->row_title_area.width;
+
+ maximize_int (&x, 0);
+ maximize_int (&y, 0);
+
+ range.row0 = row_from_ypixel (sheet, y);
- range.rowi =
- row_from_ypixel (sheet,
- event->area.y +
- event->area.height + sheet->vadjustment->value);
- range.rowi++;
+ range.rowi = row_from_ypixel (sheet, y + event->area.height);
- range.col0 =
- column_from_xpixel (sheet,
- event->area.x + sheet->hadjustment->value);
- range.col0--;
+ range.col0 = column_from_xpixel (sheet, x);
- range.coli =
- column_from_xpixel (sheet,
- event->area.x + event->area.width +
- sheet->hadjustment->value);
- range.coli++;
+ range.coli = column_from_xpixel (sheet, x + event->area.width);
+ }
if (event->window == sheet->sheet_window)
{
if (sheet->state != GTK_SHEET_NORMAL)
{
- if (gtk_sheet_range_isvisible (sheet, sheet->range))
+ if (gtk_sheet_range_isvisible (sheet, &sheet->range))
gtk_sheet_range_draw (sheet, &sheet->range);
if (GTK_SHEET_IN_RESIZE (sheet) || GTK_SHEET_IN_DRAG (sheet))
gtk_sheet_range_draw (sheet, &sheet->drag_range);
- if (gtk_sheet_range_isvisible (sheet, sheet->range))
+ if (gtk_sheet_range_isvisible (sheet, &sheet->range))
gtk_sheet_range_draw_selection (sheet, sheet->range);
if (GTK_SHEET_IN_RESIZE (sheet) || GTK_SHEET_IN_DRAG (sheet))
draw_xor_rectangle (sheet, sheet->drag_range);
if ((!GTK_SHEET_IN_XDRAG (sheet)) && (!GTK_SHEET_IN_YDRAG (sheet)))
{
if (sheet->state == GTK_SHEET_NORMAL)
- gtk_sheet_draw_active_cell (sheet);
+ g_idle_add (gtk_sheet_draw_active_cell, sheet);
}
}
- if (sheet->state != GTK_SHEET_NORMAL && GTK_SHEET_IN_SELECTION (sheet))
- gtk_widget_grab_focus (GTK_WIDGET (sheet));
-
(* GTK_WIDGET_CLASS (parent_class)->expose_event) (widget, event);
return FALSE;
/* press on resize windows */
- if (event->window == sheet->column_title_window &&
- gtk_sheet_columns_resizable (sheet))
+ if (event->window == sheet->column_title_window)
{
-#if 0
- gtk_widget_get_pointer (widget, &sheet->x_drag, NULL);
- if ( sheet->row_titles_visible)
- sheet->x_drag -= sheet->row_title_area.width;
-#endif
-
sheet->x_drag = event->x;
if (on_column_boundary (sheet, sheet->x_drag, &sheet->drag_cell.col))
}
}
- if (event->window == sheet->row_title_window && gtk_sheet_rows_resizable (sheet))
+ if (event->window == sheet->row_title_window)
{
- gtk_widget_get_pointer (widget, NULL, &sheet->y_drag);
+ sheet->y_drag = event->y;
-#if AXIS_TRANSITION
- if (POSSIBLE_YDRAG (sheet, sheet->y_drag, &sheet->drag_cell.row))
+ 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);
draw_xor_hline (sheet);
return TRUE;
}
-#endif
}
/* the sheet itself does not handle other than single click events */
NULL, NULL, event->time);
gtk_grab_add (GTK_WIDGET (sheet));
- /* This seems to be a kludge to work around a problem where the sheet
- scrolls to another position. The timeout scrolls it back to its
- original posn. JMD 3 July 2007
- */
- gtk_widget_grab_focus (GTK_WIDGET (sheet));
-
if (sheet->selection_mode != GTK_SELECTION_SINGLE &&
sheet->selection_mode != GTK_SELECTION_NONE &&
sheet->cursor_drag->type == GDK_SIZING &&
{
veto = gtk_sheet_click_cell (sheet, -1, column);
gtk_grab_add (GTK_WIDGET (sheet));
- gtk_widget_grab_focus (GTK_WIDGET (sheet));
GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
}
}
{
veto = gtk_sheet_click_cell (sheet, row, -1);
gtk_grab_add (GTK_WIDGET (sheet));
- gtk_widget_grab_focus (GTK_WIDGET (sheet));
GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
}
}
sheet->range.coli = column;
sheet->state = GTK_SHEET_NORMAL;
GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
+
gtk_sheet_draw_active_cell (sheet);
+
+ gtk_widget_grab_focus (GTK_WIDGET (sheet->entry_widget));
+
return TRUE;
}
gtk_sheet_button_release (GtkWidget *widget,
GdkEventButton *event)
{
- gint y;
GdkDisplay *display = gtk_widget_get_display (widget);
GtkSheet *sheet = GTK_SHEET (widget);
width = new_column_width (sheet, sheet->drag_cell.col, &xpos);
- gtk_sheet_set_column_width (sheet, sheet->drag_cell.col, width);
+ 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);
- gtk_widget_get_pointer (widget, NULL, &y);
+
gdk_display_pointer_ungrab (display, event->time);
draw_xor_hline (sheet);
- gtk_sheet_set_row_height (sheet, sheet->drag_cell.row,
- new_row_height (sheet, sheet->drag_cell.row, &y));
- g_signal_emit_by_name (sheet->vadjustment, "value_changed");
+ height = new_row_height (sheet, sheet->drag_cell.row, &ypos);
+ set_row_height (sheet, sheet->drag_cell.row, height);
return TRUE;
}
-
if (GTK_SHEET_IN_DRAG (sheet))
{
GtkSheetRange old_range;
}
}
- if (event->window == sheet->column_title_window &&
- gtk_sheet_columns_resizable (sheet))
+ if (event->window == sheet->column_title_window)
{
if (!GTK_SHEET_IN_SELECTION (sheet) &&
on_column_boundary (sheet, x, &column))
if (new_cursor != sheet->cursor_drag->type)
{
gdk_cursor_unref (sheet->cursor_drag);
- sheet->cursor_drag = gdk_cursor_new_for_display (display, GDK_SB_H_DOUBLE_ARROW);
+ sheet->cursor_drag =
+ gdk_cursor_new_for_display (display, new_cursor);
+
gdk_window_set_cursor (sheet->column_title_window,
sheet->cursor_drag);
}
new_cursor != sheet->cursor_drag->type)
{
gdk_cursor_unref (sheet->cursor_drag);
- sheet->cursor_drag = gdk_cursor_new_for_display (display, GDK_TOP_LEFT_ARROW);
+ sheet->cursor_drag =
+ gdk_cursor_new_for_display (display, new_cursor);
gdk_window_set_cursor (sheet->column_title_window,
sheet->cursor_drag);
}
}
}
-
- if (event->window == sheet->row_title_window &&
- gtk_sheet_rows_resizable (sheet))
+ else if (event->window == sheet->row_title_window)
{
-#if AXIS_TRANSITION
- if (!GTK_SHEET_IN_SELECTION (sheet) && POSSIBLE_YDRAG (sheet, y, &column))
+ if (!GTK_SHEET_IN_SELECTION (sheet) &&
+ on_row_boundary (sheet, y, &row))
{
new_cursor = GDK_SB_V_DOUBLE_ARROW;
if (new_cursor != sheet->cursor_drag->type)
{
gdk_cursor_unref (sheet->cursor_drag);
- sheet->cursor_drag = gdk_cursor_new_for_display (display, GDK_SB_V_DOUBLE_ARROW);
- gdk_window_set_cursor (sheet->row_title_window, sheet->cursor_drag);
+ sheet->cursor_drag =
+ gdk_cursor_new_for_display (display, new_cursor);
+ gdk_window_set_cursor (sheet->row_title_window,
+ sheet->cursor_drag);
}
}
else
-#endif
{
new_cursor = GDK_TOP_LEFT_ARROW;
if (!GTK_SHEET_IN_YDRAG (sheet) &&
new_cursor != sheet->cursor_drag->type)
{
gdk_cursor_unref (sheet->cursor_drag);
- sheet->cursor_drag = gdk_cursor_new_for_display (display, GDK_TOP_LEFT_ARROW);
- gdk_window_set_cursor (sheet->row_title_window, sheet->cursor_drag);
+ sheet->cursor_drag =
+ gdk_cursor_new_for_display (display, new_cursor);
+ gdk_window_set_cursor (sheet->row_title_window,
+ sheet->cursor_drag);
}
}
}
}
+ g_signal_emit (sheet, sheet_signals[TRAVERSE], 0,
+ &sheet->active_cell,
+ &new_cell,
+ &forbidden);
+
+ if (forbidden)
+ return;
+
+
maximize_int (&new_cell.row, 0);
maximize_int (&new_cell.col, 0);
minimize_int (&new_cell.col,
psppire_axis_unit_count (sheet->haxis) - 1);
- g_signal_emit (sheet, sheet_signals[TRAVERSE], 0,
- &sheet->active_cell,
- &new_cell,
- &forbidden);
-
- if (forbidden)
- return;
-
change_active_cell (sheet, new_cell.row, new_cell.col);
+
if ( new_cell.col > max_fully_visible_column (sheet))
{
glong hpos =
gtk_adjustment_set_value (sheet->vadjustment,
vpos);
}
+
+ gtk_widget_grab_focus (GTK_WIDGET (sheet->entry_widget));
}
rectangle_from_cell (sheet, sheet->active_cell.row,
sheet->active_cell.col, &entry_alloc);
+ entry_alloc.width -= BORDER_WIDTH ;
+ entry_alloc.height -= BORDER_WIDTH ;
+ entry_alloc.x += DIV_RND_UP (BORDER_WIDTH, 2);
+ entry_alloc.y += DIV_RND_UP (BORDER_WIDTH, 2);
+
+
gtk_widget_set_size_request (sheet->entry_widget, entry_alloc.width,
entry_alloc.height);
gtk_widget_size_allocate (sheet->entry_widget, &entry_alloc);
}
+/* Copy the sheet's font to the entry widget */
+static void
+set_entry_widget_font (GtkSheet *sheet)
+{
+ GtkRcStyle *style = gtk_widget_get_modifier_style (sheet->entry_widget);
+
+ pango_font_description_free (style->font_desc);
+ style->font_desc = pango_font_description_copy (GTK_WIDGET (sheet)->style->font_desc);
+
+ gtk_widget_modify_style (sheet->entry_widget, style);
+}
+
+
+
static void
create_sheet_entry (GtkSheet *sheet)
{
gtk_widget_size_request (sheet->entry_widget, NULL);
+ if ( GTK_IS_ENTRY (sheet->entry_widget))
+ {
+ g_object_set (sheet->entry_widget,
+ "has-frame", FALSE,
+ NULL);
+ }
+
if (GTK_WIDGET_REALIZED (sheet))
{
gtk_widget_set_parent_window (sheet->entry_widget, sheet->sheet_window);
G_CALLBACK (gtk_sheet_entry_changed),
sheet);
+ set_entry_widget_font (sheet);
+
gtk_widget_show (sheet->entry_widget);
}
allocation.y += 2 * sheet->button->style->ythickness;
- if (button->label && strlen (button->label)>0)
+ if (button->label && strlen (button->label) > 0)
{
PangoRectangle rect;
gchar *line = button->label;
static void
draw_column_title_buttons_range (GtkSheet *sheet, gint first, gint last)
{
- GdkRegion *region;
+ GdkRectangle rect;
gint col;
if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return;
g_return_if_fail (first >= min_visible_column (sheet));
g_return_if_fail (last <= max_visible_column (sheet));
- region =
- gdk_drawable_get_visible_region (GDK_DRAWABLE (sheet->column_title_window));
+ rect.y = 0;
+ rect.height = sheet->column_title_area.height;
+ rect.x = psppire_axis_pixel_start (sheet->haxis, first) + CELL_SPACING;
+ rect.width = psppire_axis_pixel_start (sheet->haxis, last) + CELL_SPACING
+ + psppire_axis_unit_size (sheet->haxis, last);
- gdk_window_begin_paint_region (sheet->column_title_window, region);
+ rect.x -= sheet->hadjustment->value;
+
+ minimize_int (&rect.width, sheet->column_title_area.width);
+ maximize_int (&rect.x, 0);
+
+ gdk_window_begin_paint_rect (sheet->column_title_window, &rect);
for (col = first ; col <= last ; ++col)
{
static void
draw_row_title_buttons_range (GtkSheet *sheet, gint first, gint last)
{
- GdkRegion *region;
+ GdkRectangle rect;
gint row;
if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return;
g_return_if_fail (first >= min_visible_row (sheet));
g_return_if_fail (last <= max_visible_row (sheet));
+ rect.x = 0;
+ rect.width = sheet->row_title_area.width;
+ rect.y = psppire_axis_pixel_start (sheet->vaxis, first) + CELL_SPACING;
+ rect.height = psppire_axis_pixel_start (sheet->vaxis, last) + CELL_SPACING
+ + psppire_axis_unit_size (sheet->vaxis, last);
- region =
- gdk_drawable_get_visible_region (GDK_DRAWABLE (sheet->row_title_window));
-
- gdk_window_begin_paint_region (sheet->row_title_window, region);
+ rect.y -= sheet->vadjustment->value;
+ minimize_int (&rect.height, sheet->row_title_area.height);
+ maximize_int (&rect.y, 0);
+ gdk_window_begin_paint_rect (sheet->row_title_window, &rect);
for (row = first; row <= last; ++row)
{
GdkRectangle allocation;
* vadjustment_value_changed
* hadjustment_value_changed */
+
+static void
+update_adjustment (GtkAdjustment *adj, PsppireAxis *axis, gint page_size)
+{
+ double position =
+ (adj->value + adj->page_size)
+ /
+ (adj->upper - adj->lower);
+
+ const glong last_item = psppire_axis_unit_count (axis) - 1;
+
+ if (isnan (position) || position < 0)
+ position = 0;
+
+ adj->upper =
+ psppire_axis_pixel_start (axis, last_item)
+ +
+ psppire_axis_unit_size (axis, last_item)
+ ;
+
+ adj->lower = 0;
+ adj->page_size = page_size;
+
+#if 0
+ adj->value = position * (adj->upper - adj->lower) - adj->page_size;
+
+ if ( adj->value < adj->lower)
+ adj->value = adj->lower;
+#endif
+
+ gtk_adjustment_changed (adj);
+}
+
+
static void
adjust_scrollbars (GtkSheet *sheet)
{
sheet->column_title_area.height -
psppire_axis_unit_size (sheet->vaxis, last_row);
-
-
- sheet->vadjustment->upper =
- psppire_axis_pixel_start (sheet->vaxis, last_row)
- +
- psppire_axis_unit_size (sheet->vaxis, last_row)
- ;
-
- sheet->vadjustment->lower = 0;
- sheet->vadjustment->page_size = height;
-
- g_signal_emit_by_name (sheet->vadjustment, "changed");
+ update_adjustment (sheet->vadjustment, sheet->vaxis, height);
}
if (sheet->hadjustment)
{
- gint last_col;
+ gint last_col = psppire_axis_unit_count (sheet->haxis) - 1;
sheet->hadjustment->step_increment = 1;
sheet->hadjustment->page_increment = width;
- last_col = psppire_axis_unit_count (sheet->haxis) - 1;
-
sheet->hadjustment->upper =
psppire_axis_pixel_start (sheet->haxis, last_col)
+
psppire_axis_unit_size (sheet->haxis, last_col)
;
- sheet->hadjustment->lower = 0;
- sheet->hadjustment->page_size = width;
-
- g_signal_emit_by_name (sheet->hadjustment, "changed");
+ update_adjustment (sheet->hadjustment, sheet->haxis, width);
}
}
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);
}
draw_column_title_buttons (sheet);
// size_allocate_global_button (sheet);
+ gtk_sheet_draw_active_cell (sheet);
+
gdk_window_end_paint (sheet->sheet_window);
}
}
static void
-gtk_sheet_set_column_width (GtkSheet *sheet,
- gint column,
- guint width)
+set_column_width (GtkSheet *sheet,
+ gint column,
+ guint width)
{
guint min_width;
gtk_sheet_column_size_request (sheet, column, &min_width);
if (width < min_width) return;
-#if AXIS_TRANSITION
- g_sheet_column_set_width (sheet->column_geometry, column, width);
-#endif
+ psppire_axis_impl_resize (sheet->haxis, column, width);
if (GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)))
{
}
-
static void
-gtk_sheet_set_row_height (GtkSheet *sheet,
- gint row,
- guint height)
+set_row_height (GtkSheet *sheet,
+ gint row,
+ guint height)
{
guint min_height;
gtk_sheet_row_size_request (sheet, row, &min_height);
if (height < min_height) return;
-#if AXIS_TRANSITION
- g_sheet_row_set_height (sheet->row_geometry, row, height);
-#endif
+ psppire_axis_impl_resize (sheet->vaxis, row, height);
if (GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)) )
{
{
GdkColor *fg, *bg;
const GtkJustification *j ;
- const PangoFontDescription *font_desc ;
- const GtkSheetCellBorder *border ;
GdkColormap *colormap;
g_return_val_if_fail (sheet != NULL, FALSE);
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);
if (j)
attr->justification = *j;
- font_desc = g_sheet_model_get_font_desc (sheet->model, row, col);
- if ( font_desc ) attr->font_desc = font_desc;
-
- border = g_sheet_model_get_cell_border (sheet->model, row, col);
-
- if ( border ) attr->border = *border;
-
return TRUE;
}
gint r, c;
GString *string;
- if ( !gtk_sheet_range_isvisible (sheet, sheet->range))
+ if ( !gtk_sheet_range_isvisible (sheet, &sheet->range))
return NULL;
string = g_string_sized_new (80);
gint r, c;
GString *string;
- if ( !gtk_sheet_range_isvisible (sheet, sheet->range))
+ if ( !gtk_sheet_range_isvisible (sheet, &sheet->range))
return NULL;
string = g_string_sized_new (480);
clipboard = gtk_widget_get_clipboard (GTK_WIDGET (sheet),
GDK_SELECTION_PRIMARY);
- if (gtk_sheet_range_isvisible (sheet, sheet->range))
+ if (gtk_sheet_range_isvisible (sheet, &sheet->range))
{
if (!gtk_clipboard_set_with_owner (clipboard, targets,
G_N_ELEMENTS (targets),