Update Spanish translation
[gnumeric.git] / src / gnm-data-cache-source.c
blob2568b673a281d2b390a4f0a37107ebf36bd690aa
1 /*
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
19 * USA
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>
28 #include <gnumeric.h>
29 #include <ranges.h>
30 #include <sheet.h>
31 #include <expr-name.h>
33 #include <gsf/gsf-impl-utils.h>
34 #include <gnm-i18n.h>
35 #include <string.h>
37 struct _GnmDataCacheSource {
38 GObject base;
40 Sheet *src_sheet;
41 GnmRange src_range; /* treated as cache if src_name is non-NULL */
42 GOString *src_name; /* optionally NULL */
44 typedef GObjectClass GnmDataCacheSourceClass;
46 enum {
47 PROP_0,
48 PROP_SHEET, /* GnmSheet * */
49 PROP_RANGE, /* GnmRange */
50 PROP_NAME /* char *, optionally NULL */
53 static GODataCache *
54 gdcs_allocate (GODataCacheSource const *src)
56 GnmDataCacheSource *gdcs = (GnmDataCacheSource *)src;
57 GODataCache *res;
59 g_return_val_if_fail (gdcs->src_sheet != NULL, NULL);
61 if (NULL != gdcs->src_name) {
62 GnmParsePos pp;
63 GnmEvalPos ep;
64 GnmNamedExpr *nexpr = expr_name_lookup (
65 parse_pos_init_sheet (&pp, gdcs->src_sheet), gdcs->src_name->str);
66 if (NULL != nexpr) {
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);
71 if (NULL != v) {
72 value_release (v);
77 res = g_object_new (GO_DATA_CACHE_TYPE, NULL);
79 return res;
82 static GError *
83 gdcs_validate (GODataCacheSource const *src)
85 return NULL;
88 static gboolean
89 gdcs_needs_update (GODataCacheSource const *src)
91 return FALSE;
94 static void
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;
102 static void
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);
109 static void
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) {
116 case PROP_SHEET :
117 gnm_data_cache_source_set_sheet (src, g_value_get_object (value));
118 break;
119 case PROP_RANGE :
120 gnm_data_cache_source_set_range (src, g_value_get_boxed (value));
121 break;
122 case PROP_NAME :
123 gnm_data_cache_source_set_name (src, g_value_get_string (value));
124 break;
125 default:
126 G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec);
130 static void
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) {
136 case PROP_SHEET :
137 g_value_set_object (value, gnm_data_cache_source_get_sheet (src));
138 break;
139 case PROP_RANGE :
140 g_value_set_boxed (value, gnm_data_cache_source_get_range (src));
141 break;
142 case PROP_NAME :
143 g_value_set_string (value, gnm_data_cache_source_get_name (src));
144 break;
145 default:
146 G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec);
150 static void
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",
160 P_("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",
165 P_("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",
170 P_("source-name"),
171 P_("Optional named expression to generate a source range"),
172 NULL,
173 GSF_PARAM_STATIC | G_PARAM_READWRITE));
175 parent_klass = g_type_class_peek_parent (klass);
178 static void
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:
193 * @src_sheet: #Sheet
194 * @src_range: #GnmRange
195 * @src_name: char *, optionally %NULL
197 * Allocates a new Allocates a new #GnmDataCacheSource
199 * Returns : #GODataCacheSource
201 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.
224 Sheet *
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;
231 void
232 gnm_data_cache_source_set_sheet (GnmDataCacheSource *src, Sheet *sheet)
234 g_return_if_fail (GNM_IS_DATA_CACHE_SOURCE (src));
237 GnmRange const *
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;
244 void
245 gnm_data_cache_source_set_range (GnmDataCacheSource *src, GnmRange const *r)
247 g_return_if_fail (GNM_IS_DATA_CACHE_SOURCE (src));
248 src->src_range = *r;
251 char const *
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;
258 void
259 gnm_data_cache_source_set_name (GnmDataCacheSource *src, char const *name)
261 GOString *new_val;
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;