1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
4 * (GLABELS) Label and Business Card Creation program for GNOME
6 * view.c: GLabels View module
8 * Copyright (C) 2001-2007 Jim Evins <evins@snaught.com>.
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29 #include <glib/gi18n.h>
30 #include <gtk/gtkscrolledwindow.h>
31 #include <gtk/gtklayout.h>
32 #include <gtk/gtkselection.h>
33 #include <gtk/gtkinvisible.h>
34 #include <gdk/gdkkeysyms.h>
39 #include "cairo-label-path.h"
40 #include "cairo-markup-path.h"
41 #include "view-object.h"
43 #include "view-ellipse.h"
44 #include "view-line.h"
45 #include "view-image.h"
46 #include "view-text.h"
47 #include "view-barcode.h"
48 #include "xml-label.h"
55 /*==========================================================================*/
56 /* Private macros and constants. */
57 /*==========================================================================*/
59 #define BG_COLOR GL_COLOR (192, 192, 192)
61 #define PAPER_RGB_ARGS 1.0, 1.0, 1.0
62 #define GRID_RGB_ARGS 0.753, 0.753, 0.753
63 #define MARKUP_RGB_ARGS 0.94, 0.39, 0.39
64 #define OUTLINE_RGB_ARGS 0.68, 0.85, 0.90
65 #define SELECT_LINE_RGBA_ARGS 0.0, 0.0, 1.0, 0.5
66 #define SELECT_FILL_RGBA_ARGS 0.75, 0.75, 1.0, 0.5
68 #define GRID_LINE_WIDTH_PIXELS 1.0
69 #define MARKUP_LINE_WIDTH_PIXELS 1.0
70 #define OUTLINE_WIDTH_PIXELS 3.0
71 #define SELECT_LINE_WIDTH_PIXELS 3.0
73 #define ZOOMTOFIT_PAD 16
75 #define POINTS_PER_MM 2.83464566929
77 /*==========================================================================*/
79 /*==========================================================================*/
83 CONTEXT_MENU_ACTIVATE,
92 /*==========================================================================*/
94 /*==========================================================================*/
96 static guint signals[LAST_SIGNAL] = {0};
98 /* "CLIPBOARD" selection */
99 static GdkAtom clipboard_atom = GDK_NONE;
101 static gdouble zooms[] = {
118 #define N_ZOOMS G_N_ELEMENTS(zooms)
121 /*==========================================================================*/
122 /* Local function prototypes */
123 /*==========================================================================*/
125 static void gl_view_finalize (GObject *object);
127 static void gl_view_construct (glView *view,
130 static gdouble get_home_scale (glView *view);
132 static gboolean expose_cb (glView *view,
133 GdkEventExpose *event);
135 static void realize_cb (glView *view);
137 static void size_allocate_cb (glView *view,
138 GtkAllocation *allocation);
140 static void screen_changed_cb (glView *view);
142 static void label_changed_cb (glView *view);
144 static void label_resized_cb (glView *view);
146 static void draw_layers (glView *view,
149 static void draw_bg_layer (glView *view,
151 static void draw_grid_layer (glView *view,
153 static void draw_markup_layer (glView *view,
155 static void draw_objects_layer (glView *view,
157 static void draw_fg_layer (glView *view,
159 static void draw_highlight_layer (glView *view,
161 static void draw_select_region_layer (glView *view,
164 static void select_object_real (glView *view,
165 glViewObject *view_object);
166 static void unselect_object_real (glView *view,
167 glViewObject *view_object);
169 static glViewObject *view_view_object_at (glView *view,
174 static void set_zoom_real (glView *view,
176 gboolean scale_to_fit_flag);
178 static void selection_clear_cb (GtkWidget *widget,
179 GdkEventSelection *event,
182 static void selection_get_cb (GtkWidget *widget,
183 GtkSelectionData *selection_data,
188 static void selection_received_cb (GtkWidget *widget,
189 GtkSelectionData *selection_data,
193 static gboolean focus_in_event_cb (glView *view,
194 GdkEventFocus *event);
196 static gboolean focus_out_event_cb (glView *view,
197 GdkEventFocus *event);
199 static gboolean enter_notify_event_cb (glView *view,
200 GdkEventCrossing *event);
202 static gboolean leave_notify_event_cb (glView *view,
203 GdkEventCrossing *event);
205 static gboolean motion_notify_event_cb (glView *view,
206 GdkEventMotion *event);
208 static gboolean button_press_event_cb (glView *view,
209 GdkEventButton *event);
211 static gboolean button_release_event_cb (glView *view,
212 GdkEventButton *event);
214 static gboolean key_press_event_cb (glView *view,
218 /****************************************************************************/
219 /* Boilerplate Object stuff. */
220 /****************************************************************************/
221 G_DEFINE_TYPE (glView, gl_view, GTK_TYPE_VBOX);
224 gl_view_class_init (glViewClass *class)
226 GObjectClass *object_class = G_OBJECT_CLASS (class);
228 gl_debug (DEBUG_VIEW, "START");
230 gl_view_parent_class = g_type_class_peek_parent (class);
232 object_class->finalize = gl_view_finalize;
234 signals[SELECTION_CHANGED] =
235 g_signal_new ("selection_changed",
236 G_OBJECT_CLASS_TYPE (object_class),
238 G_STRUCT_OFFSET (glViewClass, selection_changed),
240 gl_marshal_VOID__VOID,
244 signals[CONTEXT_MENU_ACTIVATE] =
245 g_signal_new ("context_menu_activate",
246 G_OBJECT_CLASS_TYPE (object_class),
248 G_STRUCT_OFFSET (glViewClass, context_menu_activate),
250 gl_marshal_VOID__INT_UINT,
252 2, G_TYPE_INT, G_TYPE_UINT);
254 signals[ZOOM_CHANGED] =
255 g_signal_new ("zoom_changed",
256 G_OBJECT_CLASS_TYPE (object_class),
258 G_STRUCT_OFFSET (glViewClass, zoom_changed),
260 gl_marshal_VOID__DOUBLE,
264 signals[POINTER_MOVED] =
265 g_signal_new ("pointer_moved",
266 G_OBJECT_CLASS_TYPE (object_class),
268 G_STRUCT_OFFSET (glViewClass, pointer_moved),
270 gl_marshal_VOID__DOUBLE_DOUBLE,
272 2, G_TYPE_DOUBLE, G_TYPE_DOUBLE);
274 signals[POINTER_EXIT] =
275 g_signal_new ("pointer_exit",
276 G_OBJECT_CLASS_TYPE (object_class),
278 G_STRUCT_OFFSET (glViewClass, pointer_exit),
280 gl_marshal_VOID__VOID,
284 signals[MODE_CHANGED] =
285 g_signal_new ("mode_changed",
286 G_OBJECT_CLASS_TYPE (object_class),
288 G_STRUCT_OFFSET (glViewClass, mode_changed),
290 gl_marshal_VOID__VOID,
294 gl_debug (DEBUG_VIEW, "END");
298 gl_view_init (glView *view)
303 gl_debug (DEBUG_VIEW, "START");
306 view->grid_visible = TRUE;
307 view->grid_spacing = 9;
308 view->markup_visible = TRUE;
309 view->default_font_family = NULL;
310 view->mode = GL_VIEW_MODE_ARROW;
311 view->object_list = NULL;
312 view->selected_object_list = NULL;
314 view->home_scale = get_home_scale (view);
319 view->canvas = gtk_layout_new (NULL, NULL);
320 wscroll = gtk_scrolled_window_new (NULL, NULL);
321 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (wscroll),
322 GTK_POLICY_AUTOMATIC,
323 GTK_POLICY_AUTOMATIC);
324 gtk_box_pack_start (GTK_BOX (view), wscroll, TRUE, TRUE, 0);
325 gtk_container_add (GTK_CONTAINER (wscroll), view->canvas);
327 bg_color = gl_color_to_gdk_color (BG_COLOR);
328 gtk_widget_modify_bg (GTK_WIDGET (view->canvas), GTK_STATE_NORMAL, bg_color);
331 GTK_WIDGET_SET_FLAGS (GTK_WIDGET (view->canvas), GTK_CAN_FOCUS);
333 gtk_widget_add_events (GTK_WIDGET (view->canvas),
334 (GDK_FOCUS_CHANGE_MASK |
335 GDK_ENTER_NOTIFY_MASK |
336 GDK_LEAVE_NOTIFY_MASK |
337 GDK_POINTER_MOTION_MASK |
338 GDK_BUTTON_PRESS_MASK |
339 GDK_BUTTON_RELEASE_MASK |
340 GDK_KEY_PRESS_MASK));
342 g_signal_connect_swapped (G_OBJECT (view->canvas), "expose-event",
343 G_CALLBACK (expose_cb), view);
344 g_signal_connect_swapped (G_OBJECT (view->canvas), "realize",
345 G_CALLBACK (realize_cb), view);
346 g_signal_connect_swapped (G_OBJECT (view->canvas), "size-allocate",
347 G_CALLBACK (size_allocate_cb), view);
348 g_signal_connect_swapped (G_OBJECT (view->canvas), "screen-changed",
349 G_CALLBACK (screen_changed_cb), view);
350 g_signal_connect_swapped (G_OBJECT (view->canvas), "focus-in-event",
351 G_CALLBACK (focus_in_event_cb), view);
352 g_signal_connect_swapped (G_OBJECT (view->canvas), "focus-out-event",
353 G_CALLBACK (focus_out_event_cb), view);
354 g_signal_connect_swapped (G_OBJECT (view->canvas), "enter-notify-event",
355 G_CALLBACK (enter_notify_event_cb), view);
356 g_signal_connect_swapped (G_OBJECT (view->canvas), "leave-notify-event",
357 G_CALLBACK (leave_notify_event_cb), view);
358 g_signal_connect_swapped (G_OBJECT (view->canvas), "motion-notify-event",
359 G_CALLBACK (motion_notify_event_cb), view);
360 g_signal_connect_swapped (G_OBJECT (view->canvas), "button-press-event",
361 G_CALLBACK (button_press_event_cb), view);
362 g_signal_connect_swapped (G_OBJECT (view->canvas), "button-release-event",
363 G_CALLBACK (button_release_event_cb), view);
364 g_signal_connect_swapped (G_OBJECT (view->canvas), "key-press-event",
365 G_CALLBACK (key_press_event_cb), view);
370 view->have_selection = FALSE;
371 view->selection_data = NULL;
372 view->invisible = gtk_invisible_new ();
373 if (!clipboard_atom) {
374 clipboard_atom = gdk_atom_intern ("GLABELS_CLIPBOARD", FALSE);
376 gtk_selection_add_target (view->invisible,
377 clipboard_atom, GDK_SELECTION_TYPE_STRING, 1);
378 g_signal_connect (G_OBJECT (view->invisible),
379 "selection_clear_event",
380 G_CALLBACK (selection_clear_cb), view);
381 g_signal_connect (G_OBJECT (view->invisible), "selection_get",
382 G_CALLBACK (selection_get_cb), view);
383 g_signal_connect (G_OBJECT (view->invisible),
384 "selection_received",
385 G_CALLBACK (selection_received_cb), view);
388 * Defaults from preferences
390 gl_view_set_default_font_family (view, gl_prefs->default_font_family);
391 gl_view_set_default_font_size (view, gl_prefs->default_font_size);
392 gl_view_set_default_font_weight (view, gl_prefs->default_font_weight);
393 gl_view_set_default_font_italic_flag (view, gl_prefs->default_font_italic_flag);
394 gl_view_set_default_text_color (view, gl_prefs->default_text_color);
395 gl_view_set_default_text_alignment (view, gl_prefs->default_text_alignment);
396 gl_view_set_default_text_line_spacing (view, gl_prefs->default_text_line_spacing);
397 gl_view_set_default_line_width (view, gl_prefs->default_line_width);
398 gl_view_set_default_line_color (view, gl_prefs->default_line_color);
399 gl_view_set_default_fill_color (view, gl_prefs->default_fill_color);
401 gl_debug (DEBUG_VIEW, "END");
405 gl_view_finalize (GObject *object)
407 glView *view = GL_VIEW (object);
409 gl_debug (DEBUG_VIEW, "START");
411 g_return_if_fail (object != NULL);
412 g_return_if_fail (GL_IS_VIEW (object));
414 if (view->default_font_family) {
415 g_free (view->default_font_family);
418 G_OBJECT_CLASS (gl_view_parent_class)->finalize (object);
420 gl_debug (DEBUG_VIEW, "END");
423 /****************************************************************************/
424 /* NEW view object. */
425 /****************************************************************************/
427 gl_view_new (glLabel *label)
431 gl_debug (DEBUG_VIEW, "START");
433 g_return_val_if_fail (label && GL_IS_LABEL (label), NULL);
435 view = g_object_new (GL_TYPE_VIEW, NULL);
437 gl_view_construct (view, label);
439 gl_debug (DEBUG_VIEW, "END");
441 return GTK_WIDGET (view);
444 /*---------------------------------------------------------------------------*/
445 /* PRIVATE. Construct composite widget. */
446 /*---------------------------------------------------------------------------*/
448 gl_view_construct (glView *view,
452 glLabelObject *object;
454 gl_debug (DEBUG_VIEW, "START");
456 g_return_if_fail (GL_IS_VIEW (view));
460 for (p_obj = label->objects; p_obj != NULL; p_obj = p_obj->next)
462 object = GL_LABEL_OBJECT (p_obj->data);
464 if (GL_IS_LABEL_BOX (object)) {
465 gl_view_box_new (GL_LABEL_BOX(object), view);
466 } else if (GL_IS_LABEL_ELLIPSE (object)) {
467 gl_view_ellipse_new (GL_LABEL_ELLIPSE(object), view);
468 } else if (GL_IS_LABEL_LINE (object)) {
469 gl_view_line_new (GL_LABEL_LINE(object), view);
470 } else if (GL_IS_LABEL_IMAGE (object)) {
471 gl_view_image_new (GL_LABEL_IMAGE(object), view);
472 } else if (GL_IS_LABEL_TEXT (object)) {
473 gl_view_text_new (GL_LABEL_TEXT(object), view);
474 } else if (GL_IS_LABEL_BARCODE (object)) {
475 gl_view_barcode_new (GL_LABEL_BARCODE(object), view);
477 /* Should not happen! */
478 g_message ("Invalid label object type.");
482 g_signal_connect_swapped (G_OBJECT (view->label), "changed",
483 G_CALLBACK (label_changed_cb), view);
484 g_signal_connect_swapped (G_OBJECT (view->label), "size_changed",
485 G_CALLBACK (label_resized_cb), view);
487 gl_debug (DEBUG_VIEW, "END");
490 /*---------------------------------------------------------------------------*/
491 /* PRIAVTE. Calculate 1:1 scale for screen. */
492 /*---------------------------------------------------------------------------*/
494 get_home_scale (glView *view)
497 gdouble screen_width_pixels;
498 gdouble screen_width_mm;
499 gdouble screen_height_pixels;
500 gdouble screen_height_mm;
501 gdouble x_pixels_per_mm;
502 gdouble y_pixels_per_mm;
505 if (view->canvas == NULL) return 1.0;
507 if (!gtk_widget_has_screen (GTK_WIDGET (view->canvas))) return 1.0;
509 screen = gtk_widget_get_screen (GTK_WIDGET (view->canvas));
511 gl_debug (DEBUG_VIEW, "Screen = %p", screen);
513 screen_width_pixels = gdk_screen_get_width (screen);
514 screen_width_mm = gdk_screen_get_width_mm (screen);
515 screen_height_pixels = gdk_screen_get_height (screen);
516 screen_height_mm = gdk_screen_get_height_mm (screen);
518 x_pixels_per_mm = screen_width_pixels / screen_width_mm;
519 y_pixels_per_mm = screen_height_pixels / screen_height_mm;
521 gl_debug (DEBUG_VIEW, "Horizontal dot pitch: %g pixels/mm (%g dpi)",
522 x_pixels_per_mm, x_pixels_per_mm * 25.4);
523 gl_debug (DEBUG_VIEW, "Vertical dot pitch: %g pixels/mm (%g dpi)",
524 y_pixels_per_mm, y_pixels_per_mm * 25.4);
526 scale = (x_pixels_per_mm + y_pixels_per_mm) / 2.0;
528 gl_debug (DEBUG_VIEW, "Average dot pitch: %g pixels/mm (%g dpi)",
529 scale, scale * 25.4);
531 scale /= POINTS_PER_MM;
533 gl_debug (DEBUG_VIEW, "Scale = %g pixels/point", scale);
535 /* Make sure scale is somewhat sane. */
536 if ( (scale < 0.25) || (scale > 4.0) ) return 1.0;
541 /*---------------------------------------------------------------------------*/
542 /* Schedule canvas update. */
543 /*---------------------------------------------------------------------------*/
545 gl_view_update (glView *view)
550 gl_debug (DEBUG_VIEW, "START");
552 widget = GTK_WIDGET (view->canvas);
554 if (!widget->window) return;
556 if ( !view->update_scheduled_flag )
558 view->update_scheduled_flag = TRUE;
560 region = gdk_drawable_get_clip_region (widget->window);
561 /* redraw the cairo canvas completely by exposing it */
562 gdk_window_invalidate_region (widget->window, region, TRUE);
563 gdk_region_destroy (region);
566 gl_debug (DEBUG_VIEW, "END");
569 /*---------------------------------------------------------------------------*/
570 /* Schedule canvas region update. */
571 /*---------------------------------------------------------------------------*/
573 gl_view_update_region (glView *view,
575 glLabelRegion *region)
581 gl_debug (DEBUG_VIEW, "START");
583 widget = GTK_WIDGET (view->canvas);
585 if (!widget->window) return;
587 x = MIN (region->x1, region->x2);
588 y = MIN (region->y1, region->y2);
589 w = fabs (region->x2 - region->x1);
590 h = fabs (region->y2 - region->y1);
592 cairo_user_to_device (cr, &x, &y);
593 cairo_user_to_device_distance (cr, &w, &h);
600 gdk_window_invalidate_rect (widget->window, &rect, TRUE);
602 gl_debug (DEBUG_VIEW, "END");
605 /*---------------------------------------------------------------------------*/
606 /* PRIVATE. Expose handler. */
607 /*---------------------------------------------------------------------------*/
609 expose_cb (glView *view,
610 GdkEventExpose *event)
614 gl_debug (DEBUG_VIEW, "START");
616 view->update_scheduled_flag = FALSE;
619 cr = gdk_cairo_create (GTK_LAYOUT (view->canvas)->bin_window);
622 event->area.x, event->area.y,
623 event->area.width, event->area.height);
626 draw_layers (view, cr);
630 gl_debug (DEBUG_VIEW, "END");
635 /*---------------------------------------------------------------------------*/
636 /* PRIVATE. Realize handler. */
637 /*---------------------------------------------------------------------------*/
639 realize_cb (glView *view)
641 g_return_if_fail (view && GL_IS_VIEW (view));
643 gl_debug (DEBUG_VIEW, "START");
645 gl_debug (DEBUG_VIEW, "END");
648 /*---------------------------------------------------------------------------*/
649 /* PRIVATE. Size allocation changed callback. */
650 /*---------------------------------------------------------------------------*/
652 size_allocate_cb (glView *view,
653 GtkAllocation *allocation)
655 gl_debug (DEBUG_VIEW, "START");
657 GTK_LAYOUT (view->canvas)->hadjustment->page_size = allocation->width;
658 GTK_LAYOUT (view->canvas)->hadjustment->page_increment = allocation->width / 2;
660 GTK_LAYOUT (view->canvas)->vadjustment->page_size = allocation->height;
661 GTK_LAYOUT (view->canvas)->vadjustment->page_increment = allocation->height / 2;
663 g_signal_emit_by_name (GTK_LAYOUT (view->canvas)->hadjustment, "changed");
664 g_signal_emit_by_name (GTK_LAYOUT (view->canvas)->vadjustment, "changed");
666 if (view->zoom_to_fit_flag) {
667 /* Maintain best fit zoom */
668 gl_view_zoom_to_fit (view);
671 gl_debug (DEBUG_VIEW, "END");
676 /*---------------------------------------------------------------------------*/
677 /* PRIVATE. Screen changed callback. */
678 /*---------------------------------------------------------------------------*/
680 screen_changed_cb (glView *view)
682 gl_debug (DEBUG_VIEW, "START");
684 if (gtk_widget_has_screen (GTK_WIDGET (view->canvas))) {
686 view->home_scale = get_home_scale (view);
688 if (view->zoom_to_fit_flag) {
689 /* Maintain best fit zoom */
690 gl_view_zoom_to_fit (view);
694 gl_debug (DEBUG_VIEW, "END");
697 /*---------------------------------------------------------------------------*/
698 /* PRIVATE. Handle label changed event. */
699 /*---------------------------------------------------------------------------*/
701 label_changed_cb (glView *view)
703 g_return_if_fail (view && GL_IS_VIEW (view));
705 gl_debug (DEBUG_VIEW, "START");
707 gl_view_update (view);
709 gl_debug (DEBUG_VIEW, "END");
713 /*---------------------------------------------------------------------------*/
714 /* PRIVATE. Handle label resize event. */
715 /*---------------------------------------------------------------------------*/
717 label_resized_cb (glView *view)
719 g_return_if_fail (view && GL_IS_VIEW (view));
721 gl_debug (DEBUG_VIEW, "START");
723 g_signal_emit_by_name (GTK_LAYOUT (view->canvas)->hadjustment, "changed");
724 g_signal_emit_by_name (GTK_LAYOUT (view->canvas)->vadjustment, "changed");
726 gl_view_update (view);
728 gl_debug (DEBUG_VIEW, "END");
732 /*---------------------------------------------------------------------------*/
733 /* PRIVATE. Create, draw and order layers. */
734 /*---------------------------------------------------------------------------*/
736 draw_layers (glView *view,
741 gint canvas_w, canvas_h;
743 g_return_if_fail (view && GL_IS_VIEW (view));
744 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
746 gl_debug (DEBUG_VIEW, "START");
748 scale = view->zoom * view->home_scale;
750 gl_label_get_size (view->label, &w, &h);
752 scale = view->home_scale * view->zoom;
753 gtk_layout_set_size (GTK_LAYOUT (view->canvas), w*scale+8, h*scale+8);
755 gdk_drawable_get_size (GTK_LAYOUT (view->canvas)->bin_window, &canvas_w, &canvas_h);
757 view->x0 = (canvas_w/scale - w) / 2.0;
758 view->y0 = (canvas_h/scale - h) / 2.0;
764 cairo_scale (cr, scale, scale);
765 cairo_translate (cr, view->x0, view->y0);
767 draw_bg_layer (view, cr);
768 draw_grid_layer (view, cr);
769 draw_markup_layer (view, cr);
770 draw_objects_layer (view, cr);
771 draw_fg_layer (view, cr);
772 draw_highlight_layer (view, cr);
773 draw_select_region_layer (view, cr);
777 gl_debug (DEBUG_VIEW, "END");
781 /*---------------------------------------------------------------------------*/
782 /* PRIVATE. Draw background */
783 /*---------------------------------------------------------------------------*/
785 draw_bg_layer (glView *view,
788 g_return_if_fail (view && GL_IS_VIEW (view));
789 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
791 gl_cairo_label_path (cr, view->label->template, view->label->rotate_flag, FALSE);
793 cairo_set_source_rgb (cr, PAPER_RGB_ARGS);
794 cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD);
798 /*---------------------------------------------------------------------------*/
799 /* PRIVATE. Draw grid lines. */
800 /*---------------------------------------------------------------------------*/
802 draw_grid_layer (glView *view,
808 const glTemplateLabelType *label_type;
810 gl_debug (DEBUG_VIEW, "START");
812 g_return_if_fail (view && GL_IS_VIEW (view));
813 g_return_if_fail (view->label && GL_IS_LABEL(view->label));
815 if (view->grid_visible)
818 label_type = gl_template_get_first_label_type (view->label->template);
820 gl_label_get_size (view->label, &w, &h);
822 if (label_type->shape == GL_TEMPLATE_SHAPE_RECT) {
826 /* round labels, adjust grid to line up with center of label. */
827 x0 = fmod (w/2.0, view->grid_spacing);
828 y0 = fmod (h/2.0, view->grid_spacing);
834 cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
835 cairo_set_line_width (cr, GRID_LINE_WIDTH_PIXELS/(view->home_scale * view->zoom));
836 cairo_set_source_rgb (cr, GRID_RGB_ARGS);
838 for ( x=x0+view->grid_spacing; x < w; x += view->grid_spacing )
840 cairo_move_to (cr, x, 0);
841 cairo_line_to (cr, x, h);
845 for ( y=y0+view->grid_spacing; y < h; y += view->grid_spacing )
847 cairo_move_to (cr, 0, y);
848 cairo_line_to (cr, w, y);
856 gl_debug (DEBUG_VIEW, "END");
859 /*---------------------------------------------------------------------------*/
860 /* PRIVATE. Draw markup layer. */
861 /*---------------------------------------------------------------------------*/
863 draw_markup_layer (glView *view,
867 const glTemplateLabelType *label_type;
869 glTemplateMarkup *markup;
871 g_return_if_fail (view && GL_IS_VIEW (view));
872 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
874 if (view->markup_visible)
878 label_type = gl_template_get_first_label_type (label->template);
882 cairo_set_line_width (cr, MARKUP_LINE_WIDTH_PIXELS/(view->home_scale * view->zoom));
883 cairo_set_source_rgb (cr, MARKUP_RGB_ARGS);
885 for ( p=label_type->markups; p != NULL; p=p->next )
887 markup = (glTemplateMarkup *)p->data;
889 gl_cairo_markup_path (cr, markup, label);
899 /*---------------------------------------------------------------------------*/
900 /* PRIVATE. Draw objects layer. */
901 /*---------------------------------------------------------------------------*/
903 draw_objects_layer (glView *view,
906 gl_label_draw (view->label, cr, TRUE, NULL);
909 /*---------------------------------------------------------------------------*/
910 /* PRIVATE. Draw foreground */
911 /*---------------------------------------------------------------------------*/
913 draw_fg_layer (glView *view,
916 g_return_if_fail (view && GL_IS_VIEW (view));
917 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
919 gl_cairo_label_path (cr, view->label->template, view->label->rotate_flag, FALSE);
921 cairo_set_line_width (cr, OUTLINE_WIDTH_PIXELS/(view->home_scale * view->zoom));
922 cairo_set_source_rgb (cr, OUTLINE_RGB_ARGS);
926 /*---------------------------------------------------------------------------*/
927 /* PRIVATE. Create highlight layer. */
928 /*---------------------------------------------------------------------------*/
930 draw_highlight_layer (glView *view,
934 glViewObject *view_object;
936 g_return_if_fail (view && GL_IS_VIEW (view));
940 cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
942 for (p_obj = view->selected_object_list; p_obj != NULL; p_obj = p_obj->next)
944 view_object = GL_VIEW_OBJECT (p_obj->data);
946 gl_view_object_draw_handles (view_object, cr);
952 /*---------------------------------------------------------------------------*/
953 /* PRIVATE. Draw select region layer. */
954 /*---------------------------------------------------------------------------*/
956 draw_select_region_layer (glView *view,
962 g_return_if_fail (view && GL_IS_VIEW (view));
964 if (view->select_region_visible)
966 x1 = MIN (view->select_region.x1, view->select_region.x2);
967 y1 = MIN (view->select_region.y1, view->select_region.y2);
968 w = fabs (view->select_region.x2 - view->select_region.x1);
969 h = fabs (view->select_region.y2 - view->select_region.y1);
973 cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
975 cairo_rectangle (cr, x1, y1, w, h);
977 cairo_set_source_rgba (cr, SELECT_FILL_RGBA_ARGS);
978 cairo_fill_preserve (cr);
980 cairo_set_line_width (cr, SELECT_LINE_WIDTH_PIXELS/(view->home_scale * view->zoom));
981 cairo_set_source_rgba (cr, SELECT_LINE_RGBA_ARGS);
988 /*****************************************************************************/
990 /*****************************************************************************/
992 gl_view_show_grid (glView *view)
994 g_return_if_fail (view && GL_IS_VIEW (view));
996 view->grid_visible = TRUE;
997 gl_view_update (view);
1000 /*****************************************************************************/
1002 /*****************************************************************************/
1004 gl_view_hide_grid (glView *view)
1006 g_return_if_fail (view && GL_IS_VIEW (view));
1008 view->grid_visible = FALSE;
1009 gl_view_update (view);
1012 /*****************************************************************************/
1013 /* Set grid spacing. */
1014 /*****************************************************************************/
1016 gl_view_set_grid_spacing (glView *view,
1019 g_return_if_fail (view && GL_IS_VIEW (view));
1021 view->grid_spacing = spacing;
1022 gl_view_update (view);
1025 /*****************************************************************************/
1027 /*****************************************************************************/
1029 gl_view_show_markup (glView *view)
1031 g_return_if_fail (view && GL_IS_VIEW (view));
1033 view->markup_visible = TRUE;
1034 gl_view_update (view);
1037 /*****************************************************************************/
1039 /*****************************************************************************/
1041 gl_view_hide_markup (glView *view)
1043 g_return_if_fail (view && GL_IS_VIEW (view));
1045 view->markup_visible = FALSE;
1046 gl_view_update (view);
1049 /*****************************************************************************/
1050 /* Set arrow mode. */
1051 /*****************************************************************************/
1053 gl_view_arrow_mode (glView *view)
1057 gl_debug (DEBUG_VIEW, "START");
1059 g_return_if_fail (view && GL_IS_VIEW (view));
1061 cursor = gdk_cursor_new (GDK_LEFT_PTR);
1062 gdk_window_set_cursor (view->canvas->window, cursor);
1063 gdk_cursor_unref (cursor);
1065 view->mode = GL_VIEW_MODE_ARROW;
1066 view->state = GL_VIEW_IDLE;
1068 gl_debug (DEBUG_VIEW, "END");
1071 /*****************************************************************************/
1072 /* Set create text object mode. */
1073 /*****************************************************************************/
1075 gl_view_object_create_mode (glView *view,
1076 glLabelObjectType type)
1078 GdkCursor *cursor = NULL;
1080 gl_debug (DEBUG_VIEW, "START");
1082 g_return_if_fail (view && GL_IS_VIEW (view));
1086 case GL_LABEL_OBJECT_BOX:
1087 cursor = gl_view_box_get_create_cursor ();
1089 case GL_LABEL_OBJECT_ELLIPSE:
1090 cursor = gl_view_ellipse_get_create_cursor ();
1092 case GL_LABEL_OBJECT_LINE:
1093 cursor = gl_view_line_get_create_cursor ();
1095 case GL_LABEL_OBJECT_IMAGE:
1096 cursor = gl_view_image_get_create_cursor ();
1098 case GL_LABEL_OBJECT_TEXT:
1099 cursor = gl_view_text_get_create_cursor ();
1101 case GL_LABEL_OBJECT_BARCODE:
1102 cursor = gl_view_barcode_get_create_cursor ();
1105 g_message ("Invalid label object type.");/*Should not happen!*/
1109 gdk_window_set_cursor (view->canvas->window, cursor);
1110 gdk_cursor_unref (cursor);
1112 view->mode = GL_VIEW_MODE_OBJECT_CREATE;
1113 view->state = GL_VIEW_IDLE;
1114 view->create_type = type;
1116 gl_debug (DEBUG_VIEW, "END");
1119 /*****************************************************************************/
1120 /* Select given object (adding to current selection). */
1121 /*****************************************************************************/
1123 gl_view_select_object (glView *view,
1124 glViewObject *view_object)
1126 gl_debug (DEBUG_VIEW, "START");
1128 g_return_if_fail (view && GL_IS_VIEW (view));
1130 select_object_real (view, view_object);
1132 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1134 gl_debug (DEBUG_VIEW, "END");
1137 /*****************************************************************************/
1138 /* Unselect given object (removing from current selection). */
1139 /*****************************************************************************/
1141 gl_view_unselect_object (glView *view,
1142 glViewObject *view_object)
1144 gl_debug (DEBUG_VIEW, "START");
1146 g_return_if_fail (view && GL_IS_VIEW (view));
1148 unselect_object_real (view, view_object);
1150 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1152 gl_debug (DEBUG_VIEW, "END");
1155 /*****************************************************************************/
1156 /* Select all items. */
1157 /*****************************************************************************/
1159 gl_view_select_all (glView *view)
1163 gl_debug (DEBUG_VIEW, "START");
1165 g_return_if_fail (view && GL_IS_VIEW (view));
1167 /* 1st unselect anything already selected. */
1168 for (p = view->selected_object_list; p != NULL; p = p_next) {
1170 unselect_object_real (view, GL_VIEW_OBJECT (p->data));
1173 /* Finally select all objects. */
1174 for (p = view->object_list; p != NULL; p = p->next) {
1175 select_object_real (view, GL_VIEW_OBJECT (p->data));
1178 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1180 gl_debug (DEBUG_VIEW, "END");
1183 /*****************************************************************************/
1184 /* Remove all selections */
1185 /*****************************************************************************/
1187 gl_view_unselect_all (glView *view)
1192 gl_debug (DEBUG_VIEW, "START");
1194 g_return_if_fail (view && GL_IS_VIEW (view));
1196 for (p = view->selected_object_list; p != NULL; p = p_next) {
1198 unselect_object_real (view, GL_VIEW_OBJECT (p->data));
1201 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1203 gl_debug (DEBUG_VIEW, "END");
1206 /*****************************************************************************/
1207 /* Select all objects within given rectangular region (adding to selection). */
1208 /*****************************************************************************/
1210 gl_view_select_region (glView *view,
1211 glLabelRegion *region)
1214 glViewObject *view_object;
1215 glLabelObject *object;
1218 glLabelRegion obj_extent;
1220 gl_debug (DEBUG_VIEW, "START");
1222 g_return_if_fail (view && GL_IS_VIEW (view));
1224 r_x1 = MIN (region->x1, region->x2);
1225 r_y1 = MIN (region->y1, region->y2);
1226 r_x2 = MAX (region->x1, region->x2);
1227 r_y2 = MAX (region->y1, region->y2);
1229 for (p = view->object_list; p != NULL; p = p->next)
1231 view_object = GL_VIEW_OBJECT(p->data);
1232 if (!gl_view_is_object_selected (view, view_object))
1235 object = gl_view_object_get_object (view_object);
1237 gl_label_object_get_extent (object, &obj_extent);
1238 if ((obj_extent.x1 >= r_x1) &&
1239 (obj_extent.x2 <= r_x2) &&
1240 (obj_extent.y1 >= r_y1) &&
1241 (obj_extent.y2 <= r_y2))
1243 select_object_real (view, view_object);
1249 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1251 gl_debug (DEBUG_VIEW, "END");
1254 /*---------------------------------------------------------------------------*/
1255 /* PRIVATE. Select an object. */
1256 /*---------------------------------------------------------------------------*/
1258 select_object_real (glView *view,
1259 glViewObject *view_object)
1261 gl_debug (DEBUG_VIEW, "START");
1263 g_return_if_fail (view && GL_IS_VIEW (view));
1264 g_return_if_fail (GL_IS_VIEW_OBJECT (view_object));
1266 if (!gl_view_is_object_selected (view, view_object)) {
1267 view->selected_object_list =
1268 g_list_append (view->selected_object_list, view_object);
1270 gtk_widget_grab_focus (GTK_WIDGET (view->canvas));
1272 gl_view_update (view);
1274 gl_debug (DEBUG_VIEW, "END");
1277 /*---------------------------------------------------------------------------*/
1278 /* PRIVATE. Un-select object. */
1279 /*---------------------------------------------------------------------------*/
1281 unselect_object_real (glView *view,
1282 glViewObject *view_object)
1284 gl_debug (DEBUG_VIEW, "START");
1286 g_return_if_fail (view && GL_IS_VIEW (view));
1287 g_return_if_fail (GL_IS_VIEW_OBJECT (view_object));
1289 view->selected_object_list =
1290 g_list_remove (view->selected_object_list, view_object);
1292 gl_view_update (view);
1294 gl_debug (DEBUG_VIEW, "END");
1297 /*---------------------------------------------------------------------------*/
1298 /* PRIVATE. Return object at (x,y). */
1299 /*---------------------------------------------------------------------------*/
1300 static glViewObject *
1301 view_view_object_at (glView *view,
1307 glViewObject *view_object;
1309 g_return_val_if_fail (view && GL_IS_VIEW (view), NULL);
1311 for (p_obj = g_list_last (view->object_list); p_obj != NULL; p_obj = p_obj->prev)
1314 view_object = GL_VIEW_OBJECT (p_obj->data);
1316 if (gl_view_object_at (view_object, cr, x, y))
1326 /*---------------------------------------------------------------------------*/
1327 /* PRIVATE. Return object handle at (x,y). */
1328 /*---------------------------------------------------------------------------*/
1329 static glViewObject *
1330 view_handle_at (glView *view,
1334 glViewObjectHandle *handle)
1337 glViewObject *view_object;
1339 g_return_val_if_fail (view && GL_IS_VIEW (view), NULL);
1341 for (p_obj = g_list_last (view->selected_object_list); p_obj != NULL; p_obj = p_obj->prev)
1344 view_object = GL_VIEW_OBJECT (p_obj->data);
1346 if ((*handle = gl_view_object_handle_at (view_object, cr, x, y)))
1356 /*****************************************************************************/
1357 /* Is the object in our current selection? */
1358 /*****************************************************************************/
1360 gl_view_is_object_selected (glView *view,
1361 glViewObject *view_object)
1363 gl_debug (DEBUG_VIEW, "");
1365 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
1366 g_return_val_if_fail (GL_IS_VIEW_OBJECT (view_object), FALSE);
1368 if (g_list_find (view->selected_object_list, view_object) == NULL) {
1374 /*****************************************************************************/
1375 /* Is our current selection empty? */
1376 /*****************************************************************************/
1378 gl_view_is_selection_empty (glView *view)
1380 gl_debug (DEBUG_VIEW, "");
1382 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
1384 if (view->selected_object_list == NULL) {
1391 /*****************************************************************************/
1392 /* Is our current selection atomic? I.e. only one item selected. */
1393 /*****************************************************************************/
1395 gl_view_is_selection_atomic (glView *view)
1397 gl_debug (DEBUG_VIEW, "");
1399 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
1401 if (view->selected_object_list == NULL)
1403 if (view->selected_object_list->next == NULL)
1408 /*****************************************************************************/
1409 /* Delete selected objects. (Bypass clipboard) */
1410 /*****************************************************************************/
1412 gl_view_delete_selection (glView *view)
1418 gl_debug (DEBUG_VIEW, "START");
1420 g_return_if_fail (view && GL_IS_VIEW (view));
1422 object_list = view->selected_object_list;
1423 view->selected_object_list = NULL;
1424 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1426 for (p = object_list; p != NULL; p = p_next) {
1428 g_object_unref (G_OBJECT (p->data));
1429 object_list = g_list_delete_link (object_list, p);
1432 gl_debug (DEBUG_VIEW, "END");
1435 /*****************************************************************************/
1436 /* Get object property editor of first selected object. */
1437 /*****************************************************************************/
1439 gl_view_get_editor (glView *view)
1441 glViewObject *view_object;
1442 GtkWidget *editor = NULL;
1444 gl_debug (DEBUG_VIEW, "START");
1446 g_return_val_if_fail (view && GL_IS_VIEW (view), NULL);
1448 if (!gl_view_is_selection_empty (view)) {
1450 view_object = GL_VIEW_OBJECT(view->selected_object_list->data);
1451 editor = gl_view_object_get_editor (view_object);
1455 gl_debug (DEBUG_VIEW, "END");
1460 /*****************************************************************************/
1461 /* Raise selected items to top. */
1462 /*****************************************************************************/
1464 gl_view_raise_selection (glView *view)
1467 glViewObject *view_object;
1468 glLabelObject *object;
1470 gl_debug (DEBUG_VIEW, "START");
1472 g_return_if_fail (view && GL_IS_VIEW (view));
1474 for (p = view->selected_object_list; p != NULL; p = p->next) {
1475 view_object = GL_VIEW_OBJECT (p->data);
1476 object = gl_view_object_get_object (view_object);
1477 gl_label_object_raise_to_top (object);
1480 gl_debug (DEBUG_VIEW, "END");
1483 /*****************************************************************************/
1484 /* Lower selected items to bottom. */
1485 /*****************************************************************************/
1487 gl_view_lower_selection (glView *view)
1490 glViewObject *view_object;
1491 glLabelObject *object;
1493 gl_debug (DEBUG_VIEW, "START");
1495 g_return_if_fail (view && GL_IS_VIEW (view));
1497 for (p = view->selected_object_list; p != NULL; p = p->next) {
1498 view_object = GL_VIEW_OBJECT (p->data);
1499 object = gl_view_object_get_object (view_object);
1500 gl_label_object_lower_to_bottom (object);
1503 gl_debug (DEBUG_VIEW, "END");
1506 /*****************************************************************************/
1507 /* Rotate selected objects by given angle. */
1508 /*****************************************************************************/
1510 gl_view_rotate_selection (glView *view,
1514 glViewObject *view_object;
1515 glLabelObject *object;
1517 gl_debug (DEBUG_VIEW, "START");
1519 g_return_if_fail (view && GL_IS_VIEW (view));
1521 for (p = view->selected_object_list; p != NULL; p = p->next) {
1522 view_object = GL_VIEW_OBJECT (p->data);
1523 object = gl_view_object_get_object (view_object);
1524 gl_label_object_rotate (object, theta_degs);
1527 gl_debug (DEBUG_VIEW, "END");
1530 /*****************************************************************************/
1531 /* Rotate selected objects 90 degrees left. */
1532 /*****************************************************************************/
1534 gl_view_rotate_selection_left (glView *view)
1537 glViewObject *view_object;
1538 glLabelObject *object;
1540 gl_debug (DEBUG_VIEW, "START");
1542 g_return_if_fail (view && GL_IS_VIEW (view));
1544 for (p = view->selected_object_list; p != NULL; p = p->next) {
1545 view_object = GL_VIEW_OBJECT (p->data);
1546 object = gl_view_object_get_object (view_object);
1547 gl_label_object_rotate (object, -90.0);
1550 gl_debug (DEBUG_VIEW, "END");
1553 /*****************************************************************************/
1554 /* Rotate selected objects 90 degrees right. */
1555 /*****************************************************************************/
1557 gl_view_rotate_selection_right (glView *view)
1560 glViewObject *view_object;
1561 glLabelObject *object;
1563 gl_debug (DEBUG_VIEW, "START");
1565 g_return_if_fail (view && GL_IS_VIEW (view));
1567 for (p = view->selected_object_list; p != NULL; p = p->next) {
1568 view_object = GL_VIEW_OBJECT (p->data);
1569 object = gl_view_object_get_object (view_object);
1570 gl_label_object_rotate (object, 90.0);
1573 gl_debug (DEBUG_VIEW, "END");
1576 /*****************************************************************************/
1577 /* Flip selected objects horizontally. */
1578 /*****************************************************************************/
1580 gl_view_flip_selection_horiz (glView *view)
1583 glViewObject *view_object;
1584 glLabelObject *object;
1586 gl_debug (DEBUG_VIEW, "START");
1588 g_return_if_fail (view && GL_IS_VIEW (view));
1590 for (p = view->selected_object_list; p != NULL; p = p->next) {
1591 view_object = GL_VIEW_OBJECT (p->data);
1592 object = gl_view_object_get_object (view_object);
1593 gl_label_object_flip_horiz (object);
1596 gl_debug (DEBUG_VIEW, "END");
1599 /*****************************************************************************/
1600 /* Flip selected objects vertically. */
1601 /*****************************************************************************/
1603 gl_view_flip_selection_vert (glView *view)
1606 glViewObject *view_object;
1607 glLabelObject *object;
1609 gl_debug (DEBUG_VIEW, "START");
1611 g_return_if_fail (view && GL_IS_VIEW (view));
1613 for (p = view->selected_object_list; p != NULL; p = p->next) {
1614 view_object = GL_VIEW_OBJECT (p->data);
1615 object = gl_view_object_get_object (view_object);
1616 gl_label_object_flip_vert (object);
1619 gl_debug (DEBUG_VIEW, "END");
1622 /*****************************************************************************/
1623 /* Align selected objects to left most edge. */
1624 /*****************************************************************************/
1626 gl_view_align_selection_left (glView *view)
1629 glViewObject *view_object;
1630 glLabelObject *object;
1632 glLabelRegion obj_extent;
1634 gl_debug (DEBUG_VIEW, "START");
1636 g_return_if_fail (view && GL_IS_VIEW (view));
1638 g_return_if_fail (!gl_view_is_selection_empty (view) &&
1639 !gl_view_is_selection_atomic (view));
1641 /* find left most edge */
1642 p = view->selected_object_list;
1643 view_object = GL_VIEW_OBJECT (p->data);
1644 object = gl_view_object_get_object (view_object);
1645 gl_label_object_get_extent (object, &obj_extent);
1646 x1_min = obj_extent.x1;
1647 for (p = p->next; p != NULL; p = p->next)
1649 view_object = GL_VIEW_OBJECT (p->data);
1650 object = gl_view_object_get_object (view_object);
1651 gl_label_object_get_extent (object, &obj_extent);
1652 if ( obj_extent.x1 < x1_min ) x1_min = obj_extent.x1;
1655 /* now adjust the object positions to line up the left edges */
1656 for (p = view->selected_object_list; p != NULL; p = p->next)
1658 view_object = GL_VIEW_OBJECT (p->data);
1659 object = gl_view_object_get_object (view_object);
1660 gl_label_object_get_extent (object, &obj_extent);
1661 dx = x1_min - obj_extent.x1;
1662 gl_label_object_set_position_relative (object, dx, 0.0);
1665 gl_debug (DEBUG_VIEW, "END");
1669 /*****************************************************************************/
1670 /* Align selected objects to right most edge. */
1671 /*****************************************************************************/
1673 gl_view_align_selection_right (glView *view)
1676 glViewObject *view_object;
1677 glLabelObject *object;
1679 glLabelRegion obj_extent;
1681 gl_debug (DEBUG_VIEW, "START");
1683 g_return_if_fail (view && GL_IS_VIEW (view));
1685 g_return_if_fail (!gl_view_is_selection_empty (view) &&
1686 !gl_view_is_selection_atomic (view));
1688 /* find right most edge */
1689 p = view->selected_object_list;
1690 view_object = GL_VIEW_OBJECT (p->data);
1691 object = gl_view_object_get_object (view_object);
1692 gl_label_object_get_extent (object, &obj_extent);
1693 x2_max = obj_extent.x2;
1694 for (p = p->next; p != NULL; p = p->next)
1696 view_object = GL_VIEW_OBJECT (p->data);
1697 object = gl_view_object_get_object (view_object);
1698 gl_label_object_get_extent (object, &obj_extent);
1699 if ( obj_extent.x2 > x2_max ) x2_max = obj_extent.x2;
1702 /* now adjust the object positions to line up the right edges */
1703 for (p = view->selected_object_list; p != NULL; p = p->next)
1705 view_object = GL_VIEW_OBJECT (p->data);
1706 object = gl_view_object_get_object (view_object);
1707 gl_label_object_get_extent (object, &obj_extent);
1708 dx = x2_max - obj_extent.x2;
1709 gl_label_object_set_position_relative (object, dx, 0.0);
1712 gl_debug (DEBUG_VIEW, "END");
1715 /*****************************************************************************/
1716 /* Align selected objects to horizontal center of objects. */
1717 /*****************************************************************************/
1719 gl_view_align_selection_hcenter (glView *view)
1722 glViewObject *view_object;
1723 glLabelObject *object;
1727 glLabelRegion obj_extent;
1731 gl_debug (DEBUG_VIEW, "START");
1733 g_return_if_fail (view && GL_IS_VIEW (view));
1735 g_return_if_fail (!gl_view_is_selection_empty (view) &&
1736 !gl_view_is_selection_atomic (view));
1738 /* find average center of objects */
1741 for (p = view->selected_object_list; p != NULL; p = p->next)
1743 view_object = GL_VIEW_OBJECT (p->data);
1744 object = gl_view_object_get_object (view_object);
1745 gl_label_object_get_extent (object, &obj_extent);
1746 xsum += (obj_extent.x1 + obj_extent.x2) / 2.0;
1751 /* find center of object closest to average center */
1752 p = view->selected_object_list;
1753 view_object = GL_VIEW_OBJECT (p->data);
1754 object = gl_view_object_get_object (view_object);
1755 gl_label_object_get_extent (object, &obj_extent);
1756 dxmin = fabs (xavg - (obj_extent.x1 + obj_extent.x2)/2.0);
1757 xcenter = (obj_extent.x1 + obj_extent.x2)/2.0;
1758 for (p = p->next; p != NULL; p = p->next)
1760 view_object = GL_VIEW_OBJECT (p->data);
1761 object = gl_view_object_get_object (view_object);
1762 gl_label_object_get_extent (object, &obj_extent);
1763 dx = fabs (xavg - (obj_extent.x1 + obj_extent.x2)/2.0);
1767 xcenter = (obj_extent.x1 + obj_extent.x2)/2.0;
1771 /* now adjust the object positions to line up this center */
1772 for (p = view->selected_object_list; p != NULL; p = p->next) {
1773 view_object = GL_VIEW_OBJECT (p->data);
1774 object = gl_view_object_get_object (view_object);
1775 gl_label_object_get_extent (object, &obj_extent);
1776 dx = xcenter - (obj_extent.x1 + obj_extent.x2)/2.0;
1777 gl_label_object_set_position_relative (object, dx, 0.0);
1780 gl_debug (DEBUG_VIEW, "END");
1783 /*****************************************************************************/
1784 /* Align selected objects to top most edge. */
1785 /*****************************************************************************/
1787 gl_view_align_selection_top (glView *view)
1790 glViewObject *view_object;
1791 glLabelObject *object;
1793 glLabelRegion obj_extent;
1795 gl_debug (DEBUG_VIEW, "START");
1797 g_return_if_fail (view && GL_IS_VIEW (view));
1799 g_return_if_fail (!gl_view_is_selection_empty (view) &&
1800 !gl_view_is_selection_atomic (view));
1802 /* find top most edge */
1803 p = view->selected_object_list;
1804 view_object = GL_VIEW_OBJECT (p->data);
1805 object = gl_view_object_get_object (view_object);
1806 gl_label_object_get_extent (object, &obj_extent);
1807 y1_min = obj_extent.y1;
1808 for (p = p->next; p != NULL; p = p->next)
1810 view_object = GL_VIEW_OBJECT (p->data);
1811 object = gl_view_object_get_object (view_object);
1812 gl_label_object_get_extent (object, &obj_extent);
1813 if ( obj_extent.y1 < y1_min ) y1_min = obj_extent.y1;
1816 /* now adjust the object positions to line up the top edges */
1817 for (p = view->selected_object_list; p != NULL; p = p->next)
1819 view_object = GL_VIEW_OBJECT (p->data);
1820 object = gl_view_object_get_object (view_object);
1821 gl_label_object_get_extent (object, &obj_extent);
1822 dy = y1_min - obj_extent.y1;
1823 gl_label_object_set_position_relative (object, 0.0, dy);
1826 gl_debug (DEBUG_VIEW, "END");
1829 /*****************************************************************************/
1830 /* Align selected objects to bottom most edge. */
1831 /*****************************************************************************/
1833 gl_view_align_selection_bottom (glView *view)
1836 glViewObject *view_object;
1837 glLabelObject *object;
1839 glLabelRegion obj_extent;
1841 gl_debug (DEBUG_VIEW, "START");
1843 g_return_if_fail (view && GL_IS_VIEW (view));
1845 g_return_if_fail (!gl_view_is_selection_empty (view) &&
1846 !gl_view_is_selection_atomic (view));
1848 /* find bottom most edge */
1849 p = view->selected_object_list;
1850 view_object = GL_VIEW_OBJECT (p->data);
1851 object = gl_view_object_get_object (view_object);
1852 gl_label_object_get_extent (object, &obj_extent);
1853 y2_max = obj_extent.y2;
1854 for (p = p->next; p != NULL; p = p->next)
1856 view_object = GL_VIEW_OBJECT (p->data);
1857 object = gl_view_object_get_object (view_object);
1858 gl_label_object_get_extent (object, &obj_extent);
1859 if ( obj_extent.y2 > y2_max ) y2_max = obj_extent.y2;
1862 /* now adjust the object positions to line up the bottom edges */
1863 for (p = view->selected_object_list; p != NULL; p = p->next)
1865 view_object = GL_VIEW_OBJECT (p->data);
1866 object = gl_view_object_get_object (view_object);
1867 gl_label_object_get_extent (object, &obj_extent);
1868 dy = y2_max - obj_extent.y2;
1869 gl_label_object_set_position_relative (object, 0.0, dy);
1872 gl_debug (DEBUG_VIEW, "END");
1875 /*****************************************************************************/
1876 /* Align selected objects to viertical center of objects. */
1877 /*****************************************************************************/
1879 gl_view_align_selection_vcenter (glView *view)
1882 glViewObject *view_object;
1883 glLabelObject *object;
1887 glLabelRegion obj_extent;
1891 gl_debug (DEBUG_VIEW, "START");
1893 g_return_if_fail (view && GL_IS_VIEW (view));
1895 g_return_if_fail (!gl_view_is_selection_empty (view) &&
1896 !gl_view_is_selection_atomic (view));
1898 /* find average center of objects */
1901 for (p = view->selected_object_list; p != NULL; p = p->next)
1903 view_object = GL_VIEW_OBJECT (p->data);
1904 object = gl_view_object_get_object (view_object);
1905 gl_label_object_get_extent (object, &obj_extent);
1906 ysum += (obj_extent.y1 + obj_extent.y2) / 2.0;
1911 /* find center of object closest to average center */
1912 p = view->selected_object_list;
1913 view_object = GL_VIEW_OBJECT (p->data);
1914 object = gl_view_object_get_object (view_object);
1915 gl_label_object_get_extent (object, &obj_extent);
1916 dymin = fabs (yavg - (obj_extent.y1 + obj_extent.y2)/2.0);
1917 ycenter = (obj_extent.y1 + obj_extent.y2)/2.0;
1918 for (p = p->next; p != NULL; p = p->next)
1920 view_object = GL_VIEW_OBJECT (p->data);
1921 object = gl_view_object_get_object (view_object);
1922 gl_label_object_get_extent (object, &obj_extent);
1923 dy = fabs (yavg - (obj_extent.y1 + obj_extent.y2)/2.0);
1927 ycenter = (obj_extent.y1 + obj_extent.y2)/2.0;
1931 /* now adjust the object positions to line up this center */
1932 for (p = view->selected_object_list; p != NULL; p = p->next)
1934 view_object = GL_VIEW_OBJECT (p->data);
1935 object = gl_view_object_get_object (view_object);
1936 gl_label_object_get_extent (object, &obj_extent);
1937 dy = ycenter - (obj_extent.y1 + obj_extent.y2)/2.0;
1938 gl_label_object_set_position_relative (object, 0.0, dy);
1941 gl_debug (DEBUG_VIEW, "END");
1944 /*****************************************************************************/
1945 /* Center selected objects to in center of label. */
1946 /*****************************************************************************/
1948 gl_view_center_selection_horiz (glView *view)
1951 glViewObject *view_object;
1952 glLabelObject *object;
1954 gdouble x_label_center;
1955 gdouble x_obj_center;
1956 glLabelRegion obj_extent;
1959 gl_debug (DEBUG_VIEW, "START");
1961 g_return_if_fail (view && GL_IS_VIEW (view));
1963 g_return_if_fail (!gl_view_is_selection_empty (view));
1965 gl_label_get_size (view->label, &w, &h);
1966 x_label_center = w / 2.0;
1968 /* adjust the object positions */
1969 for (p = view->selected_object_list; p != NULL; p = p->next)
1971 view_object = GL_VIEW_OBJECT (p->data);
1972 object = gl_view_object_get_object (view_object);
1973 gl_label_object_get_extent (object, &obj_extent);
1974 x_obj_center = (obj_extent.x1 + obj_extent.x2) / 2.0;
1975 dx = x_label_center - x_obj_center;
1976 gl_label_object_set_position_relative (object, dx, 0.0);
1979 gl_debug (DEBUG_VIEW, "END");
1983 /*****************************************************************************/
1984 /* Center selected objects to in center of label. */
1985 /*****************************************************************************/
1987 gl_view_center_selection_vert (glView *view)
1990 glViewObject *view_object;
1991 glLabelObject *object;
1993 gdouble y_label_center;
1994 gdouble y_obj_center;
1995 glLabelRegion obj_extent;
1998 gl_debug (DEBUG_VIEW, "START");
2000 g_return_if_fail (view && GL_IS_VIEW (view));
2002 g_return_if_fail (!gl_view_is_selection_empty (view));
2004 gl_label_get_size (view->label, &w, &h);
2005 y_label_center = h / 2.0;
2007 /* adjust the object positions */
2008 for (p = view->selected_object_list; p != NULL; p = p->next)
2010 view_object = GL_VIEW_OBJECT (p->data);
2011 object = gl_view_object_get_object (view_object);
2012 gl_label_object_get_extent (object, &obj_extent);
2013 y_obj_center = (obj_extent.y1 + obj_extent.y2) / 2.0;
2014 dy = y_label_center - y_obj_center;
2015 gl_label_object_set_position_relative (object, 0.0, dy);
2018 gl_debug (DEBUG_VIEW, "END");
2022 /*****************************************************************************/
2023 /* Move selected objects */
2024 /*****************************************************************************/
2026 gl_view_move_selection (glView *view,
2031 glLabelObject *object;
2033 gl_debug (DEBUG_VIEW, "START");
2035 g_return_if_fail (view && GL_IS_VIEW (view));
2037 for (p = view->selected_object_list; p != NULL; p = p->next)
2040 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2041 gl_label_object_set_position_relative (object, dx, dy);
2045 gl_debug (DEBUG_VIEW, "END");
2048 /*****************************************************************************/
2049 /* Can text properties be set for selection? */
2050 /*****************************************************************************/
2052 gl_view_can_selection_text (glView *view)
2055 glLabelObject *object;
2057 gl_debug (DEBUG_VIEW, "");
2059 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
2061 for (p = view->selected_object_list; p != NULL; p = p->next)
2064 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2065 if (gl_label_object_can_text (object))
2075 /*****************************************************************************/
2076 /* Set font family for all text contained in selected objects. */
2077 /*****************************************************************************/
2079 gl_view_set_selection_font_family (glView *view,
2080 const gchar *font_family)
2083 glLabelObject *object;
2085 gl_debug (DEBUG_VIEW, "START");
2087 g_return_if_fail (view && GL_IS_VIEW (view));
2089 for (p = view->selected_object_list; p != NULL; p = p->next) {
2091 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2092 gl_label_object_set_font_family (object, font_family);
2096 gl_debug (DEBUG_VIEW, "END");
2099 /*****************************************************************************/
2100 /* Set font size for all text contained in selected objects. */
2101 /*****************************************************************************/
2103 gl_view_set_selection_font_size (glView *view,
2107 glLabelObject *object;
2109 gl_debug (DEBUG_VIEW, "START");
2111 g_return_if_fail (view && GL_IS_VIEW (view));
2113 for (p = view->selected_object_list; p != NULL; p = p->next) {
2115 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2116 gl_label_object_set_font_size (object, font_size);
2120 gl_debug (DEBUG_VIEW, "END");
2123 /*****************************************************************************/
2124 /* Set font weight for all text contained in selected objects. */
2125 /*****************************************************************************/
2127 gl_view_set_selection_font_weight (glView *view,
2128 PangoWeight font_weight)
2131 glLabelObject *object;
2133 gl_debug (DEBUG_VIEW, "START");
2135 g_return_if_fail (view && GL_IS_VIEW (view));
2137 for (p = view->selected_object_list; p != NULL; p = p->next) {
2139 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2140 gl_label_object_set_font_weight (object, font_weight);
2144 gl_debug (DEBUG_VIEW, "END");
2147 /*****************************************************************************/
2148 /* Set font italic flag for all text contained in selected objects. */
2149 /*****************************************************************************/
2151 gl_view_set_selection_font_italic_flag (glView *view,
2152 gboolean font_italic_flag)
2155 glLabelObject *object;
2157 gl_debug (DEBUG_VIEW, "START");
2159 g_return_if_fail (view && GL_IS_VIEW (view));
2161 for (p = view->selected_object_list; p != NULL; p = p->next) {
2163 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2164 gl_label_object_set_font_italic_flag (object, font_italic_flag);
2168 gl_debug (DEBUG_VIEW, "END");
2171 /*****************************************************************************/
2172 /* Set text alignment for all text contained in selected objects. */
2173 /*****************************************************************************/
2175 gl_view_set_selection_text_alignment (glView *view,
2176 PangoAlignment text_alignment)
2179 glLabelObject *object;
2181 gl_debug (DEBUG_VIEW, "START");
2183 g_return_if_fail (view && GL_IS_VIEW (view));
2185 for (p = view->selected_object_list; p != NULL; p = p->next) {
2187 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2188 gl_label_object_set_text_alignment (object, text_alignment);
2192 gl_debug (DEBUG_VIEW, "END");
2195 /*****************************************************************************/
2196 /* Set text line spacing for all text contained in selected objects. */
2197 /*****************************************************************************/
2199 gl_view_set_selection_text_line_spacing (glView *view,
2200 gdouble text_line_spacing)
2203 glLabelObject *object;
2205 gl_debug (DEBUG_VIEW, "START");
2207 g_return_if_fail (view && GL_IS_VIEW (view));
2209 for (p = view->selected_object_list; p != NULL; p = p->next) {
2211 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2212 gl_label_object_set_text_line_spacing (object, text_line_spacing);
2216 gl_debug (DEBUG_VIEW, "END");
2218 /*****************************************************************************/
2219 /* Set text color for all text contained in selected objects. */
2220 /*****************************************************************************/
2222 gl_view_set_selection_text_color (glView *view,
2223 glColorNode *text_color_node)
2226 glLabelObject *object;
2228 gl_debug (DEBUG_VIEW, "START");
2230 g_return_if_fail (view && GL_IS_VIEW (view));
2232 for (p = view->selected_object_list; p != NULL; p = p->next) {
2234 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2235 gl_label_object_set_text_color (object, text_color_node);
2239 gl_debug (DEBUG_VIEW, "END");
2242 /*****************************************************************************/
2243 /* Can fill properties be set for selection? */
2244 /*****************************************************************************/
2246 gl_view_can_selection_fill (glView *view)
2249 glLabelObject *object;
2251 gl_debug (DEBUG_VIEW, "");
2253 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
2255 for (p = view->selected_object_list; p != NULL; p = p->next) {
2257 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2258 if (gl_label_object_can_fill (object)) {
2267 /*****************************************************************************/
2268 /* Set fill color for all selected objects. */
2269 /*****************************************************************************/
2271 gl_view_set_selection_fill_color (glView *view,
2272 glColorNode *fill_color_node)
2275 glLabelObject *object;
2277 gl_debug (DEBUG_VIEW, "START");
2279 g_return_if_fail (view && GL_IS_VIEW (view));
2281 for (p = view->selected_object_list; p != NULL; p = p->next) {
2283 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2284 gl_label_object_set_fill_color (object, fill_color_node);
2288 gl_debug (DEBUG_VIEW, "END");
2291 /*****************************************************************************/
2292 /* Can line color properties be set for selection? */
2293 /*****************************************************************************/
2295 gl_view_can_selection_line_color (glView *view)
2298 glLabelObject *object;
2300 gl_debug (DEBUG_VIEW, "");
2302 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
2304 for (p = view->selected_object_list; p != NULL; p = p->next) {
2306 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2307 if (gl_label_object_can_line_color (object)) {
2316 /*****************************************************************************/
2317 /* Set line color for all selected objects. */
2318 /*****************************************************************************/
2320 gl_view_set_selection_line_color (glView *view,
2321 glColorNode *line_color_node)
2324 glLabelObject *object;
2326 gl_debug (DEBUG_VIEW, "START");
2328 g_return_if_fail (view && GL_IS_VIEW (view));
2330 for (p = view->selected_object_list; p != NULL; p = p->next) {
2332 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2333 gl_label_object_set_line_color (object, line_color_node);
2337 gl_debug (DEBUG_VIEW, "END");
2340 /*****************************************************************************/
2341 /* Can line width properties be set for selection? */
2342 /*****************************************************************************/
2344 gl_view_can_selection_line_width (glView *view)
2347 glLabelObject *object;
2349 gl_debug (DEBUG_VIEW, "");
2351 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
2353 for (p = view->selected_object_list; p != NULL; p = p->next) {
2355 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2356 if (gl_label_object_can_line_width (object)) {
2365 /*****************************************************************************/
2366 /* Set line width for all selected objects. */
2367 /*****************************************************************************/
2369 gl_view_set_selection_line_width (glView *view,
2373 glLabelObject *object;
2375 gl_debug (DEBUG_VIEW, "START");
2377 g_return_if_fail (view && GL_IS_VIEW (view));
2379 for (p = view->selected_object_list; p != NULL; p = p->next) {
2381 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2382 gl_label_object_set_line_width (object, line_width);
2386 gl_debug (DEBUG_VIEW, "END");
2389 /*****************************************************************************/
2390 /* "Cut" selected items and place in clipboard selections. */
2391 /*****************************************************************************/
2393 gl_view_cut (glView *view)
2395 gl_debug (DEBUG_VIEW, "START");
2397 g_return_if_fail (view && GL_IS_VIEW (view));
2399 gl_view_copy (view);
2400 gl_view_delete_selection (view);
2402 gl_debug (DEBUG_VIEW, "END");
2405 /*****************************************************************************/
2406 /* "Copy" selected items to clipboard selections. */
2407 /*****************************************************************************/
2409 gl_view_copy (glView *view)
2412 glViewObject *view_object;
2413 glLabelObject *object;
2415 gl_debug (DEBUG_VIEW, "START");
2417 g_return_if_fail (view && GL_IS_VIEW (view));
2419 if (view->selected_object_list) {
2421 if ( view->selection_data ) {
2422 g_object_unref (view->selection_data);
2424 view->selection_data = GL_LABEL(gl_label_new ());
2425 gl_label_set_template (view->selection_data, view->label->template);
2426 gl_label_set_rotate_flag (view->selection_data, view->label->rotate_flag);
2428 for (p = view->selected_object_list; p != NULL; p = p->next) {
2430 view_object = GL_VIEW_OBJECT (p->data);
2431 object = gl_view_object_get_object (view_object);
2433 gl_label_object_dup (object, view->selection_data);
2437 gtk_selection_owner_set (view->invisible,
2438 clipboard_atom, GDK_CURRENT_TIME);
2439 view->have_selection = TRUE;
2443 gl_debug (DEBUG_VIEW, "END");
2446 /*****************************************************************************/
2447 /* "Paste" from private clipboard selection. */
2448 /*****************************************************************************/
2450 gl_view_paste (glView *view)
2452 gl_debug (DEBUG_VIEW, "START");
2454 g_return_if_fail (view && GL_IS_VIEW (view));
2456 gtk_selection_convert (GTK_WIDGET (view->invisible),
2457 clipboard_atom, GDK_SELECTION_TYPE_STRING,
2460 gl_debug (DEBUG_VIEW, "END");
2463 /*****************************************************************************/
2464 /* Zoom in one "notch" */
2465 /*****************************************************************************/
2467 gl_view_zoom_in (glView *view)
2470 gdouble dist, dist_min;
2472 gl_debug (DEBUG_VIEW, "START");
2474 g_return_if_fail (view && GL_IS_VIEW (view));
2476 /* Find index of current scale (or best match) */
2477 i_min = 1; /* start with 2nd largest scale */
2478 dist_min = fabs (zooms[1] - view->zoom);
2479 for (i = 2; i < N_ZOOMS; i++) {
2480 dist = fabs (zooms[i] - view->zoom);
2481 if (dist < dist_min) {
2487 /* zoom in one "notch" */
2488 i = MAX (0, i_min - 1);
2489 gl_debug (DEBUG_VIEW, "zoom[%d] = %g", i, zooms[i]);
2490 set_zoom_real (view, zooms[i], FALSE);
2492 gl_debug (DEBUG_VIEW, "END");
2495 /*****************************************************************************/
2496 /* Zoom out one "notch" */
2497 /*****************************************************************************/
2499 gl_view_zoom_out (glView *view)
2502 gdouble dist, dist_min;
2504 gl_debug (DEBUG_VIEW, "START");
2506 g_return_if_fail (view && GL_IS_VIEW (view));
2508 /* Find index of current scale (or best match) */
2509 i_min = 0; /* start with largest scale */
2510 dist_min = fabs (zooms[0] - view->zoom);
2511 for (i = 1; i < N_ZOOMS; i++) {
2512 dist = fabs (zooms[i] - view->zoom);
2513 if (dist < dist_min) {
2519 /* zoom out one "notch" */
2520 if (i_min >= N_ZOOMS)
2525 set_zoom_real (view, zooms[i], FALSE);
2527 gl_debug (DEBUG_VIEW, "END");
2530 /*****************************************************************************/
2531 /* Set zoom to best fit. */
2532 /*****************************************************************************/
2534 gl_view_zoom_to_fit (glView *view)
2536 gint w_view, h_view;
2537 gdouble w_label, h_label;
2538 gdouble x_scale, y_scale, scale;
2540 gl_debug (DEBUG_VIEW, "");
2542 if ( ! GTK_WIDGET_VISIBLE(view)) {
2543 set_zoom_real (view, 1.0, TRUE);
2547 w_view = GTK_WIDGET(view)->allocation.width;
2548 h_view = GTK_WIDGET(view)->allocation.height;
2550 gl_label_get_size (GL_LABEL(view->label), &w_label, &h_label);
2552 gl_debug (DEBUG_VIEW, "View size: %d, %d", w_view, h_view);
2553 gl_debug (DEBUG_VIEW, "Label size: %g, %g", w_label, h_label);
2555 /* Calculate best scale */
2556 x_scale = (double)(w_view - ZOOMTOFIT_PAD) / w_label;
2557 y_scale = (double)(h_view - ZOOMTOFIT_PAD) / h_label;
2558 scale = MIN (x_scale, y_scale);
2559 gl_debug (DEBUG_VIEW, "Candidate zooms: %g, %g => %g", x_scale, y_scale, scale);
2562 gl_debug (DEBUG_VIEW, "Scale: %g", scale);
2563 scale = MIN (scale, zooms[0]*view->home_scale);
2564 scale = MAX (scale, zooms[N_ZOOMS-1]*view->home_scale);
2565 gl_debug (DEBUG_VIEW, "Limitted scale: %g", scale);
2567 set_zoom_real (view, scale/view->home_scale, TRUE);
2570 /*****************************************************************************/
2571 /* Set current zoom factor to explicit value. */
2572 /*****************************************************************************/
2574 gl_view_set_zoom (glView *view,
2577 gl_debug (DEBUG_VIEW, "START");
2579 set_zoom_real (view, zoom, FALSE);
2581 gl_debug (DEBUG_VIEW, "END");
2584 /*---------------------------------------------------------------------------*/
2585 /* PRIVATE. Set canvas scale. */
2586 /*---------------------------------------------------------------------------*/
2588 set_zoom_real (glView *view,
2590 gboolean zoom_to_fit_flag)
2592 gl_debug (DEBUG_VIEW, "START");
2594 g_return_if_fail (view && GL_IS_VIEW (view));
2595 g_return_if_fail (zoom > 0.0);
2597 /* Limit, if needed */
2598 gl_debug (DEBUG_VIEW, "Zoom requested: %g", zoom);
2599 zoom = MIN (zoom, zooms[0]);
2600 zoom = MAX (zoom, zooms[N_ZOOMS-1]);
2601 gl_debug (DEBUG_VIEW, "Limitted zoom: %g", zoom);
2603 if ( zoom != view->zoom ) {
2606 view->zoom_to_fit_flag = zoom_to_fit_flag;
2608 gl_view_update (view);
2610 g_signal_emit (G_OBJECT(view), signals[ZOOM_CHANGED], 0, zoom);
2614 gl_debug (DEBUG_VIEW, "END");
2619 /*****************************************************************************/
2620 /* Get current zoom factor. */
2621 /*****************************************************************************/
2623 gl_view_get_zoom (glView *view)
2625 gl_debug (DEBUG_VIEW, "");
2627 g_return_val_if_fail (view && GL_IS_VIEW (view), 1.0);
2632 /*****************************************************************************/
2633 /* Is this the maximum zoom level. */
2634 /*****************************************************************************/
2636 gl_view_is_zoom_max (glView *view)
2638 gl_debug (DEBUG_VIEW, "");
2640 g_return_val_if_fail (GL_IS_VIEW (view), FALSE);
2642 return view->zoom >= zooms[0];
2645 /*****************************************************************************/
2646 /* Is this the minimum zoom level. */
2647 /*****************************************************************************/
2649 gl_view_is_zoom_min (glView *view)
2651 gl_debug (DEBUG_VIEW, "");
2653 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
2655 return view->zoom <= zooms[N_ZOOMS-1];
2658 /*---------------------------------------------------------------------------*/
2659 /* PRIVATE. Handle "selection-clear" signal. */
2660 /*---------------------------------------------------------------------------*/
2662 selection_clear_cb (GtkWidget *widget,
2663 GdkEventSelection *event,
2666 gl_debug (DEBUG_VIEW, "START");
2668 g_return_if_fail (view && GL_IS_VIEW (view));
2670 view->have_selection = FALSE;
2671 g_object_unref (view->selection_data);
2672 view->selection_data = NULL;
2674 gl_debug (DEBUG_VIEW, "END");
2677 /*---------------------------------------------------------------------------*/
2678 /* PRIVATE. Handle "selection-get" signal. */
2679 /*---------------------------------------------------------------------------*/
2681 selection_get_cb (GtkWidget *widget,
2682 GtkSelectionData *selection_data,
2688 glXMLLabelStatus status;
2690 gl_debug (DEBUG_VIEW, "START");
2692 g_return_if_fail (view && GL_IS_VIEW (view));
2694 if (view->have_selection) {
2696 buffer = gl_xml_label_save_buffer (view->selection_data,
2698 gtk_selection_data_set (selection_data,
2699 GDK_SELECTION_TYPE_STRING, 8,
2700 (guchar *)buffer, strlen (buffer));
2704 gl_debug (DEBUG_VIEW, "END");
2707 /*---------------------------------------------------------------------------*/
2708 /* PRIVATE. Handle "selection-received" signal. (Result of Paste) */
2709 /*---------------------------------------------------------------------------*/
2711 selection_received_cb (GtkWidget *widget,
2712 GtkSelectionData *selection_data,
2716 glLabel *label = NULL;
2717 glXMLLabelStatus status;
2719 glLabelObject *object, *newobject;
2720 glViewObject *view_object;
2722 gl_debug (DEBUG_VIEW, "START");
2724 g_return_if_fail (view && GL_IS_VIEW (view));
2726 if (selection_data->length < 0) {
2729 if (selection_data->type != GDK_SELECTION_TYPE_STRING) {
2733 gl_view_unselect_all (view);
2735 label = gl_xml_label_open_buffer ((gchar *)selection_data->data, &status);
2736 for (p = label->objects; p != NULL; p = p_next) {
2739 object = (glLabelObject *) p->data;
2740 newobject = gl_label_object_dup (object, view->label);
2742 gl_debug (DEBUG_VIEW, "object pasted");
2744 if (GL_IS_LABEL_BOX (newobject)) {
2745 view_object = gl_view_box_new (GL_LABEL_BOX(newobject),
2747 } else if (GL_IS_LABEL_ELLIPSE (newobject)) {
2748 view_object = gl_view_ellipse_new (GL_LABEL_ELLIPSE(newobject),
2750 } else if (GL_IS_LABEL_LINE (newobject)) {
2751 view_object = gl_view_line_new (GL_LABEL_LINE(newobject),
2753 } else if (GL_IS_LABEL_IMAGE (newobject)) {
2754 view_object = gl_view_image_new (GL_LABEL_IMAGE(newobject),
2756 } else if (GL_IS_LABEL_TEXT (newobject)) {
2757 view_object = gl_view_text_new (GL_LABEL_TEXT(newobject),
2759 } else if (GL_IS_LABEL_BARCODE (newobject)) {
2760 view_object = gl_view_barcode_new (GL_LABEL_BARCODE(newobject),
2763 /* Should not happen! */
2765 g_message ("Invalid label object type.");
2767 gl_view_select_object (view, view_object);
2769 g_object_unref (label);
2771 gl_debug (DEBUG_VIEW, "END");
2774 /****************************************************************************/
2775 /* Set default font family. */
2776 /****************************************************************************/
2778 gl_view_set_default_font_family (glView *view,
2779 const gchar *font_family)
2781 gl_debug (DEBUG_VIEW, "START");
2783 g_return_if_fail (view && GL_IS_VIEW (view));
2785 if (view->default_font_family) {
2786 g_free (view->default_font_family);
2788 view->default_font_family = g_strdup (font_family);
2790 gl_debug (DEBUG_VIEW, "END");
2794 /****************************************************************************/
2795 /* Set default font size. */
2796 /****************************************************************************/
2798 gl_view_set_default_font_size (glView *view,
2801 gl_debug (DEBUG_VIEW, "START");
2803 g_return_if_fail (view && GL_IS_VIEW (view));
2805 view->default_font_size = font_size;
2807 gl_debug (DEBUG_VIEW, "END");
2811 /****************************************************************************/
2812 /* Set default font weight. */
2813 /****************************************************************************/
2815 gl_view_set_default_font_weight (glView *view,
2816 PangoWeight font_weight)
2818 gl_debug (DEBUG_VIEW, "START");
2820 g_return_if_fail (view && GL_IS_VIEW (view));
2822 view->default_font_weight = font_weight;
2824 gl_debug (DEBUG_VIEW, "END");
2828 /****************************************************************************/
2829 /* Set default font italic flag. */
2830 /****************************************************************************/
2832 gl_view_set_default_font_italic_flag (glView *view,
2833 gboolean font_italic_flag)
2835 gl_debug (DEBUG_VIEW, "START");
2837 g_return_if_fail (view && GL_IS_VIEW (view));
2839 view->default_font_italic_flag = font_italic_flag;
2841 gl_debug (DEBUG_VIEW, "END");
2845 /****************************************************************************/
2846 /* Set default text color. */
2847 /****************************************************************************/
2849 gl_view_set_default_text_color (glView *view,
2852 gl_debug (DEBUG_VIEW, "START");
2854 g_return_if_fail (view && GL_IS_VIEW (view));
2856 view->default_text_color = text_color;
2858 gl_debug (DEBUG_VIEW, "END");
2862 /****************************************************************************/
2863 /* Set default text alignment. */
2864 /****************************************************************************/
2866 gl_view_set_default_text_alignment (glView *view,
2867 PangoAlignment text_alignment)
2869 gl_debug (DEBUG_VIEW, "START");
2871 g_return_if_fail (view && GL_IS_VIEW (view));
2873 view->default_text_alignment = text_alignment;
2874 gl_debug (DEBUG_VIEW, "END");
2877 /****************************************************************************/
2878 /* Set default text line spacing. */
2879 /****************************************************************************/
2881 gl_view_set_default_text_line_spacing (glView *view,
2882 gdouble text_line_spacing)
2884 gl_debug (DEBUG_VIEW, "START");
2886 g_return_if_fail (view && GL_IS_VIEW (view));
2888 view->default_text_line_spacing = text_line_spacing;
2890 gl_debug (DEBUG_VIEW, "END");
2894 /****************************************************************************/
2895 /* Set default line width. */
2896 /****************************************************************************/
2898 gl_view_set_default_line_width (glView *view,
2901 gl_debug (DEBUG_VIEW, "START");
2903 g_return_if_fail (view && GL_IS_VIEW (view));
2905 view->default_line_width = line_width;
2907 gl_debug (DEBUG_VIEW, "END");
2911 /****************************************************************************/
2912 /* Set default line color. */
2913 /****************************************************************************/
2915 gl_view_set_default_line_color (glView *view,
2918 gl_debug (DEBUG_VIEW, "START");
2920 g_return_if_fail (view && GL_IS_VIEW (view));
2922 view->default_line_color = line_color;
2924 gl_debug (DEBUG_VIEW, "END");
2928 /****************************************************************************/
2929 /* Set default fill color. */
2930 /****************************************************************************/
2932 gl_view_set_default_fill_color (glView *view,
2935 gl_debug (DEBUG_VIEW, "START");
2937 g_return_if_fail (view && GL_IS_VIEW (view));
2939 view->default_fill_color = fill_color;
2941 gl_debug (DEBUG_VIEW, "END");
2946 /****************************************************************************/
2947 /* Get default font family. */
2948 /****************************************************************************/
2950 gl_view_get_default_font_family (glView *view)
2952 gl_debug (DEBUG_VIEW, "START");
2954 g_return_val_if_fail (view && GL_IS_VIEW (view), NULL);
2956 gl_debug (DEBUG_VIEW, "END");
2958 return g_strdup (view->default_font_family);
2962 /****************************************************************************/
2963 /* Get default font size. */
2964 /****************************************************************************/
2966 gl_view_get_default_font_size (glView *view)
2968 gl_debug (DEBUG_VIEW, "START");
2970 g_return_val_if_fail (view && GL_IS_VIEW (view), 12.0);
2972 gl_debug (DEBUG_VIEW, "END");
2974 return view->default_font_size;
2978 /****************************************************************************/
2979 /* Get default font weight. */
2980 /****************************************************************************/
2982 gl_view_get_default_font_weight (glView *view)
2984 gl_debug (DEBUG_VIEW, "START");
2986 g_return_val_if_fail (view && GL_IS_VIEW (view), PANGO_WEIGHT_NORMAL);
2988 gl_debug (DEBUG_VIEW, "END");
2990 return view->default_font_weight;
2994 /****************************************************************************/
2995 /* Get default font italic flag. */
2996 /****************************************************************************/
2998 gl_view_get_default_font_italic_flag (glView *view)
3000 gl_debug (DEBUG_VIEW, "START");
3002 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
3004 gl_debug (DEBUG_VIEW, "END");
3006 return view->default_font_italic_flag;
3010 /****************************************************************************/
3011 /* Get default text color. */
3012 /****************************************************************************/
3014 gl_view_get_default_text_color (glView *view)
3016 gl_debug (DEBUG_VIEW, "START");
3018 g_return_val_if_fail (view && GL_IS_VIEW (view), 0);
3020 gl_debug (DEBUG_VIEW, "END");
3022 return view->default_text_color;
3026 /****************************************************************************/
3027 /* Get default text alignment. */
3028 /****************************************************************************/
3030 gl_view_get_default_text_alignment (glView *view)
3032 gl_debug (DEBUG_VIEW, "START");
3034 g_return_val_if_fail (view && GL_IS_VIEW (view), PANGO_ALIGN_LEFT);
3036 gl_debug (DEBUG_VIEW, "END");
3038 return view->default_text_alignment;
3041 /****************************************************************************/
3042 /* Get default text line spacing. */
3043 /****************************************************************************/
3045 gl_view_get_default_text_line_spacing (glView *view)
3047 gl_debug (DEBUG_VIEW, "START");
3049 g_return_val_if_fail (view && GL_IS_VIEW (view), 1.0);
3051 gl_debug (DEBUG_VIEW, "END");
3053 return view->default_text_line_spacing;
3058 /****************************************************************************/
3059 /* Get default line width. */
3060 /****************************************************************************/
3062 gl_view_get_default_line_width (glView *view)
3064 gl_debug (DEBUG_VIEW, "START");
3066 g_return_val_if_fail (view && GL_IS_VIEW (view), 1.0);
3068 gl_debug (DEBUG_VIEW, "END");
3070 return view->default_line_width;
3074 /****************************************************************************/
3075 /* Get default line color. */
3076 /****************************************************************************/
3078 gl_view_get_default_line_color (glView *view)
3080 gl_debug (DEBUG_VIEW, "START");
3082 g_return_val_if_fail (view && GL_IS_VIEW (view), 0);
3084 gl_debug (DEBUG_VIEW, "END");
3086 return view->default_line_color;
3090 /****************************************************************************/
3091 /* Get default fill color. */
3092 /****************************************************************************/
3094 gl_view_get_default_fill_color (glView *view)
3096 gl_debug (DEBUG_VIEW, "START");
3098 g_return_val_if_fail (view && GL_IS_VIEW (view), 0);
3100 gl_debug (DEBUG_VIEW, "END");
3102 return view->default_fill_color;
3105 /*---------------------------------------------------------------------------*/
3106 /* PRIVATE. Focus in event handler. */
3107 /*---------------------------------------------------------------------------*/
3109 focus_in_event_cb (glView *view,
3110 GdkEventFocus *event)
3112 GTK_WIDGET_SET_FLAGS (GTK_WIDGET (view->canvas), GTK_HAS_FOCUS);
3117 /*---------------------------------------------------------------------------*/
3118 /* PRIVATE. Focus out event handler. */
3119 /*---------------------------------------------------------------------------*/
3121 focus_out_event_cb (glView *view,
3122 GdkEventFocus *event)
3124 GTK_WIDGET_UNSET_FLAGS (GTK_WIDGET (view->canvas), GTK_HAS_FOCUS);
3129 /*---------------------------------------------------------------------------*/
3130 /* PRIVATE. Enter notify event handler. */
3131 /*---------------------------------------------------------------------------*/
3133 enter_notify_event_cb (glView *view,
3134 GdkEventCrossing *event)
3136 gtk_widget_grab_focus(GTK_WIDGET (view->canvas));
3141 /*---------------------------------------------------------------------------*/
3142 /* PRIVATE. Leave notify event handler. */
3143 /*---------------------------------------------------------------------------*/
3145 leave_notify_event_cb (glView *view,
3146 GdkEventCrossing *event)
3149 g_signal_emit (G_OBJECT(view), signals[POINTER_EXIT], 0);
3154 /*---------------------------------------------------------------------------*/
3155 /* PRIVATE. Motion notify event handler. */
3156 /*---------------------------------------------------------------------------*/
3158 motion_notify_event_cb (glView *view,
3159 GdkEventMotion *event)
3161 gboolean return_value = FALSE;
3166 glViewObjectHandle handle;
3168 cr = gdk_cairo_create (GTK_LAYOUT (view->canvas)->bin_window);
3171 * Translate to label coordinates
3173 scale = view->zoom * view->home_scale;
3174 cairo_scale (cr, scale, scale);
3175 cairo_translate (cr, view->x0, view->y0);
3179 cairo_device_to_user (cr, &x, &y);
3182 * Emit signal regardless of mode
3184 g_signal_emit (G_OBJECT(view), signals[POINTER_MOVED], 0, x, y);
3187 * Handle event as appropriate for mode
3192 case GL_VIEW_MODE_ARROW:
3193 switch (view->state)
3197 if (view_handle_at (view, cr, event->x, event->y, &handle))
3199 cursor = gdk_cursor_new (GDK_CROSSHAIR);
3201 else if (view_view_object_at (view, cr, event->x, event->y))
3203 cursor = gdk_cursor_new (GDK_FLEUR);
3207 cursor = gdk_cursor_new (GDK_LEFT_PTR);
3209 gdk_window_set_cursor (view->canvas->window, cursor);
3210 gdk_cursor_unref (cursor);
3213 case GL_VIEW_ARROW_SELECT_REGION:
3215 gl_view_update_region (view, cr, &view->select_region);
3217 view->select_region.x2 = x;
3218 view->select_region.y2 = y;
3220 gl_view_update_region (view, cr, &view->select_region);
3222 gl_view_update (view);
3226 case GL_VIEW_ARROW_MOVE:
3227 gl_view_move_selection (view,
3228 (x - view->move_last_x),
3229 (y - view->move_last_y));
3230 view->move_last_x = x;
3231 view->move_last_y = y;
3234 case GL_VIEW_ARROW_RESIZE:
3235 gl_view_object_resize_event (view->resize_object,
3236 view->resize_handle,
3237 view->resize_honor_aspect,
3244 g_message ("Invalid arrow state."); /*Should not happen!*/
3246 return_value = TRUE;
3250 case GL_VIEW_MODE_OBJECT_CREATE:
3251 if (view->state != GL_VIEW_IDLE)
3253 switch (view->create_type)
3255 case GL_LABEL_OBJECT_BOX:
3256 gl_view_box_create_motion_event (view, x, y);
3258 case GL_LABEL_OBJECT_ELLIPSE:
3259 gl_view_ellipse_create_motion_event (view, x, y);
3261 case GL_LABEL_OBJECT_LINE:
3262 gl_view_line_create_motion_event (view, x, y);
3264 case GL_LABEL_OBJECT_IMAGE:
3265 gl_view_image_create_motion_event (view, x, y);
3267 case GL_LABEL_OBJECT_TEXT:
3268 gl_view_text_create_motion_event (view, x, y);
3270 case GL_LABEL_OBJECT_BARCODE:
3271 gl_view_barcode_create_motion_event (view, x, y);
3274 g_message ("Invalid create type."); /*Should not happen!*/
3281 g_message ("Invalid view mode."); /*Should not happen!*/
3288 * FIXME: we re-establish grabs here if the grab has been lost. We seem to be
3289 * losing grabs when we emit signals that lead to the manipulation of
3290 * the GtkUIManager. Needs more investigation
3292 if (view->grabbed_flag && !gdk_pointer_is_grabbed ())
3294 gdk_pointer_grab (GTK_LAYOUT (view->canvas)->bin_window,
3296 (GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK),
3302 return return_value;
3305 /*---------------------------------------------------------------------------*/
3306 /* PRIVATE. Button press event handler. */
3307 /*---------------------------------------------------------------------------*/
3309 button_press_event_cb (glView *view,
3310 GdkEventButton *event)
3312 gboolean return_value = FALSE;
3316 glViewObject *view_object;
3317 glViewObjectHandle handle;
3319 cr = gdk_cairo_create (GTK_LAYOUT (view->canvas)->bin_window);
3322 * Translate to label coordinates
3324 scale = view->zoom * view->home_scale;
3325 cairo_scale (cr, scale, scale);
3326 cairo_translate (cr, view->x0, view->y0);
3330 cairo_device_to_user (cr, &x, &y);
3332 switch (event->button)
3337 * Handle event as appropriate for mode
3341 case GL_VIEW_MODE_ARROW:
3342 if ((view_object = view_handle_at (view, cr, event->x, event->y, &handle)))
3344 view->resize_object = view_object;
3345 view->resize_handle = handle;
3346 view->resize_honor_aspect = event->state & GDK_CONTROL_MASK;
3348 view->state = GL_VIEW_ARROW_RESIZE;
3350 else if ((view_object = view_view_object_at (view, cr, event->x, event->y)))
3352 if (event->state & GDK_CONTROL_MASK)
3354 if (gl_view_is_object_selected (view, view_object))
3356 /* Un-selecting a selected item */
3357 gl_view_unselect_object (view, view_object);
3359 /* Add to current selection */
3360 gl_view_select_object (view, view_object);
3365 if (!gl_view_is_object_selected (view, view_object))
3367 /* remove any selections before adding */
3368 gl_view_unselect_all (view);
3369 /* Add to current selection */
3370 gl_view_select_object (view, view_object);
3373 view->move_last_x = x;
3374 view->move_last_y = y;
3376 view->state = GL_VIEW_ARROW_MOVE;
3380 if (!(event->state & GDK_CONTROL_MASK))
3382 gl_view_unselect_all (view);
3385 view->select_region_visible = TRUE;
3386 view->select_region.x1 = x;
3387 view->select_region.y1 = y;
3388 view->select_region.x2 = x;
3389 view->select_region.y2 = y;
3391 view->state = GL_VIEW_ARROW_SELECT_REGION;
3395 return_value = TRUE;
3398 case GL_VIEW_MODE_OBJECT_CREATE:
3399 switch (view->create_type)
3401 case GL_LABEL_OBJECT_BOX:
3402 gl_view_box_create_button_press_event (view, x, y);
3404 case GL_LABEL_OBJECT_ELLIPSE:
3405 gl_view_ellipse_create_button_press_event (view, x, y);
3407 case GL_LABEL_OBJECT_LINE:
3408 gl_view_line_create_button_press_event (view, x, y);
3410 case GL_LABEL_OBJECT_IMAGE:
3411 gl_view_image_create_button_press_event (view, x, y);
3413 case GL_LABEL_OBJECT_TEXT:
3414 gl_view_text_create_button_press_event (view, x, y);
3416 case GL_LABEL_OBJECT_BARCODE:
3417 gl_view_barcode_create_button_press_event (view, x, y);
3420 g_message ("Invalid create type."); /*Should not happen!*/
3422 view->state = GL_VIEW_CREATE_DRAG;
3423 return_value = TRUE;
3427 g_message ("Invalid view mode."); /*Should not happen!*/
3430 view->grabbed_flag = TRUE;
3431 gdk_pointer_grab (GTK_LAYOUT (view->canvas)->bin_window,
3433 (GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK),
3440 g_signal_emit (G_OBJECT (view),
3441 signals[CONTEXT_MENU_ACTIVATE], 0,
3442 event->button, event->time);
3443 return_value = TRUE;
3450 return return_value;
3453 /*---------------------------------------------------------------------------*/
3454 /* PRIVATE. Button release event handler. */
3455 /*---------------------------------------------------------------------------*/
3457 button_release_event_cb (glView *view,
3458 GdkEventButton *event)
3460 gboolean return_value = FALSE;
3466 cr = gdk_cairo_create (GTK_LAYOUT (view->canvas)->bin_window);
3469 * Translate to label coordinates
3471 scale = view->zoom * view->home_scale;
3472 cairo_scale (cr, scale, scale);
3473 cairo_translate (cr, view->x0, view->y0);
3477 cairo_device_to_user (cr, &x, &y);
3479 switch (event->button)
3483 view->grabbed_flag = FALSE;
3484 gdk_pointer_ungrab (event->time);
3486 * Handle event as appropriate for mode
3490 case GL_VIEW_MODE_ARROW:
3491 switch (view->state)
3493 case GL_VIEW_ARROW_RESIZE:
3494 view->resize_object = NULL;
3496 view->state = GL_VIEW_IDLE;
3499 case GL_VIEW_ARROW_SELECT_REGION:
3501 gl_view_update_region (view, cr, &view->select_region);
3503 gl_view_update (view);
3506 view->select_region_visible = FALSE;
3507 view->select_region.x2 = x;
3508 view->select_region.y2 = y;
3510 gl_view_select_region (view, &view->select_region);
3512 view->state = GL_VIEW_IDLE;
3516 view->state = GL_VIEW_IDLE;
3521 return_value = TRUE;
3525 case GL_VIEW_MODE_OBJECT_CREATE:
3526 switch (view->create_type)
3528 case GL_LABEL_OBJECT_BOX:
3529 gl_view_box_create_button_release_event (view, x, y);
3531 case GL_LABEL_OBJECT_ELLIPSE:
3532 gl_view_ellipse_create_button_release_event (view, x, y);
3534 case GL_LABEL_OBJECT_LINE:
3535 gl_view_line_create_button_release_event (view, x, y);
3537 case GL_LABEL_OBJECT_IMAGE:
3538 gl_view_image_create_button_release_event (view, x, y);
3540 case GL_LABEL_OBJECT_TEXT:
3541 gl_view_text_create_button_release_event (view, x, y);
3543 case GL_LABEL_OBJECT_BARCODE:
3544 gl_view_barcode_create_button_release_event (view, x, y);
3547 g_message ("Invalid create type."); /*Should not happen!*/
3549 view->mode = GL_VIEW_MODE_ARROW;
3550 view->state = GL_VIEW_IDLE;
3551 cursor = gdk_cursor_new (GDK_LEFT_PTR);
3552 gdk_window_set_cursor (view->canvas->window, cursor);
3553 gdk_cursor_unref (cursor);
3558 g_message ("Invalid view mode."); /*Should not happen!*/
3565 return return_value;
3568 /*---------------------------------------------------------------------------*/
3569 /* PRIVATE. Key press event handler. */
3570 /*---------------------------------------------------------------------------*/
3572 key_press_event_cb (glView *view,
3577 gl_debug (DEBUG_VIEW, "");
3579 if ( (view->mode == GL_VIEW_MODE_ARROW) &&
3580 (view->state == GL_VIEW_IDLE) )
3582 switch (event->keyval) {
3586 gl_view_move_selection (view, -1.0 / (view->zoom), 0.0);
3590 gl_view_move_selection (view, 0.0, -1.0 / (view->zoom));
3594 gl_view_move_selection (view, 1.0 / (view->zoom), 0.0);
3598 gl_view_move_selection (view, 0.0, 1.0 / (view->zoom));
3602 gl_view_delete_selection (view);
3603 cursor = gdk_cursor_new (GDK_LEFT_PTR);
3604 gdk_window_set_cursor (GTK_WIDGET (view->canvas)->window
3606 gdk_cursor_unref (cursor);
3613 return TRUE; /* We handled this or we were dragging. */