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 /*===========================================*/
39 /*===========================================*/
41 /*===========================================*/
43 /*===========================================*/
44 /* Local function prototypes */
45 /*===========================================*/
47 static GnomeCanvasItem *highlight_resizable_box (glViewObject *view_object,
48 glViewHighlightStyle style);
49 static GnomeCanvasItem *highlight_resizable_line (glViewObject *view_object);
50 static GnomeCanvasItem *highlight_simple (glViewObject *view_object);
52 static void update_resizable_box (GnomeCanvasItem *highlight,
53 glViewHighlightStyle style);
54 static void update_resizable_line (GnomeCanvasItem *highlight);
55 static void update_simple (GnomeCanvasItem *highlight);
57 static int tl_resize_event_handler (GnomeCanvasItem * handle_item,
59 glViewObject *view_object);
60 static int tr_resize_event_handler (GnomeCanvasItem * handle_item,
62 glViewObject *view_object);
63 static int bl_resize_event_handler (GnomeCanvasItem * handle_item,
65 glViewObject *view_object);
66 static int br_resize_event_handler (GnomeCanvasItem * handle_item,
68 glViewObject *view_object);
70 static int sl_resize_event_handler (GnomeCanvasItem * handle_item,
72 glViewObject *view_object);
73 static int sr_resize_event_handler (GnomeCanvasItem * handle_item,
75 glViewObject *view_object);
76 static int st_resize_event_handler (GnomeCanvasItem * handle_item,
78 glViewObject *view_object);
79 static int sb_resize_event_handler (GnomeCanvasItem * handle_item,
81 glViewObject *view_object);
83 static int p1_resize_event_handler (GnomeCanvasItem * handle_item,
85 glViewObject *view_object);
86 static int p2_resize_event_handler (GnomeCanvasItem * handle_item,
88 glViewObject *view_object);
90 static int passthrough_event_handler (GnomeCanvasItem * handle_item,
92 glViewObject *view_object);
94 /*****************************************************************************/
95 /* Create a resizable highlight for given object. */
96 /*****************************************************************************/
98 gl_view_highlight_new (glViewObject *view_object,
99 glViewHighlightStyle style)
101 GnomeCanvasItem *highlight;
103 gl_debug (DEBUG_VIEW, "START");
105 g_return_if_fail (view_object && GL_IS_VIEW_OBJECT(view_object));
109 case GL_VIEW_HIGHLIGHT_BOX_RESIZABLE:
110 case GL_VIEW_HIGHLIGHT_ELLIPSE_RESIZABLE:
111 highlight = highlight_resizable_box (view_object, style);
114 case GL_VIEW_HIGHLIGHT_LINE_RESIZABLE:
115 highlight = highlight_resizable_line (view_object);
118 case GL_VIEW_HIGHLIGHT_SIMPLE:
119 highlight = highlight_simple (view_object);
123 g_warning ("Invalid resizable highlight style");
127 g_object_set_data (G_OBJECT(highlight), "style",
128 GINT_TO_POINTER(style));
130 gl_debug (DEBUG_VIEW, "END");
135 /*****************************************************************************/
136 /* Update a resizable highlight for given item. */
137 /*****************************************************************************/
139 gl_view_highlight_update (GnomeCanvasItem * highlight)
141 glViewHighlightStyle style;
143 gl_debug (DEBUG_VIEW, "START");
145 g_return_if_fail (GNOME_IS_CANVAS_ITEM (highlight));
147 style = GPOINTER_TO_INT(g_object_get_data (G_OBJECT(highlight),
152 case GL_VIEW_HIGHLIGHT_BOX_RESIZABLE:
153 case GL_VIEW_HIGHLIGHT_ELLIPSE_RESIZABLE:
154 update_resizable_box (highlight, style);
157 case GL_VIEW_HIGHLIGHT_LINE_RESIZABLE:
158 update_resizable_line (highlight);
161 case GL_VIEW_HIGHLIGHT_SIMPLE:
162 update_simple (highlight);
166 g_warning ("Invalid resizable highlight style");
170 gl_debug (DEBUG_VIEW, "END");
173 /*---------------------------------------------------------------------------*/
174 /* PRIVATE. Create a resizable box highlight. */
175 /*---------------------------------------------------------------------------*/
176 static GnomeCanvasItem *
177 highlight_resizable_box (glViewObject *view_object,
178 glViewHighlightStyle style)
180 GnomeCanvasItem *highlight;
181 glLabelObject *object;
184 GnomeCanvasItem *outline; /* Outline around item */
185 GnomeCanvasItem *tl, *tr, *bl, *br; /* Handles at four corners */
186 GnomeCanvasItem *sl, *sr, *st, *sb; /* Handles at each side */
188 gl_debug (DEBUG_VIEW, "START");
190 g_return_if_fail (GL_IS_VIEW_OBJECT (view_object));
192 object = gl_view_object_get_object (view_object);
193 gl_label_object_get_position (object, &x, &y);
194 gl_label_object_get_size (object, &w, &h);
196 view = gl_view_object_get_view (view_object);
199 gnome_canvas_item_new (gnome_canvas_root
200 (GNOME_CANVAS (view->canvas)),
201 gnome_canvas_group_get_type (),
202 "x", x, "y", y, NULL);
204 gnome_canvas_item_hide (highlight);
207 case GL_VIEW_HIGHLIGHT_BOX_RESIZABLE:
209 gnome_canvas_item_new (GNOME_CANVAS_GROUP (highlight),
210 gnome_canvas_rect_get_type (),
216 "outline_color_rgba", FG_COLOR,
219 case GL_VIEW_HIGHLIGHT_ELLIPSE_RESIZABLE:
221 gnome_canvas_item_new (GNOME_CANVAS_GROUP (highlight),
222 gnome_canvas_ellipse_get_type (),
228 "outline_color_rgba", FG_COLOR,
233 g_warning ("Invalid resizable highlight style");
236 tl = gnome_canvas_item_new (GNOME_CANVAS_GROUP (highlight),
237 gnome_canvas_rect_get_type (),
242 "fill_color_rgba", FG_COLOR,
243 "outline_color_rgba", BG_COLOR,
246 tr = gnome_canvas_item_new (GNOME_CANVAS_GROUP (highlight),
247 gnome_canvas_rect_get_type (),
252 "fill_color_rgba", FG_COLOR,
253 "outline_color_rgba", BG_COLOR,
256 bl = gnome_canvas_item_new (GNOME_CANVAS_GROUP (highlight),
257 gnome_canvas_rect_get_type (),
262 "fill_color_rgba", FG_COLOR,
263 "outline_color_rgba", BG_COLOR,
266 br = gnome_canvas_item_new (GNOME_CANVAS_GROUP (highlight),
267 gnome_canvas_rect_get_type (),
272 "fill_color_rgba", FG_COLOR,
273 "outline_color_rgba", BG_COLOR,
276 sl = gnome_canvas_item_new (GNOME_CANVAS_GROUP (highlight),
277 gnome_canvas_rect_get_type (),
282 "fill_color_rgba", FG_COLOR,
283 "outline_color_rgba", BG_COLOR,
286 sr = gnome_canvas_item_new (GNOME_CANVAS_GROUP (highlight),
287 gnome_canvas_rect_get_type (),
292 "fill_color_rgba", FG_COLOR,
293 "outline_color_rgba", BG_COLOR,
296 st = gnome_canvas_item_new (GNOME_CANVAS_GROUP (highlight),
297 gnome_canvas_rect_get_type (),
302 "fill_color_rgba", FG_COLOR,
303 "outline_color_rgba", BG_COLOR,
306 sb = gnome_canvas_item_new (GNOME_CANVAS_GROUP (highlight),
307 gnome_canvas_rect_get_type (),
312 "fill_color_rgba", FG_COLOR,
313 "outline_color_rgba", BG_COLOR,
316 g_object_set_data (G_OBJECT (highlight), "object", object);
318 g_object_set_data (G_OBJECT (highlight), "outline", outline);
320 g_object_set_data (G_OBJECT (highlight), "tl", tl);
321 g_object_set_data (G_OBJECT (highlight), "tr", tr);
322 g_object_set_data (G_OBJECT (highlight), "bl", bl);
323 g_object_set_data (G_OBJECT (highlight), "br", br);
324 g_object_set_data (G_OBJECT (highlight), "sl", sl);
325 g_object_set_data (G_OBJECT (highlight), "sr", sr);
326 g_object_set_data (G_OBJECT (highlight), "st", st);
327 g_object_set_data (G_OBJECT (highlight), "sb", sb);
329 g_signal_connect (G_OBJECT (tl), "event",
330 G_CALLBACK (tl_resize_event_handler), view_object);
331 g_signal_connect (G_OBJECT (tr), "event",
332 G_CALLBACK (tr_resize_event_handler), view_object);
333 g_signal_connect (G_OBJECT (bl), "event",
334 G_CALLBACK (bl_resize_event_handler), view_object);
335 g_signal_connect (G_OBJECT (br), "event",
336 G_CALLBACK (br_resize_event_handler), view_object);
337 g_signal_connect (G_OBJECT (sl), "event",
338 G_CALLBACK (sl_resize_event_handler), view_object);
339 g_signal_connect (G_OBJECT (sr), "event",
340 G_CALLBACK (sr_resize_event_handler), view_object);
341 g_signal_connect (G_OBJECT (st), "event",
342 G_CALLBACK (st_resize_event_handler), view_object);
343 g_signal_connect (G_OBJECT (sb), "event",
344 G_CALLBACK (sb_resize_event_handler), view_object);
346 g_signal_connect (G_OBJECT (outline), "event",
347 G_CALLBACK (passthrough_event_handler), view_object);
349 gnome_canvas_item_raise_to_top (highlight);
351 gl_debug (DEBUG_VIEW, "END");
356 /*---------------------------------------------------------------------------*/
357 /* PRIVATE. Create a resizable line highlight. */
358 /*---------------------------------------------------------------------------*/
359 static GnomeCanvasItem *
360 highlight_resizable_line (glViewObject *view_object)
362 GnomeCanvasItem *highlight;
363 glLabelObject *object;
365 gdouble x, y, dx, dy;
366 GnomeCanvasPoints *points;
367 GnomeCanvasItem *outline; /* Outline around item */
368 GnomeCanvasItem *p1, *p2; /* Handles at endpoints */
370 gl_debug (DEBUG_VIEW, "START");
372 g_return_if_fail (GL_IS_VIEW_OBJECT (view_object));
374 object = gl_view_object_get_object (view_object);
375 gl_label_object_get_position (object, &x, &y);
376 gl_label_object_get_size (object, &dx, &dy);
378 view = gl_view_object_get_view (view_object);
380 points = gnome_canvas_points_new (2);
384 gnome_canvas_item_new (gnome_canvas_root
385 (GNOME_CANVAS (view->canvas)),
386 gnome_canvas_group_get_type (),
387 "x", x, "y", y, NULL);
389 gnome_canvas_item_hide (highlight);
391 points->coords[0] = 0.0;
392 points->coords[1] = 0.0;
393 points->coords[2] = dx;
394 points->coords[3] = dy;
395 outline = gnome_canvas_item_new (GNOME_CANVAS_GROUP (highlight),
396 gnome_canvas_line_get_type (),
399 "fill_color_rgba", FG_COLOR,
402 p1 = gnome_canvas_item_new (GNOME_CANVAS_GROUP (highlight),
403 gnome_canvas_rect_get_type (),
408 "fill_color_rgba", FG_COLOR,
409 "outline_color_rgba", BG_COLOR,
412 p2 = gnome_canvas_item_new (GNOME_CANVAS_GROUP (highlight),
413 gnome_canvas_rect_get_type (),
418 "fill_color_rgba", FG_COLOR,
419 "outline_color_rgba", BG_COLOR,
422 g_object_set_data (G_OBJECT (highlight), "object", object);
424 g_object_set_data (G_OBJECT (highlight), "outline", outline);
426 g_object_set_data (G_OBJECT (highlight), "p1", p1);
427 g_object_set_data (G_OBJECT (highlight), "p2", p2);
429 g_signal_connect (G_OBJECT (p1), "event",
430 G_CALLBACK (p1_resize_event_handler), view_object);
431 g_signal_connect (G_OBJECT (p2), "event",
432 G_CALLBACK (p2_resize_event_handler), view_object);
434 g_signal_connect (G_OBJECT (outline), "event",
435 G_CALLBACK (passthrough_event_handler), view_object);
437 gnome_canvas_points_free (points);
439 gnome_canvas_item_raise_to_top (highlight);
441 gl_debug (DEBUG_VIEW, "END");
446 /*---------------------------------------------------------------------------*/
447 /* PRIVATE. Create a simple box highlight. */
448 /*---------------------------------------------------------------------------*/
449 static GnomeCanvasItem *
450 highlight_simple (glViewObject *view_object)
452 GnomeCanvasItem *highlight, *outline;
453 glLabelObject *object;
457 gl_debug (DEBUG_VIEW, "START");
459 g_return_if_fail (GL_IS_VIEW_OBJECT (view_object));
461 object = gl_view_object_get_object (view_object);
462 gl_label_object_get_position (object, &x, &y);
463 gl_label_object_get_size (object, &w, &h);
465 view = gl_view_object_get_view (view_object);
468 gnome_canvas_item_new (gnome_canvas_root
469 (GNOME_CANVAS (view->canvas)),
470 gnome_canvas_group_get_type (),
471 "x", x, "y", y, NULL);
473 gnome_canvas_item_hide (highlight);
476 gnome_canvas_item_new (GNOME_CANVAS_GROUP(highlight),
477 gnome_canvas_rect_get_type (),
483 "outline_color_rgba", FG_COLOR,
487 g_object_set_data (G_OBJECT (highlight), "outline", outline);
489 g_object_set_data (G_OBJECT (highlight), "object", object);
491 g_signal_connect (G_OBJECT (highlight), "event",
492 G_CALLBACK (passthrough_event_handler), view_object);
494 gnome_canvas_item_raise_to_top (highlight);
496 gl_debug (DEBUG_VIEW, "END");
501 /*---------------------------------------------------------------------------*/
502 /* PRIVATE. Update a resizable box highlight. */
503 /*---------------------------------------------------------------------------*/
505 update_resizable_box (GnomeCanvasItem *highlight,
506 glViewHighlightStyle style)
508 glLabelObject *object;
510 GnomeCanvasItem *outline; /* Outline around item */
511 GnomeCanvasItem *tl, *tr, *bl, *br; /* Handles at four corners */
512 GnomeCanvasItem *sl, *sr, *st, *sb; /* Handles at each side */
514 gl_debug (DEBUG_VIEW, "START");
516 g_return_if_fail (GNOME_IS_CANVAS_ITEM (highlight));
518 object = g_object_get_data (G_OBJECT (highlight), "object");
519 gl_label_object_get_size (object, &w, &h);
521 outline = g_object_get_data (G_OBJECT (highlight), "outline");
523 tl = g_object_get_data (G_OBJECT (highlight), "tl");
524 tr = g_object_get_data (G_OBJECT (highlight), "tr");
525 bl = g_object_get_data (G_OBJECT (highlight), "bl");
526 br = g_object_get_data (G_OBJECT (highlight), "br");
527 sl = g_object_get_data (G_OBJECT (highlight), "sl");
528 sr = g_object_get_data (G_OBJECT (highlight), "sr");
529 st = g_object_get_data (G_OBJECT (highlight), "st");
530 sb = g_object_get_data (G_OBJECT (highlight), "sb");
532 gnome_canvas_item_set (outline,
539 gnome_canvas_item_set (tl,
546 gnome_canvas_item_set (tr,
553 gnome_canvas_item_set (bl,
560 gnome_canvas_item_set (br,
567 gnome_canvas_item_set (sl,
574 gnome_canvas_item_set (sr,
581 gnome_canvas_item_set (st,
588 gnome_canvas_item_set (sb,
595 gnome_canvas_item_raise_to_top (highlight);
597 gl_debug (DEBUG_VIEW, "END");
600 /*---------------------------------------------------------------------------*/
601 /* PRIVATE. Update a resizable line highlight. */
602 /*---------------------------------------------------------------------------*/
604 update_resizable_line (GnomeCanvasItem *highlight)
606 glLabelObject *object;
608 GnomeCanvasPoints *points;
609 GnomeCanvasItem *outline; /* Outline around item */
610 GnomeCanvasItem *p1, *p2; /* Handles at endpoints */
612 gl_debug (DEBUG_VIEW, "START");
614 g_return_if_fail (GNOME_IS_CANVAS_ITEM (highlight));
616 object = g_object_get_data (G_OBJECT (highlight), "object");
617 gl_label_object_get_size (object, &dx, &dy);
619 points = gnome_canvas_points_new (2);
621 outline = g_object_get_data (G_OBJECT (highlight), "outline");
623 p1 = g_object_get_data (G_OBJECT (highlight), "p1");
624 p2 = g_object_get_data (G_OBJECT (highlight), "p2");
626 points->coords[0] = 0.0;
627 points->coords[1] = 0.0;
628 points->coords[2] = dx;
629 points->coords[3] = dy;
630 gnome_canvas_item_set (outline, "points", points, NULL);
632 gnome_canvas_item_set (p1,
639 gnome_canvas_item_set (p2,
646 gnome_canvas_points_free (points);
648 gnome_canvas_item_raise_to_top (highlight);
650 gl_debug (DEBUG_VIEW, "END");
653 /*---------------------------------------------------------------------------*/
654 /* PRIVATE. Update a simple box highlight. */
655 /*---------------------------------------------------------------------------*/
657 update_simple (GnomeCanvasItem *highlight)
659 glLabelObject *object;
661 GnomeCanvasItem *outline; /* Outline around item */
663 gl_debug (DEBUG_VIEW, "START");
665 g_return_if_fail (GNOME_IS_CANVAS_ITEM (highlight));
667 object = g_object_get_data (G_OBJECT (highlight), "object");
668 gl_label_object_get_size (object, &w, &h);
670 outline = g_object_get_data (G_OBJECT (highlight), "outline");
672 gnome_canvas_item_set (outline,
677 gnome_canvas_item_raise_to_top (highlight);
679 gl_debug (DEBUG_VIEW, "END");
682 /*---------------------------------------------------------------------------*/
683 /* PRIVATE. "Top-left" Resize event handler. */
684 /*---------------------------------------------------------------------------*/
686 tl_resize_event_handler (GnomeCanvasItem * handle_item,
688 glViewObject *view_object)
691 static gdouble x2, y2;
692 static gboolean dragging = FALSE;
693 glLabelObject *object;
697 gl_debug (DEBUG_VIEW, "");
699 view = gl_view_object_get_view (view_object);
700 if ( view->state != GL_VIEW_STATE_ARROW ) {
701 /* don't interfere with object creation modes */
705 object = gl_view_object_get_object (view_object);
706 gl_label_object_get_position (object, &x, &y);
707 gl_label_object_get_size (object, &w, &h);
709 switch (event->type) {
711 case GDK_BUTTON_PRESS:
712 switch (event->button.button) {
715 gnome_canvas_item_grab (handle_item,
716 GDK_POINTER_MOTION_MASK |
717 GDK_BUTTON_RELEASE_MASK |
718 GDK_BUTTON_PRESS_MASK,
719 NULL, event->button.time);
720 /* Anchor to bottom-right corner */
729 case GDK_BUTTON_RELEASE:
730 switch (event->button.button) {
733 gnome_canvas_item_ungrab (handle_item,
735 x = MIN (event->button.x, x2 - MIN_ITEM_SIZE);
736 y = MIN (event->button.y, y2 - MIN_ITEM_SIZE);
737 w = MAX (x2 - event->button.x, MIN_ITEM_SIZE);
738 h = MAX (y2 - event->button.y, MIN_ITEM_SIZE);
739 gl_label_object_set_position (object, x, y);
740 gl_label_object_set_size (object, w, h);
747 case GDK_MOTION_NOTIFY:
748 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
749 x = MIN (event->button.x, x2 - MIN_ITEM_SIZE);
750 y = MIN (event->button.y, y2 - MIN_ITEM_SIZE);
751 w = MAX (x2 - event->button.x, MIN_ITEM_SIZE);
752 h = MAX (y2 - event->button.y, MIN_ITEM_SIZE);
753 gl_label_object_set_position (object, x, y);
754 gl_label_object_set_size (object, w, h);
760 case GDK_ENTER_NOTIFY:
761 cursor = gdk_cursor_new (GDK_CROSSHAIR);
762 gdk_window_set_cursor (view->canvas->window, cursor);
763 gdk_cursor_unref (cursor);
766 case GDK_LEAVE_NOTIFY:
767 cursor = gdk_cursor_new (GDK_LEFT_PTR);
768 gdk_window_set_cursor (view->canvas->window, cursor);
769 gdk_cursor_unref (cursor);
778 /*---------------------------------------------------------------------------*/
779 /* PRIVATE. "Top-right" Resize event handler. */
780 /*---------------------------------------------------------------------------*/
782 tr_resize_event_handler (GnomeCanvasItem * handle_item,
784 glViewObject *view_object)
787 static gdouble x1, y2;
788 static gboolean dragging = FALSE;
789 glLabelObject *object;
793 gl_debug (DEBUG_VIEW, "");
795 view = gl_view_object_get_view (view_object);
796 if ( view->state != GL_VIEW_STATE_ARROW ) {
797 /* don't interfere with object creation modes */
801 object = gl_view_object_get_object (view_object);
802 gl_label_object_get_position (object, &x, &y);
803 gl_label_object_get_size (object, &w, &h);
805 switch (event->type) {
807 case GDK_BUTTON_PRESS:
808 switch (event->button.button) {
811 gnome_canvas_item_grab (handle_item,
812 GDK_POINTER_MOTION_MASK |
813 GDK_BUTTON_RELEASE_MASK |
814 GDK_BUTTON_PRESS_MASK,
815 NULL, event->button.time);
816 /* Anchor to bottom-left corner */
825 case GDK_BUTTON_RELEASE:
826 switch (event->button.button) {
829 gnome_canvas_item_ungrab (handle_item,
832 y = MIN (event->button.y, y2 - MIN_ITEM_SIZE);
833 w = MAX (event->button.x - x1, MIN_ITEM_SIZE);
834 h = MAX (y2 - event->button.y, MIN_ITEM_SIZE);
835 gl_label_object_set_position (object, x, y);
836 gl_label_object_set_size (object, w, h);
843 case GDK_MOTION_NOTIFY:
844 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
846 y = MIN (event->button.y, y2 - MIN_ITEM_SIZE);
847 w = MAX (event->button.x - x1, MIN_ITEM_SIZE);
848 h = MAX (y2 - event->button.y, MIN_ITEM_SIZE);
849 gl_label_object_set_position (object, x, y);
850 gl_label_object_set_size (object, w, h);
856 case GDK_ENTER_NOTIFY:
857 cursor = gdk_cursor_new (GDK_CROSSHAIR);
858 gdk_window_set_cursor (view->canvas->window, cursor);
859 gdk_cursor_unref (cursor);
862 case GDK_LEAVE_NOTIFY:
863 cursor = gdk_cursor_new (GDK_LEFT_PTR);
864 gdk_window_set_cursor (view->canvas->window, cursor);
865 gdk_cursor_unref (cursor);
874 /*---------------------------------------------------------------------------*/
875 /* PRIVATE. "Bottom-left" Resize event handler. */
876 /*---------------------------------------------------------------------------*/
878 bl_resize_event_handler (GnomeCanvasItem * handle_item,
880 glViewObject *view_object)
883 static gdouble x2, y1;
884 static gboolean dragging = FALSE;
885 glLabelObject *object;
889 gl_debug (DEBUG_VIEW, "");
891 view = gl_view_object_get_view (view_object);
892 if ( view->state != GL_VIEW_STATE_ARROW ) {
893 /* don't interfere with object creation modes */
897 object = gl_view_object_get_object (view_object);
898 gl_label_object_get_position (object, &x, &y);
899 gl_label_object_get_size (object, &w, &h);
901 switch (event->type) {
903 case GDK_BUTTON_PRESS:
904 switch (event->button.button) {
907 gnome_canvas_item_grab (handle_item,
908 GDK_POINTER_MOTION_MASK |
909 GDK_BUTTON_RELEASE_MASK |
910 GDK_BUTTON_PRESS_MASK,
911 NULL, event->button.time);
912 /* Anchor to top-right corner */
921 case GDK_BUTTON_RELEASE:
922 switch (event->button.button) {
925 gnome_canvas_item_ungrab (handle_item,
927 x = MIN (event->button.x, x2 - MIN_ITEM_SIZE);
929 w = MAX (x2 - event->button.x, MIN_ITEM_SIZE);
930 h = MAX (event->button.y - y1, MIN_ITEM_SIZE);
931 gl_label_object_set_position (object, x, y);
932 gl_label_object_set_size (object, w, h);
939 case GDK_MOTION_NOTIFY:
940 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
941 x = MIN (event->button.x, x2 - MIN_ITEM_SIZE);
943 w = MAX (x2 - event->button.x, MIN_ITEM_SIZE);
944 h = MAX (event->button.y - y1, MIN_ITEM_SIZE);
945 gl_label_object_set_position (object, x, y);
946 gl_label_object_set_size (object, w, h);
952 case GDK_ENTER_NOTIFY:
953 cursor = gdk_cursor_new (GDK_CROSSHAIR);
954 gdk_window_set_cursor (view->canvas->window, cursor);
955 gdk_cursor_unref (cursor);
958 case GDK_LEAVE_NOTIFY:
959 cursor = gdk_cursor_new (GDK_LEFT_PTR);
960 gdk_window_set_cursor (view->canvas->window, cursor);
961 gdk_cursor_unref (cursor);
970 /*---------------------------------------------------------------------------*/
971 /* PRIVATE. "Bottom-right" Resize event handler. */
972 /*---------------------------------------------------------------------------*/
974 br_resize_event_handler (GnomeCanvasItem * handle_item,
976 glViewObject *view_object)
979 static gdouble x1, y1;
980 static gboolean dragging = FALSE;
981 glLabelObject *object;
985 view = gl_view_object_get_view (view_object);
986 if ( view->state != GL_VIEW_STATE_ARROW ) {
987 /* don't interfere with object creation modes */
991 gl_debug (DEBUG_VIEW, "");
993 object = gl_view_object_get_object (view_object);
994 gl_label_object_get_position (object, &x, &y);
995 gl_label_object_get_size (object, &w, &h);
997 switch (event->type) {
999 case GDK_BUTTON_PRESS:
1000 switch (event->button.button) {
1003 gnome_canvas_item_grab (handle_item,
1004 GDK_POINTER_MOTION_MASK |
1005 GDK_BUTTON_RELEASE_MASK |
1006 GDK_BUTTON_PRESS_MASK,
1007 NULL, event->button.time);
1008 /* Anchor to top-left corner */
1017 case GDK_BUTTON_RELEASE:
1018 switch (event->button.button) {
1021 gnome_canvas_item_ungrab (handle_item,
1022 event->button.time);
1025 w = MAX (event->button.x - x1, MIN_ITEM_SIZE);
1026 h = MAX (event->button.y - y1, MIN_ITEM_SIZE);
1027 gl_label_object_set_position (object, x, y);
1028 gl_label_object_set_size (object, w, h);
1035 case GDK_MOTION_NOTIFY:
1036 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
1039 w = MAX (event->button.x - x1, MIN_ITEM_SIZE);
1040 h = MAX (event->button.y - y1, MIN_ITEM_SIZE);
1041 gl_label_object_set_position (object, x, y);
1042 gl_label_object_set_size (object, w, h);
1048 case GDK_ENTER_NOTIFY:
1049 cursor = gdk_cursor_new (GDK_CROSSHAIR);
1050 gdk_window_set_cursor (view->canvas->window, cursor);
1051 gdk_cursor_unref (cursor);
1054 case GDK_LEAVE_NOTIFY:
1055 cursor = gdk_cursor_new (GDK_LEFT_PTR);
1056 gdk_window_set_cursor (view->canvas->window, cursor);
1057 gdk_cursor_unref (cursor);
1066 /*---------------------------------------------------------------------------*/
1067 /* PRIVATE. "Left-side" Resize event handler. */
1068 /*---------------------------------------------------------------------------*/
1070 sl_resize_event_handler (GnomeCanvasItem * handle_item,
1072 glViewObject *view_object)
1076 static gboolean dragging = FALSE;
1077 glLabelObject *object;
1081 gl_debug (DEBUG_VIEW, "");
1083 view = gl_view_object_get_view (view_object);
1084 if ( view->state != GL_VIEW_STATE_ARROW ) {
1085 /* don't interfere with object creation modes */
1089 object = gl_view_object_get_object (view_object);
1090 gl_label_object_get_position (object, &x, &y);
1091 gl_label_object_get_size (object, &w, &h);
1093 switch (event->type) {
1095 case GDK_BUTTON_PRESS:
1096 switch (event->button.button) {
1099 gnome_canvas_item_grab (handle_item,
1100 GDK_POINTER_MOTION_MASK |
1101 GDK_BUTTON_RELEASE_MASK |
1102 GDK_BUTTON_PRESS_MASK,
1103 NULL, event->button.time);
1104 /* Anchor to right side */
1112 case GDK_BUTTON_RELEASE:
1113 switch (event->button.button) {
1116 gnome_canvas_item_ungrab (handle_item,
1117 event->button.time);
1118 x = MIN (event->button.x, x2 - MIN_ITEM_SIZE);
1119 w = MAX (x2 - event->button.x, MIN_ITEM_SIZE);
1120 gl_label_object_set_position (object, x, y);
1121 gl_label_object_set_size (object, w, h);
1128 case GDK_MOTION_NOTIFY:
1129 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
1130 x = MIN (event->button.x, x2 - MIN_ITEM_SIZE);
1131 w = MAX (x2 - event->button.x, MIN_ITEM_SIZE);
1132 gl_label_object_set_position (object, x, y);
1133 gl_label_object_set_size (object, w, h);
1139 case GDK_ENTER_NOTIFY:
1140 cursor = gdk_cursor_new (GDK_CROSSHAIR);
1141 gdk_window_set_cursor (view->canvas->window, cursor);
1142 gdk_cursor_unref (cursor);
1145 case GDK_LEAVE_NOTIFY:
1146 cursor = gdk_cursor_new (GDK_LEFT_PTR);
1147 gdk_window_set_cursor (view->canvas->window, cursor);
1148 gdk_cursor_unref (cursor);
1157 /*---------------------------------------------------------------------------*/
1158 /* PRIVATE. "Right-side" Resize event handler. */
1159 /*---------------------------------------------------------------------------*/
1161 sr_resize_event_handler (GnomeCanvasItem * handle_item,
1163 glViewObject *view_object)
1167 static gboolean dragging = FALSE;
1168 glLabelObject *object;
1172 gl_debug (DEBUG_VIEW, "");
1174 view = gl_view_object_get_view (view_object);
1175 if ( view->state != GL_VIEW_STATE_ARROW ) {
1176 /* don't interfere with object creation modes */
1180 object = gl_view_object_get_object (view_object);
1181 gl_label_object_get_position (object, &x, &y);
1182 gl_label_object_get_size (object, &w, &h);
1184 switch (event->type) {
1186 case GDK_BUTTON_PRESS:
1187 switch (event->button.button) {
1190 gnome_canvas_item_grab (handle_item,
1191 GDK_POINTER_MOTION_MASK |
1192 GDK_BUTTON_RELEASE_MASK |
1193 GDK_BUTTON_PRESS_MASK,
1194 NULL, event->button.time);
1195 /* Anchor to left side */
1203 case GDK_BUTTON_RELEASE:
1204 switch (event->button.button) {
1207 gnome_canvas_item_ungrab (handle_item,
1208 event->button.time);
1210 w = MAX (event->button.x - x1, MIN_ITEM_SIZE);
1211 gl_label_object_set_position (object, x, y);
1212 gl_label_object_set_size (object, w, h);
1219 case GDK_MOTION_NOTIFY:
1220 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
1222 w = MAX (event->button.x - x1, MIN_ITEM_SIZE);
1223 gl_label_object_set_position (object, x, y);
1224 gl_label_object_set_size (object, w, h);
1230 case GDK_ENTER_NOTIFY:
1231 cursor = gdk_cursor_new (GDK_CROSSHAIR);
1232 gdk_window_set_cursor (view->canvas->window, cursor);
1233 gdk_cursor_unref (cursor);
1236 case GDK_LEAVE_NOTIFY:
1237 cursor = gdk_cursor_new (GDK_LEFT_PTR);
1238 gdk_window_set_cursor (view->canvas->window, cursor);
1239 gdk_cursor_unref (cursor);
1248 /*---------------------------------------------------------------------------*/
1249 /* PRIVATE. "Top-side" Resize event handler. */
1250 /*---------------------------------------------------------------------------*/
1252 st_resize_event_handler (GnomeCanvasItem * handle_item,
1254 glViewObject *view_object)
1258 static gboolean dragging = FALSE;
1259 glLabelObject *object;
1263 gl_debug (DEBUG_VIEW, "");
1265 view = gl_view_object_get_view (view_object);
1266 if ( view->state != GL_VIEW_STATE_ARROW ) {
1267 /* don't interfere with object creation modes */
1271 object = gl_view_object_get_object (view_object);
1272 gl_label_object_get_position (object, &x, &y);
1273 gl_label_object_get_size (object, &w, &h);
1275 switch (event->type) {
1277 case GDK_BUTTON_PRESS:
1278 switch (event->button.button) {
1281 gnome_canvas_item_grab (handle_item,
1282 GDK_POINTER_MOTION_MASK |
1283 GDK_BUTTON_RELEASE_MASK |
1284 GDK_BUTTON_PRESS_MASK,
1285 NULL, event->button.time);
1286 /* Anchor to bottom-right corner */
1294 case GDK_BUTTON_RELEASE:
1295 switch (event->button.button) {
1298 gnome_canvas_item_ungrab (handle_item,
1299 event->button.time);
1300 y = MIN (event->button.y, y2 - MIN_ITEM_SIZE);
1301 h = MAX (y2 - event->button.y, MIN_ITEM_SIZE);
1302 gl_label_object_set_position (object, x, y);
1303 gl_label_object_set_size (object, w, h);
1310 case GDK_MOTION_NOTIFY:
1311 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
1312 y = MIN (event->button.y, y2 - MIN_ITEM_SIZE);
1313 h = MAX (y2 - event->button.y, MIN_ITEM_SIZE);
1314 gl_label_object_set_position (object, x, y);
1315 gl_label_object_set_size (object, w, h);
1321 case GDK_ENTER_NOTIFY:
1322 cursor = gdk_cursor_new (GDK_CROSSHAIR);
1323 gdk_window_set_cursor (view->canvas->window, cursor);
1324 gdk_cursor_unref (cursor);
1327 case GDK_LEAVE_NOTIFY:
1328 cursor = gdk_cursor_new (GDK_LEFT_PTR);
1329 gdk_window_set_cursor (view->canvas->window, cursor);
1330 gdk_cursor_unref (cursor);
1339 /*---------------------------------------------------------------------------*/
1340 /* PRIVATE. "Bottom-side" Resize event handler. */
1341 /*---------------------------------------------------------------------------*/
1343 sb_resize_event_handler (GnomeCanvasItem * handle_item,
1345 glViewObject *view_object)
1349 static gboolean dragging = FALSE;
1350 glLabelObject *object;
1354 gl_debug (DEBUG_VIEW, "");
1356 view = gl_view_object_get_view (view_object);
1357 if ( view->state != GL_VIEW_STATE_ARROW ) {
1358 /* don't interfere with object creation modes */
1362 object = gl_view_object_get_object (view_object);
1363 gl_label_object_get_position (object, &x, &y);
1364 gl_label_object_get_size (object, &w, &h);
1366 switch (event->type) {
1368 case GDK_BUTTON_PRESS:
1369 switch (event->button.button) {
1372 gnome_canvas_item_grab (handle_item,
1373 GDK_POINTER_MOTION_MASK |
1374 GDK_BUTTON_RELEASE_MASK |
1375 GDK_BUTTON_PRESS_MASK,
1376 NULL, event->button.time);
1377 /* Anchor to top side */
1385 case GDK_BUTTON_RELEASE:
1386 switch (event->button.button) {
1389 gnome_canvas_item_ungrab (handle_item,
1390 event->button.time);
1392 h = MAX (event->button.y - y1, MIN_ITEM_SIZE);
1393 gl_label_object_set_position (object, x, y);
1394 gl_label_object_set_size (object, w, h);
1401 case GDK_MOTION_NOTIFY:
1402 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
1404 h = MAX (event->button.y - y1, MIN_ITEM_SIZE);
1405 gl_label_object_set_position (object, x, y);
1406 gl_label_object_set_size (object, w, h);
1412 case GDK_ENTER_NOTIFY:
1413 cursor = gdk_cursor_new (GDK_CROSSHAIR);
1414 gdk_window_set_cursor (view->canvas->window, cursor);
1415 gdk_cursor_unref (cursor);
1418 case GDK_LEAVE_NOTIFY:
1419 cursor = gdk_cursor_new (GDK_LEFT_PTR);
1420 gdk_window_set_cursor (view->canvas->window, cursor);
1421 gdk_cursor_unref (cursor);
1430 /*---------------------------------------------------------------------------*/
1431 /* PRIVATE. Resize "P1" event handler. */
1432 /*---------------------------------------------------------------------------*/
1434 p1_resize_event_handler (GnomeCanvasItem * handle_item,
1436 glViewObject *view_object)
1438 gdouble x, y, dx, dy;
1439 static gdouble x0, y0;
1440 static gboolean dragging = FALSE;
1441 glLabelObject *object;
1445 gl_debug (DEBUG_VIEW, "");
1447 view = gl_view_object_get_view (view_object);
1448 if ( view->state != GL_VIEW_STATE_ARROW ) {
1449 /* don't interfere with object creation modes */
1453 object = gl_view_object_get_object (view_object);
1454 gl_label_object_get_position (object, &x, &y);
1455 gl_label_object_get_size (object, &dx, &dy);
1457 switch (event->type) {
1459 case GDK_BUTTON_PRESS:
1460 switch (event->button.button) {
1463 gnome_canvas_item_grab (handle_item,
1464 GDK_POINTER_MOTION_MASK |
1465 GDK_BUTTON_RELEASE_MASK |
1466 GDK_BUTTON_PRESS_MASK,
1467 NULL, event->button.time);
1477 case GDK_BUTTON_RELEASE:
1478 switch (event->button.button) {
1481 gnome_canvas_item_ungrab (handle_item,
1482 event->button.time);
1485 dx = (event->button.x - x0);
1486 dy = (event->button.y - y0);
1487 gl_label_object_set_position (object, x, y);
1488 gl_label_object_set_size (object, dx, dy);
1495 case GDK_MOTION_NOTIFY:
1496 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
1499 dx = (event->button.x - x0);
1500 dy = (event->button.y - y0);
1501 gl_label_object_set_position (object, x, y);
1502 gl_label_object_set_size (object, dx, dy);
1508 case GDK_ENTER_NOTIFY:
1509 cursor = gdk_cursor_new (GDK_CROSSHAIR);
1510 gdk_window_set_cursor (view->canvas->window, cursor);
1511 gdk_cursor_unref (cursor);
1514 case GDK_LEAVE_NOTIFY:
1515 cursor = gdk_cursor_new (GDK_LEFT_PTR);
1516 gdk_window_set_cursor (view->canvas->window, cursor);
1517 gdk_cursor_unref (cursor);
1526 /*---------------------------------------------------------------------------*/
1527 /* PRIVATE. Resize "P2" event handler. */
1528 /*---------------------------------------------------------------------------*/
1530 p2_resize_event_handler (GnomeCanvasItem * handle_item,
1532 glViewObject *view_object)
1534 gdouble x, y, dx, dy;
1535 static gdouble x0, y0;
1536 static gboolean dragging = FALSE;
1537 glLabelObject *object;
1541 gl_debug (DEBUG_VIEW, "");
1543 view = gl_view_object_get_view (view_object);
1544 if ( view->state != GL_VIEW_STATE_ARROW ) {
1545 /* don't interfere with object creation modes */
1549 object = gl_view_object_get_object (view_object);
1550 gl_label_object_get_position (object, &x, &y);
1551 gl_label_object_get_size (object, &dx, &dy);
1553 switch (event->type) {
1555 case GDK_BUTTON_PRESS:
1556 switch (event->button.button) {
1559 gnome_canvas_item_grab (handle_item,
1560 GDK_POINTER_MOTION_MASK |
1561 GDK_BUTTON_RELEASE_MASK |
1562 GDK_BUTTON_PRESS_MASK,
1563 NULL, event->button.time);
1573 case GDK_BUTTON_RELEASE:
1574 switch (event->button.button) {
1577 gnome_canvas_item_ungrab (handle_item,
1578 event->button.time);
1581 dx = (event->button.x - x0);
1582 dy = (event->button.y - y0);
1583 gl_label_object_set_position (object, x, y);
1584 gl_label_object_set_size (object, dx, dy);
1591 case GDK_MOTION_NOTIFY:
1592 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
1595 dx = (event->button.x - x0);
1596 dy = (event->button.y - y0);
1597 gl_label_object_set_position (object, x, y);
1598 gl_label_object_set_size (object, dx, dy);
1604 case GDK_ENTER_NOTIFY:
1605 cursor = gdk_cursor_new (GDK_CROSSHAIR);
1606 gdk_window_set_cursor (view->canvas->window, cursor);
1607 gdk_cursor_unref (cursor);
1610 case GDK_LEAVE_NOTIFY:
1611 cursor = gdk_cursor_new (GDK_LEFT_PTR);
1612 gdk_window_set_cursor (view->canvas->window, cursor);
1613 gdk_cursor_unref (cursor);
1622 /*---------------------------------------------------------------------------*/
1623 /* PRIVATE. Passthrough event handler. */
1624 /*---------------------------------------------------------------------------*/
1626 passthrough_event_handler (GnomeCanvasItem * handle_item,
1628 glViewObject *view_object)
1630 GnomeCanvasItem *group;
1632 gl_debug (DEBUG_VIEW, "");
1634 group = gl_view_object_get_group (view_object);
1635 return gl_view_item_event_handler (group, event, view_object);