~ubuntu-branches/ubuntu/quantal/gnumeric/quantal

« back to all changes in this revision

Viewing changes to src/go-data-cache-field.c

  • Committer: Bazaar Package Importer
  • Author(s): Gauvain Pocentek
  • Date: 2009-06-22 13:37:20 UTC
  • mfrom: (1.1.20 upstream) (2.1.3 sid)
  • Revision ID: james.westby@ubuntu.com-20090622133720-rtdazsiz2lx5q8l7
Tags: 1.9.9-1ubuntu1
* Merge from debian unstable, remaining changes:
  - Promoted gnumeric-doc to Recommends in gnumeric package for help to be
    installed automatically
  - gnumeric-gtk is a transitional package
  - gnumeric conflicts with gnumeric-gtk << 1.8.3-3ubuntu1
  - call initltool-update in po*
  - remove psiconv support (psiconv is in universe):
    o debian/control: remove B-D on libpsiconv-dev
    o debian/rules: don't pass --with-psiconv to ./configure
    o debian/gnumeric-plugins-extra.install: don't install the psiconv
      plugin

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 
2
/*
 
3
 * go-data-cache-field.h : A field (named vector) within a cache of data
 
4
 *      containing the unique values (unodered).  The cache contains the
 
5
 *      ordering, and allows replication.
 
6
 *
 
7
 * Copyright (C) 2008 Jody Goldberg (jody@gnome.org)
 
8
 *
 
9
 * This program is free software; you can redistribute it and/or
 
10
 * modify it under the terms of version 2 of the GNU General Public
 
11
 * License as published by the Free Software Foundation.
 
12
 *
 
13
 * This program is distributed in the hope that it will be useful,
 
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
16
 * GNU General Public License for more details.
 
17
 *
 
18
 * You should have received a copy of the GNU General Public License
 
19
 * along with this program; if not, write to the Free Software
 
20
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301
 
21
 * USA
 
22
 */
 
23
 
 
24
#include <gnumeric-config.h>
 
25
#include "go-data-cache-field-impl.h"
 
26
#include "go-data-cache.h"
 
27
 
 
28
#include <go-val.h>
 
29
 
 
30
#include <gsf/gsf-impl-utils.h>
 
31
#include <glib/gi18n-lib.h>
 
32
#include <string.h>
 
33
 
 
34
#define GO_DATA_CACHE_FIELD_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST ((k), GO_DATA_CACHE_FIELD_TYPE, GODataCacheFieldClass))
 
35
#define IS_GO_DATA_CACHE_FIELD_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), GO_DATA_CACHE_FIELD_TYPE))
 
36
#define GO_DATA_CACHE_FIELD_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GO_DATA_CACHE_FIELD_TYPE, GODataCacheFieldClass))
 
37
 
 
38
enum {
 
39
        PROP_0,
 
40
        PROP_CACHE,             /* GODataCache * */
 
41
        PROP_NAME,              /* GOString */
 
42
        PROP_INDEX,             /* int */
 
43
        PROP_BUCKETER,          /* GOValBucketer * */
 
44
        PROP_GROUP_PARENT       /* int */
 
45
};
 
46
 
 
47
static void
 
48
go_data_cache_field_init (GODataCacheField *field)
 
49
{
 
50
        field->cache            = NULL;
 
51
        field->name             = NULL;
 
52
        field->indx             = -1;
 
53
        field->group_parent     = -1;
 
54
        field->indexed          = NULL;
 
55
        field->grouped          = NULL;
 
56
        go_val_bucketer_init (&field->bucketer);
 
57
}
 
58
 
 
59
static GObjectClass *parent_klass;
 
60
 
 
61
static void
 
62
go_data_cache_field_finalize (GObject *obj)
 
63
{
 
64
        GODataCacheField *field = (GODataCacheField *)obj;
 
65
 
 
66
        field->cache = NULL; /* we do not hold a ref */
 
67
 
 
68
        go_string_unref (field->name); field->name = NULL;
 
69
 
 
70
        go_val_array_free (field->indexed);
 
71
        field->indexed = NULL;
 
72
        go_val_array_free (field->grouped);
 
73
        field->grouped = NULL;
 
74
 
 
75
        (parent_klass->finalize) (obj);
 
76
}
 
77
 
 
78
static void
 
79
go_data_cache_field_set_property (GObject *obj, guint property_id,
 
80
                                  GValue const *value, GParamSpec *pspec)
 
81
{
 
82
        GODataCacheField *field = (GODataCacheField *)obj;
 
83
 
 
84
        switch (property_id) {
 
85
        /* we do not hold a ref */
 
86
        case PROP_CACHE : field->cache = g_value_get_object (value); break;
 
87
        case PROP_NAME :         go_string_unref (field->name); field->name = g_value_dup_boxed (value); break;
 
88
        case PROP_BUCKETER :     field->bucketer = *((GOValBucketer *)g_value_get_pointer (value)); break;
 
89
        case PROP_GROUP_PARENT : field->group_parent = g_value_get_int (value); break;
 
90
        default:
 
91
                G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec);
 
92
        }
 
93
}
 
94
 
 
95
static void
 
96
go_data_cache_field_get_property (GObject *obj, guint property_id,
 
97
                                    GValue *value, GParamSpec *pspec)
 
98
{
 
99
        GODataCacheField const *field = (GODataCacheField const *)obj;
 
100
        switch (property_id) {
 
101
        case PROP_CACHE : g_value_set_object (value, field->cache); break;
 
102
        case PROP_NAME  : g_value_set_boxed (value, field->name); break;
 
103
        case PROP_INDEX : g_value_set_int (value, field->indx); break;
 
104
        case PROP_BUCKETER :     g_value_set_pointer (value, (gpointer) &field->bucketer); break;
 
105
        case PROP_GROUP_PARENT : g_value_set_int (value, field->group_parent); break;
 
106
        default:
 
107
                G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec);
 
108
        }
 
109
}
 
110
 
 
111
static void
 
112
go_data_cache_field_class_init (GODataCacheFieldClass *klass)
 
113
{
 
114
        GObjectClass *gobject_class = (GObjectClass *)klass;
 
115
        gobject_class->set_property     = go_data_cache_field_set_property;
 
116
        gobject_class->get_property     = go_data_cache_field_get_property;
 
117
        gobject_class->finalize         = go_data_cache_field_finalize;
 
118
 
 
119
        g_object_class_install_property (gobject_class, PROP_CACHE,
 
120
                 g_param_spec_object ("cache", NULL, NULL,
 
121
                        GO_DATA_CACHE_TYPE, GSF_PARAM_STATIC | G_PARAM_READWRITE));
 
122
        g_object_class_install_property (gobject_class, PROP_NAME,
 
123
                 g_param_spec_boxed ("name", NULL, NULL, go_string_get_type (),
 
124
                        GSF_PARAM_STATIC | G_PARAM_READWRITE));
 
125
        g_object_class_install_property (gobject_class, PROP_INDEX,
 
126
                 g_param_spec_int ("index", NULL,
 
127
                        "Index to identify field if the header changes in the source",
 
128
                        -1, G_MAXINT, -1,
 
129
                        GSF_PARAM_STATIC | G_PARAM_READABLE));
 
130
        g_object_class_install_property (gobject_class, PROP_BUCKETER,
 
131
                 g_param_spec_pointer ("bucketer", NULL,
 
132
                        "How to group values",
 
133
                        GSF_PARAM_STATIC | G_PARAM_READWRITE));
 
134
 
 
135
        g_object_class_install_property (gobject_class, PROP_GROUP_PARENT,
 
136
                 g_param_spec_int ("group-base", NULL,
 
137
                        "Index to CacheField of the source of the group",
 
138
                        -1, G_MAXINT, -1,
 
139
                        GSF_PARAM_STATIC | G_PARAM_READWRITE));
 
140
 
 
141
        /* Unclear how to select what is parent and what is child when dealing with groups */
 
142
        g_object_class_install_property (gobject_class, PROP_GROUP_PARENT,
 
143
                 g_param_spec_int ("group-parent", NULL,
 
144
                        "Index to CacheField with higher precedence in the group ?",
 
145
                        -1, G_MAXINT, -1,
 
146
                        GSF_PARAM_STATIC | G_PARAM_READWRITE));
 
147
 
 
148
        parent_klass = g_type_class_peek_parent (klass);
 
149
}
 
150
 
 
151
GSF_CLASS (GODataCacheField, go_data_cache_field,
 
152
           go_data_cache_field_class_init, go_data_cache_field_init,
 
153
           G_TYPE_OBJECT)
 
154
 
 
155
GOString *
 
156
go_data_cache_field_get_name (GODataCacheField const *field)
 
157
{
 
158
        g_return_val_if_fail (IS_GO_DATA_CACHE_FIELD (field), go_string_ERROR ());
 
159
        return field->name;
 
160
}
 
161
 
 
162
GOValArray const *
 
163
go_data_cache_field_get_vals (GODataCacheField const *field, gboolean group_val)
 
164
{
 
165
        g_return_val_if_fail (IS_GO_DATA_CACHE_FIELD (field), NULL);
 
166
        return group_val ? field->grouped : field->indexed;
 
167
}
 
168
 
 
169
void
 
170
go_data_cache_field_set_vals (GODataCacheField *field, gboolean group_val,
 
171
                              GOValArray *vals)
 
172
{
 
173
        g_return_if_fail (IS_GO_DATA_CACHE_FIELD (field));
 
174
 
 
175
        go_val_array_free (group_val ? field->grouped : field->indexed);
 
176
        if (group_val)
 
177
                field->grouped = vals;
 
178
        else
 
179
                field->indexed = vals;
 
180
}
 
181
 
 
182
gboolean
 
183
go_data_cache_field_is_base (GODataCacheField const *field)
 
184
{
 
185
        g_return_val_if_fail (IS_GO_DATA_CACHE_FIELD (field), FALSE);
 
186
        g_print ("[%d] %s : parent = %d\n", field->indx, field->name->str,
 
187
                 field->group_parent);
 
188
        return field->group_parent < 0 || field->group_parent == field->indx;
 
189
}
 
190
 
 
191
GODataCacheFieldType
 
192
go_data_cache_field_ref_type (GODataCacheField const *field)
 
193
{
 
194
        g_return_val_if_fail (IS_GO_DATA_CACHE_FIELD (field), GO_DATA_CACHE_FIELD_TYPE_NONE);
 
195
        return field->ref_type;
 
196
}