#include <pango/pango.h>
#include "gtksheet.h"
#include <gtksheet/psppire-marshal.h>
-#include "gsheetmodel.h"
+#include "psppire-sheetmodel.h"
#include <libpspp/misc.h>
#include <math.h>
static inline void
dispose_string (const GtkSheet *sheet, gchar *text)
{
- GSheetModel *model = gtk_sheet_get_model (sheet);
+ PsppireSheetModel *model = gtk_sheet_get_model (sheet);
if ( ! model )
return;
- if (g_sheet_model_free_strings (model))
+ if (psppire_sheet_model_free_strings (model))
g_free (text);
}
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;
}
gint column);
-static void gtk_sheet_row_size_request (GtkSheet *sheet,
- gint row,
- guint *requisition);
-
-
/* Signals */
enum
{
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);
/* Callback which occurs whenever columns are inserted / deleted in the model */
static void
-columns_inserted_deleted_callback (GSheetModel *model, gint first_column,
+columns_inserted_deleted_callback (PsppireSheetModel *model, gint first_column,
gint n_columns,
gpointer data)
{
GtkSheet *sheet = GTK_SHEET (data);
GtkSheetRange range;
- gint model_columns = g_sheet_model_get_column_count (model);
+ gint model_columns = psppire_sheet_model_get_column_count (model);
/* Need to update all the columns starting from the first column and onwards.
/* Callback which occurs whenever rows are inserted / deleted in the model */
static void
-rows_inserted_deleted_callback (GSheetModel *model, gint first_row,
+rows_inserted_deleted_callback (PsppireSheetModel *model, gint first_row,
gint n_rows, gpointer data)
{
GtkSheet *sheet = GTK_SHEET (data);
GtkSheetRange range;
- gint model_rows = g_sheet_model_get_row_count (model);
+ gint model_rows = psppire_sheet_model_get_row_count (model);
/* Need to update all the rows starting from the first row and onwards.
* Previous rows are unchanged, so don't need to be updated.
If col0 or coli are negative, then all columns will be updated.
*/
static void
-range_update_callback (GSheetModel *m, gint row0, gint col0,
+range_update_callback (PsppireSheetModel *m, gint row0, gint col0,
gint rowi, gint coli, gpointer data)
{
GtkSheet *sheet = GTK_SHEET (data);
* Returns: the new sheet widget
*/
GtkWidget *
-gtk_sheet_new (GSheetModel *model)
+gtk_sheet_new (PsppireSheetModel *model)
{
GtkWidget *widget = g_object_new (GTK_TYPE_SHEET,
"model", model,
*
*/
void
-gtk_sheet_set_model (GtkSheet *sheet, GSheetModel *model)
+gtk_sheet_set_model (GtkSheet *sheet, PsppireSheetModel *model)
{
g_return_if_fail (GTK_IS_SHEET (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->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,
GtkJustification justification,
const gchar *text)
{
- GSheetModel *model ;
+ PsppireSheetModel *model ;
gchar *old_text ;
g_return_if_fail (sheet != NULL);
model = gtk_sheet_get_model (sheet);
- old_text = g_sheet_model_get_string (model, row, col);
+ old_text = psppire_sheet_model_get_string (model, row, col);
if (0 != safe_strcmp (old_text, text))
{
g_signal_handler_block (sheet->model, sheet->update_handler_id);
- g_sheet_model_set_string (model, text, row, col);
+ psppire_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))
+ if ( psppire_sheet_model_free_strings (model))
g_free (old_text);
}
static void
gtk_sheet_real_cell_clear (GtkSheet *sheet, gint row, gint column)
{
- GSheetModel *model = gtk_sheet_get_model (sheet);
+ PsppireSheetModel *model = gtk_sheet_get_model (sheet);
gchar *old_text = gtk_sheet_cell_get_text (sheet, row, column);
if (old_text && strlen (old_text) > 0 )
{
- g_sheet_model_datum_clear (model, row, column);
+ psppire_sheet_model_datum_clear (model, row, column);
}
dispose_string (sheet, old_text);
gchar *
gtk_sheet_cell_get_text (const GtkSheet *sheet, gint row, gint col)
{
- GSheetModel *model;
+ PsppireSheetModel *model;
g_return_val_if_fail (sheet != NULL, NULL);
g_return_val_if_fail (GTK_IS_SHEET (sheet), NULL);
if ( !model )
return NULL;
- return g_sheet_model_get_string (model, row, col);
+ return psppire_sheet_model_get_string (model, row, col);
}
gtk_sheet_size_allocate_entry (sheet);
gtk_widget_set_sensitive (GTK_WIDGET (sheet_entry),
- g_sheet_model_is_editable (sheet->model,
+ psppire_sheet_model_is_editable (sheet->model,
row, col));
gtk_widget_map (sheet->entry_widget);
}
sheet_signals[BUTTON_EVENT_COLUMN], 0,
column, event);
- if (g_sheet_model_get_column_sensitivity (sheet->model, column))
+ if (psppire_sheet_model_get_column_sensitivity (sheet->model, column))
{
if ( event->type == GDK_2BUTTON_PRESS && event->button == 1)
g_signal_emit (sheet,
sheet_signals[BUTTON_EVENT_ROW], 0,
row, event);
- if (g_sheet_model_get_row_sensitivity (sheet->model, row))
+ if (psppire_sheet_model_get_row_sensitivity (sheet->model, row))
{
if ( event->type == GDK_2BUTTON_PRESS && event->button == 1)
g_signal_emit (sheet,
column = column_from_xpixel (sheet, x);
- if (g_sheet_model_get_column_sensitivity (sheet->model, column))
+ if (psppire_sheet_model_get_column_sensitivity (sheet->model, column))
{
veto = gtk_sheet_click_cell (sheet, -1, column);
gtk_grab_add (GTK_WIDGET (sheet));
y += sheet->vadjustment->value;
row = row_from_ypixel (sheet, y);
- if (g_sheet_model_get_row_sensitivity (sheet->model, row))
+ if (psppire_sheet_model_get_row_sensitivity (sheet->model, row))
{
veto = gtk_sheet_click_cell (sheet, row, -1);
gtk_grab_add (GTK_WIDGET (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);
+ gchar *text = psppire_sheet_model_get_row_subtitle (sheet->model, row);
show_subtitle (sheet, row, -1, text);
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,
+ gchar *text = psppire_sheet_model_get_column_subtitle (sheet->model,
column);
show_subtitle (sheet, -1, column, text);
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));
}
allocation.x, allocation.y,
allocation.width, allocation.height);
+ gtk_widget_ensure_style (sheet->button);
+
gtk_paint_box (sheet->button->style, window,
GTK_STATE_NORMAL, GTK_SHADOW_OUT,
&allocation, GTK_WIDGET (sheet->button),
gboolean is_sensitive = FALSE;
GtkSheetButton *
- button = g_sheet_model_get_column_button (sheet->model, col);
+ button = psppire_sheet_model_get_column_button (sheet->model, col);
allocation.y = 0;
allocation.x = psppire_axis_start_pixel (sheet->haxis, col)
+ CELL_SPACING;
allocation.height = sheet->column_title_area.height;
allocation.width = psppire_axis_unit_size (sheet->haxis, col);
- is_sensitive = g_sheet_model_get_column_sensitivity (sheet->model, col);
+ is_sensitive = psppire_sheet_model_get_column_sensitivity (sheet->model, col);
draw_button (sheet, sheet->column_title_window,
button, is_sensitive, allocation);
gboolean is_sensitive = FALSE;
GtkSheetButton *button =
- g_sheet_model_get_row_button (sheet->model, row);
+ psppire_sheet_model_get_row_button (sheet->model, row);
allocation.x = 0;
allocation.y = psppire_axis_start_pixel (sheet->vaxis, row)
+ CELL_SPACING;
allocation.width = sheet->row_title_area.width;
allocation.height = psppire_axis_unit_size (sheet->vaxis, row);
- is_sensitive = g_sheet_model_get_row_sensitivity (sheet->model, row);
+ is_sensitive = psppire_sheet_model_get_row_sensitivity (sheet->model, row);
draw_button (sheet, sheet->row_title_window,
button, is_sensitive, allocation);
}
}
+/* 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)) )
attr->border.mask = 0;
attr->border.color = GTK_WIDGET (sheet)->style->black;
- attr->is_editable = g_sheet_model_is_editable (sheet->model, row, col);
+ attr->is_editable = psppire_sheet_model_is_editable (sheet->model, row, col);
colormap = gtk_widget_get_colormap (GTK_WIDGET (sheet));
- fg = g_sheet_model_get_foreground (sheet->model, row, col);
+ fg = psppire_sheet_model_get_foreground (sheet->model, row, col);
if ( fg )
{
gdk_colormap_alloc_color (colormap, fg, TRUE, TRUE);
attr->foreground = *fg;
}
- bg = g_sheet_model_get_background (sheet->model, row, col);
+ bg = psppire_sheet_model_get_background (sheet->model, row, col);
if ( bg )
{
gdk_colormap_alloc_color (colormap, bg, TRUE, TRUE);
}
attr->justification =
- g_sheet_model_get_column_justification (sheet->model, col);
+ psppire_sheet_model_get_column_justification (sheet->model, col);
- j = g_sheet_model_get_justification (sheet->model, row, col);
+ j = psppire_sheet_model_get_justification (sheet->model, row, col);
if (j)
attr->justification = *j;
}
-GSheetModel *
+PsppireSheetModel *
gtk_sheet_get_model (const GtkSheet *sheet)
{
g_return_val_if_fail (GTK_IS_SHEET (sheet), NULL);