[gnumeric] SheetWidgetAdjustment: support h and v versions better.
- From: Morten Welinder <mortenw src gnome org>
- To: svn-commits-list gnome org
- Subject: [gnumeric] SheetWidgetAdjustment: support h and v versions better.
- Date: Thu, 14 May 2009 09:47:59 -0400 (EDT)
commit 5e29f8e1be8c1931abac2ad4c092cc375b2487fa
Author: Morten Welinder <terra gnome org>
Date: Thu May 14 09:47:25 2009 -0400
SheetWidgetAdjustment: support h and v versions better.
---
ChangeLog | 9 ++++
src/sheet-object-widget.c | 108 +++++++++++++++++++++++++++++----------------
2 files changed, 79 insertions(+), 38 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index c23aeb4..084e690 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2009-05-14 Morten Welinder <terra gnome org>
+
+ * src/sheet-object-widget.c (SheetWidgetAdjustment): Add explicit
+ direction here.
+ (SheetWidgetAdjustmentClass): Identify h and v versions here.
+ (sheet_widget_adjustment_write_xml_sax): Save direction if needed.
+ (sheet_widget_adjustment_prep_sax_parser,
+ sheet_widget_adjustment_read_xml_dom): Read it here.
+
2009-05-13 Morten Welinder <terra gnome org>
* src/sheet-object-widget.c (sheet_widget_scrollbar_create_widget):
diff --git a/src/sheet-object-widget.c b/src/sheet-object-widget.c
index 3e2b687..92cce59 100644
--- a/src/sheet-object-widget.c
+++ b/src/sheet-object-widget.c
@@ -781,8 +781,14 @@ typedef struct {
gboolean being_updated;
GnmDependent dep;
GtkAdjustment *adjustment;
+
+ gboolean horizontal;
} SheetWidgetAdjustment;
-typedef SheetObjectWidgetClass SheetWidgetAdjustmentClass;
+
+typedef struct {
+ SheetObjectWidgetClass parent_class;
+ GType htype, vtype;
+} SheetWidgetAdjustmentClass;
static GType sheet_widget_adjustment_get_type (void);
@@ -876,18 +882,16 @@ cb_adjustment_widget_value_changed (GtkWidget *widget,
}
static void
-sheet_widget_adjustment_init_full (SheetWidgetAdjustment *swa, GnmCellRef const *ref)
+sheet_widget_adjustment_init_full (SheetWidgetAdjustment *swa,
+ GnmCellRef const *ref,
+ gboolean horizontal)
{
g_return_if_fail (swa != NULL);
swa->adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (0., 0., 100., 1., 10., 0.));
-#if GLIB_CHECK_VERSION(2,10,0) && GTK_CHECK_VERSION(2,8,14)
g_object_ref_sink (swa->adjustment);
-#else
- g_object_ref (swa->adjustment);
- gtk_object_sink (GTK_OBJECT (swa->adjustment));
-#endif
+ swa->horizontal = horizontal;
swa->being_updated = FALSE;
swa->dep.sheet = NULL;
swa->dep.flags = adjustment_get_dep_type ();
@@ -899,7 +903,12 @@ sheet_widget_adjustment_init_full (SheetWidgetAdjustment *swa, GnmCellRef const
static void
sheet_widget_adjustment_init (SheetWidgetAdjustment *swa)
{
- sheet_widget_adjustment_init_full (swa, NULL);
+ SheetWidgetAdjustmentClass *klass =
+ G_TYPE_INSTANCE_GET_CLASS (swa,
+ sheet_widget_adjustment_get_type(),
+ SheetWidgetAdjustmentClass);
+ gboolean horizontal = (klass->vtype == G_TYPE_NONE);
+ sheet_widget_adjustment_init_full (swa, NULL, horizontal);
}
static void
@@ -926,7 +935,9 @@ sheet_widget_adjustment_copy (SheetObject *dst, SheetObject const *src)
GtkAdjustment *dst_adjust, *src_adjust;
GnmCellRef ref;
- sheet_widget_adjustment_init_full (dst_swa, so_get_ref (src, &ref, FALSE));
+ sheet_widget_adjustment_init_full (dst_swa,
+ so_get_ref (src, &ref, FALSE),
+ src_swa->horizontal);
dst_adjust = dst_swa->adjustment;
src_adjust = src_swa->adjustment;
@@ -1140,11 +1151,20 @@ sheet_widget_adjustment_write_xml_sax (SheetObject const *so, GsfXMLOut *output,
GnmConventions const *convs)
{
SheetWidgetAdjustment const *swa = SHEET_WIDGET_ADJUSTMENT (so);
+ SheetWidgetAdjustmentClass *swa_class =
+ G_TYPE_INSTANCE_GET_CLASS (swa,
+ sheet_widget_adjustment_get_type(),
+ SheetWidgetAdjustmentClass);
+
gsf_xml_out_add_float (output, "Min", swa->adjustment->lower, 2);
gsf_xml_out_add_float (output, "Max", swa->adjustment->upper, 2); /* allow scrolling to max */
gsf_xml_out_add_float (output, "Inc", swa->adjustment->step_increment, 2);
gsf_xml_out_add_float (output, "Page", swa->adjustment->page_increment, 2);
gsf_xml_out_add_float (output, "Value", swa->adjustment->value, 2);
+
+ if (swa_class->htype != G_TYPE_NONE && swa_class->vtype != G_TYPE_NONE)
+ gsf_xml_out_add_bool (output, "Horizontal", swa->horizontal);
+
sax_write_dep (output, &swa->dep, "Input", convs);
}
@@ -1154,9 +1174,15 @@ sheet_widget_adjustment_prep_sax_parser (SheetObject *so, GsfXMLIn *xin,
GnmConventions const *convs)
{
SheetWidgetAdjustment *swa = SHEET_WIDGET_ADJUSTMENT (so);
+ SheetWidgetAdjustmentClass *swa_class =
+ G_TYPE_INSTANCE_GET_CLASS (swa,
+ sheet_widget_adjustment_get_type(),
+ SheetWidgetAdjustmentClass);
+ swa->horizontal = (swa_class->vtype == G_TYPE_NONE);
for (; attrs != NULL && attrs[0] && attrs[1] ; attrs += 2) {
double tmp;
+ gboolean b;
if (gnm_xml_attr_double (attrs, "Min", &tmp))
swa->adjustment->lower = tmp;
@@ -1170,6 +1196,10 @@ sheet_widget_adjustment_prep_sax_parser (SheetObject *so, GsfXMLIn *xin,
swa->adjustment->value = tmp;
else if (sax_read_dep (attrs, "Input", &swa->dep, xin, convs))
;
+ else if (swa_class->htype != G_TYPE_NONE &&
+ swa_class->vtype != G_TYPE_NONE &&
+ gnm_xml_attr_bool (attrs, "Horizontal", &b))
+ swa->horizontal = b;
}
swa->dep.flags = adjustment_get_dep_type ();
@@ -1182,7 +1212,14 @@ sheet_widget_adjustment_read_xml_dom (SheetObject *so, char const *typename,
xmlNodePtr tree)
{
SheetWidgetAdjustment *swa = SHEET_WIDGET_ADJUSTMENT (so);
+ SheetWidgetAdjustmentClass *swa_class =
+ G_TYPE_INSTANCE_GET_CLASS (swa,
+ sheet_widget_adjustment_get_type(),
+ SheetWidgetAdjustmentClass);
double tmp;
+ gboolean b;
+
+ swa->horizontal = (swa_class->vtype == G_TYPE_NONE);
read_dep (&swa->dep, "Input", tree, context);
swa->dep.flags = adjustment_get_dep_type ();
@@ -1197,6 +1234,11 @@ sheet_widget_adjustment_read_xml_dom (SheetObject *so, char const *typename,
swa->adjustment->page_increment = tmp;
if (xml_node_get_double (tree, "Value", &tmp))
swa->adjustment->value = tmp;
+ if (swa_class->htype != G_TYPE_NONE &&
+ swa_class->vtype != G_TYPE_NONE &&
+ xml_node_get_bool (tree, "Horizontal", &b))
+ swa->horizontal = b;
+
gtk_adjustment_changed (swa->adjustment);
return FALSE;
@@ -1246,30 +1288,17 @@ SOW_MAKE_TYPE (adjustment, Adjustment,
#define SHEET_WIDGET_SCROLLBAR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SHEET_WIDGET_SCROLLBAR_TYPE, SheetWidgetScrollbar))
#define DEP_TO_SCROLLBAR(d_ptr) (SheetWidgetScrollbar *)(((char *)d_ptr) - G_STRUCT_OFFSET(SheetWidgetScrollbar, dep))
-typedef struct {
- SheetWidgetAdjustment adjustment;
- int horizontal;
-} SheetWidgetScrollbar;
-
-typedef SheetWidgetAdjustmentClass SheetWidgetScrollbarClass;
+typedef SheetWidgetAdjustment SheetWidgetScrollbar;
+typedef SheetWidgetAdjustmentClass SheetWidgetScrollbarClass;
static GtkWidget *
sheet_widget_scrollbar_create_widget (SheetObjectWidget *sow)
{
- SheetObject *so = SHEET_OBJECT (sow);
SheetWidgetAdjustment *swa = SHEET_WIDGET_ADJUSTMENT (sow);
- SheetWidgetScrollbar *sws = SHEET_WIDGET_SCROLLBAR (sow);
GtkWidget *bar;
- /* TODO : this is not exactly accurate, but should catch the worst of it
- * However we do not have a way to handle resizes.
- */
- if (sws->horizontal == -1)
- sws->horizontal = (range_width (&so->anchor.cell_bound) >
- range_height (&so->anchor.cell_bound));
-
swa->being_updated = TRUE;
- bar = sws->horizontal
+ bar = swa->horizontal
? gtk_hscrollbar_new (swa->adjustment)
: gtk_vscrollbar_new (swa->adjustment);
GTK_WIDGET_UNSET_FLAGS (bar, GTK_CAN_FOCUS);
@@ -1289,20 +1318,18 @@ sheet_widget_scrollbar_user_config (SheetObject *so, SheetControl *sc)
}
static void
-sheet_widget_scrollbar_init (SheetWidgetScrollbar *sws)
-{
- sws->horizontal = -1; /* Undecided. */
-}
-
-static void
sheet_widget_scrollbar_class_init (SheetObjectWidgetClass *sow_class)
{
+ SheetWidgetAdjustmentClass *swa_class = (SheetWidgetAdjustmentClass *)sow_class;
+
sow_class->create_widget = &sheet_widget_scrollbar_create_widget;
SHEET_OBJECT_CLASS (sow_class)->user_config = &sheet_widget_scrollbar_user_config;
+ swa_class->htype = GTK_TYPE_HSCROLLBAR;
+ swa_class->vtype = GTK_TYPE_VSCROLLBAR;
}
GSF_CLASS (SheetWidgetScrollbar, sheet_widget_scrollbar,
- &sheet_widget_scrollbar_class_init, sheet_widget_scrollbar_init,
+ &sheet_widget_scrollbar_class_init, NULL,
SHEET_WIDGET_ADJUSTMENT_TYPE)
/****************************************************************************/
@@ -1340,8 +1367,13 @@ sheet_widget_spinbutton_user_config (SheetObject *so, SheetControl *sc)
static void
sheet_widget_spinbutton_class_init (SheetObjectWidgetClass *sow_class)
{
+ SheetWidgetAdjustmentClass *swa_class = (SheetWidgetAdjustmentClass *)sow_class;
+
sow_class->create_widget = &sheet_widget_spinbutton_create_widget;
SHEET_OBJECT_CLASS (sow_class)->user_config = &sheet_widget_spinbutton_user_config;
+
+ swa_class->htype = GTK_TYPE_SPIN_BUTTON;
+ swa_class->vtype = G_TYPE_NONE;
}
GSF_CLASS (SheetWidgetSpinbutton, sheet_widget_spinbutton,
@@ -1359,16 +1391,11 @@ typedef SheetWidgetAdjustmentClass SheetWidgetSliderClass;
static GtkWidget *
sheet_widget_slider_create_widget (SheetObjectWidget *sow)
{
- SheetObject *so = SHEET_OBJECT (sow);
SheetWidgetAdjustment *swa = SHEET_WIDGET_ADJUSTMENT (sow);
GtkWidget *slider;
- /* TODO : this is not exactly accurate, but should catch the worst of it
- * However we do not have a way to handle resizes.
- */
- gboolean is_horizontal = range_width (&so->anchor.cell_bound) > range_height (&so->anchor.cell_bound);
swa->being_updated = TRUE;
- slider = is_horizontal
+ slider = swa->horizontal
? gtk_hscale_new (swa->adjustment)
: gtk_vscale_new (swa->adjustment);
gtk_scale_set_draw_value (GTK_SCALE (slider), FALSE);
@@ -1391,8 +1418,13 @@ sheet_widget_slider_user_config (SheetObject *so, SheetControl *sc)
static void
sheet_widget_slider_class_init (SheetObjectWidgetClass *sow_class)
{
+ SheetWidgetAdjustmentClass *swa_class = (SheetWidgetAdjustmentClass *)sow_class;
+
sow_class->create_widget = &sheet_widget_slider_create_widget;
SHEET_OBJECT_CLASS (sow_class)->user_config = &sheet_widget_slider_user_config;
+
+ swa_class->htype = GTK_TYPE_HSCALE;
+ swa_class->vtype = GTK_TYPE_VSCALE;
}
GSF_CLASS (SheetWidgetSlider, sheet_widget_slider,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]