+static void
+gtk_sheet_set_vertical_axis (GtkSheet *sheet, PsppireAxis *a)
+{
+ if ( sheet->vaxis )
+ g_object_unref (sheet->vaxis);
+
+ sheet->vaxis = a;
+
+ if ( sheet->vaxis )
+ g_object_ref (sheet->vaxis);
+}
+
+
+static void
+gtk_sheet_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+
+{
+ GtkSheet *sheet = GTK_SHEET (object);
+
+ switch (prop_id)
+ {
+ case PROP_VAXIS:
+ gtk_sheet_set_vertical_axis (sheet, g_value_get_pointer (value));
+ break;
+ case PROP_HAXIS:
+ gtk_sheet_set_horizontal_axis (sheet, g_value_get_pointer (value));
+ break;
+ case PROP_MODEL:
+ gtk_sheet_set_model (sheet, g_value_get_pointer (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ };
+}
+
+static void
+gtk_sheet_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GtkSheet *sheet = GTK_SHEET (object);
+
+ switch (prop_id)
+ {
+ case PROP_VAXIS:
+ g_value_set_pointer (value, sheet->vaxis);
+ break;
+ case PROP_HAXIS:
+ g_value_set_pointer (value, sheet->haxis);
+ break;
+ case PROP_MODEL:
+ g_value_set_pointer (value, sheet->model);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ };
+}
+
+
+static void
+gtk_sheet_class_init (GtkSheetClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ GParamSpec *haxis_spec ;
+ GParamSpec *vaxis_spec ;
+ GParamSpec *model_spec ;
+
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+ GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ /**
+ * GtkSheet::select-row
+ * @sheet: the sheet widget that emitted the signal
+ * @row: the newly selected row index
+ *
+ * A row has been selected.
+ */
+ sheet_signals[SELECT_ROW] =
+ g_signal_new ("select-row",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ offsetof (GtkSheetClass, select_row),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__INT,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_INT);
+
+
+ /**
+ * GtkSheet::select - column
+ * @sheet: the sheet widget that emitted the signal
+ * @column: the newly selected column index
+ *
+ * A column has been selected.
+ */
+ sheet_signals[SELECT_COLUMN] =
+ g_signal_new ("select-column",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ offsetof (GtkSheetClass, select_column),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__INT,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_INT);
+
+
+ /**
+ * GtkSheet::double-click-row
+ * @sheet: the sheet widget that emitted the signal
+ * @row: the row that was double clicked.
+ *
+ * A row's title button has been double clicked
+ */
+ sheet_signals[DOUBLE_CLICK_ROW] =
+ g_signal_new ("double-click-row",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__INT,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_INT);
+
+
+ /**
+ * GtkSheet::double-click-column
+ * @sheet: the sheet widget that emitted the signal
+ * @column: the column that was double clicked.
+ *
+ * A column's title button has been double clicked
+ */
+ sheet_signals[DOUBLE_CLICK_COLUMN] =
+ g_signal_new ("double-click-column",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__INT,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_INT);
+
+
+ /**
+ * GtkSheet::button-event-column
+ * @sheet: the sheet widget that emitted the signal
+ * @column: the column on which the event occured.
+ *
+ * A button event occured on a column title button
+ */
+ sheet_signals[BUTTON_EVENT_COLUMN] =
+ g_signal_new ("button-event-column",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL, NULL,
+ gtkextra_VOID__INT_POINTER,
+ G_TYPE_NONE,
+ 2,
+ G_TYPE_INT,
+ G_TYPE_POINTER
+ );
+
+
+ /**
+ * GtkSheet::button-event-row
+ * @sheet: the sheet widget that emitted the signal
+ * @column: the column on which the event occured.
+ *
+ * A button event occured on a row title button
+ */
+ sheet_signals[BUTTON_EVENT_ROW] =
+ g_signal_new ("button-event-row",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL, NULL,
+ gtkextra_VOID__INT_POINTER,
+ G_TYPE_NONE,
+ 2,
+ G_TYPE_INT,
+ G_TYPE_POINTER
+ );
+
+
+ sheet_signals[SELECT_RANGE] =
+ g_signal_new ("select-range",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ offsetof (GtkSheetClass, select_range),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__BOXED,
+ G_TYPE_NONE,
+ 1,
+ GTK_TYPE_SHEET_RANGE);
+
+
+ sheet_signals[RESIZE_RANGE] =
+ g_signal_new ("resize-range",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ offsetof (GtkSheetClass, resize_range),
+ NULL, NULL,
+ gtkextra_VOID__BOXED_BOXED,
+ G_TYPE_NONE,
+ 2,
+ GTK_TYPE_SHEET_RANGE, GTK_TYPE_SHEET_RANGE
+ );
+
+ sheet_signals[MOVE_RANGE] =
+ g_signal_new ("move-range",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ offsetof (GtkSheetClass, move_range),
+ NULL, NULL,
+ gtkextra_VOID__BOXED_BOXED,
+ G_TYPE_NONE,
+ 2,
+ GTK_TYPE_SHEET_RANGE, GTK_TYPE_SHEET_RANGE
+ );
+
+ sheet_signals[TRAVERSE] =
+ g_signal_new ("traverse",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ offsetof (GtkSheetClass, traverse),
+ NULL, NULL,
+ gtkextra_BOOLEAN__BOXED_POINTER,
+ G_TYPE_BOOLEAN, 2,
+ GTK_TYPE_SHEET_CELL,
+ G_TYPE_POINTER);
+
+
+ sheet_signals[ACTIVATE] =
+ g_signal_new ("activate",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ offsetof (GtkSheetClass, activate),
+ NULL, NULL,
+ gtkextra_VOID__INT_INT_INT_INT,
+ G_TYPE_NONE, 4,
+ G_TYPE_INT, G_TYPE_INT,
+ G_TYPE_INT, G_TYPE_INT);
+
+ widget_class->set_scroll_adjustments_signal =
+ g_signal_new ("set-scroll-adjustments",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ offsetof (GtkSheetClass, set_scroll_adjustments),
+ NULL, NULL,
+ gtkextra_VOID__OBJECT_OBJECT,
+ G_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT);
+
+
+ container_class->add = NULL;
+ container_class->remove = NULL;
+ container_class->forall = gtk_sheet_forall;
+
+ object_class->dispose = gtk_sheet_dispose;
+ object_class->finalize = gtk_sheet_finalize;
+
+
+ vaxis_spec =
+ g_param_spec_pointer ("vertical-axis",
+ "Vertical Axis",
+ "A pointer to the PsppireAxis object for the rows",
+ G_PARAM_READABLE | G_PARAM_WRITABLE );
+
+ haxis_spec =
+ g_param_spec_pointer ("horizontal-axis",
+ "Horizontal Axis",
+ "A pointer to the PsppireAxis object for the columns",
+ G_PARAM_READABLE | G_PARAM_WRITABLE );
+
+ model_spec =
+ g_param_spec_pointer ("model",
+ "Model",
+ "A pointer to the data model",
+ G_PARAM_READABLE | G_PARAM_WRITABLE );
+
+
+ object_class->set_property = gtk_sheet_set_property;
+ object_class->get_property = gtk_sheet_get_property;
+
+ g_object_class_install_property (object_class,
+ PROP_VAXIS,
+ vaxis_spec);
+
+ g_object_class_install_property (object_class,
+ PROP_HAXIS,
+ haxis_spec);
+
+ g_object_class_install_property (object_class,
+ PROP_MODEL,
+ model_spec);