2 * (GLABELS) Label and Business Card Creation program for GNOME
4 * view_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 "view-object.h"
29 /*========================================================*/
31 /*========================================================*/
33 struct _glViewObjectPrivate {
36 glLabelObject *object;
38 GnomeCanvasItem *group;
39 GnomeCanvasItem *highlight;
42 GtkWidget *property_dialog;
45 /*========================================================*/
46 /* Private globals. */
47 /*========================================================*/
49 static GObjectClass *parent_class = NULL;
52 /*========================================================*/
53 /* Private function prototypes. */
54 /*========================================================*/
56 static void gl_view_object_class_init (glViewObjectClass *klass);
57 static void gl_view_object_instance_init (glViewObject *view_object);
58 static void gl_view_object_finalize (GObject *object);
60 static GtkMenu *new_menu (glViewObject *view_object);
62 static void object_moved_cb (glLabelObject *object,
64 glViewObject *view_object);
65 static void raise_object_cb (GtkWidget * widget, glViewObject *view_object);
66 static void lower_object_cb (GtkWidget * widget, glViewObject *view_object);
69 /*****************************************************************************/
70 /* Boilerplate object stuff. */
71 /*****************************************************************************/
73 gl_view_object_get_type (void)
75 static GType type = 0;
79 sizeof (glViewObjectClass),
82 (GClassInitFunc) gl_view_object_class_init,
85 sizeof (glViewObject),
87 (GInstanceInitFunc) gl_view_object_instance_init,
90 type = g_type_register_static (G_TYPE_OBJECT,
91 "glViewObject", &info, 0);
98 gl_view_object_class_init (glViewObjectClass *klass)
100 GObjectClass *object_class = (GObjectClass *) klass;
102 gl_debug (DEBUG_VIEW, "START");
104 parent_class = g_type_class_peek_parent (klass);
106 object_class->finalize = gl_view_object_finalize;
108 gl_debug (DEBUG_VIEW, "END");
112 gl_view_object_instance_init (glViewObject *view_object)
114 gl_debug (DEBUG_VIEW, "START");
116 view_object->private = g_new0 (glViewObjectPrivate, 1);
118 gl_debug (DEBUG_VIEW, "END");
122 gl_view_object_finalize (GObject *object)
127 gl_debug (DEBUG_VIEW, "START");
129 g_return_if_fail (object && GL_IS_VIEW_OBJECT (object));
131 view = GL_VIEW_OBJECT(object)->private->view;
132 view->object_list = g_list_remove (view->object_list, object);
133 view->selected_object_list =
134 g_list_remove (view->selected_object_list, object);
136 g_object_unref (GL_VIEW_OBJECT(object)->private->object);
137 gtk_object_destroy (GTK_OBJECT(GL_VIEW_OBJECT(object)->private->group));
138 gtk_object_destroy (GTK_OBJECT(GL_VIEW_OBJECT(object)->private->highlight));
139 gtk_object_destroy (GTK_OBJECT(GL_VIEW_OBJECT(object)->private->menu));
140 gtk_object_destroy (GTK_OBJECT(GL_VIEW_OBJECT(object)->private->property_dialog));
142 G_OBJECT_CLASS (parent_class)->finalize (object);
144 gl_debug (DEBUG_VIEW, "END");
147 /*****************************************************************************/
148 /* NEW object view. */
149 /*****************************************************************************/
151 gl_view_object_new (void)
153 glViewObject *view_object;
155 gl_debug (DEBUG_VIEW, "START");
157 view_object = g_object_new (gl_view_object_get_type(), NULL);
159 gl_debug (DEBUG_VIEW, "END");
161 return G_OBJECT (view_object);
164 /*****************************************************************************/
165 /* Set parent view to which this object view belongs. */
166 /*****************************************************************************/
168 gl_view_object_set_view (glViewObject *view_object,
171 gl_debug (DEBUG_VIEW, "START");
173 g_return_if_fail (view_object && GL_IS_VIEW_OBJECT (view_object));
174 g_return_if_fail (view && GL_IS_VIEW (view));
176 view_object->private->view = view;
178 view->object_list = g_list_prepend (view->object_list, view_object);
180 gl_debug (DEBUG_VIEW, "END");
183 /*****************************************************************************/
184 /* Set Label object to follow. */
185 /*****************************************************************************/
187 gl_view_object_set_object (glViewObject *view_object,
188 glLabelObject *object,
189 glViewHighlightStyle style)
192 GnomeCanvasGroup *root;
195 gl_debug (DEBUG_VIEW, "START");
197 g_return_if_fail (view_object && GL_IS_VIEW_OBJECT (view_object));
198 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
200 view_object->private->object = object;
202 gl_label_object_get_position (GL_LABEL_OBJECT(object), &x, &y);
204 /* create canvas group to contain items representing object */
205 canvas = GNOME_CANVAS (view_object->private->view->canvas);
206 root = gnome_canvas_root (canvas);
207 view_object->private->group =
208 gnome_canvas_item_new (root, gnome_canvas_group_get_type (),
213 /* Create appropriate selection highlight canvas item. */
214 view_object->private->highlight =
215 gl_view_highlight_new (view_object, style);
217 view_object->private->menu = GTK_WIDGET(new_menu (view_object));
219 g_signal_connect (G_OBJECT (object), "moved",
220 G_CALLBACK (object_moved_cb),
223 g_signal_connect (G_OBJECT (object), "top",
224 G_CALLBACK (raise_object_cb),
227 g_signal_connect (G_OBJECT (object), "bottom",
228 G_CALLBACK (lower_object_cb),
231 g_signal_connect (G_OBJECT (view_object->private->group), "event",
232 G_CALLBACK (gl_view_item_event_handler),
235 gl_debug (DEBUG_VIEW, "END");
238 /*****************************************************************************/
239 /* Set dialog for controlling/viewing object properties. */
240 /*****************************************************************************/
242 gl_view_object_set_dialog (glViewObject *view_object,
246 gl_debug (DEBUG_VIEW, "START");
248 g_return_if_fail (view_object && GL_IS_VIEW_OBJECT (view_object));
249 g_return_if_fail (dialog && GTK_IS_WIDGET (dialog));
251 view_object->private->property_dialog = dialog;
253 gl_debug (DEBUG_VIEW, "END");
256 /*****************************************************************************/
257 /* Return parent view associated with this view. */
258 /*****************************************************************************/
260 gl_view_object_get_view (glViewObject *view_object)
262 gl_debug (DEBUG_VIEW, "START");
264 g_return_if_fail (view_object && GL_IS_VIEW_OBJECT (view_object));
266 gl_debug (DEBUG_VIEW, "END");
268 return view_object->private->view;
271 /*****************************************************************************/
272 /* Return label object that we are following. */
273 /*****************************************************************************/
275 gl_view_object_get_object (glViewObject *view_object)
277 gl_debug (DEBUG_VIEW, "START");
279 g_return_if_fail (view_object && GL_IS_VIEW_OBJECT (view_object));
281 gl_debug (DEBUG_VIEW, "END");
283 return view_object->private->object;
286 /*****************************************************************************/
287 /* Return canvas item representing our object in this view. */
288 /*****************************************************************************/
290 gl_view_object_get_group (glViewObject *view_object)
292 gl_debug (DEBUG_VIEW, "START");
294 g_return_if_fail (view_object && GL_IS_VIEW_OBJECT (view_object));
296 gl_debug (DEBUG_VIEW, "END");
298 return view_object->private->group;
301 /*****************************************************************************/
302 /* Return dialog for controlling/viewing object properties. */
303 /*****************************************************************************/
305 gl_view_object_get_dialog (glViewObject *view_object)
307 gl_debug (DEBUG_VIEW, "START");
309 g_return_if_fail (view_object && GL_IS_VIEW_OBJECT (view_object));
311 gl_debug (DEBUG_VIEW, "END");
313 return view_object->private->property_dialog;
316 /*****************************************************************************/
317 /* Popup menu for this object. */
318 /*****************************************************************************/
320 gl_view_object_get_menu (glViewObject *view_object)
322 gl_debug (DEBUG_VIEW, "START");
324 g_return_if_fail (view_object && GL_IS_VIEW_OBJECT (view_object));
326 gl_debug (DEBUG_VIEW, "END");
328 return GTK_MENU(view_object->private->menu);
331 /*****************************************************************************/
332 /* Update Highlight of object. */
333 /*****************************************************************************/
335 gl_view_object_update_highlight (glViewObject *view_object)
337 gl_debug (DEBUG_VIEW, "START");
339 g_return_if_fail (view_object && GL_IS_VIEW_OBJECT (view_object));
340 g_return_if_fail (view_object->private->highlight);
342 gl_view_highlight_update (view_object->private->highlight);
344 gl_debug (DEBUG_VIEW, "END");
347 /*****************************************************************************/
348 /* Highlight view of object. */
349 /*****************************************************************************/
351 gl_view_object_show_highlight (glViewObject *view_object)
353 gl_debug (DEBUG_VIEW, "START");
355 g_return_if_fail (view_object && GL_IS_VIEW_OBJECT (view_object));
356 g_return_if_fail (view_object->private->highlight);
358 gnome_canvas_item_show (view_object->private->highlight);
359 gnome_canvas_item_raise_to_top (view_object->private->highlight);
361 gl_debug (DEBUG_VIEW, "END");
364 /*****************************************************************************/
365 /* Remove highlight from view of object. */
366 /*****************************************************************************/
368 gl_view_object_hide_highlight (glViewObject *view_object)
370 gl_debug (DEBUG_VIEW, "START");
372 g_return_if_fail (view_object && GL_IS_VIEW_OBJECT (view_object));
373 g_return_if_fail (view_object->private->highlight);
375 gnome_canvas_item_hide (view_object->private->highlight);
377 gl_debug (DEBUG_VIEW, "END");
381 /*---------------------------------------------------------------------------*/
382 /* Create a popup menu for this object view. */
383 /*---------------------------------------------------------------------------*/
385 new_menu (glViewObject *view_object)
387 GtkWidget *menu, *menuitem;
389 gl_debug (DEBUG_VIEW, "START");
391 g_return_val_if_fail (view_object && GL_VIEW_OBJECT(view_object), NULL);
393 menu = gtk_menu_new ();
395 menuitem = gtk_menu_item_new_with_label (_("Edit properties..."));
396 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
397 gtk_widget_show (menuitem);
398 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
399 G_CALLBACK (gl_view_object_show_dialog),
402 menuitem = gtk_menu_item_new ();
403 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
404 gtk_widget_show (menuitem);
406 menuitem = gtk_menu_item_new_with_label (_("Delete"));
407 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
408 gtk_widget_show (menuitem);
409 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
410 G_CALLBACK (g_object_unref), view_object);
412 menuitem = gtk_menu_item_new ();
413 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
414 gtk_widget_show (menuitem);
416 menuitem = gtk_menu_item_new_with_label (_("Bring to front"));
417 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
418 gtk_widget_show (menuitem);
419 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
420 G_CALLBACK (gl_label_object_raise_to_top),
421 view_object->private->object);
423 menuitem = gtk_menu_item_new_with_label (_("Send to back"));
424 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
425 gtk_widget_show (menuitem);
426 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
427 G_CALLBACK (gl_label_object_lower_to_bottom),
428 view_object->private->object);
430 gl_debug (DEBUG_VIEW, "END");
432 return GTK_MENU(menu);
435 /*****************************************************************************/
436 /* Show property dialog. */
437 /*****************************************************************************/
439 gl_view_object_show_dialog (glViewObject *view_object)
441 gl_debug (DEBUG_VIEW, "START");
443 g_return_if_fail (view_object && GL_IS_VIEW_OBJECT (view_object));
445 gtk_widget_show_all (view_object->private->property_dialog);
447 gl_debug (DEBUG_VIEW, "END");
451 /*---------------------------------------------------------------------------*/
452 /* PRIVATE. Object moved callback. */
453 /*---------------------------------------------------------------------------*/
455 object_moved_cb (glLabelObject *object,
458 glViewObject *view_object)
460 GnomeCanvasItem *item, *highlight;
462 gl_debug (DEBUG_VIEW, "START");
464 /* Adjust location of analogous canvas group. */
465 gnome_canvas_item_move (view_object->private->group, dx, dy);
467 /* Adjust location of highlight group */
468 gnome_canvas_item_move (view_object->private->highlight, dx, dy);
470 gl_debug (DEBUG_VIEW, "END");
473 /*---------------------------------------------------------------------------*/
474 /* PRIVATE. raise item to front callback. */
475 /*---------------------------------------------------------------------------*/
477 raise_object_cb (GtkWidget * widget,
478 glViewObject *view_object)
480 glLabelObject *object;
482 gl_debug (DEBUG_VIEW, "START");
484 gnome_canvas_item_raise_to_top (view_object->private->group);
485 gnome_canvas_item_raise_to_top (view_object->private->highlight);
487 gl_debug (DEBUG_VIEW, "END");
490 /*---------------------------------------------------------------------------*/
491 /* PRIVATE. lower item to back callback. */
492 /*---------------------------------------------------------------------------*/
494 lower_object_cb (GtkWidget * widget,
495 glViewObject *view_object)
497 glLabelObject *object;
500 gl_debug (DEBUG_VIEW, "START");
503 gnome_canvas_item_lower_to_bottom (view_object->private->group);
505 /* now raise it above all items that form the backgound */
506 gnome_canvas_item_raise (view_object->private->group,
507 view_object->private->view->n_bg_items);
509 gl_debug (DEBUG_VIEW, "END");
512 /*****************************************************************************/
514 /*****************************************************************************/
516 gl_view_object_select (glViewObject *view_object)
518 gl_debug (DEBUG_VIEW, "START");
520 gl_view_select_object(view_object->private->view, view_object);
522 gl_debug (DEBUG_VIEW, "END");