1 /* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * gnm-data-cache-source.c : GODataCacheSource from a Sheet
5 * Copyright (C) 2008 Jody Goldberg (jody@gnome.org)
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as
9 * published by the Free Software Foundation; either version 2 of the
10 * License, or (at your option) version 3.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
23 #include <gnumeric-config.h>
24 #include "gnm-data-cache-source.h"
25 #include "go-data-cache-source.h"
26 #include "go-data-cache.h"
32 #include <expr-name.h>
34 #include <gsf/gsf-impl-utils.h>
38 struct _GnmDataCacheSource
{
42 GnmRange src_range
; /* treated as cache if src_name is non-NULL */
43 GOString
*src_name
; /* optionally NULL */
45 typedef GObjectClass GnmDataCacheSourceClass
;
49 PROP_SHEET
, /* GnmSheet * */
50 PROP_RANGE
, /* GnmRange */
51 PROP_NAME
/* char *, optionally NULL */
55 gdcs_allocate (GODataCacheSource
const *src
)
57 GnmDataCacheSource
*gdcs
= (GnmDataCacheSource
*)src
;
60 g_return_val_if_fail (gdcs
->src_sheet
!= NULL
, NULL
);
62 if (NULL
!= gdcs
->src_name
) {
65 GnmNamedExpr
*nexpr
= expr_name_lookup (
66 parse_pos_init_sheet (&pp
, gdcs
->src_sheet
), gdcs
->src_name
->str
);
68 GnmValue
*v
= expr_name_eval (nexpr
,
69 eval_pos_init_sheet (&ep
, gdcs
->src_sheet
),
70 GNM_EXPR_EVAL_PERMIT_NON_SCALAR
| GNM_EXPR_EVAL_PERMIT_EMPTY
);
78 res
= g_object_new (GO_DATA_CACHE_TYPE
, NULL
);
84 gdcs_validate (GODataCacheSource
const *src
)
90 gdcs_needs_update (GODataCacheSource
const *src
)
96 gnm_data_cache_source_init (GnmDataCacheSource
*src
)
98 src
->src_sheet
= NULL
;
99 range_init_invalid (&src
->src_range
);
102 static GObjectClass
*parent_klass
;
104 gnm_data_cache_source_finalize (GObject
*obj
)
106 GnmDataCacheSource
*src
= (GnmDataCacheSource
*)obj
;
107 go_string_unref (src
->src_name
);
108 (parent_klass
->finalize
) (obj
);
111 gnm_data_cache_source_set_property (GObject
*obj
, guint property_id
,
112 GValue
const *value
, GParamSpec
*pspec
)
114 GnmDataCacheSource
*src
= (GnmDataCacheSource
*)obj
;
116 switch (property_id
) {
118 gnm_data_cache_source_set_sheet (src
, g_value_get_object (value
));
121 gnm_data_cache_source_set_range (src
, g_value_get_boxed (value
));
124 gnm_data_cache_source_set_name (src
, g_value_get_string (value
));
127 G_OBJECT_WARN_INVALID_PROPERTY_ID (obj
, property_id
, pspec
);
132 gnm_data_cache_source_get_property (GObject
*obj
, guint property_id
,
133 GValue
*value
, GParamSpec
*pspec
)
135 GnmDataCacheSource
const *src
= (GnmDataCacheSource
const *)obj
;
136 switch (property_id
) {
138 g_value_set_object (value
, gnm_data_cache_source_get_sheet (src
));
141 g_value_set_boxed (value
, gnm_data_cache_source_get_range (src
));
144 g_value_set_string (value
, gnm_data_cache_source_get_name (src
));
147 G_OBJECT_WARN_INVALID_PROPERTY_ID (obj
, property_id
, pspec
);
152 gnm_data_cache_source_class_init (GnmDataCacheSourceClass
*klass
)
154 GObjectClass
*gobject_class
= (GObjectClass
*)klass
;
155 gobject_class
->set_property
= gnm_data_cache_source_set_property
;
156 gobject_class
->get_property
= gnm_data_cache_source_get_property
;
157 gobject_class
->finalize
= gnm_data_cache_source_finalize
;
159 g_object_class_install_property (gobject_class
, PROP_SHEET
,
160 g_param_spec_object ("src-sheet",
162 P_("The source sheet"),
163 GNM_SHEET_TYPE
, GSF_PARAM_STATIC
| G_PARAM_READWRITE
));
164 g_object_class_install_property (gobject_class
, PROP_RANGE
,
165 g_param_spec_boxed ("src-range",
167 P_("Optional named expression to generate a source range"),
168 gnm_range_get_type (), GSF_PARAM_STATIC
| G_PARAM_READWRITE
));
169 g_object_class_install_property (gobject_class
, PROP_NAME
,
170 g_param_spec_string ("src-name",
172 P_("Optional named expression to generate a source range"),
174 GSF_PARAM_STATIC
| G_PARAM_READWRITE
));
176 parent_klass
= g_type_class_peek_parent (klass
);
180 gnm_data_cache_source_iface_init (GODataCacheSourceClass
*iface
)
182 iface
->allocate
= gdcs_allocate
;
183 iface
->validate
= gdcs_validate
;
184 iface
->needs_update
= gdcs_needs_update
;
187 GSF_CLASS_FULL (GnmDataCacheSource
, gnm_data_cache_source
, NULL
, NULL
,
188 gnm_data_cache_source_class_init
, NULL
,
189 gnm_data_cache_source_init
, G_TYPE_OBJECT
, 0,
190 GSF_INTERFACE (gnm_data_cache_source_iface_init
, GO_DATA_CACHE_SOURCE_TYPE
))
193 * gnm_data_cache_source_new:
195 * @src_range: #GnmRange
196 * @src_name: char *, optionally %NULL
198 * Allocates a new Allocates a new #GnmDataCacheSource
200 * Returns : #GODataCacheSource
203 gnm_data_cache_source_new (Sheet
*src_sheet
,
204 GnmRange
const *src_range
, char const *src_name
)
206 GnmDataCacheSource
*res
;
208 g_return_val_if_fail (IS_SHEET (src_sheet
), NULL
);
209 g_return_val_if_fail (src_range
!= NULL
, NULL
);
211 res
= g_object_new (GNM_DATA_CACHE_SOURCE_TYPE
, NULL
);
212 res
->src_sheet
= src_sheet
;
213 res
->src_range
= *src_range
;
214 gnm_data_cache_source_set_name (res
, src_name
);
216 return GO_DATA_CACHE_SOURCE (res
);
220 * gnm_data_cache_source_get_sheet:
221 * @src: #GnmDataCacheSource
223 * Returns: (transfer none): the #Sheet for @src.
226 gnm_data_cache_source_get_sheet (GnmDataCacheSource
const *src
)
228 g_return_val_if_fail (IS_GNM_DATA_CACHE_SOURCE (src
), NULL
);
229 return src
->src_sheet
;
233 gnm_data_cache_source_set_sheet (GnmDataCacheSource
*src
, Sheet
*sheet
)
235 g_return_if_fail (IS_GNM_DATA_CACHE_SOURCE (src
));
239 gnm_data_cache_source_get_range (GnmDataCacheSource
const *src
)
241 g_return_val_if_fail (IS_GNM_DATA_CACHE_SOURCE (src
), NULL
);
242 return &src
->src_range
;
246 gnm_data_cache_source_set_range (GnmDataCacheSource
*src
, GnmRange
const *r
)
248 g_return_if_fail (IS_GNM_DATA_CACHE_SOURCE (src
));
253 gnm_data_cache_source_get_name (GnmDataCacheSource
const *src
)
255 g_return_val_if_fail (IS_GNM_DATA_CACHE_SOURCE (src
), NULL
);
256 return src
->src_name
? src
->src_name
->str
: NULL
;
260 gnm_data_cache_source_set_name (GnmDataCacheSource
*src
, char const *name
)
264 g_return_if_fail (IS_GNM_DATA_CACHE_SOURCE (src
));
266 new_val
= go_string_new (name
);
267 go_string_unref (src
->src_name
);
268 src
->src_name
= new_val
;