2 * gnm-data-cache-source.c : GODataCacheSource from a Sheet
4 * Copyright (C) 2008 Jody Goldberg (jody@gnome.org)
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of the
9 * License, or (at your option) version 3.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
22 #include <gnumeric-config.h>
23 #include <gnm-data-cache-source.h>
24 #include <go-data-cache-source.h>
25 #include <go-data-cache.h>
31 #include <expr-name.h>
33 #include <gsf/gsf-impl-utils.h>
37 struct _GnmDataCacheSource
{
41 GnmRange src_range
; /* treated as cache if src_name is non-NULL */
42 GOString
*src_name
; /* optionally NULL */
44 typedef GObjectClass GnmDataCacheSourceClass
;
48 PROP_SHEET
, /* GnmSheet * */
49 PROP_RANGE
, /* GnmRange */
50 PROP_NAME
/* char *, optionally NULL */
54 gdcs_allocate (GODataCacheSource
const *src
)
56 GnmDataCacheSource
*gdcs
= (GnmDataCacheSource
*)src
;
59 g_return_val_if_fail (gdcs
->src_sheet
!= NULL
, NULL
);
61 if (NULL
!= gdcs
->src_name
) {
64 GnmNamedExpr
*nexpr
= expr_name_lookup (
65 parse_pos_init_sheet (&pp
, gdcs
->src_sheet
), gdcs
->src_name
->str
);
67 GnmValue
*v
= expr_name_eval (nexpr
,
68 eval_pos_init_sheet (&ep
, gdcs
->src_sheet
),
69 GNM_EXPR_EVAL_PERMIT_NON_SCALAR
| GNM_EXPR_EVAL_PERMIT_EMPTY
);
77 res
= g_object_new (GO_DATA_CACHE_TYPE
, NULL
);
83 gdcs_validate (GODataCacheSource
const *src
)
89 gdcs_needs_update (GODataCacheSource
const *src
)
95 gnm_data_cache_source_init (GnmDataCacheSource
*src
)
97 src
->src_sheet
= NULL
;
98 range_init_invalid (&src
->src_range
);
101 static GObjectClass
*parent_klass
;
103 gnm_data_cache_source_finalize (GObject
*obj
)
105 GnmDataCacheSource
*src
= (GnmDataCacheSource
*)obj
;
106 go_string_unref (src
->src_name
);
107 (parent_klass
->finalize
) (obj
);
110 gnm_data_cache_source_set_property (GObject
*obj
, guint property_id
,
111 GValue
const *value
, GParamSpec
*pspec
)
113 GnmDataCacheSource
*src
= (GnmDataCacheSource
*)obj
;
115 switch (property_id
) {
117 gnm_data_cache_source_set_sheet (src
, g_value_get_object (value
));
120 gnm_data_cache_source_set_range (src
, g_value_get_boxed (value
));
123 gnm_data_cache_source_set_name (src
, g_value_get_string (value
));
126 G_OBJECT_WARN_INVALID_PROPERTY_ID (obj
, property_id
, pspec
);
131 gnm_data_cache_source_get_property (GObject
*obj
, guint property_id
,
132 GValue
*value
, GParamSpec
*pspec
)
134 GnmDataCacheSource
const *src
= (GnmDataCacheSource
const *)obj
;
135 switch (property_id
) {
137 g_value_set_object (value
, gnm_data_cache_source_get_sheet (src
));
140 g_value_set_boxed (value
, gnm_data_cache_source_get_range (src
));
143 g_value_set_string (value
, gnm_data_cache_source_get_name (src
));
146 G_OBJECT_WARN_INVALID_PROPERTY_ID (obj
, property_id
, pspec
);
151 gnm_data_cache_source_class_init (GnmDataCacheSourceClass
*klass
)
153 GObjectClass
*gobject_class
= (GObjectClass
*)klass
;
154 gobject_class
->set_property
= gnm_data_cache_source_set_property
;
155 gobject_class
->get_property
= gnm_data_cache_source_get_property
;
156 gobject_class
->finalize
= gnm_data_cache_source_finalize
;
158 g_object_class_install_property (gobject_class
, PROP_SHEET
,
159 g_param_spec_object ("src-sheet",
161 P_("The source sheet"),
162 GNM_SHEET_TYPE
, GSF_PARAM_STATIC
| G_PARAM_READWRITE
));
163 g_object_class_install_property (gobject_class
, PROP_RANGE
,
164 g_param_spec_boxed ("src-range",
166 P_("Optional named expression to generate a source range"),
167 gnm_range_get_type (), GSF_PARAM_STATIC
| G_PARAM_READWRITE
));
168 g_object_class_install_property (gobject_class
, PROP_NAME
,
169 g_param_spec_string ("src-name",
171 P_("Optional named expression to generate a source range"),
173 GSF_PARAM_STATIC
| G_PARAM_READWRITE
));
175 parent_klass
= g_type_class_peek_parent (klass
);
179 gnm_data_cache_source_iface_init (GODataCacheSourceClass
*iface
)
181 iface
->allocate
= gdcs_allocate
;
182 iface
->validate
= gdcs_validate
;
183 iface
->needs_update
= gdcs_needs_update
;
186 GSF_CLASS_FULL (GnmDataCacheSource
, gnm_data_cache_source
, NULL
, NULL
,
187 gnm_data_cache_source_class_init
, NULL
,
188 gnm_data_cache_source_init
, G_TYPE_OBJECT
, 0,
189 GSF_INTERFACE (gnm_data_cache_source_iface_init
, GO_DATA_CACHE_SOURCE_TYPE
))
192 * gnm_data_cache_source_new:
194 * @src_range: #GnmRange
195 * @src_name: char *, optionally %NULL
197 * Allocates a new Allocates a new #GnmDataCacheSource
199 * Returns : #GODataCacheSource
202 gnm_data_cache_source_new (Sheet
*src_sheet
,
203 GnmRange
const *src_range
, char const *src_name
)
205 GnmDataCacheSource
*res
;
207 g_return_val_if_fail (IS_SHEET (src_sheet
), NULL
);
208 g_return_val_if_fail (src_range
!= NULL
, NULL
);
210 res
= g_object_new (GNM_DATA_CACHE_SOURCE_TYPE
, NULL
);
211 res
->src_sheet
= src_sheet
;
212 res
->src_range
= *src_range
;
213 gnm_data_cache_source_set_name (res
, src_name
);
215 return GO_DATA_CACHE_SOURCE (res
);
219 * gnm_data_cache_source_get_sheet:
220 * @src: #GnmDataCacheSource
222 * Returns: (transfer none): the #Sheet for @src.
225 gnm_data_cache_source_get_sheet (GnmDataCacheSource
const *src
)
227 g_return_val_if_fail (GNM_IS_DATA_CACHE_SOURCE (src
), NULL
);
228 return src
->src_sheet
;
232 gnm_data_cache_source_set_sheet (GnmDataCacheSource
*src
, Sheet
*sheet
)
234 g_return_if_fail (GNM_IS_DATA_CACHE_SOURCE (src
));
238 gnm_data_cache_source_get_range (GnmDataCacheSource
const *src
)
240 g_return_val_if_fail (GNM_IS_DATA_CACHE_SOURCE (src
), NULL
);
241 return &src
->src_range
;
245 gnm_data_cache_source_set_range (GnmDataCacheSource
*src
, GnmRange
const *r
)
247 g_return_if_fail (GNM_IS_DATA_CACHE_SOURCE (src
));
252 gnm_data_cache_source_get_name (GnmDataCacheSource
const *src
)
254 g_return_val_if_fail (GNM_IS_DATA_CACHE_SOURCE (src
), NULL
);
255 return src
->src_name
? src
->src_name
->str
: NULL
;
259 gnm_data_cache_source_set_name (GnmDataCacheSource
*src
, char const *name
)
263 g_return_if_fail (GNM_IS_DATA_CACHE_SOURCE (src
));
265 new_val
= go_string_new (name
);
266 go_string_unref (src
->src_name
);
267 src
->src_name
= new_val
;