1 /* PSPPIRE - a graphical user interface for PSPP.
2 Copyright (C) 2008 Free Software Foundation
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 #include <libpspp/tower.h>
22 #include <libpspp/pool.h>
23 #include "psppire-axis.h"
27 /* --- prototypes --- */
28 static void psppire_axis_class_init (PsppireAxisClass *class);
29 static void psppire_axis_init (PsppireAxis *axis);
30 static void psppire_axis_finalize (GObject *object);
33 /* --- variables --- */
34 static GObjectClass *parent_class = NULL;
36 /* --- functions --- */
38 * psppire_axis_get_type:
39 * @returns: the type ID for accelerator groups.
42 psppire_axis_get_type (void)
44 static GType object_type = 0;
48 static const GTypeInfo object_info = {
49 sizeof (PsppireAxisClass),
51 (GBaseFinalizeFunc) NULL,
52 (GClassInitFunc) psppire_axis_class_init,
53 NULL, /* class_finalize */
54 NULL, /* class_data */
57 (GInstanceInitFunc) psppire_axis_init,
60 object_type = g_type_register_static (G_TYPE_OBJECT,
70 psppire_axis_class_init (PsppireAxisClass *class)
72 GObjectClass *object_class = G_OBJECT_CLASS (class);
74 parent_class = g_type_class_peek_parent (class);
76 object_class->finalize = psppire_axis_finalize;
80 psppire_axis_init (PsppireAxis *axis)
83 psppire_axis_clear (axis);
88 psppire_axis_finalize (GObject *object)
90 PsppireAxis *a = PSPPIRE_AXIS (object);
91 pool_destroy (a->pool);
92 G_OBJECT_CLASS (parent_class)->finalize (object);
97 * @returns: a new #PsppireAxis object
99 * Creates a new #PsppireAxis.
102 psppire_axis_new (void)
104 return g_object_new (G_TYPE_PSPPIRE_AXIS, NULL);
109 psppire_axis_unit_size (PsppireAxis *a, gint unit)
111 const struct tower_node *node;
112 if (unit >= tower_count (&a->tower))
115 node = tower_get (&a->tower, unit);
117 return tower_node_get_size (node);
121 psppire_axis_unit_count (PsppireAxis *a)
123 return tower_count (&a->tower);
127 psppire_axis_pixel_start (PsppireAxis *a, gint unit)
129 const struct tower_node *node;
131 if ( unit >= tower_count (&a->tower))
132 return tower_height (&a->tower);
134 node = tower_get (&a->tower, unit);
136 return tower_node_get_level (node);
140 psppire_axis_get_unit_at_pixel (PsppireAxis *a, glong pixel)
142 const struct tower_node *node;
143 unsigned long int node_start;
145 if (pixel >= tower_height (&a->tower))
146 return tower_count (&a->tower);
148 node = tower_lookup (&a->tower, pixel, &node_start);
150 return tower_node_get_index (node);
154 psppire_axis_append (PsppireAxis *a, gint size)
156 struct tower_node *new = pool_malloc (a->pool, sizeof *new);
158 tower_insert (&a->tower, size, new, NULL);
163 /* Insert a new unit of size SIZE before position POSN */
165 psppire_axis_insert (PsppireAxis *a, gint size, gint posn)
167 struct tower_node *new = pool_malloc (a->pool, sizeof *new);
169 struct tower_node *before = NULL;
171 if ( posn != tower_count (&a->tower))
172 before = tower_get (&a->tower, posn);
174 tower_insert (&a->tower, size, new, before);
179 psppire_axis_remove (PsppireAxis *a, gint posn)
181 struct tower_node *node = tower_get (&a->tower, posn);
183 tower_delete (&a->tower, node);
185 pool_free (a->pool, node);
190 psppire_axis_resize_unit (PsppireAxis *a, gint size, gint posn)
192 struct tower_node *node = tower_get (&a->tower, posn);
194 tower_resize (&a->tower, node, size);
200 psppire_axis_clear (PsppireAxis *a)
202 pool_destroy (a->pool);
203 a->pool = pool_create ();
204 tower_init (&a->tower);