2 * (GLABELS) Label and Business Card Creation program for GNOME
4 * label_object.c: GLabels label object base class
6 * Copyright (C) 2001-2002 Jim Evins <evins@snaught.com>.
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
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.
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 #include "label-object.h"
30 /*========================================================*/
32 /*========================================================*/
34 struct _glLabelObjectPrivate {
48 /*========================================================*/
49 /* Private globals. */
50 /*========================================================*/
52 static GObjectClass *parent_class = NULL;
54 static guint signals[LAST_SIGNAL] = {0};
56 static guint instance = 0;
58 /*========================================================*/
59 /* Private function prototypes. */
60 /*========================================================*/
62 static void gl_label_object_class_init (glLabelObjectClass *klass);
63 static void gl_label_object_instance_init (glLabelObject *object);
64 static void gl_label_object_finalize (GObject *object);
67 /*****************************************************************************/
68 /* Boilerplate object stuff. */
69 /*****************************************************************************/
71 gl_label_object_get_type (void)
73 static GType type = 0;
77 sizeof (glLabelObjectClass),
80 (GClassInitFunc) gl_label_object_class_init,
83 sizeof (glLabelObject),
85 (GInstanceInitFunc) gl_label_object_instance_init,
88 type = g_type_register_static (G_TYPE_OBJECT,
89 "glLabelObject", &info, 0);
96 gl_label_object_class_init (glLabelObjectClass *klass)
98 GObjectClass *object_class = (GObjectClass *) klass;
100 gl_debug (DEBUG_LABEL, "START");
102 parent_class = g_type_class_peek_parent (klass);
104 object_class->finalize = gl_label_object_finalize;
107 g_signal_new ("changed",
108 G_OBJECT_CLASS_TYPE (object_class),
110 G_STRUCT_OFFSET (glLabelObjectClass, changed),
112 gl_marshal_VOID__VOID,
117 g_signal_new ("moved",
118 G_OBJECT_CLASS_TYPE (object_class),
120 G_STRUCT_OFFSET (glLabelObjectClass, moved),
122 gl_marshal_VOID__DOUBLE_DOUBLE,
124 2, G_TYPE_DOUBLE, G_TYPE_DOUBLE);
127 G_OBJECT_CLASS_TYPE (object_class),
129 G_STRUCT_OFFSET (glLabelObjectClass, top),
131 gl_marshal_VOID__VOID,
136 g_signal_new ("bottom",
137 G_OBJECT_CLASS_TYPE (object_class),
139 G_STRUCT_OFFSET (glLabelObjectClass, bottom),
141 gl_marshal_VOID__VOID,
145 gl_debug (DEBUG_LABEL, "END");
149 gl_label_object_instance_init (glLabelObject *object)
151 gl_debug (DEBUG_LABEL, "START");
153 object->private = g_new0 (glLabelObjectPrivate, 1);
155 object->private->name = g_strdup_printf ("object%d", instance++);
157 gl_debug (DEBUG_LABEL, "END");
161 gl_label_object_finalize (GObject *object)
165 gl_debug (DEBUG_LABEL, "START");
167 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
169 parent = GL_LABEL_OBJECT(object)->parent;
170 gl_label_remove_object (parent, GL_LABEL_OBJECT(object));
172 g_free (GL_LABEL_OBJECT(object)->private);
174 G_OBJECT_CLASS (parent_class)->finalize (object);
176 gl_debug (DEBUG_LABEL, "END");
180 gl_label_object_new (glLabel *label)
182 glLabelObject *object;
184 gl_debug (DEBUG_LABEL, "START");
186 object = g_object_new (gl_label_object_get_type(), NULL);
188 gl_label_object_set_parent (object, label);
190 gl_debug (DEBUG_LABEL, "END");
192 return G_OBJECT (object);
195 /*****************************************************************************/
196 /* Emit "changed" signal (for derived objects). */
197 /*****************************************************************************/
199 gl_label_object_emit_changed (glLabelObject *object)
201 gl_debug (DEBUG_LABEL, "START");
203 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
205 g_signal_emit (G_OBJECT(object), signals[CHANGED], 0);
207 gl_debug (DEBUG_LABEL, "END");
210 /*****************************************************************************/
211 /* Set parent label of object. */
212 /*****************************************************************************/
214 gl_label_object_set_parent (glLabelObject *object,
219 gl_debug (DEBUG_LABEL, "START");
221 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
222 g_return_if_fail (label && GL_IS_LABEL (label));
224 old_parent = object->parent;
225 if ( old_parent != NULL ) {
226 gl_label_remove_object( old_parent, object );
228 gl_label_add_object( label, object );
230 g_signal_emit (G_OBJECT(object), signals[CHANGED], 0);
232 gl_debug (DEBUG_LABEL, "END");
235 /*****************************************************************************/
236 /* Get parent label of object. */
237 /*****************************************************************************/
239 gl_label_object_get_parent (glLabelObject *object)
241 gl_debug (DEBUG_LABEL, "START");
243 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
245 gl_debug (DEBUG_LABEL, "END");
247 return object->parent;
250 /*****************************************************************************/
251 /* Set name of object. */
252 /*****************************************************************************/
254 gl_label_object_set_name (glLabelObject *object,
257 gl_debug (DEBUG_LABEL, "START");
259 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
261 g_free(object->private->name);
262 object->private->name = name;
264 g_signal_emit (G_OBJECT(object), signals[CHANGED], 0);
266 gl_debug (DEBUG_LABEL, "END");
269 /*****************************************************************************/
270 /* Get name of object. */
271 /*****************************************************************************/
273 gl_label_object_get_name (glLabelObject *object)
275 gl_debug (DEBUG_LABEL, "START");
277 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
279 gl_debug (DEBUG_LABEL, "END");
281 return g_strdup(object->private->name);
284 /*****************************************************************************/
285 /* Set position of object. */
286 /*****************************************************************************/
288 gl_label_object_set_position (glLabelObject *object,
294 gl_debug (DEBUG_LABEL, "START");
296 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
298 dx = x - object->private->x;
299 dy = y - object->private->y;
301 object->private->x = x;
302 object->private->y = y;
304 g_signal_emit (G_OBJECT(object), signals[MOVED], 0, dx, dy);
306 gl_debug (DEBUG_LABEL, "END");
309 /*****************************************************************************/
310 /* Set position of object relative to old position. */
311 /*****************************************************************************/
313 gl_label_object_set_position_relative (glLabelObject *object,
317 gl_debug (DEBUG_LABEL, "START");
319 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
321 object->private->x += dx;
322 object->private->y += dy;
324 gl_debug (DEBUG_LABEL, " x = %f, y= %f",
328 g_signal_emit (G_OBJECT(object), signals[MOVED], 0, dx, dy);
330 gl_debug (DEBUG_LABEL, "END");
333 /*****************************************************************************/
334 /* Get position of object. */
335 /*****************************************************************************/
337 gl_label_object_get_position (glLabelObject *object,
341 gl_debug (DEBUG_LABEL, "START");
343 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
345 *x = object->private->x;
346 *y = object->private->y;
348 gl_debug (DEBUG_LABEL, "END");
351 /*****************************************************************************/
352 /* Set size of object. */
353 /*****************************************************************************/
355 gl_label_object_set_size (glLabelObject *object,
359 gl_debug (DEBUG_LABEL, "START");
361 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
363 object->private->w = w;
364 object->private->h = h;
366 g_signal_emit (G_OBJECT(object), signals[CHANGED], 0);
368 gl_debug (DEBUG_LABEL, "END");
371 /*****************************************************************************/
372 /* Get size of object. */
373 /*****************************************************************************/
375 gl_label_object_get_size (glLabelObject *object,
379 gl_debug (DEBUG_LABEL, "START");
381 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
383 *w = object->private->w;
384 *h = object->private->h;
386 gl_debug (DEBUG_LABEL, "END");
389 /****************************************************************************/
390 /* Bring label object to front/top. */
391 /****************************************************************************/
393 gl_label_object_raise_to_top (glLabelObject *object)
397 gl_debug (DEBUG_LABEL, "START");
399 label = object->parent;
401 gl_label_raise_object_to_top (label, object);
403 g_signal_emit (G_OBJECT(object), signals[TOP], 0);
405 gl_debug (DEBUG_LABEL, "END");
408 /****************************************************************************/
409 /* Send label object to rear/bottom. */
410 /****************************************************************************/
412 gl_label_object_lower_to_bottom (glLabelObject *object)
416 gl_debug (DEBUG_LABEL, "START");
418 label = object->parent;
420 gl_label_lower_object_to_bottom (label, object);
422 g_signal_emit (G_OBJECT(object), signals[BOTTOM], 0);
424 gl_debug (DEBUG_LABEL, "END");