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);
971 cairo_rectangle (cr, x1, y1, w, h);
973 cairo_set_source_rgba (cr, SELECT_FILL_RGBA_ARGS);
974 cairo_fill_preserve (cr);
976 cairo_set_line_width (cr, SELECT_LINE_WIDTH_PIXELS/(view->home_scale * view->zoom));
977 cairo_set_source_rgba (cr, SELECT_LINE_RGBA_ARGS);
982 /*****************************************************************************/
984 /*****************************************************************************/
986 gl_view_show_grid (glView *view)
988 g_return_if_fail (view && GL_IS_VIEW (view));
990 view->grid_visible = TRUE;
991 gl_view_update (view);
994 /*****************************************************************************/
996 /*****************************************************************************/
998 gl_view_hide_grid (glView *view)
1000 g_return_if_fail (view && GL_IS_VIEW (view));
1002 view->grid_visible = FALSE;
1003 gl_view_update (view);
1006 /*****************************************************************************/
1007 /* Set grid spacing. */
1008 /*****************************************************************************/
1010 gl_view_set_grid_spacing (glView *view,
1013 g_return_if_fail (view && GL_IS_VIEW (view));
1015 view->grid_spacing = spacing;
1016 gl_view_update (view);
1019 /*****************************************************************************/
1021 /*****************************************************************************/
1023 gl_view_show_markup (glView *view)
1025 g_return_if_fail (view && GL_IS_VIEW (view));
1027 view->markup_visible = TRUE;
1028 gl_view_update (view);
1031 /*****************************************************************************/
1033 /*****************************************************************************/
1035 gl_view_hide_markup (glView *view)
1037 g_return_if_fail (view && GL_IS_VIEW (view));
1039 view->markup_visible = FALSE;
1040 gl_view_update (view);
1043 /*****************************************************************************/
1044 /* Set arrow mode. */
1045 /*****************************************************************************/
1047 gl_view_arrow_mode (glView *view)
1051 gl_debug (DEBUG_VIEW, "START");
1053 g_return_if_fail (view && GL_IS_VIEW (view));
1055 cursor = gdk_cursor_new (GDK_LEFT_PTR);
1056 gdk_window_set_cursor (view->canvas->window, cursor);
1057 gdk_cursor_unref (cursor);
1059 view->mode = GL_VIEW_MODE_ARROW;
1060 view->state = GL_VIEW_IDLE;
1062 gl_debug (DEBUG_VIEW, "END");
1065 /*****************************************************************************/
1066 /* Set create text object mode. */
1067 /*****************************************************************************/
1069 gl_view_object_create_mode (glView *view,
1070 glLabelObjectType type)
1072 GdkCursor *cursor = NULL;
1074 gl_debug (DEBUG_VIEW, "START");
1076 g_return_if_fail (view && GL_IS_VIEW (view));
1080 case GL_LABEL_OBJECT_BOX:
1081 cursor = gl_view_box_get_create_cursor ();
1083 case GL_LABEL_OBJECT_ELLIPSE:
1084 cursor = gl_view_ellipse_get_create_cursor ();
1086 case GL_LABEL_OBJECT_LINE:
1087 cursor = gl_view_line_get_create_cursor ();
1089 case GL_LABEL_OBJECT_IMAGE:
1090 cursor = gl_view_image_get_create_cursor ();
1092 case GL_LABEL_OBJECT_TEXT:
1093 cursor = gl_view_text_get_create_cursor ();
1095 case GL_LABEL_OBJECT_BARCODE:
1096 cursor = gl_view_barcode_get_create_cursor ();
1099 g_message ("Invalid label object type.");/*Should not happen!*/
1103 gdk_window_set_cursor (view->canvas->window, cursor);
1104 gdk_cursor_unref (cursor);
1106 view->mode = GL_VIEW_MODE_OBJECT_CREATE;
1107 view->state = GL_VIEW_IDLE;
1108 view->create_type = type;
1110 gl_debug (DEBUG_VIEW, "END");
1113 /*****************************************************************************/
1114 /* Select given object (adding to current selection). */
1115 /*****************************************************************************/
1117 gl_view_select_object (glView *view,
1118 glViewObject *view_object)
1120 gl_debug (DEBUG_VIEW, "START");
1122 g_return_if_fail (view && GL_IS_VIEW (view));
1124 select_object_real (view, view_object);
1126 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1128 gl_debug (DEBUG_VIEW, "END");
1131 /*****************************************************************************/
1132 /* Unselect given object (removing from current selection). */
1133 /*****************************************************************************/
1135 gl_view_unselect_object (glView *view,
1136 glViewObject *view_object)
1138 gl_debug (DEBUG_VIEW, "START");
1140 g_return_if_fail (view && GL_IS_VIEW (view));
1142 unselect_object_real (view, view_object);
1144 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1146 gl_debug (DEBUG_VIEW, "END");
1149 /*****************************************************************************/
1150 /* Select all items. */
1151 /*****************************************************************************/
1153 gl_view_select_all (glView *view)
1157 gl_debug (DEBUG_VIEW, "START");
1159 g_return_if_fail (view && GL_IS_VIEW (view));
1161 /* 1st unselect anything already selected. */
1162 for (p = view->selected_object_list; p != NULL; p = p_next) {
1164 unselect_object_real (view, GL_VIEW_OBJECT (p->data));
1167 /* Finally select all objects. */
1168 for (p = view->object_list; p != NULL; p = p->next) {
1169 select_object_real (view, GL_VIEW_OBJECT (p->data));
1172 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1174 gl_debug (DEBUG_VIEW, "END");
1177 /*****************************************************************************/
1178 /* Remove all selections */
1179 /*****************************************************************************/
1181 gl_view_unselect_all (glView *view)
1186 gl_debug (DEBUG_VIEW, "START");
1188 g_return_if_fail (view && GL_IS_VIEW (view));
1190 for (p = view->selected_object_list; p != NULL; p = p_next) {
1192 unselect_object_real (view, GL_VIEW_OBJECT (p->data));
1195 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1197 gl_debug (DEBUG_VIEW, "END");
1200 /*****************************************************************************/
1201 /* Select all objects within given rectangular region (adding to selection). */
1202 /*****************************************************************************/
1204 gl_view_select_region (glView *view,
1205 glLabelRegion *region)
1208 glViewObject *view_object;
1209 glLabelObject *object;
1212 glLabelRegion obj_extent;
1214 gl_debug (DEBUG_VIEW, "START");
1216 g_return_if_fail (view && GL_IS_VIEW (view));
1218 r_x1 = MIN (region->x1, region->x2);
1219 r_y1 = MIN (region->y1, region->y2);
1220 r_x2 = MAX (region->x1, region->x2);
1221 r_y2 = MAX (region->y1, region->y2);
1223 for (p = view->object_list; p != NULL; p = p->next)
1225 view_object = GL_VIEW_OBJECT(p->data);
1226 if (!gl_view_is_object_selected (view, view_object))
1229 object = gl_view_object_get_object (view_object);
1231 gl_label_object_get_extent (object, &obj_extent);
1232 if ((obj_extent.x1 >= r_x1) &&
1233 (obj_extent.x2 <= r_x2) &&
1234 (obj_extent.y1 >= r_y1) &&
1235 (obj_extent.y2 <= r_y2))
1237 select_object_real (view, view_object);
1243 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1245 gl_debug (DEBUG_VIEW, "END");
1248 /*---------------------------------------------------------------------------*/
1249 /* PRIVATE. Select an object. */
1250 /*---------------------------------------------------------------------------*/
1252 select_object_real (glView *view,
1253 glViewObject *view_object)
1255 gl_debug (DEBUG_VIEW, "START");
1257 g_return_if_fail (view && GL_IS_VIEW (view));
1258 g_return_if_fail (GL_IS_VIEW_OBJECT (view_object));
1260 if (!gl_view_is_object_selected (view, view_object)) {
1261 view->selected_object_list =
1262 g_list_append (view->selected_object_list, view_object);
1264 gtk_widget_grab_focus (GTK_WIDGET (view->canvas));
1266 gl_view_update (view);
1268 gl_debug (DEBUG_VIEW, "END");
1271 /*---------------------------------------------------------------------------*/
1272 /* PRIVATE. Un-select object. */
1273 /*---------------------------------------------------------------------------*/
1275 unselect_object_real (glView *view,
1276 glViewObject *view_object)
1278 gl_debug (DEBUG_VIEW, "START");
1280 g_return_if_fail (view && GL_IS_VIEW (view));
1281 g_return_if_fail (GL_IS_VIEW_OBJECT (view_object));
1283 view->selected_object_list =
1284 g_list_remove (view->selected_object_list, view_object);
1286 gl_view_update (view);
1288 gl_debug (DEBUG_VIEW, "END");
1291 /*---------------------------------------------------------------------------*/
1292 /* PRIVATE. Return object at (x,y). */
1293 /*---------------------------------------------------------------------------*/
1294 static glViewObject *
1295 view_view_object_at (glView *view,
1301 glViewObject *view_object;
1303 g_return_val_if_fail (view && GL_IS_VIEW (view), NULL);
1305 for (p_obj = g_list_last (view->object_list); p_obj != NULL; p_obj = p_obj->prev)
1308 view_object = GL_VIEW_OBJECT (p_obj->data);
1310 if (gl_view_object_at (view_object, cr, x, y))
1320 /*---------------------------------------------------------------------------*/
1321 /* PRIVATE. Return object handle at (x,y). */
1322 /*---------------------------------------------------------------------------*/
1323 static glViewObject *
1324 view_handle_at (glView *view,
1328 glViewObjectHandle *handle)
1331 glViewObject *view_object;
1333 g_return_val_if_fail (view && GL_IS_VIEW (view), NULL);
1335 for (p_obj = g_list_last (view->selected_object_list); p_obj != NULL; p_obj = p_obj->prev)
1338 view_object = GL_VIEW_OBJECT (p_obj->data);
1340 if ((*handle = gl_view_object_handle_at (view_object, cr, x, y)))
1350 /*****************************************************************************/
1351 /* Is the object in our current selection? */
1352 /*****************************************************************************/
1354 gl_view_is_object_selected (glView *view,
1355 glViewObject *view_object)
1357 gl_debug (DEBUG_VIEW, "");
1359 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
1360 g_return_val_if_fail (GL_IS_VIEW_OBJECT (view_object), FALSE);
1362 if (g_list_find (view->selected_object_list, view_object) == NULL) {
1368 /*****************************************************************************/
1369 /* Is our current selection empty? */
1370 /*****************************************************************************/
1372 gl_view_is_selection_empty (glView *view)
1374 gl_debug (DEBUG_VIEW, "");
1376 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
1378 if (view->selected_object_list == NULL) {
1385 /*****************************************************************************/
1386 /* Is our current selection atomic? I.e. only one item selected. */
1387 /*****************************************************************************/
1389 gl_view_is_selection_atomic (glView *view)
1391 gl_debug (DEBUG_VIEW, "");
1393 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
1395 if (view->selected_object_list == NULL)
1397 if (view->selected_object_list->next == NULL)
1402 /*****************************************************************************/
1403 /* Delete selected objects. (Bypass clipboard) */
1404 /*****************************************************************************/
1406 gl_view_delete_selection (glView *view)
1412 gl_debug (DEBUG_VIEW, "START");
1414 g_return_if_fail (view && GL_IS_VIEW (view));
1416 object_list = view->selected_object_list;
1417 view->selected_object_list = NULL;
1418 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1420 for (p = object_list; p != NULL; p = p_next) {
1422 g_object_unref (G_OBJECT (p->data));
1423 object_list = g_list_delete_link (object_list, p);
1426 gl_debug (DEBUG_VIEW, "END");
1429 /*****************************************************************************/
1430 /* Get object property editor of first selected object. */
1431 /*****************************************************************************/
1433 gl_view_get_editor (glView *view)
1435 glViewObject *view_object;
1436 GtkWidget *editor = NULL;
1438 gl_debug (DEBUG_VIEW, "START");
1440 g_return_val_if_fail (view && GL_IS_VIEW (view), NULL);
1442 if (!gl_view_is_selection_empty (view)) {
1444 view_object = GL_VIEW_OBJECT(view->selected_object_list->data);
1445 editor = gl_view_object_get_editor (view_object);
1449 gl_debug (DEBUG_VIEW, "END");
1454 /*****************************************************************************/
1455 /* Raise selected items to top. */
1456 /*****************************************************************************/
1458 gl_view_raise_selection (glView *view)
1461 glViewObject *view_object;
1462 glLabelObject *object;
1464 gl_debug (DEBUG_VIEW, "START");
1466 g_return_if_fail (view && GL_IS_VIEW (view));
1468 for (p = view->selected_object_list; p != NULL; p = p->next) {
1469 view_object = GL_VIEW_OBJECT (p->data);
1470 object = gl_view_object_get_object (view_object);
1471 gl_label_object_raise_to_top (object);
1474 gl_debug (DEBUG_VIEW, "END");
1477 /*****************************************************************************/
1478 /* Lower selected items to bottom. */
1479 /*****************************************************************************/
1481 gl_view_lower_selection (glView *view)
1484 glViewObject *view_object;
1485 glLabelObject *object;
1487 gl_debug (DEBUG_VIEW, "START");
1489 g_return_if_fail (view && GL_IS_VIEW (view));
1491 for (p = view->selected_object_list; p != NULL; p = p->next) {
1492 view_object = GL_VIEW_OBJECT (p->data);
1493 object = gl_view_object_get_object (view_object);
1494 gl_label_object_lower_to_bottom (object);
1497 gl_debug (DEBUG_VIEW, "END");
1500 /*****************************************************************************/
1501 /* Rotate selected objects by given angle. */
1502 /*****************************************************************************/
1504 gl_view_rotate_selection (glView *view,
1508 glViewObject *view_object;
1509 glLabelObject *object;
1511 gl_debug (DEBUG_VIEW, "START");
1513 g_return_if_fail (view && GL_IS_VIEW (view));
1515 for (p = view->selected_object_list; p != NULL; p = p->next) {
1516 view_object = GL_VIEW_OBJECT (p->data);
1517 object = gl_view_object_get_object (view_object);
1518 gl_label_object_rotate (object, theta_degs);
1521 gl_debug (DEBUG_VIEW, "END");
1524 /*****************************************************************************/
1525 /* Rotate selected objects 90 degrees left. */
1526 /*****************************************************************************/
1528 gl_view_rotate_selection_left (glView *view)
1531 glViewObject *view_object;
1532 glLabelObject *object;
1534 gl_debug (DEBUG_VIEW, "START");
1536 g_return_if_fail (view && GL_IS_VIEW (view));
1538 for (p = view->selected_object_list; p != NULL; p = p->next) {
1539 view_object = GL_VIEW_OBJECT (p->data);
1540 object = gl_view_object_get_object (view_object);
1541 gl_label_object_rotate (object, -90.0);
1544 gl_debug (DEBUG_VIEW, "END");
1547 /*****************************************************************************/
1548 /* Rotate selected objects 90 degrees right. */
1549 /*****************************************************************************/
1551 gl_view_rotate_selection_right (glView *view)
1554 glViewObject *view_object;
1555 glLabelObject *object;
1557 gl_debug (DEBUG_VIEW, "START");
1559 g_return_if_fail (view && GL_IS_VIEW (view));
1561 for (p = view->selected_object_list; p != NULL; p = p->next) {
1562 view_object = GL_VIEW_OBJECT (p->data);
1563 object = gl_view_object_get_object (view_object);
1564 gl_label_object_rotate (object, 90.0);
1567 gl_debug (DEBUG_VIEW, "END");
1570 /*****************************************************************************/
1571 /* Flip selected objects horizontally. */
1572 /*****************************************************************************/
1574 gl_view_flip_selection_horiz (glView *view)
1577 glViewObject *view_object;
1578 glLabelObject *object;
1580 gl_debug (DEBUG_VIEW, "START");
1582 g_return_if_fail (view && GL_IS_VIEW (view));
1584 for (p = view->selected_object_list; p != NULL; p = p->next) {
1585 view_object = GL_VIEW_OBJECT (p->data);
1586 object = gl_view_object_get_object (view_object);
1587 gl_label_object_flip_horiz (object);
1590 gl_debug (DEBUG_VIEW, "END");
1593 /*****************************************************************************/
1594 /* Flip selected objects vertically. */
1595 /*****************************************************************************/
1597 gl_view_flip_selection_vert (glView *view)
1600 glViewObject *view_object;
1601 glLabelObject *object;
1603 gl_debug (DEBUG_VIEW, "START");
1605 g_return_if_fail (view && GL_IS_VIEW (view));
1607 for (p = view->selected_object_list; p != NULL; p = p->next) {
1608 view_object = GL_VIEW_OBJECT (p->data);
1609 object = gl_view_object_get_object (view_object);
1610 gl_label_object_flip_vert (object);
1613 gl_debug (DEBUG_VIEW, "END");
1616 /*****************************************************************************/
1617 /* Align selected objects to left most edge. */
1618 /*****************************************************************************/
1620 gl_view_align_selection_left (glView *view)
1623 glViewObject *view_object;
1624 glLabelObject *object;
1626 glLabelRegion obj_extent;
1628 gl_debug (DEBUG_VIEW, "START");
1630 g_return_if_fail (view && GL_IS_VIEW (view));
1632 g_return_if_fail (!gl_view_is_selection_empty (view) &&
1633 !gl_view_is_selection_atomic (view));
1635 /* find left most edge */
1636 p = view->selected_object_list;
1637 view_object = GL_VIEW_OBJECT (p->data);
1638 object = gl_view_object_get_object (view_object);
1639 gl_label_object_get_extent (object, &obj_extent);
1640 x1_min = obj_extent.x1;
1641 for (p = p->next; p != NULL; p = p->next)
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 if ( obj_extent.x1 < x1_min ) x1_min = obj_extent.x1;
1649 /* now adjust the object positions to line up the left edges */
1650 for (p = view->selected_object_list; p != NULL; p = p->next)
1652 view_object = GL_VIEW_OBJECT (p->data);
1653 object = gl_view_object_get_object (view_object);
1654 gl_label_object_get_extent (object, &obj_extent);
1655 dx = x1_min - obj_extent.x1;
1656 gl_label_object_set_position_relative (object, dx, 0.0);
1659 gl_debug (DEBUG_VIEW, "END");
1663 /*****************************************************************************/
1664 /* Align selected objects to right most edge. */
1665 /*****************************************************************************/
1667 gl_view_align_selection_right (glView *view)
1670 glViewObject *view_object;
1671 glLabelObject *object;
1673 glLabelRegion obj_extent;
1675 gl_debug (DEBUG_VIEW, "START");
1677 g_return_if_fail (view && GL_IS_VIEW (view));
1679 g_return_if_fail (!gl_view_is_selection_empty (view) &&
1680 !gl_view_is_selection_atomic (view));
1682 /* find right most edge */
1683 p = view->selected_object_list;
1684 view_object = GL_VIEW_OBJECT (p->data);
1685 object = gl_view_object_get_object (view_object);
1686 gl_label_object_get_extent (object, &obj_extent);
1687 x2_max = obj_extent.x2;
1688 for (p = p->next; p != NULL; p = p->next)
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 if ( obj_extent.x2 > x2_max ) x2_max = obj_extent.x2;
1696 /* now adjust the object positions to line up the right edges */
1697 for (p = view->selected_object_list; p != NULL; p = p->next)
1699 view_object = GL_VIEW_OBJECT (p->data);
1700 object = gl_view_object_get_object (view_object);
1701 gl_label_object_get_extent (object, &obj_extent);
1702 dx = x2_max - obj_extent.x2;
1703 gl_label_object_set_position_relative (object, dx, 0.0);
1706 gl_debug (DEBUG_VIEW, "END");
1709 /*****************************************************************************/
1710 /* Align selected objects to horizontal center of objects. */
1711 /*****************************************************************************/
1713 gl_view_align_selection_hcenter (glView *view)
1716 glViewObject *view_object;
1717 glLabelObject *object;
1721 glLabelRegion obj_extent;
1725 gl_debug (DEBUG_VIEW, "START");
1727 g_return_if_fail (view && GL_IS_VIEW (view));
1729 g_return_if_fail (!gl_view_is_selection_empty (view) &&
1730 !gl_view_is_selection_atomic (view));
1732 /* find average center of objects */
1735 for (p = view->selected_object_list; p != NULL; p = p->next)
1737 view_object = GL_VIEW_OBJECT (p->data);
1738 object = gl_view_object_get_object (view_object);
1739 gl_label_object_get_extent (object, &obj_extent);
1740 xsum += (obj_extent.x1 + obj_extent.x2) / 2.0;
1745 /* find center of object closest to average center */
1746 p = view->selected_object_list;
1747 view_object = GL_VIEW_OBJECT (p->data);
1748 object = gl_view_object_get_object (view_object);
1749 gl_label_object_get_extent (object, &obj_extent);
1750 dxmin = fabs (xavg - (obj_extent.x1 + obj_extent.x2)/2.0);
1751 xcenter = (obj_extent.x1 + obj_extent.x2)/2.0;
1752 for (p = p->next; p != NULL; p = p->next)
1754 view_object = GL_VIEW_OBJECT (p->data);
1755 object = gl_view_object_get_object (view_object);
1756 gl_label_object_get_extent (object, &obj_extent);
1757 dx = fabs (xavg - (obj_extent.x1 + obj_extent.x2)/2.0);
1761 xcenter = (obj_extent.x1 + obj_extent.x2)/2.0;
1765 /* now adjust the object positions to line up this center */
1766 for (p = view->selected_object_list; p != NULL; p = p->next) {
1767 view_object = GL_VIEW_OBJECT (p->data);
1768 object = gl_view_object_get_object (view_object);
1769 gl_label_object_get_extent (object, &obj_extent);
1770 dx = xcenter - (obj_extent.x1 + obj_extent.x2)/2.0;
1771 gl_label_object_set_position_relative (object, dx, 0.0);
1774 gl_debug (DEBUG_VIEW, "END");
1777 /*****************************************************************************/
1778 /* Align selected objects to top most edge. */
1779 /*****************************************************************************/
1781 gl_view_align_selection_top (glView *view)
1784 glViewObject *view_object;
1785 glLabelObject *object;
1787 glLabelRegion obj_extent;
1789 gl_debug (DEBUG_VIEW, "START");
1791 g_return_if_fail (view && GL_IS_VIEW (view));
1793 g_return_if_fail (!gl_view_is_selection_empty (view) &&
1794 !gl_view_is_selection_atomic (view));
1796 /* find top most edge */
1797 p = view->selected_object_list;
1798 view_object = GL_VIEW_OBJECT (p->data);
1799 object = gl_view_object_get_object (view_object);
1800 gl_label_object_get_extent (object, &obj_extent);
1801 y1_min = obj_extent.y1;
1802 for (p = p->next; p != NULL; p = p->next)
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 if ( obj_extent.y1 < y1_min ) y1_min = obj_extent.y1;
1810 /* now adjust the object positions to line up the top edges */
1811 for (p = view->selected_object_list; p != NULL; p = p->next)
1813 view_object = GL_VIEW_OBJECT (p->data);
1814 object = gl_view_object_get_object (view_object);
1815 gl_label_object_get_extent (object, &obj_extent);
1816 dy = y1_min - obj_extent.y1;
1817 gl_label_object_set_position_relative (object, 0.0, dy);
1820 gl_debug (DEBUG_VIEW, "END");
1823 /*****************************************************************************/
1824 /* Align selected objects to bottom most edge. */
1825 /*****************************************************************************/
1827 gl_view_align_selection_bottom (glView *view)
1830 glViewObject *view_object;
1831 glLabelObject *object;
1833 glLabelRegion obj_extent;
1835 gl_debug (DEBUG_VIEW, "START");
1837 g_return_if_fail (view && GL_IS_VIEW (view));
1839 g_return_if_fail (!gl_view_is_selection_empty (view) &&
1840 !gl_view_is_selection_atomic (view));
1842 /* find bottom most edge */
1843 p = view->selected_object_list;
1844 view_object = GL_VIEW_OBJECT (p->data);
1845 object = gl_view_object_get_object (view_object);
1846 gl_label_object_get_extent (object, &obj_extent);
1847 y2_max = obj_extent.y2;
1848 for (p = p->next; p != NULL; p = p->next)
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 if ( obj_extent.y2 > y2_max ) y2_max = obj_extent.y2;
1856 /* now adjust the object positions to line up the bottom edges */
1857 for (p = view->selected_object_list; p != NULL; p = p->next)
1859 view_object = GL_VIEW_OBJECT (p->data);
1860 object = gl_view_object_get_object (view_object);
1861 gl_label_object_get_extent (object, &obj_extent);
1862 dy = y2_max - obj_extent.y2;
1863 gl_label_object_set_position_relative (object, 0.0, dy);
1866 gl_debug (DEBUG_VIEW, "END");
1869 /*****************************************************************************/
1870 /* Align selected objects to viertical center of objects. */
1871 /*****************************************************************************/
1873 gl_view_align_selection_vcenter (glView *view)
1876 glViewObject *view_object;
1877 glLabelObject *object;
1881 glLabelRegion obj_extent;
1885 gl_debug (DEBUG_VIEW, "START");
1887 g_return_if_fail (view && GL_IS_VIEW (view));
1889 g_return_if_fail (!gl_view_is_selection_empty (view) &&
1890 !gl_view_is_selection_atomic (view));
1892 /* find average center of objects */
1895 for (p = view->selected_object_list; p != NULL; p = p->next)
1897 view_object = GL_VIEW_OBJECT (p->data);
1898 object = gl_view_object_get_object (view_object);
1899 gl_label_object_get_extent (object, &obj_extent);
1900 ysum += (obj_extent.y1 + obj_extent.y2) / 2.0;
1905 /* find center of object closest to average center */
1906 p = view->selected_object_list;
1907 view_object = GL_VIEW_OBJECT (p->data);
1908 object = gl_view_object_get_object (view_object);
1909 gl_label_object_get_extent (object, &obj_extent);
1910 dymin = fabs (yavg - (obj_extent.y1 + obj_extent.y2)/2.0);
1911 ycenter = (obj_extent.y1 + obj_extent.y2)/2.0;
1912 for (p = p->next; p != NULL; p = p->next)
1914 view_object = GL_VIEW_OBJECT (p->data);
1915 object = gl_view_object_get_object (view_object);
1916 gl_label_object_get_extent (object, &obj_extent);
1917 dy = fabs (yavg - (obj_extent.y1 + obj_extent.y2)/2.0);
1921 ycenter = (obj_extent.y1 + obj_extent.y2)/2.0;
1925 /* now adjust the object positions to line up this center */
1926 for (p = view->selected_object_list; p != NULL; p = p->next)
1928 view_object = GL_VIEW_OBJECT (p->data);
1929 object = gl_view_object_get_object (view_object);
1930 gl_label_object_get_extent (object, &obj_extent);
1931 dy = ycenter - (obj_extent.y1 + obj_extent.y2)/2.0;
1932 gl_label_object_set_position_relative (object, 0.0, dy);
1935 gl_debug (DEBUG_VIEW, "END");
1938 /*****************************************************************************/
1939 /* Center selected objects to in center of label. */
1940 /*****************************************************************************/
1942 gl_view_center_selection_horiz (glView *view)
1945 glViewObject *view_object;
1946 glLabelObject *object;
1948 gdouble x_label_center;
1949 gdouble x_obj_center;
1950 glLabelRegion obj_extent;
1953 gl_debug (DEBUG_VIEW, "START");
1955 g_return_if_fail (view && GL_IS_VIEW (view));
1957 g_return_if_fail (!gl_view_is_selection_empty (view));
1959 gl_label_get_size (view->label, &w, &h);
1960 x_label_center = w / 2.0;
1962 /* adjust the object positions */
1963 for (p = view->selected_object_list; p != NULL; p = p->next)
1965 view_object = GL_VIEW_OBJECT (p->data);
1966 object = gl_view_object_get_object (view_object);
1967 gl_label_object_get_extent (object, &obj_extent);
1968 x_obj_center = (obj_extent.x1 + obj_extent.x2) / 2.0;
1969 dx = x_label_center - x_obj_center;
1970 gl_label_object_set_position_relative (object, dx, 0.0);
1973 gl_debug (DEBUG_VIEW, "END");
1977 /*****************************************************************************/
1978 /* Center selected objects to in center of label. */
1979 /*****************************************************************************/
1981 gl_view_center_selection_vert (glView *view)
1984 glViewObject *view_object;
1985 glLabelObject *object;
1987 gdouble y_label_center;
1988 gdouble y_obj_center;
1989 glLabelRegion obj_extent;
1992 gl_debug (DEBUG_VIEW, "START");
1994 g_return_if_fail (view && GL_IS_VIEW (view));
1996 g_return_if_fail (!gl_view_is_selection_empty (view));
1998 gl_label_get_size (view->label, &w, &h);
1999 y_label_center = h / 2.0;
2001 /* adjust the object positions */
2002 for (p = view->selected_object_list; p != NULL; p = p->next)
2004 view_object = GL_VIEW_OBJECT (p->data);
2005 object = gl_view_object_get_object (view_object);
2006 gl_label_object_get_extent (object, &obj_extent);
2007 y_obj_center = (obj_extent.y1 + obj_extent.y2) / 2.0;
2008 dy = y_label_center - y_obj_center;
2009 gl_label_object_set_position_relative (object, 0.0, dy);
2012 gl_debug (DEBUG_VIEW, "END");
2016 /*****************************************************************************/
2017 /* Move selected objects */
2018 /*****************************************************************************/
2020 gl_view_move_selection (glView *view,
2025 glLabelObject *object;
2027 gl_debug (DEBUG_VIEW, "START");
2029 g_return_if_fail (view && GL_IS_VIEW (view));
2031 for (p = view->selected_object_list; p != NULL; p = p->next)
2034 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2035 gl_label_object_set_position_relative (object, dx, dy);
2039 gl_debug (DEBUG_VIEW, "END");
2042 /*****************************************************************************/
2043 /* Can text properties be set for selection? */
2044 /*****************************************************************************/
2046 gl_view_can_selection_text (glView *view)
2049 glLabelObject *object;
2051 gl_debug (DEBUG_VIEW, "");
2053 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
2055 for (p = view->selected_object_list; p != NULL; p = p->next)
2058 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2059 if (gl_label_object_can_text (object))
2069 /*****************************************************************************/
2070 /* Set font family for all text contained in selected objects. */
2071 /*****************************************************************************/
2073 gl_view_set_selection_font_family (glView *view,
2074 const gchar *font_family)
2077 glLabelObject *object;
2079 gl_debug (DEBUG_VIEW, "START");
2081 g_return_if_fail (view && GL_IS_VIEW (view));
2083 for (p = view->selected_object_list; p != NULL; p = p->next) {
2085 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2086 gl_label_object_set_font_family (object, font_family);
2090 gl_debug (DEBUG_VIEW, "END");
2093 /*****************************************************************************/
2094 /* Set font size for all text contained in selected objects. */
2095 /*****************************************************************************/
2097 gl_view_set_selection_font_size (glView *view,
2101 glLabelObject *object;
2103 gl_debug (DEBUG_VIEW, "START");
2105 g_return_if_fail (view && GL_IS_VIEW (view));
2107 for (p = view->selected_object_list; p != NULL; p = p->next) {
2109 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2110 gl_label_object_set_font_size (object, font_size);
2114 gl_debug (DEBUG_VIEW, "END");
2117 /*****************************************************************************/
2118 /* Set font weight for all text contained in selected objects. */
2119 /*****************************************************************************/
2121 gl_view_set_selection_font_weight (glView *view,
2122 PangoWeight font_weight)
2125 glLabelObject *object;
2127 gl_debug (DEBUG_VIEW, "START");
2129 g_return_if_fail (view && GL_IS_VIEW (view));
2131 for (p = view->selected_object_list; p != NULL; p = p->next) {
2133 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2134 gl_label_object_set_font_weight (object, font_weight);
2138 gl_debug (DEBUG_VIEW, "END");
2141 /*****************************************************************************/
2142 /* Set font italic flag for all text contained in selected objects. */
2143 /*****************************************************************************/
2145 gl_view_set_selection_font_italic_flag (glView *view,
2146 gboolean font_italic_flag)
2149 glLabelObject *object;
2151 gl_debug (DEBUG_VIEW, "START");
2153 g_return_if_fail (view && GL_IS_VIEW (view));
2155 for (p = view->selected_object_list; p != NULL; p = p->next) {
2157 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2158 gl_label_object_set_font_italic_flag (object, font_italic_flag);
2162 gl_debug (DEBUG_VIEW, "END");
2165 /*****************************************************************************/
2166 /* Set text alignment for all text contained in selected objects. */
2167 /*****************************************************************************/
2169 gl_view_set_selection_text_alignment (glView *view,
2170 PangoAlignment text_alignment)
2173 glLabelObject *object;
2175 gl_debug (DEBUG_VIEW, "START");
2177 g_return_if_fail (view && GL_IS_VIEW (view));
2179 for (p = view->selected_object_list; p != NULL; p = p->next) {
2181 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2182 gl_label_object_set_text_alignment (object, text_alignment);
2186 gl_debug (DEBUG_VIEW, "END");
2189 /*****************************************************************************/
2190 /* Set text line spacing for all text contained in selected objects. */
2191 /*****************************************************************************/
2193 gl_view_set_selection_text_line_spacing (glView *view,
2194 gdouble text_line_spacing)
2197 glLabelObject *object;
2199 gl_debug (DEBUG_VIEW, "START");
2201 g_return_if_fail (view && GL_IS_VIEW (view));
2203 for (p = view->selected_object_list; p != NULL; p = p->next) {
2205 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2206 gl_label_object_set_text_line_spacing (object, text_line_spacing);
2210 gl_debug (DEBUG_VIEW, "END");
2212 /*****************************************************************************/
2213 /* Set text color for all text contained in selected objects. */
2214 /*****************************************************************************/
2216 gl_view_set_selection_text_color (glView *view,
2217 glColorNode *text_color_node)
2220 glLabelObject *object;
2222 gl_debug (DEBUG_VIEW, "START");
2224 g_return_if_fail (view && GL_IS_VIEW (view));
2226 for (p = view->selected_object_list; p != NULL; p = p->next) {
2228 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2229 gl_label_object_set_text_color (object, text_color_node);
2233 gl_debug (DEBUG_VIEW, "END");
2236 /*****************************************************************************/
2237 /* Can fill properties be set for selection? */
2238 /*****************************************************************************/
2240 gl_view_can_selection_fill (glView *view)
2243 glLabelObject *object;
2245 gl_debug (DEBUG_VIEW, "");
2247 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
2249 for (p = view->selected_object_list; p != NULL; p = p->next) {
2251 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2252 if (gl_label_object_can_fill (object)) {
2261 /*****************************************************************************/
2262 /* Set fill color for all selected objects. */
2263 /*****************************************************************************/
2265 gl_view_set_selection_fill_color (glView *view,
2266 glColorNode *fill_color_node)
2269 glLabelObject *object;
2271 gl_debug (DEBUG_VIEW, "START");
2273 g_return_if_fail (view && GL_IS_VIEW (view));
2275 for (p = view->selected_object_list; p != NULL; p = p->next) {
2277 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2278 gl_label_object_set_fill_color (object, fill_color_node);
2282 gl_debug (DEBUG_VIEW, "END");
2285 /*****************************************************************************/
2286 /* Can line color properties be set for selection? */
2287 /*****************************************************************************/
2289 gl_view_can_selection_line_color (glView *view)
2292 glLabelObject *object;
2294 gl_debug (DEBUG_VIEW, "");
2296 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
2298 for (p = view->selected_object_list; p != NULL; p = p->next) {
2300 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2301 if (gl_label_object_can_line_color (object)) {
2310 /*****************************************************************************/
2311 /* Set line color for all selected objects. */
2312 /*****************************************************************************/
2314 gl_view_set_selection_line_color (glView *view,
2315 glColorNode *line_color_node)
2318 glLabelObject *object;
2320 gl_debug (DEBUG_VIEW, "START");
2322 g_return_if_fail (view && GL_IS_VIEW (view));
2324 for (p = view->selected_object_list; p != NULL; p = p->next) {
2326 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2327 gl_label_object_set_line_color (object, line_color_node);
2331 gl_debug (DEBUG_VIEW, "END");
2334 /*****************************************************************************/
2335 /* Can line width properties be set for selection? */
2336 /*****************************************************************************/
2338 gl_view_can_selection_line_width (glView *view)
2341 glLabelObject *object;
2343 gl_debug (DEBUG_VIEW, "");
2345 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
2347 for (p = view->selected_object_list; p != NULL; p = p->next) {
2349 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2350 if (gl_label_object_can_line_width (object)) {
2359 /*****************************************************************************/
2360 /* Set line width for all selected objects. */
2361 /*****************************************************************************/
2363 gl_view_set_selection_line_width (glView *view,
2367 glLabelObject *object;
2369 gl_debug (DEBUG_VIEW, "START");
2371 g_return_if_fail (view && GL_IS_VIEW (view));
2373 for (p = view->selected_object_list; p != NULL; p = p->next) {
2375 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2376 gl_label_object_set_line_width (object, line_width);
2380 gl_debug (DEBUG_VIEW, "END");
2383 /*****************************************************************************/
2384 /* "Cut" selected items and place in clipboard selections. */
2385 /*****************************************************************************/
2387 gl_view_cut (glView *view)
2389 gl_debug (DEBUG_VIEW, "START");
2391 g_return_if_fail (view && GL_IS_VIEW (view));
2393 gl_view_copy (view);
2394 gl_view_delete_selection (view);
2396 gl_debug (DEBUG_VIEW, "END");
2399 /*****************************************************************************/
2400 /* "Copy" selected items to clipboard selections. */
2401 /*****************************************************************************/
2403 gl_view_copy (glView *view)
2406 glViewObject *view_object;
2407 glLabelObject *object;
2409 gl_debug (DEBUG_VIEW, "START");
2411 g_return_if_fail (view && GL_IS_VIEW (view));
2413 if (view->selected_object_list) {
2415 if ( view->selection_data ) {
2416 g_object_unref (view->selection_data);
2418 view->selection_data = GL_LABEL(gl_label_new ());
2419 gl_label_set_template (view->selection_data, view->label->template);
2420 gl_label_set_rotate_flag (view->selection_data, view->label->rotate_flag);
2422 for (p = view->selected_object_list; p != NULL; p = p->next) {
2424 view_object = GL_VIEW_OBJECT (p->data);
2425 object = gl_view_object_get_object (view_object);
2427 gl_label_object_dup (object, view->selection_data);
2431 gtk_selection_owner_set (view->invisible,
2432 clipboard_atom, GDK_CURRENT_TIME);
2433 view->have_selection = TRUE;
2437 gl_debug (DEBUG_VIEW, "END");
2440 /*****************************************************************************/
2441 /* "Paste" from private clipboard selection. */
2442 /*****************************************************************************/
2444 gl_view_paste (glView *view)
2446 gl_debug (DEBUG_VIEW, "START");
2448 g_return_if_fail (view && GL_IS_VIEW (view));
2450 gtk_selection_convert (GTK_WIDGET (view->invisible),
2451 clipboard_atom, GDK_SELECTION_TYPE_STRING,
2454 gl_debug (DEBUG_VIEW, "END");
2457 /*****************************************************************************/
2458 /* Zoom in one "notch" */
2459 /*****************************************************************************/
2461 gl_view_zoom_in (glView *view)
2464 gdouble dist, dist_min;
2466 gl_debug (DEBUG_VIEW, "START");
2468 g_return_if_fail (view && GL_IS_VIEW (view));
2470 /* Find index of current scale (or best match) */
2471 i_min = 1; /* start with 2nd largest scale */
2472 dist_min = fabs (zooms[1] - view->zoom);
2473 for (i = 2; i < N_ZOOMS; i++) {
2474 dist = fabs (zooms[i] - view->zoom);
2475 if (dist < dist_min) {
2481 /* zoom in one "notch" */
2482 i = MAX (0, i_min - 1);
2483 gl_debug (DEBUG_VIEW, "zoom[%d] = %g", i, zooms[i]);
2484 set_zoom_real (view, zooms[i], FALSE);
2486 gl_debug (DEBUG_VIEW, "END");
2489 /*****************************************************************************/
2490 /* Zoom out one "notch" */
2491 /*****************************************************************************/
2493 gl_view_zoom_out (glView *view)
2496 gdouble dist, dist_min;
2498 gl_debug (DEBUG_VIEW, "START");
2500 g_return_if_fail (view && GL_IS_VIEW (view));
2502 /* Find index of current scale (or best match) */
2503 i_min = 0; /* start with largest scale */
2504 dist_min = fabs (zooms[0] - view->zoom);
2505 for (i = 1; i < N_ZOOMS; i++) {
2506 dist = fabs (zooms[i] - view->zoom);
2507 if (dist < dist_min) {
2513 /* zoom out one "notch" */
2514 if (i_min >= N_ZOOMS)
2519 set_zoom_real (view, zooms[i], FALSE);
2521 gl_debug (DEBUG_VIEW, "END");
2524 /*****************************************************************************/
2525 /* Set zoom to best fit. */
2526 /*****************************************************************************/
2528 gl_view_zoom_to_fit (glView *view)
2530 gint w_view, h_view;
2531 gdouble w_label, h_label;
2532 gdouble x_scale, y_scale, scale;
2534 gl_debug (DEBUG_VIEW, "");
2536 if ( ! GTK_WIDGET_VISIBLE(view)) {
2537 set_zoom_real (view, 1.0, TRUE);
2541 w_view = GTK_WIDGET(view)->allocation.width;
2542 h_view = GTK_WIDGET(view)->allocation.height;
2544 gl_label_get_size (GL_LABEL(view->label), &w_label, &h_label);
2546 gl_debug (DEBUG_VIEW, "View size: %d, %d", w_view, h_view);
2547 gl_debug (DEBUG_VIEW, "Label size: %g, %g", w_label, h_label);
2549 /* Calculate best scale */
2550 x_scale = (double)(w_view - ZOOMTOFIT_PAD) / w_label;
2551 y_scale = (double)(h_view - ZOOMTOFIT_PAD) / h_label;
2552 scale = MIN (x_scale, y_scale);
2553 gl_debug (DEBUG_VIEW, "Candidate zooms: %g, %g => %g", x_scale, y_scale, scale);
2556 gl_debug (DEBUG_VIEW, "Scale: %g", scale);
2557 scale = MIN (scale, zooms[0]*view->home_scale);
2558 scale = MAX (scale, zooms[N_ZOOMS-1]*view->home_scale);
2559 gl_debug (DEBUG_VIEW, "Limitted scale: %g", scale);
2561 set_zoom_real (view, scale/view->home_scale, TRUE);
2564 /*****************************************************************************/
2565 /* Set current zoom factor to explicit value. */
2566 /*****************************************************************************/
2568 gl_view_set_zoom (glView *view,
2571 gl_debug (DEBUG_VIEW, "START");
2573 set_zoom_real (view, zoom, FALSE);
2575 gl_debug (DEBUG_VIEW, "END");
2578 /*---------------------------------------------------------------------------*/
2579 /* PRIVATE. Set canvas scale. */
2580 /*---------------------------------------------------------------------------*/
2582 set_zoom_real (glView *view,
2584 gboolean zoom_to_fit_flag)
2586 gl_debug (DEBUG_VIEW, "START");
2588 g_return_if_fail (view && GL_IS_VIEW (view));
2589 g_return_if_fail (zoom > 0.0);
2591 /* Limit, if needed */
2592 gl_debug (DEBUG_VIEW, "Zoom requested: %g", zoom);
2593 zoom = MIN (zoom, zooms[0]);
2594 zoom = MAX (zoom, zooms[N_ZOOMS-1]);
2595 gl_debug (DEBUG_VIEW, "Limitted zoom: %g", zoom);
2597 if ( zoom != view->zoom ) {
2600 view->zoom_to_fit_flag = zoom_to_fit_flag;
2602 gl_view_update (view);
2604 g_signal_emit (G_OBJECT(view), signals[ZOOM_CHANGED], 0, zoom);
2608 gl_debug (DEBUG_VIEW, "END");
2613 /*****************************************************************************/
2614 /* Get current zoom factor. */
2615 /*****************************************************************************/
2617 gl_view_get_zoom (glView *view)
2619 gl_debug (DEBUG_VIEW, "");
2621 g_return_val_if_fail (view && GL_IS_VIEW (view), 1.0);
2626 /*****************************************************************************/
2627 /* Is this the maximum zoom level. */
2628 /*****************************************************************************/
2630 gl_view_is_zoom_max (glView *view)
2632 gl_debug (DEBUG_VIEW, "");
2634 g_return_val_if_fail (GL_IS_VIEW (view), FALSE);
2636 return view->zoom >= zooms[0];
2639 /*****************************************************************************/
2640 /* Is this the minimum zoom level. */
2641 /*****************************************************************************/
2643 gl_view_is_zoom_min (glView *view)
2645 gl_debug (DEBUG_VIEW, "");
2647 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
2649 return view->zoom <= zooms[N_ZOOMS-1];
2652 /*---------------------------------------------------------------------------*/
2653 /* PRIVATE. Handle "selection-clear" signal. */
2654 /*---------------------------------------------------------------------------*/
2656 selection_clear_cb (GtkWidget *widget,
2657 GdkEventSelection *event,
2660 gl_debug (DEBUG_VIEW, "START");
2662 g_return_if_fail (view && GL_IS_VIEW (view));
2664 view->have_selection = FALSE;
2665 g_object_unref (view->selection_data);
2666 view->selection_data = NULL;
2668 gl_debug (DEBUG_VIEW, "END");
2671 /*---------------------------------------------------------------------------*/
2672 /* PRIVATE. Handle "selection-get" signal. */
2673 /*---------------------------------------------------------------------------*/
2675 selection_get_cb (GtkWidget *widget,
2676 GtkSelectionData *selection_data,
2682 glXMLLabelStatus status;
2684 gl_debug (DEBUG_VIEW, "START");
2686 g_return_if_fail (view && GL_IS_VIEW (view));
2688 if (view->have_selection) {
2690 buffer = gl_xml_label_save_buffer (view->selection_data,
2692 gtk_selection_data_set (selection_data,
2693 GDK_SELECTION_TYPE_STRING, 8,
2694 (guchar *)buffer, strlen (buffer));
2698 gl_debug (DEBUG_VIEW, "END");
2701 /*---------------------------------------------------------------------------*/
2702 /* PRIVATE. Handle "selection-received" signal. (Result of Paste) */
2703 /*---------------------------------------------------------------------------*/
2705 selection_received_cb (GtkWidget *widget,
2706 GtkSelectionData *selection_data,
2710 glLabel *label = NULL;
2711 glXMLLabelStatus status;
2713 glLabelObject *object, *newobject;
2714 glViewObject *view_object;
2716 gl_debug (DEBUG_VIEW, "START");
2718 g_return_if_fail (view && GL_IS_VIEW (view));
2720 if (selection_data->length < 0) {
2723 if (selection_data->type != GDK_SELECTION_TYPE_STRING) {
2727 gl_view_unselect_all (view);
2729 label = gl_xml_label_open_buffer ((gchar *)selection_data->data, &status);
2730 for (p = label->objects; p != NULL; p = p_next) {
2733 object = (glLabelObject *) p->data;
2734 newobject = gl_label_object_dup (object, view->label);
2736 gl_debug (DEBUG_VIEW, "object pasted");
2738 if (GL_IS_LABEL_BOX (newobject)) {
2739 view_object = gl_view_box_new (GL_LABEL_BOX(newobject),
2741 } else if (GL_IS_LABEL_ELLIPSE (newobject)) {
2742 view_object = gl_view_ellipse_new (GL_LABEL_ELLIPSE(newobject),
2744 } else if (GL_IS_LABEL_LINE (newobject)) {
2745 view_object = gl_view_line_new (GL_LABEL_LINE(newobject),
2747 } else if (GL_IS_LABEL_IMAGE (newobject)) {
2748 view_object = gl_view_image_new (GL_LABEL_IMAGE(newobject),
2750 } else if (GL_IS_LABEL_TEXT (newobject)) {
2751 view_object = gl_view_text_new (GL_LABEL_TEXT(newobject),
2753 } else if (GL_IS_LABEL_BARCODE (newobject)) {
2754 view_object = gl_view_barcode_new (GL_LABEL_BARCODE(newobject),
2757 /* Should not happen! */
2759 g_message ("Invalid label object type.");
2761 gl_view_select_object (view, view_object);
2763 g_object_unref (label);
2765 gl_debug (DEBUG_VIEW, "END");
2768 /****************************************************************************/
2769 /* Set default font family. */
2770 /****************************************************************************/
2772 gl_view_set_default_font_family (glView *view,
2773 const gchar *font_family)
2775 gl_debug (DEBUG_VIEW, "START");
2777 g_return_if_fail (view && GL_IS_VIEW (view));
2779 if (view->default_font_family) {
2780 g_free (view->default_font_family);
2782 view->default_font_family = g_strdup (font_family);
2784 gl_debug (DEBUG_VIEW, "END");
2788 /****************************************************************************/
2789 /* Set default font size. */
2790 /****************************************************************************/
2792 gl_view_set_default_font_size (glView *view,
2795 gl_debug (DEBUG_VIEW, "START");
2797 g_return_if_fail (view && GL_IS_VIEW (view));
2799 view->default_font_size = font_size;
2801 gl_debug (DEBUG_VIEW, "END");
2805 /****************************************************************************/
2806 /* Set default font weight. */
2807 /****************************************************************************/
2809 gl_view_set_default_font_weight (glView *view,
2810 PangoWeight font_weight)
2812 gl_debug (DEBUG_VIEW, "START");
2814 g_return_if_fail (view && GL_IS_VIEW (view));
2816 view->default_font_weight = font_weight;
2818 gl_debug (DEBUG_VIEW, "END");
2822 /****************************************************************************/
2823 /* Set default font italic flag. */
2824 /****************************************************************************/
2826 gl_view_set_default_font_italic_flag (glView *view,
2827 gboolean font_italic_flag)
2829 gl_debug (DEBUG_VIEW, "START");
2831 g_return_if_fail (view && GL_IS_VIEW (view));
2833 view->default_font_italic_flag = font_italic_flag;
2835 gl_debug (DEBUG_VIEW, "END");
2839 /****************************************************************************/
2840 /* Set default text color. */
2841 /****************************************************************************/
2843 gl_view_set_default_text_color (glView *view,
2846 gl_debug (DEBUG_VIEW, "START");
2848 g_return_if_fail (view && GL_IS_VIEW (view));
2850 view->default_text_color = text_color;
2852 gl_debug (DEBUG_VIEW, "END");
2856 /****************************************************************************/
2857 /* Set default text alignment. */
2858 /****************************************************************************/
2860 gl_view_set_default_text_alignment (glView *view,
2861 PangoAlignment text_alignment)
2863 gl_debug (DEBUG_VIEW, "START");
2865 g_return_if_fail (view && GL_IS_VIEW (view));
2867 view->default_text_alignment = text_alignment;
2868 gl_debug (DEBUG_VIEW, "END");
2871 /****************************************************************************/
2872 /* Set default text line spacing. */
2873 /****************************************************************************/
2875 gl_view_set_default_text_line_spacing (glView *view,
2876 gdouble text_line_spacing)
2878 gl_debug (DEBUG_VIEW, "START");
2880 g_return_if_fail (view && GL_IS_VIEW (view));
2882 view->default_text_line_spacing = text_line_spacing;
2884 gl_debug (DEBUG_VIEW, "END");
2888 /****************************************************************************/
2889 /* Set default line width. */
2890 /****************************************************************************/
2892 gl_view_set_default_line_width (glView *view,
2895 gl_debug (DEBUG_VIEW, "START");
2897 g_return_if_fail (view && GL_IS_VIEW (view));
2899 view->default_line_width = line_width;
2901 gl_debug (DEBUG_VIEW, "END");
2905 /****************************************************************************/
2906 /* Set default line color. */
2907 /****************************************************************************/
2909 gl_view_set_default_line_color (glView *view,
2912 gl_debug (DEBUG_VIEW, "START");
2914 g_return_if_fail (view && GL_IS_VIEW (view));
2916 view->default_line_color = line_color;
2918 gl_debug (DEBUG_VIEW, "END");
2922 /****************************************************************************/
2923 /* Set default fill color. */
2924 /****************************************************************************/
2926 gl_view_set_default_fill_color (glView *view,
2929 gl_debug (DEBUG_VIEW, "START");
2931 g_return_if_fail (view && GL_IS_VIEW (view));
2933 view->default_fill_color = fill_color;
2935 gl_debug (DEBUG_VIEW, "END");
2940 /****************************************************************************/
2941 /* Get default font family. */
2942 /****************************************************************************/
2944 gl_view_get_default_font_family (glView *view)
2946 gl_debug (DEBUG_VIEW, "START");
2948 g_return_val_if_fail (view && GL_IS_VIEW (view), NULL);
2950 gl_debug (DEBUG_VIEW, "END");
2952 return g_strdup (view->default_font_family);
2956 /****************************************************************************/
2957 /* Get default font size. */
2958 /****************************************************************************/
2960 gl_view_get_default_font_size (glView *view)
2962 gl_debug (DEBUG_VIEW, "START");
2964 g_return_val_if_fail (view && GL_IS_VIEW (view), 12.0);
2966 gl_debug (DEBUG_VIEW, "END");
2968 return view->default_font_size;
2972 /****************************************************************************/
2973 /* Get default font weight. */
2974 /****************************************************************************/
2976 gl_view_get_default_font_weight (glView *view)
2978 gl_debug (DEBUG_VIEW, "START");
2980 g_return_val_if_fail (view && GL_IS_VIEW (view), PANGO_WEIGHT_NORMAL);
2982 gl_debug (DEBUG_VIEW, "END");
2984 return view->default_font_weight;
2988 /****************************************************************************/
2989 /* Get default font italic flag. */
2990 /****************************************************************************/
2992 gl_view_get_default_font_italic_flag (glView *view)
2994 gl_debug (DEBUG_VIEW, "START");
2996 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
2998 gl_debug (DEBUG_VIEW, "END");
3000 return view->default_font_italic_flag;
3004 /****************************************************************************/
3005 /* Get default text color. */
3006 /****************************************************************************/
3008 gl_view_get_default_text_color (glView *view)
3010 gl_debug (DEBUG_VIEW, "START");
3012 g_return_val_if_fail (view && GL_IS_VIEW (view), 0);
3014 gl_debug (DEBUG_VIEW, "END");
3016 return view->default_text_color;
3020 /****************************************************************************/
3021 /* Get default text alignment. */
3022 /****************************************************************************/
3024 gl_view_get_default_text_alignment (glView *view)
3026 gl_debug (DEBUG_VIEW, "START");
3028 g_return_val_if_fail (view && GL_IS_VIEW (view), PANGO_ALIGN_LEFT);
3030 gl_debug (DEBUG_VIEW, "END");
3032 return view->default_text_alignment;
3035 /****************************************************************************/
3036 /* Get default text line spacing. */
3037 /****************************************************************************/
3039 gl_view_get_default_text_line_spacing (glView *view)
3041 gl_debug (DEBUG_VIEW, "START");
3043 g_return_val_if_fail (view && GL_IS_VIEW (view), 1.0);
3045 gl_debug (DEBUG_VIEW, "END");
3047 return view->default_text_line_spacing;
3052 /****************************************************************************/
3053 /* Get default line width. */
3054 /****************************************************************************/
3056 gl_view_get_default_line_width (glView *view)
3058 gl_debug (DEBUG_VIEW, "START");
3060 g_return_val_if_fail (view && GL_IS_VIEW (view), 1.0);
3062 gl_debug (DEBUG_VIEW, "END");
3064 return view->default_line_width;
3068 /****************************************************************************/
3069 /* Get default line color. */
3070 /****************************************************************************/
3072 gl_view_get_default_line_color (glView *view)
3074 gl_debug (DEBUG_VIEW, "START");
3076 g_return_val_if_fail (view && GL_IS_VIEW (view), 0);
3078 gl_debug (DEBUG_VIEW, "END");
3080 return view->default_line_color;
3084 /****************************************************************************/
3085 /* Get default fill color. */
3086 /****************************************************************************/
3088 gl_view_get_default_fill_color (glView *view)
3090 gl_debug (DEBUG_VIEW, "START");
3092 g_return_val_if_fail (view && GL_IS_VIEW (view), 0);
3094 gl_debug (DEBUG_VIEW, "END");
3096 return view->default_fill_color;
3099 /*---------------------------------------------------------------------------*/
3100 /* PRIVATE. Focus in event handler. */
3101 /*---------------------------------------------------------------------------*/
3103 focus_in_event_cb (glView *view,
3104 GdkEventFocus *event)
3106 GTK_WIDGET_SET_FLAGS (GTK_WIDGET (view->canvas), GTK_HAS_FOCUS);
3111 /*---------------------------------------------------------------------------*/
3112 /* PRIVATE. Focus out event handler. */
3113 /*---------------------------------------------------------------------------*/
3115 focus_out_event_cb (glView *view,
3116 GdkEventFocus *event)
3118 GTK_WIDGET_UNSET_FLAGS (GTK_WIDGET (view->canvas), GTK_HAS_FOCUS);
3123 /*---------------------------------------------------------------------------*/
3124 /* PRIVATE. Enter notify event handler. */
3125 /*---------------------------------------------------------------------------*/
3127 enter_notify_event_cb (glView *view,
3128 GdkEventCrossing *event)
3130 gtk_widget_grab_focus(GTK_WIDGET (view->canvas));
3135 /*---------------------------------------------------------------------------*/
3136 /* PRIVATE. Leave notify event handler. */
3137 /*---------------------------------------------------------------------------*/
3139 leave_notify_event_cb (glView *view,
3140 GdkEventCrossing *event)
3143 g_signal_emit (G_OBJECT(view), signals[POINTER_EXIT], 0);
3148 /*---------------------------------------------------------------------------*/
3149 /* PRIVATE. Motion notify event handler. */
3150 /*---------------------------------------------------------------------------*/
3152 motion_notify_event_cb (glView *view,
3153 GdkEventMotion *event)
3155 gboolean return_value = FALSE;
3160 glViewObjectHandle handle;
3162 cr = gdk_cairo_create (GTK_LAYOUT (view->canvas)->bin_window);
3165 * Translate to label coordinates
3167 scale = view->zoom * view->home_scale;
3168 cairo_scale (cr, scale, scale);
3169 cairo_translate (cr, view->x0, view->y0);
3173 cairo_device_to_user (cr, &x, &y);
3176 * Emit signal regardless of mode
3178 g_signal_emit (G_OBJECT(view), signals[POINTER_MOVED], 0, x, y);
3181 * Handle event as appropriate for mode
3186 case GL_VIEW_MODE_ARROW:
3187 switch (view->state)
3191 if (view_handle_at (view, cr, event->x, event->y, &handle))
3193 cursor = gdk_cursor_new (GDK_CROSSHAIR);
3195 else if (view_view_object_at (view, cr, event->x, event->y))
3197 cursor = gdk_cursor_new (GDK_FLEUR);
3201 cursor = gdk_cursor_new (GDK_LEFT_PTR);
3203 gdk_window_set_cursor (view->canvas->window, cursor);
3204 gdk_cursor_unref (cursor);
3207 case GL_VIEW_ARROW_SELECT_REGION:
3208 gl_view_update_region (view, cr, &view->select_region);
3209 view->select_region.x2 = x;
3210 view->select_region.y2 = y;
3211 gl_view_update_region (view, cr, &view->select_region);
3214 case GL_VIEW_ARROW_MOVE:
3215 gl_view_move_selection (view,
3216 (x - view->move_last_x),
3217 (y - view->move_last_y));
3218 view->move_last_x = x;
3219 view->move_last_y = y;
3222 case GL_VIEW_ARROW_RESIZE:
3223 gl_view_object_resize_event (view->resize_object,
3224 view->resize_handle,
3225 view->resize_honor_aspect,
3232 g_message ("Invalid arrow state."); /*Should not happen!*/
3234 return_value = TRUE;
3238 case GL_VIEW_MODE_OBJECT_CREATE:
3239 if (view->state != GL_VIEW_IDLE)
3241 switch (view->create_type)
3243 case GL_LABEL_OBJECT_BOX:
3244 gl_view_box_create_motion_event (view, x, y);
3246 case GL_LABEL_OBJECT_ELLIPSE:
3247 gl_view_ellipse_create_motion_event (view, x, y);
3249 case GL_LABEL_OBJECT_LINE:
3250 gl_view_line_create_motion_event (view, x, y);
3252 case GL_LABEL_OBJECT_IMAGE:
3253 gl_view_image_create_motion_event (view, x, y);
3255 case GL_LABEL_OBJECT_TEXT:
3256 gl_view_text_create_motion_event (view, x, y);
3258 case GL_LABEL_OBJECT_BARCODE:
3259 gl_view_barcode_create_motion_event (view, x, y);
3262 g_message ("Invalid create type."); /*Should not happen!*/
3269 g_message ("Invalid view mode."); /*Should not happen!*/
3276 * FIXME: we re-establish grabs here if the grab has been lost. We seem to be
3277 * losing grabs when we emit signals that lead to the manipulation of
3278 * the GtkUIManager. Needs more investigation
3280 if (view->grabbed_flag && !gdk_pointer_is_grabbed ())
3282 gdk_pointer_grab (GTK_LAYOUT (view->canvas)->bin_window,
3284 (GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK),
3290 return return_value;
3293 /*---------------------------------------------------------------------------*/
3294 /* PRIVATE. Button press event handler. */
3295 /*---------------------------------------------------------------------------*/
3297 button_press_event_cb (glView *view,
3298 GdkEventButton *event)
3300 gboolean return_value = FALSE;
3304 glViewObject *view_object;
3305 glViewObjectHandle handle;
3307 cr = gdk_cairo_create (GTK_LAYOUT (view->canvas)->bin_window);
3310 * Translate to label coordinates
3312 scale = view->zoom * view->home_scale;
3313 cairo_scale (cr, scale, scale);
3314 cairo_translate (cr, view->x0, view->y0);
3318 cairo_device_to_user (cr, &x, &y);
3320 switch (event->button)
3325 * Handle event as appropriate for mode
3329 case GL_VIEW_MODE_ARROW:
3330 if ((view_object = view_handle_at (view, cr, event->x, event->y, &handle)))
3332 view->resize_object = view_object;
3333 view->resize_handle = handle;
3334 view->resize_honor_aspect = event->state & GDK_CONTROL_MASK;
3336 view->state = GL_VIEW_ARROW_RESIZE;
3338 else if ((view_object = view_view_object_at (view, cr, event->x, event->y)))
3340 if (event->state & GDK_CONTROL_MASK)
3342 if (gl_view_is_object_selected (view, view_object))
3344 /* Un-selecting a selected item */
3345 gl_view_unselect_object (view, view_object);
3347 /* Add to current selection */
3348 gl_view_select_object (view, view_object);
3353 if (!gl_view_is_object_selected (view, view_object))
3355 /* remove any selections before adding */
3356 gl_view_unselect_all (view);
3357 /* Add to current selection */
3358 gl_view_select_object (view, view_object);
3361 view->move_last_x = x;
3362 view->move_last_y = y;
3364 view->state = GL_VIEW_ARROW_MOVE;
3368 if (!(event->state & GDK_CONTROL_MASK))
3370 gl_view_unselect_all (view);
3373 view->select_region_visible = TRUE;
3374 view->select_region.x1 = x;
3375 view->select_region.y1 = y;
3376 view->select_region.x2 = x;
3377 view->select_region.y2 = y;
3379 view->state = GL_VIEW_ARROW_SELECT_REGION;
3383 return_value = TRUE;
3386 case GL_VIEW_MODE_OBJECT_CREATE:
3387 switch (view->create_type)
3389 case GL_LABEL_OBJECT_BOX:
3390 gl_view_box_create_button_press_event (view, x, y);
3392 case GL_LABEL_OBJECT_ELLIPSE:
3393 gl_view_ellipse_create_button_press_event (view, x, y);
3395 case GL_LABEL_OBJECT_LINE:
3396 gl_view_line_create_button_press_event (view, x, y);
3398 case GL_LABEL_OBJECT_IMAGE:
3399 gl_view_image_create_button_press_event (view, x, y);
3401 case GL_LABEL_OBJECT_TEXT:
3402 gl_view_text_create_button_press_event (view, x, y);
3404 case GL_LABEL_OBJECT_BARCODE:
3405 gl_view_barcode_create_button_press_event (view, x, y);
3408 g_message ("Invalid create type."); /*Should not happen!*/
3410 view->state = GL_VIEW_CREATE_DRAG;
3411 return_value = TRUE;
3415 g_message ("Invalid view mode."); /*Should not happen!*/
3418 view->grabbed_flag = TRUE;
3419 gdk_pointer_grab (GTK_LAYOUT (view->canvas)->bin_window,
3421 (GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK),
3428 g_signal_emit (G_OBJECT (view),
3429 signals[CONTEXT_MENU_ACTIVATE], 0,
3430 event->button, event->time);
3431 return_value = TRUE;
3438 return return_value;
3441 /*---------------------------------------------------------------------------*/
3442 /* PRIVATE. Button release event handler. */
3443 /*---------------------------------------------------------------------------*/
3445 button_release_event_cb (glView *view,
3446 GdkEventButton *event)
3448 gboolean return_value = FALSE;
3454 cr = gdk_cairo_create (GTK_LAYOUT (view->canvas)->bin_window);
3457 * Translate to label coordinates
3459 scale = view->zoom * view->home_scale;
3460 cairo_scale (cr, scale, scale);
3461 cairo_translate (cr, view->x0, view->y0);
3465 cairo_device_to_user (cr, &x, &y);
3467 switch (event->button)
3471 view->grabbed_flag = FALSE;
3472 gdk_pointer_ungrab (event->time);
3474 * Handle event as appropriate for mode
3478 case GL_VIEW_MODE_ARROW:
3479 switch (view->state)
3481 case GL_VIEW_ARROW_RESIZE:
3482 view->resize_object = NULL;
3484 view->state = GL_VIEW_IDLE;
3487 case GL_VIEW_ARROW_SELECT_REGION:
3488 gl_view_update_region (view, cr, &view->select_region);
3490 view->select_region_visible = FALSE;
3491 view->select_region.x2 = x;
3492 view->select_region.y2 = y;
3494 gl_view_select_region (view, &view->select_region);
3496 view->state = GL_VIEW_IDLE;
3500 view->state = GL_VIEW_IDLE;
3505 return_value = TRUE;
3509 case GL_VIEW_MODE_OBJECT_CREATE:
3510 switch (view->create_type)
3512 case GL_LABEL_OBJECT_BOX:
3513 gl_view_box_create_button_release_event (view, x, y);
3515 case GL_LABEL_OBJECT_ELLIPSE:
3516 gl_view_ellipse_create_button_release_event (view, x, y);
3518 case GL_LABEL_OBJECT_LINE:
3519 gl_view_line_create_button_release_event (view, x, y);
3521 case GL_LABEL_OBJECT_IMAGE:
3522 gl_view_image_create_button_release_event (view, x, y);
3524 case GL_LABEL_OBJECT_TEXT:
3525 gl_view_text_create_button_release_event (view, x, y);
3527 case GL_LABEL_OBJECT_BARCODE:
3528 gl_view_barcode_create_button_release_event (view, x, y);
3531 g_message ("Invalid create type."); /*Should not happen!*/
3533 view->mode = GL_VIEW_MODE_ARROW;
3534 view->state = GL_VIEW_IDLE;
3535 cursor = gdk_cursor_new (GDK_LEFT_PTR);
3536 gdk_window_set_cursor (view->canvas->window, cursor);
3537 gdk_cursor_unref (cursor);
3542 g_message ("Invalid view mode."); /*Should not happen!*/
3549 return return_value;
3552 /*---------------------------------------------------------------------------*/
3553 /* PRIVATE. Key press event handler. */
3554 /*---------------------------------------------------------------------------*/
3556 key_press_event_cb (glView *view,
3561 gl_debug (DEBUG_VIEW, "");
3563 if ( (view->mode == GL_VIEW_MODE_ARROW) &&
3564 (view->state == GL_VIEW_IDLE) )
3566 switch (event->keyval) {
3570 gl_view_move_selection (view, -1.0 / (view->zoom), 0.0);
3574 gl_view_move_selection (view, 0.0, -1.0 / (view->zoom));
3578 gl_view_move_selection (view, 1.0 / (view->zoom), 0.0);
3582 gl_view_move_selection (view, 0.0, 1.0 / (view->zoom));
3586 gl_view_delete_selection (view);
3587 cursor = gdk_cursor_new (GDK_LEFT_PTR);
3588 gdk_window_set_cursor (GTK_WIDGET (view->canvas)->window
3590 gdk_cursor_unref (cursor);
3597 return TRUE; /* We handled this or we were dragging. */