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 redraw_range (GtkSheet *sheet, GtkSheetRange *range);
static void set_row_height (GtkSheet *sheet,
on_column_boundary (const GtkSheet *sheet, gint x, gint *column)
{
gint col;
+ gint pixel;
x += sheet->hadjustment->value;
+ if ( x < 0)
+ return FALSE;
+
col = column_from_xpixel (sheet, x);
- if ( column_from_xpixel (sheet, x - DRAG_WIDTH / 2) < col )
+ pixel = x - DRAG_WIDTH / 2;
+ if (pixel < 0)
+ pixel = 0;
+
+ if ( column_from_xpixel (sheet, pixel) < col )
{
*column = col - 1;
return TRUE;
on_row_boundary (const GtkSheet *sheet, gint y, gint *row)
{
gint r;
+ gint pixel;
y += sheet->vadjustment->value;
+ if ( y < 0)
+ return FALSE;
+
r = row_from_ypixel (sheet, y);
- if ( row_from_ypixel (sheet, y - DRAG_WIDTH / 2) < r )
+ pixel = y - DRAG_WIDTH / 2;
+ if (pixel < 0)
+ pixel = 0;
+
+ if ( row_from_ypixel (sheet, pixel) < r )
{
*row = r - 1;
return TRUE;
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_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_start_pixel (sheet->haxis, range->coli) -
psppire_axis_start_pixel (sheet->haxis, range->col0) +
psppire_axis_unit_size (sheet->haxis, range->coli);
psppire_axis_start_pixel (sheet->vaxis, range->row0) +
psppire_axis_unit_size (sheet->vaxis, range->rowi);
+ if ( sheet->column_titles_visible)
+ {
+ r->y += sheet->column_title_area.height;
+ }
+
+ if ( sheet->row_titles_visible)
+ {
+ r->x += sheet->row_title_area.width;
+ }
+
return TRUE;
}
GtkCallback callback,
gpointer callback_data);
-static void gtk_sheet_set_scroll_adjustments (GtkSheet *sheet,
+static gboolean gtk_sheet_set_scroll_adjustments (GtkSheet *sheet,
GtkAdjustment *hadjustment,
GtkAdjustment *vadjustment);
/* 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,
gint column);
-static void gtk_sheet_row_size_request (GtkSheet *sheet,
- gint row,
- guint *requisition);
-
-
/* Signals */
enum
{
PROP_MODEL
};
+static void
+resize_column (GtkSheet *sheet, gint unit, glong size)
+{
+ GtkSheetRange range;
+ range.col0 = unit;
+ range.coli = max_visible_column (sheet);
+ range.row0 = min_visible_row (sheet);
+ range.rowi = max_visible_row (sheet);
+
+ redraw_range (sheet, &range);
+
+ draw_column_title_buttons_range (sheet, range.col0, range.coli);
+}
+
+
static void
gtk_sheet_set_horizontal_axis (GtkSheet *sheet, PsppireAxis *a)
{
g_object_unref (sheet->haxis);
sheet->haxis = a;
+ g_signal_connect_swapped (a, "resize-unit", G_CALLBACK (resize_column), sheet);
if ( sheet->haxis )
g_object_ref (sheet->haxis);
}
+static void
+resize_row (GtkSheet *sheet, gint unit, glong size)
+{
+ GtkSheetRange range;
+ range.col0 = min_visible_column (sheet);
+ range.coli = max_visible_column (sheet);
+ range.row0 = unit;
+ range.rowi = max_visible_row (sheet);
+
+ redraw_range (sheet, &range);
+
+ draw_row_title_buttons_range (sheet, range.row0, range.rowi);
+}
+
static void
gtk_sheet_set_vertical_axis (GtkSheet *sheet, PsppireAxis *a)
{
sheet->vaxis = a;
+ g_signal_connect_swapped (a, "resize-unit", G_CALLBACK (resize_row), sheet);
+
if ( sheet->vaxis )
g_object_ref (sheet->vaxis);
}
redraw_range (GtkSheet *sheet, GtkSheetRange *range)
{
GdkRectangle rect;
-
+
if ( ! GTK_WIDGET_REALIZED (sheet))
return;
{
GdkRegion *r = gdk_drawable_get_visible_region (sheet->sheet_window);
gdk_region_get_clipbox (r, &rect);
+
+ if ( sheet->column_titles_visible)
+ {
+ rect.y += sheet->column_title_area.height;
+ rect.height -= sheet->column_title_area.height;
+ }
+
+ if ( sheet->row_titles_visible)
+ {
+ rect.x += sheet->row_title_area.width;
+ rect.width -= sheet->row_title_area.width;
+ }
}
gdk_window_invalidate_rect (sheet->sheet_window, &rect, FALSE);
{
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);
if (sheet->vadjustment)
g_signal_emit_by_name (sheet->vadjustment,
"value_changed");
+
size_allocate_global_button (sheet);
+
+ if ( sheet->row_titles_visible)
+ gtk_widget_show (sheet->button);
}
if (sheet->hadjustment)
g_signal_emit_by_name (sheet->hadjustment,
"value_changed");
+
size_allocate_global_button (sheet);
+
+ if ( sheet->column_titles_visible)
+ gtk_widget_show (sheet->button);
}
void
{
if (sheet->column_title_window)
gdk_window_hide (sheet->column_title_window);
- if (GTK_WIDGET_VISIBLE (sheet->button))
- gtk_widget_hide (sheet->button);
+
+ gtk_widget_hide (sheet->button);
adjust_scrollbars (sheet);
}
if (sheet->row_title_window)
gdk_window_hide (sheet->row_title_window);
- if (GTK_WIDGET_VISIBLE (sheet->button))
- gtk_widget_hide (sheet->button);
+ gtk_widget_hide (sheet->button);
adjust_scrollbars (sheet);
}
if (row >= 0)
- {
- gint y = psppire_axis_start_pixel (sheet->vaxis, row);
+ {
+ gint y = psppire_axis_start_pixel (sheet->vaxis, row);
- gtk_adjustment_set_value (sheet->vadjustment, y - height * row_align);
- }
+ gtk_adjustment_set_value (sheet->vadjustment, y - height * row_align);
+ }
if (col >= 0)
- {
- gint x = psppire_axis_start_pixel (sheet->haxis, col);
+ {
+ gint x = psppire_axis_start_pixel (sheet->haxis, col);
- gtk_adjustment_set_value (sheet->hadjustment, x - width * col_align);
- }
+ gtk_adjustment_set_value (sheet->hadjustment, x - width * col_align);
+ }
}
sheet->range.rowi = row;
sheet->range.coli = psppire_axis_unit_count (sheet->haxis) - 1;
sheet->active_cell.row = row;
- sheet->active_cell.col = 0;
g_signal_emit (sheet, sheet_signals[SELECT_ROW], 0, row);
gtk_sheet_real_select_range (sheet, NULL);
sheet->range.col0 = column;
sheet->range.rowi = psppire_axis_unit_count (sheet->vaxis) - 1;
sheet->range.coli = column;
- sheet->active_cell.row = 0;
sheet->active_cell.col = column;
g_signal_emit (sheet, sheet_signals[SELECT_COLUMN], 0, column);
}
-static void
+static gboolean
gtk_sheet_set_scroll_adjustments (GtkSheet *sheet,
GtkAdjustment *hadjustment,
GtkAdjustment *vadjustment)
if (sheet->vadjustment)
g_object_unref (sheet->vadjustment);
sheet->vadjustment = vadjustment;
- g_object_ref (vadjustment);
- g_signal_connect (sheet->vadjustment, "value_changed",
- G_CALLBACK (vadjustment_value_changed),
- sheet);
+ if ( vadjustment)
+ {
+ g_object_ref (vadjustment);
+
+ g_signal_connect (sheet->vadjustment, "value_changed",
+ G_CALLBACK (vadjustment_value_changed),
+ sheet);
+ }
}
if ( sheet->hadjustment != hadjustment )
{
if (sheet->hadjustment)
g_object_unref (sheet->hadjustment);
+
sheet->hadjustment = hadjustment;
- g_object_ref (hadjustment);
- g_signal_connect (sheet->hadjustment, "value_changed",
- G_CALLBACK (hadjustment_value_changed),
- sheet);
+ if ( hadjustment)
+ {
+ g_object_ref (hadjustment);
+
+ g_signal_connect (sheet->hadjustment, "value_changed",
+ G_CALLBACK (hadjustment_value_changed),
+ sheet);
+ }
}
+ return TRUE;
}
static void
sheet = GTK_SHEET (widget);
- GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
-
colormap = gtk_widget_get_colormap (widget);
display = gtk_widget_get_display (widget);
draw_column_title_buttons (sheet);
gtk_sheet_update_primary_selection (sheet);
+
+
+ GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
}
static void
{
sheet->button = gtk_button_new_with_label (" ");
+ GTK_WIDGET_UNSET_FLAGS(sheet->button, GTK_CAN_FOCUS);
+
g_object_ref_sink (sheet->button);
g_signal_connect (sheet->button,
allocation.height = sheet->column_title_area.height;
gtk_widget_size_allocate (sheet->button, &allocation);
- gtk_widget_show (sheet->button);
}
static void
gtk_widget_map (sheet->entry_widget);
}
- if (GTK_WIDGET_VISIBLE (sheet->button) &&
- !GTK_WIDGET_MAPPED (sheet->button))
+ if (!GTK_WIDGET_MAPPED (sheet->button))
{
gtk_widget_show (sheet->button);
gtk_widget_map (sheet->button);
}
- if (GTK_BIN (sheet->button)->child)
- if (GTK_WIDGET_VISIBLE (GTK_BIN (sheet->button)->child) &&
- !GTK_WIDGET_MAPPED (GTK_BIN (sheet->button)->child))
- gtk_widget_map (GTK_BIN (sheet->button)->child);
-
redraw_range (sheet, NULL);
change_active_cell (sheet,
sheet->active_cell.row,
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);
col >= psppire_axis_unit_count (sheet->haxis))
return;
- sheet->active_cell.row = row;
- sheet->active_cell.col = col;
-
if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)))
return;
}
static void
-gtk_sheet_entry_changed (GtkWidget *widget, gpointer data)
+entry_load_text (GtkSheet *sheet)
{
- GtkSheet *sheet = GTK_SHEET (data);
gint row, col;
const char *text;
GtkJustification justification;
GtkSheetCellAttr attributes;
-
- 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;
}
/* Erase the old cell */
gtk_sheet_draw_active_cell (sheet);
+ entry_load_text (sheet);
+
sheet->range.row0 = row;
sheet->range.col0 = col;
sheet->range.rowi = row;
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,
gtk_sheet_get_attributes (sheet, row, col, &attributes);
- if (GTK_IS_ENTRY (sheet_entry) && !GTK_WIDGET_HAS_FOCUS (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 (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;
+ }
}
- dispose_string (sheet, text);
}
gtk_sheet_size_allocate_entry (sheet);
if ( gtk_sheet_get_pixel_info (sheet, x, y, &row, &column) )
{
- if (sheet->row_title_under)
+ if (sheet->row_title_under && row >= 0)
{
gchar *text = g_sheet_model_get_row_subtitle (sheet->model, row);
g_free (text);
}
- if (sheet->column_title_under)
+ if (sheet->column_title_under && column >= 0)
{
gchar *text = g_sheet_model_get_column_subtitle (sheet->model,
column);
if (sheet->column_titles_visible)
sheet->row_title_area.y += sheet->column_title_area.height;
-
if (GTK_WIDGET_REALIZED (widget) && sheet->column_titles_visible)
gdk_window_move_resize (sheet->column_title_window,
sheet->column_title_area.x,
sheet->row_title_area.width,
sheet->row_title_area.height);
+ size_allocate_global_button (sheet);
+
if (sheet->haxis)
{
gint width = sheet->column_title_area.width;
if (!GTK_WIDGET_DRAWABLE (sheet)) return;
- size_allocate_global_button (sheet);
-
draw_column_title_buttons_range (sheet, min_visible_column (sheet),
max_visible_column (sheet));
}
if (!GTK_WIDGET_DRAWABLE (sheet)) return;
- size_allocate_global_button (sheet);
-
-
draw_row_title_buttons_range (sheet, min_visible_row (sheet),
max_visible_row (sheet));
}
G_CALLBACK (gtk_sheet_entry_key_press),
sheet);
- 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);
}
}
+/* Subtracts the region of WIDGET from REGION */
+static void
+subtract_widget_region (GdkRegion *region, GtkWidget *widget)
+{
+ GdkRectangle rect;
+ GdkRectangle intersect;
+ GdkRegion *region2;
+
+ gdk_region_get_clipbox (region, &rect);
+ gtk_widget_intersect (widget,
+ &rect,
+ &intersect);
+
+ region2 = gdk_region_rectangle (&intersect);
+ gdk_region_subtract (region, region2);
+ gdk_region_destroy (region2);
+}
+
static void
vadjustment_value_changed (GtkAdjustment *adjustment,
gpointer data)
region =
gdk_drawable_get_visible_region (GDK_DRAWABLE (sheet->sheet_window));
+ subtract_widget_region (region, sheet->button);
gdk_window_begin_paint_region (sheet->sheet_window, region);
draw_sheet_region (sheet, region);
draw_row_title_buttons (sheet);
- // size_allocate_global_button (sheet);
gtk_sheet_draw_active_cell (sheet);
gdk_window_end_paint (sheet->sheet_window);
region =
gdk_drawable_get_visible_region (GDK_DRAWABLE (sheet->sheet_window));
+ subtract_widget_region (region, sheet->button);
gdk_window_begin_paint_region (sheet->sheet_window, region);
draw_sheet_region (sheet, region);
draw_column_title_buttons (sheet);
- // size_allocate_global_button (sheet);
gtk_sheet_draw_active_cell (sheet);
if (column < 0 || column >= psppire_axis_unit_count (sheet->haxis))
return;
+ if ( width <= 0)
+ return;
+
psppire_axis_resize (sheet->haxis, column, width);
if (GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)))
if (row < 0 || row >= psppire_axis_unit_count (sheet->vaxis))
return;
+ if (height <= 0)
+ return;
+
psppire_axis_resize (sheet->vaxis, row, height);
if (GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)) )