2 * (GLABELS) Label and Business Card Creation program for GNOME
4 * view_highlight.c: GLabels Resizable Highlight module
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
27 #include "view-highlight.h"
31 #define MIN_ITEM_SIZE 1.0
32 #define FG_COLOR GNOME_CANVAS_COLOR_A (0, 0, 255, 255)
33 #define BG_COLOR GNOME_CANVAS_COLOR_A (255, 255, 255, 255)
35 /*===========================================*/
36 /* Private data types */
37 /*===========================================*/
38 struct _glViewHighlightPrivate {
39 glViewHighlightStyle style;
40 glLabelObject *object;
43 GnomeCanvasItem *group;
44 GnomeCanvasItem *outline;
45 GnomeCanvasItem *tl, *tr, *bl, *br; /* Corner handles */
46 GnomeCanvasItem *sl, *sr, *st, *sb; /* Side handles */
47 GnomeCanvasItem *p1, *p2; /* Line endpoint handles */
50 /*===========================================*/
52 /*===========================================*/
54 static GObjectClass *parent_class = NULL;
56 /*===========================================*/
57 /* Local function prototypes */
58 /*===========================================*/
60 static void gl_view_highlight_class_init (glViewHighlightClass *klass);
61 static void gl_view_highlight_instance_init (glViewHighlight *view_highlight);
62 static void gl_view_highlight_finalize (GObject *object);
65 static void highlight_resizable_box_construct (glViewHighlight *view_highlight,
66 glViewObject *view_object,
67 glViewHighlightStyle style);
69 static void highlight_resizable_line_construct (glViewHighlight *view_highlight,
70 glViewObject *view_object);
72 static void highlight_simple_construct (glViewHighlight *view_highlight,
73 glViewObject *view_object);
75 static void object_moved_cb (glLabelObject *object,
78 glViewHighlight *view_highlight);
80 static void object_changed_cb (glLabelObject *object,
81 glViewHighlight *view_highlight);
84 static void update_resizable_box (glViewHighlight *view_highlight);
86 static void update_resizable_line (glViewHighlight *view_highlight);
88 static void update_simple (glViewHighlight *view_highlight);
91 static int tl_resize_event_handler (GnomeCanvasItem *handle_item,
93 glViewHighlight *view_highlight);
94 static int tr_resize_event_handler (GnomeCanvasItem *handle_item,
96 glViewHighlight *view_highlight);
97 static int bl_resize_event_handler (GnomeCanvasItem *handle_item,
99 glViewHighlight *view_highlight);
100 static int br_resize_event_handler (GnomeCanvasItem *handle_item,
102 glViewHighlight *view_highlight);
104 static int sl_resize_event_handler (GnomeCanvasItem *handle_item,
106 glViewHighlight *view_highlight);
107 static int sr_resize_event_handler (GnomeCanvasItem *handle_item,
109 glViewHighlight *view_highlight);
110 static int st_resize_event_handler (GnomeCanvasItem *handle_item,
112 glViewHighlight *view_highlight);
113 static int sb_resize_event_handler (GnomeCanvasItem *handle_item,
115 glViewHighlight *view_highlight);
117 static int p1_resize_event_handler (GnomeCanvasItem *handle_item,
119 glViewHighlight *view_highlight);
120 static int p2_resize_event_handler (GnomeCanvasItem *handle_item,
122 glViewHighlight *view_highlight);
124 static int passthrough_event_handler (GnomeCanvasItem *handle_item,
126 glViewObject *view_object);
128 /*****************************************************************************/
129 /* Boilerplate object stuff. */
130 /*****************************************************************************/
132 gl_view_highlight_get_type (void)
134 static GType type = 0;
138 sizeof (glViewHighlightClass),
141 (GClassInitFunc) gl_view_highlight_class_init,
144 sizeof (glViewHighlight),
146 (GInstanceInitFunc) gl_view_highlight_instance_init,
149 type = g_type_register_static (G_TYPE_OBJECT,
150 "glViewHighlight", &info, 0);
157 gl_view_highlight_class_init (glViewHighlightClass *klass)
159 GObjectClass *object_class = (GObjectClass *) klass;
161 gl_debug (DEBUG_VIEW, "START");
163 parent_class = g_type_class_peek_parent (klass);
165 object_class->finalize = gl_view_highlight_finalize;
167 gl_debug (DEBUG_VIEW, "END");
171 gl_view_highlight_instance_init (glViewHighlight *view_highlight)
173 gl_debug (DEBUG_VIEW, "START");
175 view_highlight->private = g_new0 (glViewHighlightPrivate, 1);
177 gl_debug (DEBUG_VIEW, "END");
181 gl_view_highlight_finalize (GObject *object)
186 gl_debug (DEBUG_VIEW, "START");
188 g_return_if_fail (object && GL_IS_VIEW_HIGHLIGHT (object));
190 g_object_unref (GL_VIEW_HIGHLIGHT(object)->private->object);
192 gtk_object_destroy (GTK_OBJECT(GL_VIEW_HIGHLIGHT(object)->private->group));
194 G_OBJECT_CLASS (parent_class)->finalize (object);
196 gl_debug (DEBUG_VIEW, "END");
199 /*****************************************************************************/
200 /* Create a resizable highlight for given object. */
201 /*****************************************************************************/
203 gl_view_highlight_new (glViewObject *view_object,
204 glViewHighlightStyle style)
206 glViewHighlight *view_highlight;
208 gl_debug (DEBUG_VIEW, "START");
210 g_return_if_fail (view_object && GL_IS_VIEW_OBJECT(view_object));
212 view_highlight = g_object_new (gl_view_highlight_get_type (), NULL);
214 view_highlight->private->style = style;
218 case GL_VIEW_HIGHLIGHT_BOX_RESIZABLE:
219 case GL_VIEW_HIGHLIGHT_ELLIPSE_RESIZABLE:
220 highlight_resizable_box_construct (view_highlight, view_object, style);
223 case GL_VIEW_HIGHLIGHT_LINE_RESIZABLE:
224 highlight_resizable_line_construct (view_highlight, view_object);
227 case GL_VIEW_HIGHLIGHT_SIMPLE:
228 highlight_simple_construct (view_highlight, view_object);
232 g_warning ("Invalid resizable highlight style");
236 g_signal_connect (G_OBJECT (view_highlight->private->object), "moved",
237 G_CALLBACK (object_moved_cb), view_highlight);
239 g_signal_connect (G_OBJECT (view_highlight->private->object), "changed",
240 G_CALLBACK (object_changed_cb), view_highlight);
242 gl_debug (DEBUG_VIEW, "END");
244 return G_OBJECT (view_highlight);
247 /*---------------------------------------------------------------------------*/
248 /* PRIVATE. Create a resizable box highlight. */
249 /*---------------------------------------------------------------------------*/
251 highlight_resizable_box_construct (glViewHighlight *view_highlight,
252 glViewObject *view_object,
253 glViewHighlightStyle style)
256 GnomeCanvasItem *group;
258 glLabelObject *object;
260 gl_debug (DEBUG_VIEW, "START");
262 g_return_if_fail (view_highlight && GL_IS_VIEW_HIGHLIGHT (view_highlight));
263 g_return_if_fail (view_object && GL_IS_VIEW_OBJECT (view_object));
265 view = gl_view_object_get_view (view_object);
266 view_highlight->private->view = view;
268 object = gl_view_object_get_object (view_object);
269 view_highlight->private->object = object;
271 g_return_if_fail (view && GL_IS_VIEW (view));
272 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
274 gl_label_object_get_position (object, &x, &y);
275 gl_label_object_get_size (object, &w, &h);
277 view_highlight->private->group =
278 gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (view->canvas)),
279 gnome_canvas_group_get_type (),
280 "x", x, "y", y, NULL);
281 gnome_canvas_item_hide (view_highlight->private->group);
282 group = view_highlight->private->group;
285 case GL_VIEW_HIGHLIGHT_BOX_RESIZABLE:
286 view_highlight->private->outline =
287 gnome_canvas_item_new (GNOME_CANVAS_GROUP(group),
288 gnome_canvas_rect_get_type (),
294 "outline_color_rgba", FG_COLOR,
297 case GL_VIEW_HIGHLIGHT_ELLIPSE_RESIZABLE:
298 view_highlight->private->outline =
299 gnome_canvas_item_new (GNOME_CANVAS_GROUP(group),
300 gnome_canvas_ellipse_get_type (),
306 "outline_color_rgba", FG_COLOR,
310 view_highlight->private->outline = NULL;
311 g_warning ("Invalid resizable highlight style");
314 view_highlight->private->tl =
315 gnome_canvas_item_new (GNOME_CANVAS_GROUP(group),
316 gnome_canvas_rect_get_type (),
321 "fill_color_rgba", FG_COLOR,
322 "outline_color_rgba", BG_COLOR,
325 view_highlight->private->tr =
326 gnome_canvas_item_new (GNOME_CANVAS_GROUP(group),
327 gnome_canvas_rect_get_type (),
332 "fill_color_rgba", FG_COLOR,
333 "outline_color_rgba", BG_COLOR,
336 view_highlight->private->bl =
337 gnome_canvas_item_new (GNOME_CANVAS_GROUP(group),
338 gnome_canvas_rect_get_type (),
343 "fill_color_rgba", FG_COLOR,
344 "outline_color_rgba", BG_COLOR,
347 view_highlight->private->br =
348 gnome_canvas_item_new (GNOME_CANVAS_GROUP(group),
349 gnome_canvas_rect_get_type (),
354 "fill_color_rgba", FG_COLOR,
355 "outline_color_rgba", BG_COLOR,
358 view_highlight->private->sl =
359 gnome_canvas_item_new (GNOME_CANVAS_GROUP(group),
360 gnome_canvas_rect_get_type (),
365 "fill_color_rgba", FG_COLOR,
366 "outline_color_rgba", BG_COLOR,
369 view_highlight->private->sr =
370 gnome_canvas_item_new (GNOME_CANVAS_GROUP(group),
371 gnome_canvas_rect_get_type (),
376 "fill_color_rgba", FG_COLOR,
377 "outline_color_rgba", BG_COLOR,
380 view_highlight->private->st =
381 gnome_canvas_item_new (GNOME_CANVAS_GROUP(group),
382 gnome_canvas_rect_get_type (),
387 "fill_color_rgba", FG_COLOR,
388 "outline_color_rgba", BG_COLOR,
391 view_highlight->private->sb =
392 gnome_canvas_item_new (GNOME_CANVAS_GROUP(group),
393 gnome_canvas_rect_get_type (),
398 "fill_color_rgba", FG_COLOR,
399 "outline_color_rgba", BG_COLOR,
402 g_signal_connect (G_OBJECT (view_highlight->private->tl), "event",
403 G_CALLBACK (tl_resize_event_handler), view_highlight);
404 g_signal_connect (G_OBJECT (view_highlight->private->tr), "event",
405 G_CALLBACK (tr_resize_event_handler), view_highlight);
406 g_signal_connect (G_OBJECT (view_highlight->private->bl), "event",
407 G_CALLBACK (bl_resize_event_handler), view_highlight);
408 g_signal_connect (G_OBJECT (view_highlight->private->br), "event",
409 G_CALLBACK (br_resize_event_handler), view_highlight);
410 g_signal_connect (G_OBJECT (view_highlight->private->sl), "event",
411 G_CALLBACK (sl_resize_event_handler), view_highlight);
412 g_signal_connect (G_OBJECT (view_highlight->private->sr), "event",
413 G_CALLBACK (sr_resize_event_handler), view_highlight);
414 g_signal_connect (G_OBJECT (view_highlight->private->st), "event",
415 G_CALLBACK (st_resize_event_handler), view_highlight);
416 g_signal_connect (G_OBJECT (view_highlight->private->sb), "event",
417 G_CALLBACK (sb_resize_event_handler), view_highlight);
419 g_signal_connect (G_OBJECT (view_highlight->private->outline), "event",
420 G_CALLBACK (passthrough_event_handler), view_object);
422 /* send to top, then lower below all items that form the foregound */
423 gnome_canvas_item_raise_to_top (group);
424 gl_view_raise_fg (view);
426 gl_debug (DEBUG_VIEW, "END");
429 /*---------------------------------------------------------------------------*/
430 /* PRIVATE. Create a resizable line highlight. */
431 /*---------------------------------------------------------------------------*/
433 highlight_resizable_line_construct (glViewHighlight *view_highlight,
434 glViewObject *view_object)
436 gdouble x, y, dx, dy;
437 GnomeCanvasItem *group;
438 GnomeCanvasPoints *points;
440 glLabelObject *object;
442 gl_debug (DEBUG_VIEW, "START");
444 g_return_if_fail (view_highlight && GL_IS_VIEW_HIGHLIGHT (view_highlight));
445 g_return_if_fail (view_object && GL_IS_VIEW_OBJECT (view_object));
447 view = gl_view_object_get_view (view_object);
448 view_highlight->private->view = view;
450 object = gl_view_object_get_object (view_object);
451 view_highlight->private->object = object;
453 g_return_if_fail (view && GL_IS_VIEW (view));
454 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
456 gl_label_object_get_position (object, &x, &y);
457 gl_label_object_get_size (object, &dx, &dy);
459 points = gnome_canvas_points_new (2);
461 view_highlight->private->group =
462 gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (view->canvas)),
463 gnome_canvas_group_get_type (),
464 "x", x, "y", y, NULL);
465 gnome_canvas_item_hide (view_highlight->private->group);
466 group = view_highlight->private->group;
468 points->coords[0] = 0.0;
469 points->coords[1] = 0.0;
470 points->coords[2] = dx;
471 points->coords[3] = dy;
472 view_highlight->private->outline =
473 gnome_canvas_item_new (GNOME_CANVAS_GROUP(group),
474 gnome_canvas_line_get_type (),
477 "fill_color_rgba", FG_COLOR,
480 view_highlight->private->p1 =
481 gnome_canvas_item_new (GNOME_CANVAS_GROUP(group),
482 gnome_canvas_rect_get_type (),
487 "fill_color_rgba", FG_COLOR,
488 "outline_color_rgba", BG_COLOR,
491 view_highlight->private->p2 =
492 gnome_canvas_item_new (GNOME_CANVAS_GROUP(group),
493 gnome_canvas_rect_get_type (),
498 "fill_color_rgba", FG_COLOR,
499 "outline_color_rgba", BG_COLOR,
502 g_signal_connect (G_OBJECT (view_highlight->private->p1), "event",
503 G_CALLBACK (p1_resize_event_handler), view_highlight);
504 g_signal_connect (G_OBJECT (view_highlight->private->p2), "event",
505 G_CALLBACK (p2_resize_event_handler), view_highlight);
507 g_signal_connect (G_OBJECT (view_highlight->private->outline), "event",
508 G_CALLBACK (passthrough_event_handler), view_object);
510 gnome_canvas_points_free (points);
512 /* send to top, then lower below all items that form the foregound */
513 gnome_canvas_item_raise_to_top (group);
514 gl_view_raise_fg (view);
516 gl_debug (DEBUG_VIEW, "END");
519 /*---------------------------------------------------------------------------*/
520 /* PRIVATE. Create a simple box highlight. */
521 /*---------------------------------------------------------------------------*/
523 highlight_simple_construct (glViewHighlight *view_highlight,
524 glViewObject *view_object)
527 GnomeCanvasItem *group;
529 glLabelObject *object;
531 gl_debug (DEBUG_VIEW, "START");
533 g_return_if_fail (view_highlight && GL_IS_VIEW_HIGHLIGHT (view_highlight));
534 g_return_if_fail (view_object && GL_IS_VIEW_OBJECT (view_object));
536 view = gl_view_object_get_view (view_object);
537 view_highlight->private->view = view;
539 object = gl_view_object_get_object (view_object);
540 view_highlight->private->object = object;
542 g_return_if_fail (view && GL_IS_VIEW (view));
543 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
545 gl_label_object_get_position (object, &x, &y);
546 gl_label_object_get_size (object, &w, &h);
549 view_highlight->private->group =
550 gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (view->canvas)),
551 gnome_canvas_group_get_type (),
552 "x", x, "y", y, NULL);
553 gnome_canvas_item_hide (view_highlight->private->group);
554 group = view_highlight->private->group;
556 view_highlight->private->outline =
557 gnome_canvas_item_new (GNOME_CANVAS_GROUP(group),
558 gnome_canvas_rect_get_type (),
564 "outline_color_rgba", FG_COLOR,
568 g_signal_connect (G_OBJECT (view_highlight->private->outline), "event",
569 G_CALLBACK (passthrough_event_handler), view_object);
571 /* send to top, then lower below all items that form the foregound */
572 gnome_canvas_item_raise_to_top (group);
573 gl_view_raise_fg (view);
575 gl_debug (DEBUG_VIEW, "END");
578 /****************************************************************************/
579 /* Show highlight. */
580 /****************************************************************************/
582 gl_view_highlight_show (glViewHighlight *view_highlight)
584 gnome_canvas_item_show (view_highlight->private->group);
586 gnome_canvas_item_raise_to_top (view_highlight->private->group);
587 gl_view_raise_fg (view_highlight->private->view);
590 /****************************************************************************/
591 /* Hide highlight. */
592 /****************************************************************************/
594 gl_view_highlight_hide (glViewHighlight *view_highlight)
596 gnome_canvas_item_hide (view_highlight->private->group);
599 /*---------------------------------------------------------------------------*/
600 /* PRIVATE. Object moved callback. */
601 /*---------------------------------------------------------------------------*/
603 object_moved_cb (glLabelObject *object,
606 glViewHighlight *view_highlight)
608 GnomeCanvasItem *item, *highlight;
610 gl_debug (DEBUG_VIEW, "START");
612 g_return_if_fail (view_highlight && GL_IS_VIEW_HIGHLIGHT (view_highlight));
613 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
615 /* Adjust location of highlight group */
616 gnome_canvas_item_move (view_highlight->private->group, dx, dy);
618 gl_debug (DEBUG_VIEW, "END");
621 /*---------------------------------------------------------------------------*/
622 /* PRIVATE. label object "changed" callback. */
623 /*---------------------------------------------------------------------------*/
625 object_changed_cb (glLabelObject *object,
626 glViewHighlight *view_highlight)
628 gl_debug (DEBUG_VIEW, "START");
630 g_return_if_fail (view_highlight && GL_IS_VIEW_HIGHLIGHT (view_highlight));
631 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
633 switch (view_highlight->private->style) {
635 case GL_VIEW_HIGHLIGHT_BOX_RESIZABLE:
636 case GL_VIEW_HIGHLIGHT_ELLIPSE_RESIZABLE:
637 update_resizable_box (view_highlight);
640 case GL_VIEW_HIGHLIGHT_LINE_RESIZABLE:
641 update_resizable_line (view_highlight);
644 case GL_VIEW_HIGHLIGHT_SIMPLE:
645 update_simple (view_highlight);
649 g_warning ("Invalid resizable highlight style");
653 gl_debug (DEBUG_VIEW, "END");
656 /*---------------------------------------------------------------------------*/
657 /* PRIVATE. Update a resizable box highlight. */
658 /*---------------------------------------------------------------------------*/
660 update_resizable_box (glViewHighlight *view_highlight)
664 gl_debug (DEBUG_VIEW, "START");
666 g_return_if_fail (view_highlight && GL_IS_VIEW_HIGHLIGHT (view_highlight));
668 gl_label_object_get_size (view_highlight->private->object, &w, &h);
671 gnome_canvas_item_set (view_highlight->private->outline,
678 gnome_canvas_item_set (view_highlight->private->tl,
685 gnome_canvas_item_set (view_highlight->private->tr,
692 gnome_canvas_item_set (view_highlight->private->bl,
699 gnome_canvas_item_set (view_highlight->private->br,
706 gnome_canvas_item_set (view_highlight->private->sl,
713 gnome_canvas_item_set (view_highlight->private->sr,
720 gnome_canvas_item_set (view_highlight->private->st,
727 gnome_canvas_item_set (view_highlight->private->sb,
734 /* send to top, then lower below all items that form the foregound */
735 gnome_canvas_item_raise_to_top (view_highlight->private->group);
736 gl_view_raise_fg (view_highlight->private->view);
738 gl_debug (DEBUG_VIEW, "END");
741 /*---------------------------------------------------------------------------*/
742 /* PRIVATE. Update a resizable line highlight. */
743 /*---------------------------------------------------------------------------*/
745 update_resizable_line (glViewHighlight *view_highlight)
748 GnomeCanvasPoints *points;
750 gl_debug (DEBUG_VIEW, "START");
752 g_return_if_fail (view_highlight && GL_IS_VIEW_HIGHLIGHT (view_highlight));
754 gl_label_object_get_size (view_highlight->private->object, &dx, &dy);
756 points = gnome_canvas_points_new (2);
758 points->coords[0] = 0.0;
759 points->coords[1] = 0.0;
760 points->coords[2] = dx;
761 points->coords[3] = dy;
762 gnome_canvas_item_set (view_highlight->private->outline, "points", points, NULL);
764 gnome_canvas_item_set (view_highlight->private->p1,
771 gnome_canvas_item_set (view_highlight->private->p2,
778 gnome_canvas_points_free (points);
780 /* send to top, then lower below all items that form the foregound */
781 gnome_canvas_item_raise_to_top (view_highlight->private->group);
782 gl_view_raise_fg (view_highlight->private->view);
784 gl_debug (DEBUG_VIEW, "END");
787 /*---------------------------------------------------------------------------*/
788 /* PRIVATE. Update a simple box highlight. */
789 /*---------------------------------------------------------------------------*/
791 update_simple (glViewHighlight *view_highlight)
795 gl_debug (DEBUG_VIEW, "START");
797 g_return_if_fail (view_highlight && GL_IS_VIEW_HIGHLIGHT (view_highlight));
799 gl_label_object_get_size (view_highlight->private->object, &w, &h);
801 gnome_canvas_item_set (view_highlight->private->outline,
806 /* send to top, then lower below all items that form the foregound */
807 gnome_canvas_item_raise_to_top (view_highlight->private->group);
808 gl_view_raise_fg (view_highlight->private->view);
810 gl_debug (DEBUG_VIEW, "END");
813 /*---------------------------------------------------------------------------*/
814 /* PRIVATE. "Top-left" Resize event handler. */
815 /*---------------------------------------------------------------------------*/
817 tl_resize_event_handler (GnomeCanvasItem *handle_item,
819 glViewHighlight *view_highlight)
822 static gdouble x2, y2;
823 static gboolean dragging = FALSE;
824 glLabelObject *object;
827 if ( view_highlight->private->view->state != GL_VIEW_STATE_ARROW ) {
828 /* don't interfere with object creation modes */
832 object = view_highlight->private->object;;
833 gl_label_object_get_position (object, &x, &y);
834 gl_label_object_get_size (object, &w, &h);
836 switch (event->type) {
838 case GDK_BUTTON_PRESS:
839 switch (event->button.button) {
842 gnome_canvas_item_grab (handle_item,
843 GDK_POINTER_MOTION_MASK |
844 GDK_BUTTON_RELEASE_MASK |
845 GDK_BUTTON_PRESS_MASK,
846 NULL, event->button.time);
847 /* Anchor to bottom-right corner */
856 case GDK_BUTTON_RELEASE:
857 switch (event->button.button) {
860 gnome_canvas_item_ungrab (handle_item,
862 x = MIN (event->button.x, x2 - MIN_ITEM_SIZE);
863 y = MIN (event->button.y, y2 - MIN_ITEM_SIZE);
864 w = MAX (x2 - event->button.x, MIN_ITEM_SIZE);
865 h = MAX (y2 - event->button.y, MIN_ITEM_SIZE);
866 gl_label_object_set_position (object, x, y);
867 gl_label_object_set_size (object, w, h);
874 case GDK_MOTION_NOTIFY:
875 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
876 x = MIN (event->motion.x, x2 - MIN_ITEM_SIZE);
877 y = MIN (event->motion.y, y2 - MIN_ITEM_SIZE);
878 w = MAX (x2 - event->motion.x, MIN_ITEM_SIZE);
879 h = MAX (y2 - event->motion.y, MIN_ITEM_SIZE);
880 gl_label_object_set_position (object, x, y);
881 gl_label_object_set_size (object, w, h);
887 case GDK_ENTER_NOTIFY:
888 cursor = gdk_cursor_new (GDK_CROSSHAIR);
889 gdk_window_set_cursor (view_highlight->private->view->canvas->window,
891 gdk_cursor_unref (cursor);
894 case GDK_LEAVE_NOTIFY:
895 cursor = gdk_cursor_new (GDK_LEFT_PTR);
896 gdk_window_set_cursor (view_highlight->private->view->canvas->window,
898 gdk_cursor_unref (cursor);
907 /*---------------------------------------------------------------------------*/
908 /* PRIVATE. "Top-right" Resize event handler. */
909 /*---------------------------------------------------------------------------*/
911 tr_resize_event_handler (GnomeCanvasItem *handle_item,
913 glViewHighlight *view_highlight)
916 static gdouble x1, y2;
917 static gboolean dragging = FALSE;
918 glLabelObject *object;
921 if ( view_highlight->private->view->state != GL_VIEW_STATE_ARROW ) {
922 /* don't interfere with object creation modes */
926 object = view_highlight->private->object;;
927 gl_label_object_get_position (object, &x, &y);
928 gl_label_object_get_size (object, &w, &h);
930 switch (event->type) {
932 case GDK_BUTTON_PRESS:
933 switch (event->button.button) {
936 gnome_canvas_item_grab (handle_item,
937 GDK_POINTER_MOTION_MASK |
938 GDK_BUTTON_RELEASE_MASK |
939 GDK_BUTTON_PRESS_MASK,
940 NULL, event->button.time);
941 /* Anchor to bottom-left corner */
950 case GDK_BUTTON_RELEASE:
951 switch (event->button.button) {
954 gnome_canvas_item_ungrab (handle_item,
957 y = MIN (event->button.y, y2 - MIN_ITEM_SIZE);
958 w = MAX (event->button.x - x1, MIN_ITEM_SIZE);
959 h = MAX (y2 - event->button.y, MIN_ITEM_SIZE);
960 gl_label_object_set_position (object, x, y);
961 gl_label_object_set_size (object, w, h);
968 case GDK_MOTION_NOTIFY:
969 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
971 y = MIN (event->motion.y, y2 - MIN_ITEM_SIZE);
972 w = MAX (event->motion.x - x1, MIN_ITEM_SIZE);
973 h = MAX (y2 - event->motion.y, MIN_ITEM_SIZE);
974 gl_label_object_set_position (object, x, y);
975 gl_label_object_set_size (object, w, h);
981 case GDK_ENTER_NOTIFY:
982 cursor = gdk_cursor_new (GDK_CROSSHAIR);
983 gdk_window_set_cursor (view_highlight->private->view->canvas->window,
985 gdk_cursor_unref (cursor);
988 case GDK_LEAVE_NOTIFY:
989 cursor = gdk_cursor_new (GDK_LEFT_PTR);
990 gdk_window_set_cursor (view_highlight->private->view->canvas->window,
992 gdk_cursor_unref (cursor);
1001 /*---------------------------------------------------------------------------*/
1002 /* PRIVATE. "Bottom-left" Resize event handler. */
1003 /*---------------------------------------------------------------------------*/
1005 bl_resize_event_handler (GnomeCanvasItem *handle_item,
1007 glViewHighlight *view_highlight)
1010 static gdouble x2, y1;
1011 static gboolean dragging = FALSE;
1012 glLabelObject *object;
1015 if ( view_highlight->private->view->state != GL_VIEW_STATE_ARROW ) {
1016 /* don't interfere with object creation modes */
1020 object = view_highlight->private->object;;
1021 gl_label_object_get_position (object, &x, &y);
1022 gl_label_object_get_size (object, &w, &h);
1024 switch (event->type) {
1026 case GDK_BUTTON_PRESS:
1027 switch (event->button.button) {
1030 gnome_canvas_item_grab (handle_item,
1031 GDK_POINTER_MOTION_MASK |
1032 GDK_BUTTON_RELEASE_MASK |
1033 GDK_BUTTON_PRESS_MASK,
1034 NULL, event->button.time);
1035 /* Anchor to top-right corner */
1044 case GDK_BUTTON_RELEASE:
1045 switch (event->button.button) {
1048 gnome_canvas_item_ungrab (handle_item,
1049 event->button.time);
1050 x = MIN (event->button.x, x2 - MIN_ITEM_SIZE);
1052 w = MAX (x2 - event->button.x, MIN_ITEM_SIZE);
1053 h = MAX (event->button.y - y1, MIN_ITEM_SIZE);
1054 gl_label_object_set_position (object, x, y);
1055 gl_label_object_set_size (object, w, h);
1062 case GDK_MOTION_NOTIFY:
1063 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
1064 x = MIN (event->motion.x, x2 - MIN_ITEM_SIZE);
1066 w = MAX (x2 - event->motion.x, MIN_ITEM_SIZE);
1067 h = MAX (event->motion.y - y1, MIN_ITEM_SIZE);
1068 gl_label_object_set_position (object, x, y);
1069 gl_label_object_set_size (object, w, h);
1075 case GDK_ENTER_NOTIFY:
1076 cursor = gdk_cursor_new (GDK_CROSSHAIR);
1077 gdk_window_set_cursor (view_highlight->private->view->canvas->window,
1079 gdk_cursor_unref (cursor);
1082 case GDK_LEAVE_NOTIFY:
1083 cursor = gdk_cursor_new (GDK_LEFT_PTR);
1084 gdk_window_set_cursor (view_highlight->private->view->canvas->window,
1086 gdk_cursor_unref (cursor);
1095 /*---------------------------------------------------------------------------*/
1096 /* PRIVATE. "Bottom-right" Resize event handler. */
1097 /*---------------------------------------------------------------------------*/
1099 br_resize_event_handler (GnomeCanvasItem *handle_item,
1101 glViewHighlight *view_highlight)
1104 static gdouble x1, y1;
1105 static gboolean dragging = FALSE;
1106 glLabelObject *object;
1109 if ( view_highlight->private->view->state != GL_VIEW_STATE_ARROW ) {
1110 /* don't interfere with object creation modes */
1114 object = view_highlight->private->object;;
1115 gl_label_object_get_position (object, &x, &y);
1116 gl_label_object_get_size (object, &w, &h);
1118 switch (event->type) {
1120 case GDK_BUTTON_PRESS:
1121 switch (event->button.button) {
1124 gnome_canvas_item_grab (handle_item,
1125 GDK_POINTER_MOTION_MASK |
1126 GDK_BUTTON_RELEASE_MASK |
1127 GDK_BUTTON_PRESS_MASK,
1128 NULL, event->button.time);
1129 /* Anchor to top-left corner */
1138 case GDK_BUTTON_RELEASE:
1139 switch (event->button.button) {
1142 gnome_canvas_item_ungrab (handle_item,
1143 event->button.time);
1146 w = MAX (event->button.x - x1, MIN_ITEM_SIZE);
1147 h = MAX (event->button.y - y1, MIN_ITEM_SIZE);
1148 gl_label_object_set_position (object, x, y);
1149 gl_label_object_set_size (object, w, h);
1156 case GDK_MOTION_NOTIFY:
1157 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
1160 w = MAX (event->motion.x - x1, MIN_ITEM_SIZE);
1161 h = MAX (event->motion.y - y1, MIN_ITEM_SIZE);
1162 gl_label_object_set_position (object, x, y);
1163 gl_label_object_set_size (object, w, h);
1169 case GDK_ENTER_NOTIFY:
1170 cursor = gdk_cursor_new (GDK_CROSSHAIR);
1171 gdk_window_set_cursor (view_highlight->private->view->canvas->window,
1173 gdk_cursor_unref (cursor);
1176 case GDK_LEAVE_NOTIFY:
1177 cursor = gdk_cursor_new (GDK_LEFT_PTR);
1178 gdk_window_set_cursor (view_highlight->private->view->canvas->window,
1180 gdk_cursor_unref (cursor);
1189 /*---------------------------------------------------------------------------*/
1190 /* PRIVATE. "Left-side" Resize event handler. */
1191 /*---------------------------------------------------------------------------*/
1193 sl_resize_event_handler (GnomeCanvasItem *handle_item,
1195 glViewHighlight *view_highlight)
1199 static gboolean dragging = FALSE;
1200 glLabelObject *object;
1203 if ( view_highlight->private->view->state != GL_VIEW_STATE_ARROW ) {
1204 /* don't interfere with object creation modes */
1208 object = view_highlight->private->object;;
1209 gl_label_object_get_position (object, &x, &y);
1210 gl_label_object_get_size (object, &w, &h);
1212 switch (event->type) {
1214 case GDK_BUTTON_PRESS:
1215 switch (event->button.button) {
1218 gnome_canvas_item_grab (handle_item,
1219 GDK_POINTER_MOTION_MASK |
1220 GDK_BUTTON_RELEASE_MASK |
1221 GDK_BUTTON_PRESS_MASK,
1222 NULL, event->button.time);
1223 /* Anchor to right side */
1231 case GDK_BUTTON_RELEASE:
1232 switch (event->button.button) {
1235 gnome_canvas_item_ungrab (handle_item,
1236 event->button.time);
1237 x = MIN (event->button.x, x2 - MIN_ITEM_SIZE);
1238 w = MAX (x2 - event->button.x, MIN_ITEM_SIZE);
1239 gl_label_object_set_position (object, x, y);
1240 gl_label_object_set_size (object, w, h);
1247 case GDK_MOTION_NOTIFY:
1248 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
1249 x = MIN (event->motion.x, x2 - MIN_ITEM_SIZE);
1250 w = MAX (x2 - event->motion.x, MIN_ITEM_SIZE);
1251 gl_label_object_set_position (object, x, y);
1252 gl_label_object_set_size (object, w, h);
1258 case GDK_ENTER_NOTIFY:
1259 cursor = gdk_cursor_new (GDK_CROSSHAIR);
1260 gdk_window_set_cursor (view_highlight->private->view->canvas->window,
1262 gdk_cursor_unref (cursor);
1265 case GDK_LEAVE_NOTIFY:
1266 cursor = gdk_cursor_new (GDK_LEFT_PTR);
1267 gdk_window_set_cursor (view_highlight->private->view->canvas->window,
1269 gdk_cursor_unref (cursor);
1278 /*---------------------------------------------------------------------------*/
1279 /* PRIVATE. "Right-side" Resize event handler. */
1280 /*---------------------------------------------------------------------------*/
1282 sr_resize_event_handler (GnomeCanvasItem *handle_item,
1284 glViewHighlight *view_highlight)
1288 static gboolean dragging = FALSE;
1289 glLabelObject *object;
1292 if ( view_highlight->private->view->state != GL_VIEW_STATE_ARROW ) {
1293 /* don't interfere with object creation modes */
1297 object = view_highlight->private->object;;
1298 gl_label_object_get_position (object, &x, &y);
1299 gl_label_object_get_size (object, &w, &h);
1301 switch (event->type) {
1303 case GDK_BUTTON_PRESS:
1304 switch (event->button.button) {
1307 gnome_canvas_item_grab (handle_item,
1308 GDK_POINTER_MOTION_MASK |
1309 GDK_BUTTON_RELEASE_MASK |
1310 GDK_BUTTON_PRESS_MASK,
1311 NULL, event->button.time);
1312 /* Anchor to left side */
1320 case GDK_BUTTON_RELEASE:
1321 switch (event->button.button) {
1324 gnome_canvas_item_ungrab (handle_item,
1325 event->button.time);
1327 w = MAX (event->button.x - x1, MIN_ITEM_SIZE);
1328 gl_label_object_set_position (object, x, y);
1329 gl_label_object_set_size (object, w, h);
1336 case GDK_MOTION_NOTIFY:
1337 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
1339 w = MAX (event->motion.x - x1, MIN_ITEM_SIZE);
1340 gl_label_object_set_position (object, x, y);
1341 gl_label_object_set_size (object, w, h);
1347 case GDK_ENTER_NOTIFY:
1348 cursor = gdk_cursor_new (GDK_CROSSHAIR);
1349 gdk_window_set_cursor (view_highlight->private->view->canvas->window,
1351 gdk_cursor_unref (cursor);
1354 case GDK_LEAVE_NOTIFY:
1355 cursor = gdk_cursor_new (GDK_LEFT_PTR);
1356 gdk_window_set_cursor (view_highlight->private->view->canvas->window,
1358 gdk_cursor_unref (cursor);
1367 /*---------------------------------------------------------------------------*/
1368 /* PRIVATE. "Top-side" Resize event handler. */
1369 /*---------------------------------------------------------------------------*/
1371 st_resize_event_handler (GnomeCanvasItem *handle_item,
1373 glViewHighlight *view_highlight)
1377 static gboolean dragging = FALSE;
1378 glLabelObject *object;
1381 if ( view_highlight->private->view->state != GL_VIEW_STATE_ARROW ) {
1382 /* don't interfere with object creation modes */
1386 object = view_highlight->private->object;;
1387 gl_label_object_get_position (object, &x, &y);
1388 gl_label_object_get_size (object, &w, &h);
1390 switch (event->type) {
1392 case GDK_BUTTON_PRESS:
1393 switch (event->button.button) {
1396 gnome_canvas_item_grab (handle_item,
1397 GDK_POINTER_MOTION_MASK |
1398 GDK_BUTTON_RELEASE_MASK |
1399 GDK_BUTTON_PRESS_MASK,
1400 NULL, event->button.time);
1401 /* Anchor to bottom-right corner */
1409 case GDK_BUTTON_RELEASE:
1410 switch (event->button.button) {
1413 gnome_canvas_item_ungrab (handle_item,
1414 event->button.time);
1415 y = MIN (event->button.y, y2 - MIN_ITEM_SIZE);
1416 h = MAX (y2 - event->button.y, MIN_ITEM_SIZE);
1417 gl_label_object_set_position (object, x, y);
1418 gl_label_object_set_size (object, w, h);
1425 case GDK_MOTION_NOTIFY:
1426 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
1427 y = MIN (event->motion.y, y2 - MIN_ITEM_SIZE);
1428 h = MAX (y2 - event->motion.y, MIN_ITEM_SIZE);
1429 gl_label_object_set_position (object, x, y);
1430 gl_label_object_set_size (object, w, h);
1436 case GDK_ENTER_NOTIFY:
1437 cursor = gdk_cursor_new (GDK_CROSSHAIR);
1438 gdk_window_set_cursor (view_highlight->private->view->canvas->window,
1440 gdk_cursor_unref (cursor);
1443 case GDK_LEAVE_NOTIFY:
1444 cursor = gdk_cursor_new (GDK_LEFT_PTR);
1445 gdk_window_set_cursor (view_highlight->private->view->canvas->window,
1447 gdk_cursor_unref (cursor);
1456 /*---------------------------------------------------------------------------*/
1457 /* PRIVATE. "Bottom-side" Resize event handler. */
1458 /*---------------------------------------------------------------------------*/
1460 sb_resize_event_handler (GnomeCanvasItem *handle_item,
1462 glViewHighlight *view_highlight)
1466 static gboolean dragging = FALSE;
1467 glLabelObject *object;
1470 if ( view_highlight->private->view->state != GL_VIEW_STATE_ARROW ) {
1471 /* don't interfere with object creation modes */
1475 object = view_highlight->private->object;;
1476 gl_label_object_get_position (object, &x, &y);
1477 gl_label_object_get_size (object, &w, &h);
1479 switch (event->type) {
1481 case GDK_BUTTON_PRESS:
1482 switch (event->button.button) {
1485 gnome_canvas_item_grab (handle_item,
1486 GDK_POINTER_MOTION_MASK |
1487 GDK_BUTTON_RELEASE_MASK |
1488 GDK_BUTTON_PRESS_MASK,
1489 NULL, event->button.time);
1490 /* Anchor to top side */
1498 case GDK_BUTTON_RELEASE:
1499 switch (event->button.button) {
1502 gnome_canvas_item_ungrab (handle_item,
1503 event->button.time);
1505 h = MAX (event->button.y - y1, MIN_ITEM_SIZE);
1506 gl_label_object_set_position (object, x, y);
1507 gl_label_object_set_size (object, w, h);
1514 case GDK_MOTION_NOTIFY:
1515 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
1517 h = MAX (event->motion.y - y1, MIN_ITEM_SIZE);
1518 gl_label_object_set_position (object, x, y);
1519 gl_label_object_set_size (object, w, h);
1525 case GDK_ENTER_NOTIFY:
1526 cursor = gdk_cursor_new (GDK_CROSSHAIR);
1527 gdk_window_set_cursor (view_highlight->private->view->canvas->window,
1529 gdk_cursor_unref (cursor);
1532 case GDK_LEAVE_NOTIFY:
1533 cursor = gdk_cursor_new (GDK_LEFT_PTR);
1534 gdk_window_set_cursor (view_highlight->private->view->canvas->window,
1536 gdk_cursor_unref (cursor);
1545 /*---------------------------------------------------------------------------*/
1546 /* PRIVATE. Resize "P1" event handler. */
1547 /*---------------------------------------------------------------------------*/
1549 p1_resize_event_handler (GnomeCanvasItem *handle_item,
1551 glViewHighlight *view_highlight)
1553 gdouble x, y, dx, dy;
1554 static gdouble x0, y0;
1555 static gboolean dragging = FALSE;
1556 glLabelObject *object;
1559 if ( view_highlight->private->view->state != GL_VIEW_STATE_ARROW ) {
1560 /* don't interfere with object creation modes */
1564 object = view_highlight->private->object;;
1565 gl_label_object_get_position (object, &x, &y);
1566 gl_label_object_get_size (object, &dx, &dy);
1568 switch (event->type) {
1570 case GDK_BUTTON_PRESS:
1571 switch (event->button.button) {
1574 gnome_canvas_item_grab (handle_item,
1575 GDK_POINTER_MOTION_MASK |
1576 GDK_BUTTON_RELEASE_MASK |
1577 GDK_BUTTON_PRESS_MASK,
1578 NULL, event->button.time);
1588 case GDK_BUTTON_RELEASE:
1589 switch (event->button.button) {
1592 gnome_canvas_item_ungrab (handle_item,
1593 event->button.time);
1596 dx = (event->button.x - x0);
1597 dy = (event->button.y - y0);
1598 gl_label_object_set_position (object, x, y);
1599 gl_label_object_set_size (object, dx, dy);
1606 case GDK_MOTION_NOTIFY:
1607 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
1610 dx = (event->motion.x - x0);
1611 dy = (event->motion.y - y0);
1612 gl_label_object_set_position (object, x, y);
1613 gl_label_object_set_size (object, dx, dy);
1619 case GDK_ENTER_NOTIFY:
1620 cursor = gdk_cursor_new (GDK_CROSSHAIR);
1621 gdk_window_set_cursor (view_highlight->private->view->canvas->window,
1623 gdk_cursor_unref (cursor);
1626 case GDK_LEAVE_NOTIFY:
1627 cursor = gdk_cursor_new (GDK_LEFT_PTR);
1628 gdk_window_set_cursor (view_highlight->private->view->canvas->window,
1630 gdk_cursor_unref (cursor);
1639 /*---------------------------------------------------------------------------*/
1640 /* PRIVATE. Resize "P2" event handler. */
1641 /*---------------------------------------------------------------------------*/
1643 p2_resize_event_handler (GnomeCanvasItem *handle_item,
1645 glViewHighlight *view_highlight)
1647 gdouble x, y, dx, dy;
1648 static gdouble x0, y0;
1649 static gboolean dragging = FALSE;
1650 glLabelObject *object;
1653 if ( view_highlight->private->view->state != GL_VIEW_STATE_ARROW ) {
1654 /* don't interfere with object creation modes */
1658 object = view_highlight->private->object;;
1659 gl_label_object_get_position (object, &x, &y);
1660 gl_label_object_get_size (object, &dx, &dy);
1662 switch (event->type) {
1664 case GDK_BUTTON_PRESS:
1665 switch (event->button.button) {
1668 gnome_canvas_item_grab (handle_item,
1669 GDK_POINTER_MOTION_MASK |
1670 GDK_BUTTON_RELEASE_MASK |
1671 GDK_BUTTON_PRESS_MASK,
1672 NULL, event->button.time);
1682 case GDK_BUTTON_RELEASE:
1683 switch (event->button.button) {
1686 gnome_canvas_item_ungrab (handle_item,
1687 event->button.time);
1690 dx = (event->button.x - x0);
1691 dy = (event->button.y - y0);
1692 gl_label_object_set_position (object, x, y);
1693 gl_label_object_set_size (object, dx, dy);
1700 case GDK_MOTION_NOTIFY:
1701 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
1704 dx = (event->motion.x - x0);
1705 dy = (event->motion.y - y0);
1706 gl_label_object_set_position (object, x, y);
1707 gl_label_object_set_size (object, dx, dy);
1713 case GDK_ENTER_NOTIFY:
1714 cursor = gdk_cursor_new (GDK_CROSSHAIR);
1715 gdk_window_set_cursor (view_highlight->private->view->canvas->window,
1717 gdk_cursor_unref (cursor);
1720 case GDK_LEAVE_NOTIFY:
1721 cursor = gdk_cursor_new (GDK_LEFT_PTR);
1722 gdk_window_set_cursor (view_highlight->private->view->canvas->window,
1724 gdk_cursor_unref (cursor);
1733 /*---------------------------------------------------------------------------*/
1734 /* PRIVATE. Passthrough event handler. */
1735 /*---------------------------------------------------------------------------*/
1737 passthrough_event_handler (GnomeCanvasItem *handle_item,
1739 glViewObject *view_object)
1741 GnomeCanvasItem *group;
1743 group = gl_view_object_get_group (view_object);
1744 return gl_view_item_event_handler (group, event, view_object);