2 * (GLABELS) Label and Business Card Creation program for GNOME
4 * 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
25 #include "highlight.h"
32 #define MIN_ITEM_SIZE 1.0
34 /*===========================================*/
35 /* Private data types */
36 /*===========================================*/
38 /*===========================================*/
40 /*===========================================*/
42 /*===========================================*/
43 /* Local function prototypes */
44 /*===========================================*/
46 static void highlight_resizable_box (GnomeCanvasItem * item,
47 glHighlightStyle style);
48 static void highlight_resizable_line (GnomeCanvasItem * item);
49 static void highlight_simple (GnomeCanvasItem * item);
51 static int tl_resize_event_handler (GnomeCanvasItem * handle_item,
52 GdkEvent * event, gpointer data);
53 static int tr_resize_event_handler (GnomeCanvasItem * handle_item,
54 GdkEvent * event, gpointer data);
55 static int bl_resize_event_handler (GnomeCanvasItem * handle_item,
56 GdkEvent * event, gpointer data);
57 static int br_resize_event_handler (GnomeCanvasItem * handle_item,
58 GdkEvent * event, gpointer data);
60 static int sl_resize_event_handler (GnomeCanvasItem * handle_item,
61 GdkEvent * event, gpointer data);
62 static int sr_resize_event_handler (GnomeCanvasItem * handle_item,
63 GdkEvent * event, gpointer data);
64 static int st_resize_event_handler (GnomeCanvasItem * handle_item,
65 GdkEvent * event, gpointer data);
66 static int sb_resize_event_handler (GnomeCanvasItem * handle_item,
67 GdkEvent * event, gpointer data);
69 static int p1_resize_event_handler (GnomeCanvasItem * handle_item,
70 GdkEvent * event, gpointer data);
71 static int p2_resize_event_handler (GnomeCanvasItem * handle_item,
72 GdkEvent * event, gpointer data);
74 static int passthrough_event_handler (GnomeCanvasItem * handle_item,
75 GdkEvent * event, gpointer data);
77 /*****************************************************************************/
78 /* Create/Update & Display a resizable highlight for given item. */
79 /*****************************************************************************/
81 gl_highlight (GnomeCanvasItem * item,
82 glHighlightStyle style)
84 g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
88 case GL_HIGHLIGHT_BOX_RESIZABLE:
89 case GL_HIGHLIGHT_ELLIPSE_RESIZABLE:
90 highlight_resizable_box (item, style);
93 case GL_HIGHLIGHT_LINE_RESIZABLE:
94 highlight_resizable_line (item);
97 case GL_HIGHLIGHT_SIMPLE:
98 highlight_simple (item);
102 WARN ("Invalid resizable highlight style");
107 /*---------------------------------------------------------------------------*/
108 /* PRIVATE. Create/Update & Display a resizable box highlight. */
109 /*---------------------------------------------------------------------------*/
111 highlight_resizable_box (GnomeCanvasItem * item,
112 glHighlightStyle style)
114 GnomeCanvasItem *highlight;
116 GnomeCanvasItem *outline; /* Outline around item */
117 GnomeCanvasItem *tl, *tr, *bl, *br; /* Handles at four corners */
118 GnomeCanvasItem *sl, *sr, *st, *sb; /* Handles at each side */
120 g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
122 highlight = gtk_object_get_data (GTK_OBJECT (item), "highlight");
124 gl_item_get_position_size (item, &x, &y, &w, &h);
126 if (highlight == NULL) {
129 gnome_canvas_item_new (gnome_canvas_root
130 (GNOME_CANVAS (item->canvas)),
131 gnome_canvas_group_get_type (), "x",
135 case GL_HIGHLIGHT_BOX_RESIZABLE:
137 gnome_canvas_item_new (GNOME_CANVAS_GROUP
139 gnome_canvas_rect_get_type
146 "outline_color_rgba",
147 GNOME_CANVAS_COLOR_A (0, 0,
152 case GL_HIGHLIGHT_ELLIPSE_RESIZABLE:
154 gnome_canvas_item_new (GNOME_CANVAS_GROUP
156 gnome_canvas_ellipse_get_type
163 "outline_color_rgba",
164 GNOME_CANVAS_COLOR_A (0, 0,
171 WARN ("Invalid resizable highlight style");
174 tl = gnome_canvas_item_new (GNOME_CANVAS_GROUP (highlight),
175 gnome_canvas_rect_get_type (),
181 GNOME_CANVAS_COLOR_A (0, 0, 255,
183 "outline_color_rgba",
184 GNOME_CANVAS_COLOR_A (255, 255, 255,
187 tr = gnome_canvas_item_new (GNOME_CANVAS_GROUP (highlight),
188 gnome_canvas_rect_get_type (),
194 GNOME_CANVAS_COLOR_A (0, 0, 255,
196 "outline_color_rgba",
197 GNOME_CANVAS_COLOR_A (255, 255, 255,
200 bl = gnome_canvas_item_new (GNOME_CANVAS_GROUP (highlight),
201 gnome_canvas_rect_get_type (),
207 GNOME_CANVAS_COLOR_A (0, 0, 255,
209 "outline_color_rgba",
210 GNOME_CANVAS_COLOR_A (255, 255, 255,
213 br = gnome_canvas_item_new (GNOME_CANVAS_GROUP (highlight),
214 gnome_canvas_rect_get_type (),
220 GNOME_CANVAS_COLOR_A (0, 0, 255,
222 "outline_color_rgba",
223 GNOME_CANVAS_COLOR_A (255, 255, 255,
226 sl = gnome_canvas_item_new (GNOME_CANVAS_GROUP (highlight),
227 gnome_canvas_rect_get_type (),
233 GNOME_CANVAS_COLOR_A (0, 0, 255,
235 "outline_color_rgba",
236 GNOME_CANVAS_COLOR_A (255, 255, 255,
239 sr = gnome_canvas_item_new (GNOME_CANVAS_GROUP (highlight),
240 gnome_canvas_rect_get_type (),
246 GNOME_CANVAS_COLOR_A (0, 0, 255,
248 "outline_color_rgba",
249 GNOME_CANVAS_COLOR_A (255, 255, 255,
252 st = gnome_canvas_item_new (GNOME_CANVAS_GROUP (highlight),
253 gnome_canvas_rect_get_type (),
259 GNOME_CANVAS_COLOR_A (0, 0, 255,
261 "outline_color_rgba",
262 GNOME_CANVAS_COLOR_A (255, 255, 255,
265 sb = gnome_canvas_item_new (GNOME_CANVAS_GROUP (highlight),
266 gnome_canvas_rect_get_type (),
272 GNOME_CANVAS_COLOR_A (0, 0, 255,
274 "outline_color_rgba",
275 GNOME_CANVAS_COLOR_A (255, 255, 255,
278 gtk_object_set_data (GTK_OBJECT (item), "highlight", highlight);
280 gtk_object_set_data (GTK_OBJECT (highlight), "outline",
283 gtk_object_set_data (GTK_OBJECT (highlight), "tl", tl);
284 gtk_object_set_data (GTK_OBJECT (highlight), "tr", tr);
285 gtk_object_set_data (GTK_OBJECT (highlight), "bl", bl);
286 gtk_object_set_data (GTK_OBJECT (highlight), "br", br);
287 gtk_object_set_data (GTK_OBJECT (highlight), "sl", sl);
288 gtk_object_set_data (GTK_OBJECT (highlight), "sr", sr);
289 gtk_object_set_data (GTK_OBJECT (highlight), "st", st);
290 gtk_object_set_data (GTK_OBJECT (highlight), "sb", sb);
292 gtk_signal_connect (GTK_OBJECT (tl), "event",
293 GTK_SIGNAL_FUNC (tl_resize_event_handler),
295 gtk_signal_connect (GTK_OBJECT (tr), "event",
296 GTK_SIGNAL_FUNC (tr_resize_event_handler),
298 gtk_signal_connect (GTK_OBJECT (bl), "event",
299 GTK_SIGNAL_FUNC (bl_resize_event_handler),
301 gtk_signal_connect (GTK_OBJECT (br), "event",
302 GTK_SIGNAL_FUNC (br_resize_event_handler),
304 gtk_signal_connect (GTK_OBJECT (sl), "event",
305 GTK_SIGNAL_FUNC (sl_resize_event_handler),
307 gtk_signal_connect (GTK_OBJECT (sr), "event",
308 GTK_SIGNAL_FUNC (sr_resize_event_handler),
310 gtk_signal_connect (GTK_OBJECT (st), "event",
311 GTK_SIGNAL_FUNC (st_resize_event_handler),
313 gtk_signal_connect (GTK_OBJECT (sb), "event",
314 GTK_SIGNAL_FUNC (sb_resize_event_handler),
317 gtk_signal_connect (GTK_OBJECT (outline), "event",
318 GTK_SIGNAL_FUNC (passthrough_event_handler),
323 gnome_canvas_item_set (highlight, "x", x, "y", y, NULL);
326 gtk_object_get_data (GTK_OBJECT (highlight), "outline");
328 tl = gtk_object_get_data (GTK_OBJECT (highlight), "tl");
329 tr = gtk_object_get_data (GTK_OBJECT (highlight), "tr");
330 bl = gtk_object_get_data (GTK_OBJECT (highlight), "bl");
331 br = gtk_object_get_data (GTK_OBJECT (highlight), "br");
332 sl = gtk_object_get_data (GTK_OBJECT (highlight), "sl");
333 sr = gtk_object_get_data (GTK_OBJECT (highlight), "sr");
334 st = gtk_object_get_data (GTK_OBJECT (highlight), "st");
335 sb = gtk_object_get_data (GTK_OBJECT (highlight), "sb");
337 gnome_canvas_item_set (outline,
340 "x2", w + 0.5, "y2", h + 0.5, NULL);
342 gnome_canvas_item_set (tl,
345 "x2", +1.0, "y2", +1.0, NULL);
347 gnome_canvas_item_set (tr,
350 "x2", w + 1.0, "y2", +1.0, NULL);
352 gnome_canvas_item_set (bl,
355 "x2", +1.0, "y2", h + 1.0, NULL);
357 gnome_canvas_item_set (br,
360 "x2", w + 1.0, "y2", h + 1.0, NULL);
362 gnome_canvas_item_set (sl,
365 "x2", +1.0, "y2", h / 2.0 + 1.0, NULL);
367 gnome_canvas_item_set (sr,
371 "y2", h / 2.0 + 1.0, NULL);
373 gnome_canvas_item_set (st,
376 "x2", w / 2.0 + 1.0, "y2", +1.0, NULL);
378 gnome_canvas_item_set (sb,
382 "y2", h + 1.0, NULL);
384 gnome_canvas_item_show (highlight);
388 gnome_canvas_item_raise_to_top (highlight);
392 /*---------------------------------------------------------------------------*/
393 /* PRIVATE. Create/Update & Display a resizable line highlight. */
394 /*---------------------------------------------------------------------------*/
396 highlight_resizable_line (GnomeCanvasItem * item)
398 GnomeCanvasItem *highlight;
399 gdouble x, y, dx, dy;
400 GnomeCanvasPoints *points;
401 GnomeCanvasItem *outline; /* Outline around item */
402 GnomeCanvasItem *p1, *p2; /* Handles at endpoints */
404 g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
406 highlight = gtk_object_get_data (GTK_OBJECT (item), "highlight");
408 gl_item_get_position_size (item, &x, &y, &dx, &dy);
410 points = gnome_canvas_points_new (2);
412 if (highlight == NULL) {
415 gnome_canvas_item_new (gnome_canvas_root
416 (GNOME_CANVAS (item->canvas)),
417 gnome_canvas_group_get_type (), "x",
420 points->coords[0] = 0.0;
421 points->coords[1] = 0.0;
422 points->coords[2] = dx;
423 points->coords[3] = dy;
425 gnome_canvas_item_new (GNOME_CANVAS_GROUP (highlight),
426 gnome_canvas_line_get_type (),
430 GNOME_CANVAS_COLOR_A (0, 0, 255,
433 p1 = gnome_canvas_item_new (GNOME_CANVAS_GROUP (highlight),
434 gnome_canvas_rect_get_type (),
440 GNOME_CANVAS_COLOR_A (0, 0, 255,
442 "outline_color_rgba",
443 GNOME_CANVAS_COLOR_A (255, 255, 255,
446 p2 = gnome_canvas_item_new (GNOME_CANVAS_GROUP (highlight),
447 gnome_canvas_rect_get_type (),
453 GNOME_CANVAS_COLOR_A (0, 0, 255,
455 "outline_color_rgba",
456 GNOME_CANVAS_COLOR_A (255, 255, 255,
459 gtk_object_set_data (GTK_OBJECT (item), "highlight", highlight);
461 gtk_object_set_data (GTK_OBJECT (highlight), "outline",
464 gtk_object_set_data (GTK_OBJECT (highlight), "p1", p1);
465 gtk_object_set_data (GTK_OBJECT (highlight), "p2", p2);
467 gtk_signal_connect (GTK_OBJECT (outline), "event",
468 GTK_SIGNAL_FUNC (passthrough_event_handler),
471 gtk_signal_connect (GTK_OBJECT (p1), "event",
472 GTK_SIGNAL_FUNC (p1_resize_event_handler),
474 gtk_signal_connect (GTK_OBJECT (p2), "event",
475 GTK_SIGNAL_FUNC (p2_resize_event_handler),
480 gnome_canvas_item_set (highlight, "x", x, "y", y, NULL);
483 gtk_object_get_data (GTK_OBJECT (highlight), "outline");
485 p1 = gtk_object_get_data (GTK_OBJECT (highlight), "p1");
486 p2 = gtk_object_get_data (GTK_OBJECT (highlight), "p2");
488 points->coords[0] = 0.0;
489 points->coords[1] = 0.0;
490 points->coords[2] = dx;
491 points->coords[3] = dy;
492 gnome_canvas_item_set (outline, "points", points, NULL);
494 gnome_canvas_item_set (p1,
497 "x2", +1.0, "y2", +1.0, NULL);
499 gnome_canvas_item_set (p2,
502 "x2", dx + 1.0, "y2", dy + 1.0, NULL);
504 gnome_canvas_item_show (highlight);
508 gnome_canvas_points_free (points);
510 gnome_canvas_item_raise_to_top (highlight);
514 /*---------------------------------------------------------------------------*/
515 /* PRIVATE. Create/Update & Display a simple box highlight. */
516 /*---------------------------------------------------------------------------*/
518 highlight_simple (GnomeCanvasItem * item)
520 GnomeCanvasItem *highlight;
521 gdouble x1, y1, x2, y2;
523 g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
525 highlight = gtk_object_get_data (GTK_OBJECT (item), "highlight");
527 gl_item_get_bounds (item, &x1, &y1, &x2, &y2);
529 if (highlight == NULL) {
532 gnome_canvas_item_new (gnome_canvas_root
533 (GNOME_CANVAS (item->canvas)),
534 gnome_canvas_rect_get_type (), "x1",
535 x1 - 0.5, "y1", y1 - 0.5, "x2",
536 x2 + 0.5, "y2", y2 + 0.5,
538 "outline_color_rgba",
539 GNOME_CANVAS_COLOR_A (0, 0, 255,
542 gtk_object_set_data (GTK_OBJECT (item), "highlight", highlight);
544 gtk_signal_connect (GTK_OBJECT (highlight), "event",
545 GTK_SIGNAL_FUNC (passthrough_event_handler),
550 gnome_canvas_item_set (highlight,
556 "outline_color_rgba",
557 GNOME_CANVAS_COLOR_A (0, 0, 255, 255),
560 gnome_canvas_item_show (highlight);
564 gnome_canvas_item_raise_to_top (highlight);
568 /*---------------------------------------------------------------------------*/
569 /* PRIVATE. "Top-left" Resize event handler. */
570 /*---------------------------------------------------------------------------*/
572 tl_resize_event_handler (GnomeCanvasItem * handle_item,
577 static gdouble x2, y2;
578 static gboolean dragging = FALSE;
579 static GnomeCanvasItem *item;
580 static glDisplay *display;
583 item = GNOME_CANVAS_ITEM (data);
584 gl_item_get_position_size (item, &x, &y, &w, &h);
585 display = gl_item_get_display (item);
587 switch (event->type) {
589 case GDK_BUTTON_PRESS:
590 switch (event->button.button) {
593 gnome_canvas_item_grab (handle_item,
594 GDK_POINTER_MOTION_MASK |
595 GDK_BUTTON_RELEASE_MASK |
596 GDK_BUTTON_PRESS_MASK,
597 NULL, event->button.time);
598 /* Anchor to bottom-right corner */
607 case GDK_BUTTON_RELEASE:
608 switch (event->button.button) {
611 gnome_canvas_item_ungrab (handle_item,
613 x = MIN (event->button.x, x2 - MIN_ITEM_SIZE);
614 y = MIN (event->button.y, y2 - MIN_ITEM_SIZE);
615 w = MAX (x2 - event->button.x, MIN_ITEM_SIZE);
616 h = MAX (y2 - event->button.y, MIN_ITEM_SIZE);
617 gl_item_set_position_size (item, x, y, w, h);
618 gl_display_select_item (display, item);
625 case GDK_MOTION_NOTIFY:
626 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
627 x = MIN (event->button.x, x2 - MIN_ITEM_SIZE);
628 y = MIN (event->button.y, y2 - MIN_ITEM_SIZE);
629 w = MAX (x2 - event->button.x, MIN_ITEM_SIZE);
630 h = MAX (y2 - event->button.y, MIN_ITEM_SIZE);
631 gl_item_set_position_size (item, x, y, w, h);
632 gl_display_select_item (display, item);
638 case GDK_ENTER_NOTIFY:
639 cursor = gdk_cursor_new (GDK_CROSSHAIR);
640 gdk_window_set_cursor (display->canvas->window, cursor);
641 gdk_cursor_destroy (cursor);
644 case GDK_LEAVE_NOTIFY:
645 cursor = gdk_cursor_new (GDK_LEFT_PTR);
646 gdk_window_set_cursor (display->canvas->window, cursor);
647 gdk_cursor_destroy (cursor);
656 /*---------------------------------------------------------------------------*/
657 /* PRIVATE. "Top-right" Resize event handler. */
658 /*---------------------------------------------------------------------------*/
660 tr_resize_event_handler (GnomeCanvasItem * handle_item,
665 static gdouble x1, y2;
666 static gboolean dragging = FALSE;
667 static GnomeCanvasItem *item;
668 static glDisplay *display;
671 item = GNOME_CANVAS_ITEM (data);
672 gl_item_get_position_size (item, &x, &y, &w, &h);
673 display = gl_item_get_display (item);
675 switch (event->type) {
677 case GDK_BUTTON_PRESS:
678 switch (event->button.button) {
681 gnome_canvas_item_grab (handle_item,
682 GDK_POINTER_MOTION_MASK |
683 GDK_BUTTON_RELEASE_MASK |
684 GDK_BUTTON_PRESS_MASK,
685 NULL, event->button.time);
686 /* Anchor to bottom-left corner */
695 case GDK_BUTTON_RELEASE:
696 switch (event->button.button) {
699 gnome_canvas_item_ungrab (handle_item,
702 y = MIN (event->button.y, y2 - MIN_ITEM_SIZE);
703 w = MAX (event->button.x - x1, MIN_ITEM_SIZE);
704 h = MAX (y2 - event->button.y, MIN_ITEM_SIZE);
705 gl_item_set_position_size (item, x, y, w, h);
706 gl_display_select_item (display, item);
713 case GDK_MOTION_NOTIFY:
714 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
716 y = MIN (event->button.y, y2 - MIN_ITEM_SIZE);
717 w = MAX (event->button.x - x1, MIN_ITEM_SIZE);
718 h = MAX (y2 - event->button.y, MIN_ITEM_SIZE);
719 gl_item_set_position_size (item, x, y, w, h);
720 gl_display_select_item (display, item);
726 case GDK_ENTER_NOTIFY:
727 cursor = gdk_cursor_new (GDK_CROSSHAIR);
728 gdk_window_set_cursor (display->canvas->window, cursor);
729 gdk_cursor_destroy (cursor);
732 case GDK_LEAVE_NOTIFY:
733 cursor = gdk_cursor_new (GDK_LEFT_PTR);
734 gdk_window_set_cursor (display->canvas->window, cursor);
735 gdk_cursor_destroy (cursor);
744 /*---------------------------------------------------------------------------*/
745 /* PRIVATE. "Bottom-left" Resize event handler. */
746 /*---------------------------------------------------------------------------*/
748 bl_resize_event_handler (GnomeCanvasItem * handle_item,
753 static gdouble x2, y1;
754 static gboolean dragging = FALSE;
755 static GnomeCanvasItem *item;
756 static glDisplay *display;
759 item = GNOME_CANVAS_ITEM (data);
760 gl_item_get_position_size (item, &x, &y, &w, &h);
761 display = gl_item_get_display (item);
763 switch (event->type) {
765 case GDK_BUTTON_PRESS:
766 switch (event->button.button) {
769 gnome_canvas_item_grab (handle_item,
770 GDK_POINTER_MOTION_MASK |
771 GDK_BUTTON_RELEASE_MASK |
772 GDK_BUTTON_PRESS_MASK,
773 NULL, event->button.time);
774 /* Anchor to top-right corner */
783 case GDK_BUTTON_RELEASE:
784 switch (event->button.button) {
787 gnome_canvas_item_ungrab (handle_item,
789 x = MIN (event->button.x, x2 - MIN_ITEM_SIZE);
791 w = MAX (x2 - event->button.x, MIN_ITEM_SIZE);
792 h = MAX (event->button.y - y1, MIN_ITEM_SIZE);
793 gl_item_set_position_size (item, x, y, w, h);
794 gl_display_select_item (display, item);
801 case GDK_MOTION_NOTIFY:
802 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
803 x = MIN (event->button.x, x2 - MIN_ITEM_SIZE);
805 w = MAX (x2 - event->button.x, MIN_ITEM_SIZE);
806 h = MAX (event->button.y - y1, MIN_ITEM_SIZE);
807 gl_item_set_position_size (item, x, y, w, h);
808 gl_display_select_item (display, item);
814 case GDK_ENTER_NOTIFY:
815 cursor = gdk_cursor_new (GDK_CROSSHAIR);
816 gdk_window_set_cursor (display->canvas->window, cursor);
817 gdk_cursor_destroy (cursor);
820 case GDK_LEAVE_NOTIFY:
821 cursor = gdk_cursor_new (GDK_LEFT_PTR);
822 gdk_window_set_cursor (display->canvas->window, cursor);
823 gdk_cursor_destroy (cursor);
832 /*---------------------------------------------------------------------------*/
833 /* PRIVATE. "Bottom-right" Resize event handler. */
834 /*---------------------------------------------------------------------------*/
836 br_resize_event_handler (GnomeCanvasItem * handle_item,
841 static gdouble x1, y1;
842 static gboolean dragging = FALSE;
843 static GnomeCanvasItem *item;
844 static glDisplay *display;
847 item = GNOME_CANVAS_ITEM (data);
848 gl_item_get_position_size (item, &x, &y, &w, &h);
849 display = gl_item_get_display (item);
851 switch (event->type) {
853 case GDK_BUTTON_PRESS:
854 switch (event->button.button) {
857 gnome_canvas_item_grab (handle_item,
858 GDK_POINTER_MOTION_MASK |
859 GDK_BUTTON_RELEASE_MASK |
860 GDK_BUTTON_PRESS_MASK,
861 NULL, event->button.time);
862 /* Anchor to top-left corner */
871 case GDK_BUTTON_RELEASE:
872 switch (event->button.button) {
875 gnome_canvas_item_ungrab (handle_item,
879 w = MAX (event->button.x - x1, MIN_ITEM_SIZE);
880 h = MAX (event->button.y - y1, MIN_ITEM_SIZE);
881 gl_item_set_position_size (item, x, y, w, h);
882 gl_display_select_item (display, item);
889 case GDK_MOTION_NOTIFY:
890 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
893 w = MAX (event->button.x - x1, MIN_ITEM_SIZE);
894 h = MAX (event->button.y - y1, MIN_ITEM_SIZE);
895 gl_item_set_position_size (item, x, y, w, h);
896 gl_display_select_item (display, item);
902 case GDK_ENTER_NOTIFY:
903 cursor = gdk_cursor_new (GDK_CROSSHAIR);
904 gdk_window_set_cursor (display->canvas->window, cursor);
905 gdk_cursor_destroy (cursor);
908 case GDK_LEAVE_NOTIFY:
909 cursor = gdk_cursor_new (GDK_LEFT_PTR);
910 gdk_window_set_cursor (display->canvas->window, cursor);
911 gdk_cursor_destroy (cursor);
920 /*---------------------------------------------------------------------------*/
921 /* PRIVATE. "Left-side" Resize event handler. */
922 /*---------------------------------------------------------------------------*/
924 sl_resize_event_handler (GnomeCanvasItem * handle_item,
930 static gboolean dragging = FALSE;
931 static GnomeCanvasItem *item;
932 static glDisplay *display;
935 item = GNOME_CANVAS_ITEM (data);
936 gl_item_get_position_size (item, &x, &y, &w, &h);
937 display = gl_item_get_display (item);
939 switch (event->type) {
941 case GDK_BUTTON_PRESS:
942 switch (event->button.button) {
945 gnome_canvas_item_grab (handle_item,
946 GDK_POINTER_MOTION_MASK |
947 GDK_BUTTON_RELEASE_MASK |
948 GDK_BUTTON_PRESS_MASK,
949 NULL, event->button.time);
950 /* Anchor to right side */
958 case GDK_BUTTON_RELEASE:
959 switch (event->button.button) {
962 gnome_canvas_item_ungrab (handle_item,
964 x = MIN (event->button.x, x2 - MIN_ITEM_SIZE);
965 w = MAX (x2 - event->button.x, MIN_ITEM_SIZE);
966 gl_item_set_position_size (item, x, y, w, h);
967 gl_display_select_item (display, item);
974 case GDK_MOTION_NOTIFY:
975 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
976 x = MIN (event->button.x, x2 - MIN_ITEM_SIZE);
977 w = MAX (x2 - event->button.x, MIN_ITEM_SIZE);
978 gl_item_set_position_size (item, x, y, w, h);
979 gl_display_select_item (display, item);
985 case GDK_ENTER_NOTIFY:
986 cursor = gdk_cursor_new (GDK_CROSSHAIR);
987 gdk_window_set_cursor (display->canvas->window, cursor);
988 gdk_cursor_destroy (cursor);
991 case GDK_LEAVE_NOTIFY:
992 cursor = gdk_cursor_new (GDK_LEFT_PTR);
993 gdk_window_set_cursor (display->canvas->window, cursor);
994 gdk_cursor_destroy (cursor);
1003 /*---------------------------------------------------------------------------*/
1004 /* PRIVATE. "Right-side" Resize event handler. */
1005 /*---------------------------------------------------------------------------*/
1007 sr_resize_event_handler (GnomeCanvasItem * handle_item,
1013 static gboolean dragging = FALSE;
1014 static GnomeCanvasItem *item;
1015 static glDisplay *display;
1018 item = GNOME_CANVAS_ITEM (data);
1019 gl_item_get_position_size (item, &x, &y, &w, &h);
1020 display = gl_item_get_display (item);
1022 switch (event->type) {
1024 case GDK_BUTTON_PRESS:
1025 switch (event->button.button) {
1028 gnome_canvas_item_grab (handle_item,
1029 GDK_POINTER_MOTION_MASK |
1030 GDK_BUTTON_RELEASE_MASK |
1031 GDK_BUTTON_PRESS_MASK,
1032 NULL, event->button.time);
1033 /* Anchor to left side */
1041 case GDK_BUTTON_RELEASE:
1042 switch (event->button.button) {
1045 gnome_canvas_item_ungrab (handle_item,
1046 event->button.time);
1048 w = MAX (event->button.x - x1, MIN_ITEM_SIZE);
1049 gl_item_set_position_size (item, x, y, w, h);
1050 gl_display_select_item (display, item);
1057 case GDK_MOTION_NOTIFY:
1058 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
1060 w = MAX (event->button.x - x1, MIN_ITEM_SIZE);
1061 gl_item_set_position_size (item, x, y, w, h);
1062 gl_display_select_item (display, item);
1068 case GDK_ENTER_NOTIFY:
1069 cursor = gdk_cursor_new (GDK_CROSSHAIR);
1070 gdk_window_set_cursor (display->canvas->window, cursor);
1071 gdk_cursor_destroy (cursor);
1074 case GDK_LEAVE_NOTIFY:
1075 cursor = gdk_cursor_new (GDK_LEFT_PTR);
1076 gdk_window_set_cursor (display->canvas->window, cursor);
1077 gdk_cursor_destroy (cursor);
1086 /*---------------------------------------------------------------------------*/
1087 /* PRIVATE. "Top-side" Resize event handler. */
1088 /*---------------------------------------------------------------------------*/
1090 st_resize_event_handler (GnomeCanvasItem * handle_item,
1096 static gboolean dragging = FALSE;
1097 static GnomeCanvasItem *item;
1098 static glDisplay *display;
1101 item = GNOME_CANVAS_ITEM (data);
1102 gl_item_get_position_size (item, &x, &y, &w, &h);
1103 display = gl_item_get_display (item);
1105 switch (event->type) {
1107 case GDK_BUTTON_PRESS:
1108 switch (event->button.button) {
1111 gnome_canvas_item_grab (handle_item,
1112 GDK_POINTER_MOTION_MASK |
1113 GDK_BUTTON_RELEASE_MASK |
1114 GDK_BUTTON_PRESS_MASK,
1115 NULL, event->button.time);
1116 /* Anchor to bottom-right corner */
1124 case GDK_BUTTON_RELEASE:
1125 switch (event->button.button) {
1128 gnome_canvas_item_ungrab (handle_item,
1129 event->button.time);
1130 y = MIN (event->button.y, y2 - MIN_ITEM_SIZE);
1131 h = MAX (y2 - event->button.y, MIN_ITEM_SIZE);
1132 gl_item_set_position_size (item, x, y, w, h);
1133 gl_display_select_item (display, item);
1140 case GDK_MOTION_NOTIFY:
1141 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
1142 y = MIN (event->button.y, y2 - MIN_ITEM_SIZE);
1143 h = MAX (y2 - event->button.y, MIN_ITEM_SIZE);
1144 gl_item_set_position_size (item, x, y, w, h);
1145 gl_display_select_item (display, item);
1151 case GDK_ENTER_NOTIFY:
1152 cursor = gdk_cursor_new (GDK_CROSSHAIR);
1153 gdk_window_set_cursor (display->canvas->window, cursor);
1154 gdk_cursor_destroy (cursor);
1157 case GDK_LEAVE_NOTIFY:
1158 cursor = gdk_cursor_new (GDK_LEFT_PTR);
1159 gdk_window_set_cursor (display->canvas->window, cursor);
1160 gdk_cursor_destroy (cursor);
1169 /*---------------------------------------------------------------------------*/
1170 /* PRIVATE. "Bottom-side" Resize event handler. */
1171 /*---------------------------------------------------------------------------*/
1173 sb_resize_event_handler (GnomeCanvasItem * handle_item,
1179 static gboolean dragging = FALSE;
1180 static GnomeCanvasItem *item;
1181 static glDisplay *display;
1184 item = GNOME_CANVAS_ITEM (data);
1185 gl_item_get_position_size (item, &x, &y, &w, &h);
1186 display = gl_item_get_display (item);
1188 switch (event->type) {
1190 case GDK_BUTTON_PRESS:
1191 switch (event->button.button) {
1194 gnome_canvas_item_grab (handle_item,
1195 GDK_POINTER_MOTION_MASK |
1196 GDK_BUTTON_RELEASE_MASK |
1197 GDK_BUTTON_PRESS_MASK,
1198 NULL, event->button.time);
1199 /* Anchor to top side */
1207 case GDK_BUTTON_RELEASE:
1208 switch (event->button.button) {
1211 gnome_canvas_item_ungrab (handle_item,
1212 event->button.time);
1214 h = MAX (event->button.y - y1, MIN_ITEM_SIZE);
1215 gl_item_set_position_size (item, x, y, w, h);
1216 gl_display_select_item (display, item);
1223 case GDK_MOTION_NOTIFY:
1224 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
1226 h = MAX (event->button.y - y1, MIN_ITEM_SIZE);
1227 gl_item_set_position_size (item, x, y, w, h);
1228 gl_display_select_item (display, item);
1234 case GDK_ENTER_NOTIFY:
1235 cursor = gdk_cursor_new (GDK_CROSSHAIR);
1236 gdk_window_set_cursor (display->canvas->window, cursor);
1237 gdk_cursor_destroy (cursor);
1240 case GDK_LEAVE_NOTIFY:
1241 cursor = gdk_cursor_new (GDK_LEFT_PTR);
1242 gdk_window_set_cursor (display->canvas->window, cursor);
1243 gdk_cursor_destroy (cursor);
1252 /*---------------------------------------------------------------------------*/
1253 /* PRIVATE. Resize "P1" event handler. */
1254 /*---------------------------------------------------------------------------*/
1256 p1_resize_event_handler (GnomeCanvasItem * handle_item,
1260 gdouble x, y, dx, dy;
1261 static gdouble x0, y0;
1262 static gboolean dragging = FALSE;
1263 static GnomeCanvasItem *item;
1264 static glDisplay *display;
1267 item = GNOME_CANVAS_ITEM (data);
1268 gl_item_get_position_size (item, &x, &y, &dx, &dy);
1269 display = gl_item_get_display (item);
1271 switch (event->type) {
1273 case GDK_BUTTON_PRESS:
1274 switch (event->button.button) {
1277 gnome_canvas_item_grab (handle_item,
1278 GDK_POINTER_MOTION_MASK |
1279 GDK_BUTTON_RELEASE_MASK |
1280 GDK_BUTTON_PRESS_MASK,
1281 NULL, event->button.time);
1291 case GDK_BUTTON_RELEASE:
1292 switch (event->button.button) {
1295 gnome_canvas_item_ungrab (handle_item,
1296 event->button.time);
1299 dx = (event->button.x - x0);
1300 dy = (event->button.y - y0);
1301 gl_item_set_position_size (item, x, y, dx, dy);
1302 gl_display_select_item (display, item);
1309 case GDK_MOTION_NOTIFY:
1310 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
1313 dx = (event->button.x - x0);
1314 dy = (event->button.y - y0);
1315 gl_item_set_position_size (item, x, y, dx, dy);
1316 gl_display_select_item (display, item);
1322 case GDK_ENTER_NOTIFY:
1323 cursor = gdk_cursor_new (GDK_CROSSHAIR);
1324 gdk_window_set_cursor (display->canvas->window, cursor);
1325 gdk_cursor_destroy (cursor);
1328 case GDK_LEAVE_NOTIFY:
1329 cursor = gdk_cursor_new (GDK_LEFT_PTR);
1330 gdk_window_set_cursor (display->canvas->window, cursor);
1331 gdk_cursor_destroy (cursor);
1340 /*---------------------------------------------------------------------------*/
1341 /* PRIVATE. Resize "P2" event handler. */
1342 /*---------------------------------------------------------------------------*/
1344 p2_resize_event_handler (GnomeCanvasItem * handle_item,
1348 gdouble x, y, dx, dy;
1349 static gdouble x0, y0;
1350 static gboolean dragging = FALSE;
1351 static GnomeCanvasItem *item;
1352 static glDisplay *display;
1355 item = GNOME_CANVAS_ITEM (data);
1356 gl_item_get_position_size (item, &x, &y, &dx, &dy);
1357 display = gl_item_get_display (item);
1359 switch (event->type) {
1361 case GDK_BUTTON_PRESS:
1362 switch (event->button.button) {
1365 gnome_canvas_item_grab (handle_item,
1366 GDK_POINTER_MOTION_MASK |
1367 GDK_BUTTON_RELEASE_MASK |
1368 GDK_BUTTON_PRESS_MASK,
1369 NULL, event->button.time);
1379 case GDK_BUTTON_RELEASE:
1380 switch (event->button.button) {
1383 gnome_canvas_item_ungrab (handle_item,
1384 event->button.time);
1387 dx = (event->button.x - x0);
1388 dy = (event->button.y - y0);
1389 gl_item_set_position_size (item, x, y, dx, dy);
1390 gl_display_select_item (display, item);
1397 case GDK_MOTION_NOTIFY:
1398 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
1401 dx = (event->button.x - x0);
1402 dy = (event->button.y - y0);
1403 gl_item_set_position_size (item, x, y, dx, dy);
1404 gl_display_select_item (display, item);
1410 case GDK_ENTER_NOTIFY:
1411 cursor = gdk_cursor_new (GDK_CROSSHAIR);
1412 gdk_window_set_cursor (display->canvas->window, cursor);
1413 gdk_cursor_destroy (cursor);
1416 case GDK_LEAVE_NOTIFY:
1417 cursor = gdk_cursor_new (GDK_LEFT_PTR);
1418 gdk_window_set_cursor (display->canvas->window, cursor);
1419 gdk_cursor_destroy (cursor);
1428 /*---------------------------------------------------------------------------*/
1429 /* PRIVATE. Passthrough event handler. */
1430 /*---------------------------------------------------------------------------*/
1432 passthrough_event_handler (GnomeCanvasItem * handle_item,
1436 static GnomeCanvasItem *item;
1437 static glDisplay *display;
1439 item = GNOME_CANVAS_ITEM (data);
1440 display = gl_item_get_display (item);
1441 return gl_display_item_event_handler (item, event, display);