#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 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
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,
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 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,
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);
}
-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)
{
gtk_style_set_background (widget->style, widget->window, widget->state);
}
+ set_entry_widget_font (sheet);
}
-#define BORDER_WIDTH 4
+#define BORDER_WIDTH 2
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 */
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++)
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 (sheet, &r);
}
-
-
sheet->range.row0 = row;
sheet->range.col0 = col;
sheet->range.rowi = row;
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;
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 + 1,
+ area.height + 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;
- range.rowi =
- row_from_ypixel (sheet,
- event->area.y +
- event->area.height + sheet->vadjustment->value);
- range.rowi++;
+ if ( sheet->row_titles_visible)
+ x -= sheet->row_title_area.width;
- range.col0 =
- column_from_xpixel (sheet,
- event->area.x + sheet->hadjustment->value);
- range.col0--;
+ maximize_int (&x, 0);
+ maximize_int (&y, 0);
- range.coli =
- column_from_xpixel (sheet,
- event->area.x + event->area.width +
- sheet->hadjustment->value);
- range.coli++;
+ 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)
{
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);
}
}
/* 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 (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);
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;
}
}
}
- 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 (event->window == sheet->row_title_window &&
- gtk_sheet_rows_resizable (sheet))
+ if (event->window == sheet->row_title_window)
{
#if AXIS_TRANSITION
if (!GTK_SHEET_IN_SELECTION (sheet) && POSSIBLE_YDRAG (sheet, y, &column))
}
+ 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 += BORDER_WIDTH / 2;
+ entry_alloc.y += 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;
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)
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)
{
* 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);
}
}
{
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;
}