3 * Copyright (C) 2001-2009 Jim Evins <evins@snaught.com>.
5 * This file is part of gLabels.
7 * gLabels is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
12 * gLabels is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with gLabels. If not, see <http://www.gnu.org/licenses/>.
25 #include <glib/gi18n.h>
27 #include <gdk/gdkkeysyms.h>
32 #include "cairo-label-path.h"
33 #include "cairo-markup-path.h"
34 #include "view-object.h"
36 #include "view-ellipse.h"
37 #include "view-line.h"
38 #include "view-image.h"
39 #include "view-text.h"
40 #include "view-barcode.h"
41 #include "xml-label.h"
49 /*==========================================================================*/
50 /* Private macros and constants. */
51 /*==========================================================================*/
53 #define BG_COLOR GL_COLOR (192, 192, 192)
55 #define PAPER_RGB_ARGS 1.0, 1.0, 1.0
56 #define GRID_RGB_ARGS 0.753, 0.753, 0.753
57 #define MARKUP_RGB_ARGS 0.94, 0.39, 0.39
58 #define OUTLINE_RGB_ARGS 0.68, 0.85, 0.90
59 #define SELECT_LINE_RGBA_ARGS 0.0, 0.0, 1.0, 0.5
60 #define SELECT_FILL_RGBA_ARGS 0.75, 0.75, 1.0, 0.5
62 #define GRID_LINE_WIDTH_PIXELS 1.0
63 #define MARKUP_LINE_WIDTH_PIXELS 1.0
64 #define OUTLINE_WIDTH_PIXELS 3.0
65 #define SELECT_LINE_WIDTH_PIXELS 3.0
67 #define ZOOMTOFIT_PAD 16
69 #define POINTS_PER_MM 2.83464566929
72 /*==========================================================================*/
74 /*==========================================================================*/
78 CONTEXT_MENU_ACTIVATE,
87 /*==========================================================================*/
89 /*==========================================================================*/
91 static guint signals[LAST_SIGNAL] = {0};
93 /* "CLIPBOARD" selection */
94 static GdkAtom clipboard_atom = GDK_NONE;
96 static gdouble zooms[] = {
113 #define N_ZOOMS G_N_ELEMENTS(zooms)
116 /*==========================================================================*/
117 /* Local function prototypes */
118 /*==========================================================================*/
120 static void gl_view_finalize (GObject *object);
122 static void gl_view_construct (glView *view,
125 static gdouble get_home_scale (glView *view);
127 static gboolean expose_cb (glView *view,
128 GdkEventExpose *event);
130 static void realize_cb (glView *view);
132 static void size_allocate_cb (glView *view,
133 GtkAllocation *allocation);
135 static void screen_changed_cb (glView *view);
137 static void label_changed_cb (glView *view);
139 static void label_resized_cb (glView *view);
141 static void label_object_added_cb (glView *view,
142 glLabelObject *object);
144 static void draw_layers (glView *view,
147 static void draw_bg_layer (glView *view,
149 static void draw_grid_layer (glView *view,
151 static void draw_markup_layer (glView *view,
153 static void draw_objects_layer (glView *view,
155 static void draw_fg_layer (glView *view,
157 static void draw_highlight_layer (glView *view,
159 static void draw_select_region_layer (glView *view,
162 static void select_object_real (glView *view,
163 glViewObject *view_object);
164 static void unselect_object_real (glView *view,
165 glViewObject *view_object);
167 static glViewObject *view_view_object_at (glView *view,
172 static void set_zoom_real (glView *view,
174 gboolean scale_to_fit_flag);
176 static void selection_clear_cb (GtkWidget *widget,
177 GdkEventSelection *event,
180 static void selection_get_cb (GtkWidget *widget,
181 GtkSelectionData *selection_data,
186 static void selection_received_cb (GtkWidget *widget,
187 GtkSelectionData *selection_data,
191 static gboolean focus_in_event_cb (glView *view,
192 GdkEventFocus *event);
194 static gboolean focus_out_event_cb (glView *view,
195 GdkEventFocus *event);
197 static gboolean enter_notify_event_cb (glView *view,
198 GdkEventCrossing *event);
200 static gboolean leave_notify_event_cb (glView *view,
201 GdkEventCrossing *event);
203 static gboolean motion_notify_event_cb (glView *view,
204 GdkEventMotion *event);
206 static gboolean button_press_event_cb (glView *view,
207 GdkEventButton *event);
209 static gboolean button_release_event_cb (glView *view,
210 GdkEventButton *event);
212 static gboolean key_press_event_cb (glView *view,
216 /****************************************************************************/
217 /* Boilerplate Object stuff. */
218 /****************************************************************************/
219 G_DEFINE_TYPE (glView, gl_view, GTK_TYPE_VBOX);
223 gl_view_class_init (glViewClass *class)
225 GObjectClass *object_class = G_OBJECT_CLASS (class);
227 gl_debug (DEBUG_VIEW, "START");
229 gl_view_parent_class = g_type_class_peek_parent (class);
231 object_class->finalize = gl_view_finalize;
233 signals[SELECTION_CHANGED] =
234 g_signal_new ("selection_changed",
235 G_OBJECT_CLASS_TYPE (object_class),
237 G_STRUCT_OFFSET (glViewClass, selection_changed),
239 gl_marshal_VOID__VOID,
243 signals[CONTEXT_MENU_ACTIVATE] =
244 g_signal_new ("context_menu_activate",
245 G_OBJECT_CLASS_TYPE (object_class),
247 G_STRUCT_OFFSET (glViewClass, context_menu_activate),
249 gl_marshal_VOID__INT_UINT,
251 2, G_TYPE_INT, G_TYPE_UINT);
253 signals[ZOOM_CHANGED] =
254 g_signal_new ("zoom_changed",
255 G_OBJECT_CLASS_TYPE (object_class),
257 G_STRUCT_OFFSET (glViewClass, zoom_changed),
259 gl_marshal_VOID__DOUBLE,
263 signals[POINTER_MOVED] =
264 g_signal_new ("pointer_moved",
265 G_OBJECT_CLASS_TYPE (object_class),
267 G_STRUCT_OFFSET (glViewClass, pointer_moved),
269 gl_marshal_VOID__DOUBLE_DOUBLE,
271 2, G_TYPE_DOUBLE, G_TYPE_DOUBLE);
273 signals[POINTER_EXIT] =
274 g_signal_new ("pointer_exit",
275 G_OBJECT_CLASS_TYPE (object_class),
277 G_STRUCT_OFFSET (glViewClass, pointer_exit),
279 gl_marshal_VOID__VOID,
283 signals[MODE_CHANGED] =
284 g_signal_new ("mode_changed",
285 G_OBJECT_CLASS_TYPE (object_class),
287 G_STRUCT_OFFSET (glViewClass, mode_changed),
289 gl_marshal_VOID__VOID,
293 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");
406 gl_view_finalize (GObject *object)
408 glView *view = GL_VIEW (object);
410 gl_debug (DEBUG_VIEW, "START");
412 g_return_if_fail (object != NULL);
413 g_return_if_fail (GL_IS_VIEW (object));
415 if (view->default_font_family) {
416 g_free (view->default_font_family);
419 G_OBJECT_CLASS (gl_view_parent_class)->finalize (object);
421 gl_debug (DEBUG_VIEW, "END");
425 /****************************************************************************/
426 /* NEW view object. */
427 /****************************************************************************/
429 gl_view_new (glLabel *label)
433 gl_debug (DEBUG_VIEW, "START");
435 g_return_val_if_fail (label && GL_IS_LABEL (label), NULL);
437 view = g_object_new (GL_TYPE_VIEW, NULL);
439 gl_view_construct (view, label);
441 gl_debug (DEBUG_VIEW, "END");
443 return GTK_WIDGET (view);
447 /*---------------------------------------------------------------------------*/
448 /* PRIVATE. Construct composite widget. */
449 /*---------------------------------------------------------------------------*/
451 gl_view_construct (glView *view,
455 glLabelObject *object;
457 gl_debug (DEBUG_VIEW, "START");
459 g_return_if_fail (GL_IS_VIEW (view));
463 for (p_obj = label->objects; p_obj != NULL; p_obj = p_obj->next)
465 object = GL_LABEL_OBJECT (p_obj->data);
467 if (GL_IS_LABEL_BOX (object)) {
468 gl_view_box_new (GL_LABEL_BOX(object), view);
469 } else if (GL_IS_LABEL_ELLIPSE (object)) {
470 gl_view_ellipse_new (GL_LABEL_ELLIPSE(object), view);
471 } else if (GL_IS_LABEL_LINE (object)) {
472 gl_view_line_new (GL_LABEL_LINE(object), view);
473 } else if (GL_IS_LABEL_IMAGE (object)) {
474 gl_view_image_new (GL_LABEL_IMAGE(object), view);
475 } else if (GL_IS_LABEL_TEXT (object)) {
476 gl_view_text_new (GL_LABEL_TEXT(object), view);
477 } else if (GL_IS_LABEL_BARCODE (object)) {
478 gl_view_barcode_new (GL_LABEL_BARCODE(object), view);
480 /* Should not happen! */
481 g_message ("Invalid label object type.");
485 g_signal_connect_swapped (G_OBJECT (view->label), "changed",
486 G_CALLBACK (label_changed_cb), view);
487 g_signal_connect_swapped (G_OBJECT (view->label), "size_changed",
488 G_CALLBACK (label_resized_cb), view);
489 g_signal_connect_swapped (G_OBJECT (view->label), "object_added",
490 G_CALLBACK (label_object_added_cb), view);
492 gl_debug (DEBUG_VIEW, "END");
496 /*---------------------------------------------------------------------------*/
497 /* PRIAVTE. Calculate 1:1 scale for screen. */
498 /*---------------------------------------------------------------------------*/
500 get_home_scale (glView *view)
503 gdouble screen_width_pixels;
504 gdouble screen_width_mm;
505 gdouble screen_height_pixels;
506 gdouble screen_height_mm;
507 gdouble x_pixels_per_mm;
508 gdouble y_pixels_per_mm;
511 if (view->canvas == NULL) return 1.0;
513 if (!gtk_widget_has_screen (GTK_WIDGET (view->canvas))) return 1.0;
515 screen = gtk_widget_get_screen (GTK_WIDGET (view->canvas));
517 gl_debug (DEBUG_VIEW, "Screen = %p", screen);
519 screen_width_pixels = gdk_screen_get_width (screen);
520 screen_width_mm = gdk_screen_get_width_mm (screen);
521 screen_height_pixels = gdk_screen_get_height (screen);
522 screen_height_mm = gdk_screen_get_height_mm (screen);
524 x_pixels_per_mm = screen_width_pixels / screen_width_mm;
525 y_pixels_per_mm = screen_height_pixels / screen_height_mm;
527 gl_debug (DEBUG_VIEW, "Horizontal dot pitch: %g pixels/mm (%g dpi)",
528 x_pixels_per_mm, x_pixels_per_mm * 25.4);
529 gl_debug (DEBUG_VIEW, "Vertical dot pitch: %g pixels/mm (%g dpi)",
530 y_pixels_per_mm, y_pixels_per_mm * 25.4);
532 scale = (x_pixels_per_mm + y_pixels_per_mm) / 2.0;
534 gl_debug (DEBUG_VIEW, "Average dot pitch: %g pixels/mm (%g dpi)",
535 scale, scale * 25.4);
537 scale /= POINTS_PER_MM;
539 gl_debug (DEBUG_VIEW, "Scale = %g pixels/point", scale);
541 /* Make sure scale is somewhat sane. */
542 if ( (scale < 0.25) || (scale > 4.0) ) return 1.0;
548 /*---------------------------------------------------------------------------*/
549 /* Schedule canvas update. */
550 /*---------------------------------------------------------------------------*/
552 gl_view_update (glView *view)
557 gl_debug (DEBUG_VIEW, "START");
559 widget = GTK_WIDGET (view->canvas);
561 if (!widget->window) return;
563 if ( !view->update_scheduled_flag )
565 view->update_scheduled_flag = TRUE;
567 region = gdk_drawable_get_clip_region (widget->window);
568 /* redraw the cairo canvas completely by exposing it */
569 gdk_window_invalidate_region (widget->window, region, TRUE);
570 gdk_region_destroy (region);
573 gl_debug (DEBUG_VIEW, "END");
577 /*---------------------------------------------------------------------------*/
578 /* Schedule canvas region update. */
579 /*---------------------------------------------------------------------------*/
581 gl_view_update_region (glView *view,
583 glLabelRegion *region)
589 gl_debug (DEBUG_VIEW, "START");
591 widget = GTK_WIDGET (view->canvas);
593 if (!widget->window) return;
595 x = MIN (region->x1, region->x2);
596 y = MIN (region->y1, region->y2);
597 w = fabs (region->x2 - region->x1);
598 h = fabs (region->y2 - region->y1);
600 cairo_user_to_device (cr, &x, &y);
601 cairo_user_to_device_distance (cr, &w, &h);
608 gdk_window_invalidate_rect (widget->window, &rect, TRUE);
610 gl_debug (DEBUG_VIEW, "END");
614 /*---------------------------------------------------------------------------*/
615 /* PRIVATE. Expose handler. */
616 /*---------------------------------------------------------------------------*/
618 expose_cb (glView *view,
619 GdkEventExpose *event)
623 gl_debug (DEBUG_VIEW, "START");
625 view->update_scheduled_flag = FALSE;
628 cr = gdk_cairo_create (GTK_LAYOUT (view->canvas)->bin_window);
631 event->area.x, event->area.y,
632 event->area.width, event->area.height);
635 draw_layers (view, cr);
639 gl_debug (DEBUG_VIEW, "END");
645 /*---------------------------------------------------------------------------*/
646 /* PRIVATE. Realize handler. */
647 /*---------------------------------------------------------------------------*/
649 realize_cb (glView *view)
651 g_return_if_fail (view && GL_IS_VIEW (view));
653 gl_debug (DEBUG_VIEW, "START");
655 gl_debug (DEBUG_VIEW, "END");
659 /*---------------------------------------------------------------------------*/
660 /* PRIVATE. Size allocation changed callback. */
661 /*---------------------------------------------------------------------------*/
663 size_allocate_cb (glView *view,
664 GtkAllocation *allocation)
666 gl_debug (DEBUG_VIEW, "START");
668 GTK_LAYOUT (view->canvas)->hadjustment->page_size = allocation->width;
669 GTK_LAYOUT (view->canvas)->hadjustment->page_increment = allocation->width / 2;
671 GTK_LAYOUT (view->canvas)->vadjustment->page_size = allocation->height;
672 GTK_LAYOUT (view->canvas)->vadjustment->page_increment = allocation->height / 2;
674 g_signal_emit_by_name (GTK_LAYOUT (view->canvas)->hadjustment, "changed");
675 g_signal_emit_by_name (GTK_LAYOUT (view->canvas)->vadjustment, "changed");
677 if (view->zoom_to_fit_flag) {
678 /* Maintain best fit zoom */
679 gl_view_zoom_to_fit (view);
682 gl_debug (DEBUG_VIEW, "END");
686 /*---------------------------------------------------------------------------*/
687 /* PRIVATE. Screen changed callback. */
688 /*---------------------------------------------------------------------------*/
690 screen_changed_cb (glView *view)
692 gl_debug (DEBUG_VIEW, "START");
694 if (gtk_widget_has_screen (GTK_WIDGET (view->canvas))) {
696 view->home_scale = get_home_scale (view);
698 if (view->zoom_to_fit_flag) {
699 /* Maintain best fit zoom */
700 gl_view_zoom_to_fit (view);
704 gl_debug (DEBUG_VIEW, "END");
708 /*---------------------------------------------------------------------------*/
709 /* PRIVATE. Handle label changed event. */
710 /*---------------------------------------------------------------------------*/
712 label_changed_cb (glView *view)
714 g_return_if_fail (view && GL_IS_VIEW (view));
716 gl_debug (DEBUG_VIEW, "START");
718 gl_view_update (view);
720 gl_debug (DEBUG_VIEW, "END");
724 /*---------------------------------------------------------------------------*/
725 /* PRIVATE. Handle label resize event. */
726 /*---------------------------------------------------------------------------*/
728 label_resized_cb (glView *view)
730 g_return_if_fail (view && GL_IS_VIEW (view));
732 gl_debug (DEBUG_VIEW, "START");
734 g_signal_emit_by_name (GTK_LAYOUT (view->canvas)->hadjustment, "changed");
735 g_signal_emit_by_name (GTK_LAYOUT (view->canvas)->vadjustment, "changed");
737 gl_view_update (view);
739 gl_debug (DEBUG_VIEW, "END");
743 /*---------------------------------------------------------------------------*/
744 /* PRIVATE. Handle new label object. */
745 /*---------------------------------------------------------------------------*/
747 label_object_added_cb (glView *view,
748 glLabelObject *object)
750 glViewObject *view_object;
752 g_return_if_fail (view && GL_IS_VIEW (view));
753 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
755 if (GL_IS_LABEL_BOX (object)) {
756 view_object = gl_view_box_new (GL_LABEL_BOX(object), view);
757 } else if (GL_IS_LABEL_ELLIPSE (object)) {
758 view_object = gl_view_ellipse_new (GL_LABEL_ELLIPSE(object), view);
759 } else if (GL_IS_LABEL_LINE (object)) {
760 view_object = gl_view_line_new (GL_LABEL_LINE(object), view);
761 } else if (GL_IS_LABEL_IMAGE (object)) {
762 view_object = gl_view_image_new (GL_LABEL_IMAGE(object), view);
763 } else if (GL_IS_LABEL_TEXT (object)) {
764 view_object = gl_view_text_new (GL_LABEL_TEXT(object), view);
765 } else if (GL_IS_LABEL_BARCODE (object)) {
766 view_object = gl_view_barcode_new (GL_LABEL_BARCODE(object), view);
768 /* Should not happen! */
770 g_message ("Invalid label object type.");
773 gl_view_select_object (view, view_object);
777 /*---------------------------------------------------------------------------*/
778 /* PRIVATE. Create, draw and order layers. */
779 /*---------------------------------------------------------------------------*/
781 draw_layers (glView *view,
786 gint canvas_w, canvas_h;
788 g_return_if_fail (view && GL_IS_VIEW (view));
789 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
791 gl_debug (DEBUG_VIEW, "START");
793 scale = view->zoom * view->home_scale;
795 gl_label_get_size (view->label, &w, &h);
797 scale = view->home_scale * view->zoom;
798 gtk_layout_set_size (GTK_LAYOUT (view->canvas), w*scale+8, h*scale+8);
800 gdk_drawable_get_size (GTK_LAYOUT (view->canvas)->bin_window, &canvas_w, &canvas_h);
802 view->x0 = (canvas_w/scale - w) / 2.0;
803 view->y0 = (canvas_h/scale - h) / 2.0;
809 cairo_scale (cr, scale, scale);
810 cairo_translate (cr, view->x0, view->y0);
812 draw_bg_layer (view, cr);
813 draw_grid_layer (view, cr);
814 draw_markup_layer (view, cr);
815 draw_objects_layer (view, cr);
816 draw_fg_layer (view, cr);
817 draw_highlight_layer (view, cr);
818 draw_select_region_layer (view, cr);
822 gl_debug (DEBUG_VIEW, "END");
827 /*---------------------------------------------------------------------------*/
828 /* PRIVATE. Draw background */
829 /*---------------------------------------------------------------------------*/
831 draw_bg_layer (glView *view,
834 g_return_if_fail (view && GL_IS_VIEW (view));
835 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
837 gl_cairo_label_path (cr, view->label->template, view->label->rotate_flag, FALSE);
839 cairo_set_source_rgb (cr, PAPER_RGB_ARGS);
840 cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD);
845 /*---------------------------------------------------------------------------*/
846 /* PRIVATE. Draw grid lines. */
847 /*---------------------------------------------------------------------------*/
849 draw_grid_layer (glView *view,
855 const lglTemplateFrame *frame;
857 gl_debug (DEBUG_VIEW, "START");
859 g_return_if_fail (view && GL_IS_VIEW (view));
860 g_return_if_fail (view->label && GL_IS_LABEL(view->label));
862 if (view->grid_visible)
865 frame = (lglTemplateFrame *)view->label->template->frames->data;
867 gl_label_get_size (view->label, &w, &h);
869 if (frame->shape == LGL_TEMPLATE_FRAME_SHAPE_RECT) {
873 /* round labels, adjust grid to line up with center of label. */
874 x0 = fmod (w/2.0, view->grid_spacing);
875 y0 = fmod (h/2.0, view->grid_spacing);
881 cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
882 cairo_set_line_width (cr, GRID_LINE_WIDTH_PIXELS/(view->home_scale * view->zoom));
883 cairo_set_source_rgb (cr, GRID_RGB_ARGS);
885 for ( x=x0+view->grid_spacing; x < w; x += view->grid_spacing )
887 cairo_move_to (cr, x, 0);
888 cairo_line_to (cr, x, h);
892 for ( y=y0+view->grid_spacing; y < h; y += view->grid_spacing )
894 cairo_move_to (cr, 0, y);
895 cairo_line_to (cr, w, y);
903 gl_debug (DEBUG_VIEW, "END");
907 /*---------------------------------------------------------------------------*/
908 /* PRIVATE. Draw markup layer. */
909 /*---------------------------------------------------------------------------*/
911 draw_markup_layer (glView *view,
915 const lglTemplateFrame *frame;
917 lglTemplateMarkup *markup;
918 gdouble width, height;
920 g_return_if_fail (view && GL_IS_VIEW (view));
921 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
923 if (view->markup_visible)
927 frame = (lglTemplateFrame *)view->label->template->frames->data;
931 if (label->rotate_flag)
933 lgl_template_frame_get_size (frame, &width, &height);
934 cairo_rotate (cr, -M_PI/2.0);
935 cairo_translate (cr, -width, 0.0);
938 cairo_set_line_width (cr, MARKUP_LINE_WIDTH_PIXELS/(view->home_scale * view->zoom));
939 cairo_set_source_rgb (cr, MARKUP_RGB_ARGS);
941 for ( p=frame->all.markups; p != NULL; p=p->next )
943 markup = (lglTemplateMarkup *)p->data;
945 gl_cairo_markup_path (cr, markup, label);
956 /*---------------------------------------------------------------------------*/
957 /* PRIVATE. Draw objects layer. */
958 /*---------------------------------------------------------------------------*/
960 draw_objects_layer (glView *view,
963 gl_label_draw (view->label, cr, TRUE, NULL);
967 /*---------------------------------------------------------------------------*/
968 /* PRIVATE. Draw foreground */
969 /*---------------------------------------------------------------------------*/
971 draw_fg_layer (glView *view,
974 g_return_if_fail (view && GL_IS_VIEW (view));
975 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
977 gl_cairo_label_path (cr, view->label->template, view->label->rotate_flag, FALSE);
979 cairo_set_line_width (cr, OUTLINE_WIDTH_PIXELS/(view->home_scale * view->zoom));
980 cairo_set_source_rgb (cr, OUTLINE_RGB_ARGS);
985 /*---------------------------------------------------------------------------*/
986 /* PRIVATE. Create highlight layer. */
987 /*---------------------------------------------------------------------------*/
989 draw_highlight_layer (glView *view,
993 glViewObject *view_object;
995 g_return_if_fail (view && GL_IS_VIEW (view));
999 cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
1001 for (p_obj = view->selected_object_list; p_obj != NULL; p_obj = p_obj->next)
1003 view_object = GL_VIEW_OBJECT (p_obj->data);
1005 gl_view_object_draw_handles (view_object, cr);
1012 /*---------------------------------------------------------------------------*/
1013 /* PRIVATE. Draw select region layer. */
1014 /*---------------------------------------------------------------------------*/
1016 draw_select_region_layer (glView *view,
1022 g_return_if_fail (view && GL_IS_VIEW (view));
1024 if (view->select_region_visible)
1026 x1 = MIN (view->select_region.x1, view->select_region.x2);
1027 y1 = MIN (view->select_region.y1, view->select_region.y2);
1028 w = fabs (view->select_region.x2 - view->select_region.x1);
1029 h = fabs (view->select_region.y2 - view->select_region.y1);
1033 cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
1035 cairo_rectangle (cr, x1, y1, w, h);
1037 cairo_set_source_rgba (cr, SELECT_FILL_RGBA_ARGS);
1038 cairo_fill_preserve (cr);
1040 cairo_set_line_width (cr, SELECT_LINE_WIDTH_PIXELS/(view->home_scale * view->zoom));
1041 cairo_set_source_rgba (cr, SELECT_LINE_RGBA_ARGS);
1049 /*****************************************************************************/
1051 /*****************************************************************************/
1053 gl_view_show_grid (glView *view)
1055 g_return_if_fail (view && GL_IS_VIEW (view));
1057 view->grid_visible = TRUE;
1058 gl_view_update (view);
1062 /*****************************************************************************/
1064 /*****************************************************************************/
1066 gl_view_hide_grid (glView *view)
1068 g_return_if_fail (view && GL_IS_VIEW (view));
1070 view->grid_visible = FALSE;
1071 gl_view_update (view);
1075 /*****************************************************************************/
1076 /* Set grid spacing. */
1077 /*****************************************************************************/
1079 gl_view_set_grid_spacing (glView *view,
1082 g_return_if_fail (view && GL_IS_VIEW (view));
1084 view->grid_spacing = spacing;
1085 gl_view_update (view);
1089 /*****************************************************************************/
1091 /*****************************************************************************/
1093 gl_view_show_markup (glView *view)
1095 g_return_if_fail (view && GL_IS_VIEW (view));
1097 view->markup_visible = TRUE;
1098 gl_view_update (view);
1102 /*****************************************************************************/
1104 /*****************************************************************************/
1106 gl_view_hide_markup (glView *view)
1108 g_return_if_fail (view && GL_IS_VIEW (view));
1110 view->markup_visible = FALSE;
1111 gl_view_update (view);
1115 /*****************************************************************************/
1116 /* Set arrow mode. */
1117 /*****************************************************************************/
1119 gl_view_arrow_mode (glView *view)
1123 gl_debug (DEBUG_VIEW, "START");
1125 g_return_if_fail (view && GL_IS_VIEW (view));
1127 cursor = gdk_cursor_new (GDK_LEFT_PTR);
1128 gdk_window_set_cursor (view->canvas->window, cursor);
1129 gdk_cursor_unref (cursor);
1131 view->mode = GL_VIEW_MODE_ARROW;
1132 view->state = GL_VIEW_IDLE;
1134 gl_debug (DEBUG_VIEW, "END");
1138 /*****************************************************************************/
1139 /* Set create text object mode. */
1140 /*****************************************************************************/
1142 gl_view_object_create_mode (glView *view,
1143 glLabelObjectType type)
1145 GdkCursor *cursor = NULL;
1147 gl_debug (DEBUG_VIEW, "START");
1149 g_return_if_fail (view && GL_IS_VIEW (view));
1153 case GL_LABEL_OBJECT_BOX:
1154 cursor = gl_view_box_get_create_cursor ();
1156 case GL_LABEL_OBJECT_ELLIPSE:
1157 cursor = gl_view_ellipse_get_create_cursor ();
1159 case GL_LABEL_OBJECT_LINE:
1160 cursor = gl_view_line_get_create_cursor ();
1162 case GL_LABEL_OBJECT_IMAGE:
1163 cursor = gl_view_image_get_create_cursor ();
1165 case GL_LABEL_OBJECT_TEXT:
1166 cursor = gl_view_text_get_create_cursor ();
1168 case GL_LABEL_OBJECT_BARCODE:
1169 cursor = gl_view_barcode_get_create_cursor ();
1172 g_message ("Invalid label object type.");/*Should not happen!*/
1176 gdk_window_set_cursor (view->canvas->window, cursor);
1177 gdk_cursor_unref (cursor);
1179 view->mode = GL_VIEW_MODE_OBJECT_CREATE;
1180 view->state = GL_VIEW_IDLE;
1181 view->create_type = type;
1183 gl_debug (DEBUG_VIEW, "END");
1187 /*****************************************************************************/
1188 /* Select given object (adding to current selection). */
1189 /*****************************************************************************/
1191 gl_view_select_object (glView *view,
1192 glViewObject *view_object)
1194 gl_debug (DEBUG_VIEW, "START");
1196 g_return_if_fail (view && GL_IS_VIEW (view));
1198 select_object_real (view, view_object);
1200 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1202 gl_debug (DEBUG_VIEW, "END");
1206 /*****************************************************************************/
1207 /* Unselect given object (removing from current selection). */
1208 /*****************************************************************************/
1210 gl_view_unselect_object (glView *view,
1211 glViewObject *view_object)
1213 gl_debug (DEBUG_VIEW, "START");
1215 g_return_if_fail (view && GL_IS_VIEW (view));
1217 unselect_object_real (view, view_object);
1219 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1221 gl_debug (DEBUG_VIEW, "END");
1225 /*****************************************************************************/
1226 /* Select all items. */
1227 /*****************************************************************************/
1229 gl_view_select_all (glView *view)
1233 gl_debug (DEBUG_VIEW, "START");
1235 g_return_if_fail (view && GL_IS_VIEW (view));
1237 /* 1st unselect anything already selected. */
1238 for (p = view->selected_object_list; p != NULL; p = p_next) {
1240 unselect_object_real (view, GL_VIEW_OBJECT (p->data));
1243 /* Finally select all objects. */
1244 for (p = view->object_list; p != NULL; p = p->next) {
1245 select_object_real (view, GL_VIEW_OBJECT (p->data));
1248 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1250 gl_debug (DEBUG_VIEW, "END");
1254 /*****************************************************************************/
1255 /* Remove all selections */
1256 /*****************************************************************************/
1258 gl_view_unselect_all (glView *view)
1263 gl_debug (DEBUG_VIEW, "START");
1265 g_return_if_fail (view && GL_IS_VIEW (view));
1267 for (p = view->selected_object_list; p != NULL; p = p_next) {
1269 unselect_object_real (view, GL_VIEW_OBJECT (p->data));
1272 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1274 gl_debug (DEBUG_VIEW, "END");
1278 /*****************************************************************************/
1279 /* Select all objects within given rectangular region (adding to selection). */
1280 /*****************************************************************************/
1282 gl_view_select_region (glView *view,
1283 glLabelRegion *region)
1286 glViewObject *view_object;
1287 glLabelObject *object;
1290 glLabelRegion obj_extent;
1292 gl_debug (DEBUG_VIEW, "START");
1294 g_return_if_fail (view && GL_IS_VIEW (view));
1296 r_x1 = MIN (region->x1, region->x2);
1297 r_y1 = MIN (region->y1, region->y2);
1298 r_x2 = MAX (region->x1, region->x2);
1299 r_y2 = MAX (region->y1, region->y2);
1301 for (p = view->object_list; p != NULL; p = p->next)
1303 view_object = GL_VIEW_OBJECT(p->data);
1304 if (!gl_view_is_object_selected (view, view_object))
1307 object = gl_view_object_get_object (view_object);
1309 gl_label_object_get_extent (object, &obj_extent);
1310 if ((obj_extent.x1 >= r_x1) &&
1311 (obj_extent.x2 <= r_x2) &&
1312 (obj_extent.y1 >= r_y1) &&
1313 (obj_extent.y2 <= r_y2))
1315 select_object_real (view, view_object);
1321 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1323 gl_debug (DEBUG_VIEW, "END");
1327 /*---------------------------------------------------------------------------*/
1328 /* PRIVATE. Select an object. */
1329 /*---------------------------------------------------------------------------*/
1331 select_object_real (glView *view,
1332 glViewObject *view_object)
1334 gl_debug (DEBUG_VIEW, "START");
1336 g_return_if_fail (view && GL_IS_VIEW (view));
1337 g_return_if_fail (GL_IS_VIEW_OBJECT (view_object));
1339 if (!gl_view_is_object_selected (view, view_object)) {
1340 view->selected_object_list =
1341 g_list_append (view->selected_object_list, view_object);
1343 gtk_widget_grab_focus (GTK_WIDGET (view->canvas));
1345 gl_view_update (view);
1347 gl_debug (DEBUG_VIEW, "END");
1351 /*---------------------------------------------------------------------------*/
1352 /* PRIVATE. Un-select object. */
1353 /*---------------------------------------------------------------------------*/
1355 unselect_object_real (glView *view,
1356 glViewObject *view_object)
1358 gl_debug (DEBUG_VIEW, "START");
1360 g_return_if_fail (view && GL_IS_VIEW (view));
1361 g_return_if_fail (GL_IS_VIEW_OBJECT (view_object));
1363 view->selected_object_list =
1364 g_list_remove (view->selected_object_list, view_object);
1366 gl_view_update (view);
1368 gl_debug (DEBUG_VIEW, "END");
1372 /*---------------------------------------------------------------------------*/
1373 /* PRIVATE. Return object at (x,y). */
1374 /*---------------------------------------------------------------------------*/
1375 static glViewObject *
1376 view_view_object_at (glView *view,
1382 glViewObject *view_object;
1384 g_return_val_if_fail (view && GL_IS_VIEW (view), NULL);
1386 for (p_obj = g_list_last (view->object_list); p_obj != NULL; p_obj = p_obj->prev)
1389 view_object = GL_VIEW_OBJECT (p_obj->data);
1391 if (gl_view_object_at (view_object, cr, x, y))
1402 /*---------------------------------------------------------------------------*/
1403 /* PRIVATE. Return object handle at (x,y). */
1404 /*---------------------------------------------------------------------------*/
1405 static glViewObject *
1406 view_handle_at (glView *view,
1410 glViewObjectHandle *handle)
1413 glViewObject *view_object;
1415 g_return_val_if_fail (view && GL_IS_VIEW (view), NULL);
1417 for (p_obj = g_list_last (view->selected_object_list); p_obj != NULL; p_obj = p_obj->prev)
1420 view_object = GL_VIEW_OBJECT (p_obj->data);
1422 if ((*handle = gl_view_object_handle_at (view_object, cr, x, y)))
1433 /*****************************************************************************/
1434 /* Is the object in our current selection? */
1435 /*****************************************************************************/
1437 gl_view_is_object_selected (glView *view,
1438 glViewObject *view_object)
1440 gl_debug (DEBUG_VIEW, "");
1442 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
1443 g_return_val_if_fail (GL_IS_VIEW_OBJECT (view_object), FALSE);
1445 if (g_list_find (view->selected_object_list, view_object) == NULL) {
1452 /*****************************************************************************/
1453 /* Is our current selection empty? */
1454 /*****************************************************************************/
1456 gl_view_is_selection_empty (glView *view)
1458 gl_debug (DEBUG_VIEW, "");
1460 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
1462 if (view->selected_object_list == NULL) {
1470 /*****************************************************************************/
1471 /* Is our current selection atomic? I.e. only one item selected. */
1472 /*****************************************************************************/
1474 gl_view_is_selection_atomic (glView *view)
1476 gl_debug (DEBUG_VIEW, "");
1478 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
1480 if (view->selected_object_list == NULL)
1482 if (view->selected_object_list->next == NULL)
1488 /*****************************************************************************/
1489 /* Delete selected objects. (Bypass clipboard) */
1490 /*****************************************************************************/
1492 gl_view_delete_selection (glView *view)
1497 glViewObject *view_object;
1498 glLabelObject *object;
1500 gl_debug (DEBUG_VIEW, "START");
1502 g_return_if_fail (view && GL_IS_VIEW (view));
1504 object_list = view->selected_object_list;
1505 view->selected_object_list = NULL;
1506 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1508 for (p = object_list; p != NULL; p = p_next) {
1510 view_object = GL_VIEW_OBJECT (p->data);
1511 object = gl_view_object_get_object (view_object);
1512 gl_label_object_remove (object);
1515 g_list_free (object_list);
1517 gl_debug (DEBUG_VIEW, "END");
1521 /*****************************************************************************/
1522 /* Get object property editor of first selected object. */
1523 /*****************************************************************************/
1525 gl_view_get_editor (glView *view)
1527 glViewObject *view_object;
1528 GtkWidget *editor = NULL;
1530 gl_debug (DEBUG_VIEW, "START");
1532 g_return_val_if_fail (view && GL_IS_VIEW (view), NULL);
1534 if (!gl_view_is_selection_empty (view)) {
1536 view_object = GL_VIEW_OBJECT(view->selected_object_list->data);
1537 editor = gl_view_object_get_editor (view_object);
1541 gl_debug (DEBUG_VIEW, "END");
1547 /*****************************************************************************/
1548 /* Raise selected items to top. */
1549 /*****************************************************************************/
1551 gl_view_raise_selection (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_raise_to_top (object);
1567 gl_debug (DEBUG_VIEW, "END");
1571 /*****************************************************************************/
1572 /* Lower selected items to bottom. */
1573 /*****************************************************************************/
1575 gl_view_lower_selection (glView *view)
1578 glViewObject *view_object;
1579 glLabelObject *object;
1581 gl_debug (DEBUG_VIEW, "START");
1583 g_return_if_fail (view && GL_IS_VIEW (view));
1585 for (p = view->selected_object_list; p != NULL; p = p->next) {
1586 view_object = GL_VIEW_OBJECT (p->data);
1587 object = gl_view_object_get_object (view_object);
1588 gl_label_object_lower_to_bottom (object);
1591 gl_debug (DEBUG_VIEW, "END");
1595 /*****************************************************************************/
1596 /* Rotate selected objects by given angle. */
1597 /*****************************************************************************/
1599 gl_view_rotate_selection (glView *view,
1603 glViewObject *view_object;
1604 glLabelObject *object;
1606 gl_debug (DEBUG_VIEW, "START");
1608 g_return_if_fail (view && GL_IS_VIEW (view));
1610 for (p = view->selected_object_list; p != NULL; p = p->next) {
1611 view_object = GL_VIEW_OBJECT (p->data);
1612 object = gl_view_object_get_object (view_object);
1613 gl_label_object_rotate (object, theta_degs);
1616 gl_debug (DEBUG_VIEW, "END");
1620 /*****************************************************************************/
1621 /* Rotate selected objects 90 degrees left. */
1622 /*****************************************************************************/
1624 gl_view_rotate_selection_left (glView *view)
1627 glViewObject *view_object;
1628 glLabelObject *object;
1630 gl_debug (DEBUG_VIEW, "START");
1632 g_return_if_fail (view && GL_IS_VIEW (view));
1634 for (p = view->selected_object_list; p != NULL; p = p->next) {
1635 view_object = GL_VIEW_OBJECT (p->data);
1636 object = gl_view_object_get_object (view_object);
1637 gl_label_object_rotate (object, -90.0);
1640 gl_debug (DEBUG_VIEW, "END");
1644 /*****************************************************************************/
1645 /* Rotate selected objects 90 degrees right. */
1646 /*****************************************************************************/
1648 gl_view_rotate_selection_right (glView *view)
1651 glViewObject *view_object;
1652 glLabelObject *object;
1654 gl_debug (DEBUG_VIEW, "START");
1656 g_return_if_fail (view && GL_IS_VIEW (view));
1658 for (p = view->selected_object_list; p != NULL; p = p->next) {
1659 view_object = GL_VIEW_OBJECT (p->data);
1660 object = gl_view_object_get_object (view_object);
1661 gl_label_object_rotate (object, 90.0);
1664 gl_debug (DEBUG_VIEW, "END");
1668 /*****************************************************************************/
1669 /* Flip selected objects horizontally. */
1670 /*****************************************************************************/
1672 gl_view_flip_selection_horiz (glView *view)
1675 glViewObject *view_object;
1676 glLabelObject *object;
1678 gl_debug (DEBUG_VIEW, "START");
1680 g_return_if_fail (view && GL_IS_VIEW (view));
1682 for (p = view->selected_object_list; p != NULL; p = p->next) {
1683 view_object = GL_VIEW_OBJECT (p->data);
1684 object = gl_view_object_get_object (view_object);
1685 gl_label_object_flip_horiz (object);
1688 gl_debug (DEBUG_VIEW, "END");
1692 /*****************************************************************************/
1693 /* Flip selected objects vertically. */
1694 /*****************************************************************************/
1696 gl_view_flip_selection_vert (glView *view)
1699 glViewObject *view_object;
1700 glLabelObject *object;
1702 gl_debug (DEBUG_VIEW, "START");
1704 g_return_if_fail (view && GL_IS_VIEW (view));
1706 for (p = view->selected_object_list; p != NULL; p = p->next) {
1707 view_object = GL_VIEW_OBJECT (p->data);
1708 object = gl_view_object_get_object (view_object);
1709 gl_label_object_flip_vert (object);
1712 gl_debug (DEBUG_VIEW, "END");
1716 /*****************************************************************************/
1717 /* Align selected objects to left most edge. */
1718 /*****************************************************************************/
1720 gl_view_align_selection_left (glView *view)
1723 glViewObject *view_object;
1724 glLabelObject *object;
1726 glLabelRegion obj_extent;
1728 gl_debug (DEBUG_VIEW, "START");
1730 g_return_if_fail (view && GL_IS_VIEW (view));
1732 g_return_if_fail (!gl_view_is_selection_empty (view) &&
1733 !gl_view_is_selection_atomic (view));
1735 /* find left most edge */
1736 p = view->selected_object_list;
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 x1_min = obj_extent.x1;
1741 for (p = p->next; p != NULL; p = p->next)
1743 view_object = GL_VIEW_OBJECT (p->data);
1744 object = gl_view_object_get_object (view_object);
1745 gl_label_object_get_extent (object, &obj_extent);
1746 if ( obj_extent.x1 < x1_min ) x1_min = obj_extent.x1;
1749 /* now adjust the object positions to line up the left edges */
1750 for (p = view->selected_object_list; p != NULL; p = p->next)
1752 view_object = GL_VIEW_OBJECT (p->data);
1753 object = gl_view_object_get_object (view_object);
1754 gl_label_object_get_extent (object, &obj_extent);
1755 dx = x1_min - obj_extent.x1;
1756 gl_label_object_set_position_relative (object, dx, 0.0);
1759 gl_debug (DEBUG_VIEW, "END");
1763 /*****************************************************************************/
1764 /* Align selected objects to right most edge. */
1765 /*****************************************************************************/
1767 gl_view_align_selection_right (glView *view)
1770 glViewObject *view_object;
1771 glLabelObject *object;
1773 glLabelRegion obj_extent;
1775 gl_debug (DEBUG_VIEW, "START");
1777 g_return_if_fail (view && GL_IS_VIEW (view));
1779 g_return_if_fail (!gl_view_is_selection_empty (view) &&
1780 !gl_view_is_selection_atomic (view));
1782 /* find right most edge */
1783 p = view->selected_object_list;
1784 view_object = GL_VIEW_OBJECT (p->data);
1785 object = gl_view_object_get_object (view_object);
1786 gl_label_object_get_extent (object, &obj_extent);
1787 x2_max = obj_extent.x2;
1788 for (p = p->next; p != NULL; p = p->next)
1790 view_object = GL_VIEW_OBJECT (p->data);
1791 object = gl_view_object_get_object (view_object);
1792 gl_label_object_get_extent (object, &obj_extent);
1793 if ( obj_extent.x2 > x2_max ) x2_max = obj_extent.x2;
1796 /* now adjust the object positions to line up the right edges */
1797 for (p = view->selected_object_list; p != NULL; p = p->next)
1799 view_object = GL_VIEW_OBJECT (p->data);
1800 object = gl_view_object_get_object (view_object);
1801 gl_label_object_get_extent (object, &obj_extent);
1802 dx = x2_max - obj_extent.x2;
1803 gl_label_object_set_position_relative (object, dx, 0.0);
1806 gl_debug (DEBUG_VIEW, "END");
1810 /*****************************************************************************/
1811 /* Align selected objects to horizontal center of objects. */
1812 /*****************************************************************************/
1814 gl_view_align_selection_hcenter (glView *view)
1817 glViewObject *view_object;
1818 glLabelObject *object;
1822 glLabelRegion obj_extent;
1826 gl_debug (DEBUG_VIEW, "START");
1828 g_return_if_fail (view && GL_IS_VIEW (view));
1830 g_return_if_fail (!gl_view_is_selection_empty (view) &&
1831 !gl_view_is_selection_atomic (view));
1833 /* find average center of objects */
1836 for (p = view->selected_object_list; p != NULL; p = p->next)
1838 view_object = GL_VIEW_OBJECT (p->data);
1839 object = gl_view_object_get_object (view_object);
1840 gl_label_object_get_extent (object, &obj_extent);
1841 xsum += (obj_extent.x1 + obj_extent.x2) / 2.0;
1846 /* find center of object closest to average center */
1847 p = view->selected_object_list;
1848 view_object = GL_VIEW_OBJECT (p->data);
1849 object = gl_view_object_get_object (view_object);
1850 gl_label_object_get_extent (object, &obj_extent);
1851 dxmin = fabs (xavg - (obj_extent.x1 + obj_extent.x2)/2.0);
1852 xcenter = (obj_extent.x1 + obj_extent.x2)/2.0;
1853 for (p = p->next; p != NULL; p = p->next)
1855 view_object = GL_VIEW_OBJECT (p->data);
1856 object = gl_view_object_get_object (view_object);
1857 gl_label_object_get_extent (object, &obj_extent);
1858 dx = fabs (xavg - (obj_extent.x1 + obj_extent.x2)/2.0);
1862 xcenter = (obj_extent.x1 + obj_extent.x2)/2.0;
1866 /* now adjust the object positions to line up this center */
1867 for (p = view->selected_object_list; p != NULL; p = p->next) {
1868 view_object = GL_VIEW_OBJECT (p->data);
1869 object = gl_view_object_get_object (view_object);
1870 gl_label_object_get_extent (object, &obj_extent);
1871 dx = xcenter - (obj_extent.x1 + obj_extent.x2)/2.0;
1872 gl_label_object_set_position_relative (object, dx, 0.0);
1875 gl_debug (DEBUG_VIEW, "END");
1879 /*****************************************************************************/
1880 /* Align selected objects to top most edge. */
1881 /*****************************************************************************/
1883 gl_view_align_selection_top (glView *view)
1886 glViewObject *view_object;
1887 glLabelObject *object;
1889 glLabelRegion obj_extent;
1891 gl_debug (DEBUG_VIEW, "START");
1893 g_return_if_fail (view && GL_IS_VIEW (view));
1895 g_return_if_fail (!gl_view_is_selection_empty (view) &&
1896 !gl_view_is_selection_atomic (view));
1898 /* find top most edge */
1899 p = view->selected_object_list;
1900 view_object = GL_VIEW_OBJECT (p->data);
1901 object = gl_view_object_get_object (view_object);
1902 gl_label_object_get_extent (object, &obj_extent);
1903 y1_min = obj_extent.y1;
1904 for (p = p->next; p != NULL; p = p->next)
1906 view_object = GL_VIEW_OBJECT (p->data);
1907 object = gl_view_object_get_object (view_object);
1908 gl_label_object_get_extent (object, &obj_extent);
1909 if ( obj_extent.y1 < y1_min ) y1_min = obj_extent.y1;
1912 /* now adjust the object positions to line up the top edges */
1913 for (p = view->selected_object_list; p != NULL; p = p->next)
1915 view_object = GL_VIEW_OBJECT (p->data);
1916 object = gl_view_object_get_object (view_object);
1917 gl_label_object_get_extent (object, &obj_extent);
1918 dy = y1_min - obj_extent.y1;
1919 gl_label_object_set_position_relative (object, 0.0, dy);
1922 gl_debug (DEBUG_VIEW, "END");
1926 /*****************************************************************************/
1927 /* Align selected objects to bottom most edge. */
1928 /*****************************************************************************/
1930 gl_view_align_selection_bottom (glView *view)
1933 glViewObject *view_object;
1934 glLabelObject *object;
1936 glLabelRegion obj_extent;
1938 gl_debug (DEBUG_VIEW, "START");
1940 g_return_if_fail (view && GL_IS_VIEW (view));
1942 g_return_if_fail (!gl_view_is_selection_empty (view) &&
1943 !gl_view_is_selection_atomic (view));
1945 /* find bottom most edge */
1946 p = view->selected_object_list;
1947 view_object = GL_VIEW_OBJECT (p->data);
1948 object = gl_view_object_get_object (view_object);
1949 gl_label_object_get_extent (object, &obj_extent);
1950 y2_max = obj_extent.y2;
1951 for (p = p->next; p != NULL; p = p->next)
1953 view_object = GL_VIEW_OBJECT (p->data);
1954 object = gl_view_object_get_object (view_object);
1955 gl_label_object_get_extent (object, &obj_extent);
1956 if ( obj_extent.y2 > y2_max ) y2_max = obj_extent.y2;
1959 /* now adjust the object positions to line up the bottom edges */
1960 for (p = view->selected_object_list; p != NULL; p = p->next)
1962 view_object = GL_VIEW_OBJECT (p->data);
1963 object = gl_view_object_get_object (view_object);
1964 gl_label_object_get_extent (object, &obj_extent);
1965 dy = y2_max - obj_extent.y2;
1966 gl_label_object_set_position_relative (object, 0.0, dy);
1969 gl_debug (DEBUG_VIEW, "END");
1973 /*****************************************************************************/
1974 /* Align selected objects to viertical center of objects. */
1975 /*****************************************************************************/
1977 gl_view_align_selection_vcenter (glView *view)
1980 glViewObject *view_object;
1981 glLabelObject *object;
1985 glLabelRegion obj_extent;
1989 gl_debug (DEBUG_VIEW, "START");
1991 g_return_if_fail (view && GL_IS_VIEW (view));
1993 g_return_if_fail (!gl_view_is_selection_empty (view) &&
1994 !gl_view_is_selection_atomic (view));
1996 /* find average center of objects */
1999 for (p = view->selected_object_list; p != NULL; p = p->next)
2001 view_object = GL_VIEW_OBJECT (p->data);
2002 object = gl_view_object_get_object (view_object);
2003 gl_label_object_get_extent (object, &obj_extent);
2004 ysum += (obj_extent.y1 + obj_extent.y2) / 2.0;
2009 /* find center of object closest to average center */
2010 p = view->selected_object_list;
2011 view_object = GL_VIEW_OBJECT (p->data);
2012 object = gl_view_object_get_object (view_object);
2013 gl_label_object_get_extent (object, &obj_extent);
2014 dymin = fabs (yavg - (obj_extent.y1 + obj_extent.y2)/2.0);
2015 ycenter = (obj_extent.y1 + obj_extent.y2)/2.0;
2016 for (p = p->next; p != NULL; p = p->next)
2018 view_object = GL_VIEW_OBJECT (p->data);
2019 object = gl_view_object_get_object (view_object);
2020 gl_label_object_get_extent (object, &obj_extent);
2021 dy = fabs (yavg - (obj_extent.y1 + obj_extent.y2)/2.0);
2025 ycenter = (obj_extent.y1 + obj_extent.y2)/2.0;
2029 /* now adjust the object positions to line up this center */
2030 for (p = view->selected_object_list; p != NULL; p = p->next)
2032 view_object = GL_VIEW_OBJECT (p->data);
2033 object = gl_view_object_get_object (view_object);
2034 gl_label_object_get_extent (object, &obj_extent);
2035 dy = ycenter - (obj_extent.y1 + obj_extent.y2)/2.0;
2036 gl_label_object_set_position_relative (object, 0.0, dy);
2039 gl_debug (DEBUG_VIEW, "END");
2043 /*****************************************************************************/
2044 /* Center selected objects to in center of label. */
2045 /*****************************************************************************/
2047 gl_view_center_selection_horiz (glView *view)
2050 glViewObject *view_object;
2051 glLabelObject *object;
2053 gdouble x_label_center;
2054 gdouble x_obj_center;
2055 glLabelRegion obj_extent;
2058 gl_debug (DEBUG_VIEW, "START");
2060 g_return_if_fail (view && GL_IS_VIEW (view));
2062 g_return_if_fail (!gl_view_is_selection_empty (view));
2064 gl_label_get_size (view->label, &w, &h);
2065 x_label_center = w / 2.0;
2067 /* adjust the object positions */
2068 for (p = view->selected_object_list; p != NULL; p = p->next)
2070 view_object = GL_VIEW_OBJECT (p->data);
2071 object = gl_view_object_get_object (view_object);
2072 gl_label_object_get_extent (object, &obj_extent);
2073 x_obj_center = (obj_extent.x1 + obj_extent.x2) / 2.0;
2074 dx = x_label_center - x_obj_center;
2075 gl_label_object_set_position_relative (object, dx, 0.0);
2078 gl_debug (DEBUG_VIEW, "END");
2082 /*****************************************************************************/
2083 /* Center selected objects to in center of label. */
2084 /*****************************************************************************/
2086 gl_view_center_selection_vert (glView *view)
2089 glViewObject *view_object;
2090 glLabelObject *object;
2092 gdouble y_label_center;
2093 gdouble y_obj_center;
2094 glLabelRegion obj_extent;
2097 gl_debug (DEBUG_VIEW, "START");
2099 g_return_if_fail (view && GL_IS_VIEW (view));
2101 g_return_if_fail (!gl_view_is_selection_empty (view));
2103 gl_label_get_size (view->label, &w, &h);
2104 y_label_center = h / 2.0;
2106 /* adjust the object positions */
2107 for (p = view->selected_object_list; p != NULL; p = p->next)
2109 view_object = GL_VIEW_OBJECT (p->data);
2110 object = gl_view_object_get_object (view_object);
2111 gl_label_object_get_extent (object, &obj_extent);
2112 y_obj_center = (obj_extent.y1 + obj_extent.y2) / 2.0;
2113 dy = y_label_center - y_obj_center;
2114 gl_label_object_set_position_relative (object, 0.0, dy);
2117 gl_debug (DEBUG_VIEW, "END");
2121 /*****************************************************************************/
2122 /* Move selected objects */
2123 /*****************************************************************************/
2125 gl_view_move_selection (glView *view,
2130 glLabelObject *object;
2132 gl_debug (DEBUG_VIEW, "START");
2134 g_return_if_fail (view && GL_IS_VIEW (view));
2136 for (p = view->selected_object_list; p != NULL; p = p->next)
2139 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2140 gl_label_object_set_position_relative (object, dx, dy);
2144 gl_debug (DEBUG_VIEW, "END");
2148 /*****************************************************************************/
2149 /* Can text properties be set for selection? */
2150 /*****************************************************************************/
2152 gl_view_can_selection_text (glView *view)
2155 glLabelObject *object;
2157 gl_debug (DEBUG_VIEW, "");
2159 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
2161 for (p = view->selected_object_list; p != NULL; p = p->next)
2164 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2165 if (gl_label_object_can_text (object))
2176 /*****************************************************************************/
2177 /* Set font family for all text contained in selected objects. */
2178 /*****************************************************************************/
2180 gl_view_set_selection_font_family (glView *view,
2181 const gchar *font_family)
2184 glLabelObject *object;
2186 gl_debug (DEBUG_VIEW, "START");
2188 g_return_if_fail (view && GL_IS_VIEW (view));
2190 for (p = view->selected_object_list; p != NULL; p = p->next) {
2192 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2193 gl_label_object_set_font_family (object, font_family);
2197 gl_debug (DEBUG_VIEW, "END");
2201 /*****************************************************************************/
2202 /* Set font size for all text contained in selected objects. */
2203 /*****************************************************************************/
2205 gl_view_set_selection_font_size (glView *view,
2209 glLabelObject *object;
2211 gl_debug (DEBUG_VIEW, "START");
2213 g_return_if_fail (view && GL_IS_VIEW (view));
2215 for (p = view->selected_object_list; p != NULL; p = p->next) {
2217 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2218 gl_label_object_set_font_size (object, font_size);
2222 gl_debug (DEBUG_VIEW, "END");
2226 /*****************************************************************************/
2227 /* Set font weight for all text contained in selected objects. */
2228 /*****************************************************************************/
2230 gl_view_set_selection_font_weight (glView *view,
2231 PangoWeight font_weight)
2234 glLabelObject *object;
2236 gl_debug (DEBUG_VIEW, "START");
2238 g_return_if_fail (view && GL_IS_VIEW (view));
2240 for (p = view->selected_object_list; p != NULL; p = p->next) {
2242 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2243 gl_label_object_set_font_weight (object, font_weight);
2247 gl_debug (DEBUG_VIEW, "END");
2251 /*****************************************************************************/
2252 /* Set font italic flag for all text contained in selected objects. */
2253 /*****************************************************************************/
2255 gl_view_set_selection_font_italic_flag (glView *view,
2256 gboolean font_italic_flag)
2259 glLabelObject *object;
2261 gl_debug (DEBUG_VIEW, "START");
2263 g_return_if_fail (view && GL_IS_VIEW (view));
2265 for (p = view->selected_object_list; p != NULL; p = p->next) {
2267 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2268 gl_label_object_set_font_italic_flag (object, font_italic_flag);
2272 gl_debug (DEBUG_VIEW, "END");
2276 /*****************************************************************************/
2277 /* Set text alignment for all text contained in selected objects. */
2278 /*****************************************************************************/
2280 gl_view_set_selection_text_alignment (glView *view,
2281 PangoAlignment text_alignment)
2284 glLabelObject *object;
2286 gl_debug (DEBUG_VIEW, "START");
2288 g_return_if_fail (view && GL_IS_VIEW (view));
2290 for (p = view->selected_object_list; p != NULL; p = p->next) {
2292 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2293 gl_label_object_set_text_alignment (object, text_alignment);
2297 gl_debug (DEBUG_VIEW, "END");
2301 /*****************************************************************************/
2302 /* Set text line spacing for all text contained in selected objects. */
2303 /*****************************************************************************/
2305 gl_view_set_selection_text_line_spacing (glView *view,
2306 gdouble text_line_spacing)
2309 glLabelObject *object;
2311 gl_debug (DEBUG_VIEW, "START");
2313 g_return_if_fail (view && GL_IS_VIEW (view));
2315 for (p = view->selected_object_list; p != NULL; p = p->next) {
2317 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2318 gl_label_object_set_text_line_spacing (object, text_line_spacing);
2322 gl_debug (DEBUG_VIEW, "END");
2326 /*****************************************************************************/
2327 /* Set text color for all text contained in selected objects. */
2328 /*****************************************************************************/
2330 gl_view_set_selection_text_color (glView *view,
2331 glColorNode *text_color_node)
2334 glLabelObject *object;
2336 gl_debug (DEBUG_VIEW, "START");
2338 g_return_if_fail (view && GL_IS_VIEW (view));
2340 for (p = view->selected_object_list; p != NULL; p = p->next) {
2342 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2343 gl_label_object_set_text_color (object, text_color_node);
2347 gl_debug (DEBUG_VIEW, "END");
2351 /*****************************************************************************/
2352 /* Can fill properties be set for selection? */
2353 /*****************************************************************************/
2355 gl_view_can_selection_fill (glView *view)
2358 glLabelObject *object;
2360 gl_debug (DEBUG_VIEW, "");
2362 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
2364 for (p = view->selected_object_list; p != NULL; p = p->next) {
2366 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2367 if (gl_label_object_can_fill (object)) {
2377 /*****************************************************************************/
2378 /* Set fill color for all selected objects. */
2379 /*****************************************************************************/
2381 gl_view_set_selection_fill_color (glView *view,
2382 glColorNode *fill_color_node)
2385 glLabelObject *object;
2387 gl_debug (DEBUG_VIEW, "START");
2389 g_return_if_fail (view && GL_IS_VIEW (view));
2391 for (p = view->selected_object_list; p != NULL; p = p->next) {
2393 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2394 gl_label_object_set_fill_color (object, fill_color_node);
2398 gl_debug (DEBUG_VIEW, "END");
2402 /*****************************************************************************/
2403 /* Can line color properties be set for selection? */
2404 /*****************************************************************************/
2406 gl_view_can_selection_line_color (glView *view)
2409 glLabelObject *object;
2411 gl_debug (DEBUG_VIEW, "");
2413 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
2415 for (p = view->selected_object_list; p != NULL; p = p->next) {
2417 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2418 if (gl_label_object_can_line_color (object)) {
2428 /*****************************************************************************/
2429 /* Set line color for all selected objects. */
2430 /*****************************************************************************/
2432 gl_view_set_selection_line_color (glView *view,
2433 glColorNode *line_color_node)
2436 glLabelObject *object;
2438 gl_debug (DEBUG_VIEW, "START");
2440 g_return_if_fail (view && GL_IS_VIEW (view));
2442 for (p = view->selected_object_list; p != NULL; p = p->next) {
2444 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2445 gl_label_object_set_line_color (object, line_color_node);
2449 gl_debug (DEBUG_VIEW, "END");
2453 /*****************************************************************************/
2454 /* Can line width properties be set for selection? */
2455 /*****************************************************************************/
2457 gl_view_can_selection_line_width (glView *view)
2460 glLabelObject *object;
2462 gl_debug (DEBUG_VIEW, "");
2464 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
2466 for (p = view->selected_object_list; p != NULL; p = p->next) {
2468 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2469 if (gl_label_object_can_line_width (object)) {
2479 /*****************************************************************************/
2480 /* Set line width for all selected objects. */
2481 /*****************************************************************************/
2483 gl_view_set_selection_line_width (glView *view,
2487 glLabelObject *object;
2489 gl_debug (DEBUG_VIEW, "START");
2491 g_return_if_fail (view && GL_IS_VIEW (view));
2493 for (p = view->selected_object_list; p != NULL; p = p->next) {
2495 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2496 gl_label_object_set_line_width (object, line_width);
2500 gl_debug (DEBUG_VIEW, "END");
2504 /*****************************************************************************/
2505 /* "Cut" selected items and place in clipboard selections. */
2506 /*****************************************************************************/
2508 gl_view_cut (glView *view)
2510 gl_debug (DEBUG_VIEW, "START");
2512 g_return_if_fail (view && GL_IS_VIEW (view));
2514 gl_view_copy (view);
2515 gl_view_delete_selection (view);
2517 gl_debug (DEBUG_VIEW, "END");
2521 /*****************************************************************************/
2522 /* "Copy" selected items to clipboard selections. */
2523 /*****************************************************************************/
2525 gl_view_copy (glView *view)
2528 glViewObject *view_object;
2529 glLabelObject *object;
2531 gl_debug (DEBUG_VIEW, "START");
2533 g_return_if_fail (view && GL_IS_VIEW (view));
2535 if (view->selected_object_list) {
2537 if ( view->selection_data ) {
2538 g_object_unref (view->selection_data);
2540 view->selection_data = GL_LABEL(gl_label_new ());
2541 gl_label_set_template (view->selection_data, view->label->template);
2542 gl_label_set_rotate_flag (view->selection_data, view->label->rotate_flag);
2544 for (p = view->selected_object_list; p != NULL; p = p->next) {
2546 view_object = GL_VIEW_OBJECT (p->data);
2547 object = gl_view_object_get_object (view_object);
2549 gl_label_object_dup (object, view->selection_data);
2553 gtk_selection_owner_set (view->invisible,
2554 clipboard_atom, GDK_CURRENT_TIME);
2555 view->have_selection = TRUE;
2559 gl_debug (DEBUG_VIEW, "END");
2563 /*****************************************************************************/
2564 /* "Paste" from private clipboard selection. */
2565 /*****************************************************************************/
2567 gl_view_paste (glView *view)
2569 gl_debug (DEBUG_VIEW, "START");
2571 g_return_if_fail (view && GL_IS_VIEW (view));
2573 gtk_selection_convert (GTK_WIDGET (view->invisible),
2574 clipboard_atom, GDK_SELECTION_TYPE_STRING,
2577 gl_debug (DEBUG_VIEW, "END");
2581 /*****************************************************************************/
2582 /* Zoom in one "notch" */
2583 /*****************************************************************************/
2585 gl_view_zoom_in (glView *view)
2588 gdouble dist, dist_min;
2590 gl_debug (DEBUG_VIEW, "START");
2592 g_return_if_fail (view && GL_IS_VIEW (view));
2594 /* Find index of current scale (or best match) */
2595 i_min = 1; /* start with 2nd largest scale */
2596 dist_min = fabs (zooms[1] - view->zoom);
2597 for (i = 2; i < N_ZOOMS; i++) {
2598 dist = fabs (zooms[i] - view->zoom);
2599 if (dist < dist_min) {
2605 /* zoom in one "notch" */
2606 i = MAX (0, i_min - 1);
2607 gl_debug (DEBUG_VIEW, "zoom[%d] = %g", i, zooms[i]);
2608 set_zoom_real (view, zooms[i], FALSE);
2610 gl_debug (DEBUG_VIEW, "END");
2614 /*****************************************************************************/
2615 /* Zoom out one "notch" */
2616 /*****************************************************************************/
2618 gl_view_zoom_out (glView *view)
2621 gdouble dist, dist_min;
2623 gl_debug (DEBUG_VIEW, "START");
2625 g_return_if_fail (view && GL_IS_VIEW (view));
2627 /* Find index of current scale (or best match) */
2628 i_min = 0; /* start with largest scale */
2629 dist_min = fabs (zooms[0] - view->zoom);
2630 for (i = 1; i < N_ZOOMS; i++) {
2631 dist = fabs (zooms[i] - view->zoom);
2632 if (dist < dist_min) {
2638 /* zoom out one "notch" */
2639 if (i_min >= N_ZOOMS)
2644 set_zoom_real (view, zooms[i], FALSE);
2646 gl_debug (DEBUG_VIEW, "END");
2650 /*****************************************************************************/
2651 /* Set zoom to best fit. */
2652 /*****************************************************************************/
2654 gl_view_zoom_to_fit (glView *view)
2656 gint w_view, h_view;
2657 gdouble w_label, h_label;
2658 gdouble x_scale, y_scale, scale;
2660 gl_debug (DEBUG_VIEW, "");
2662 if ( ! GTK_WIDGET_VISIBLE(view)) {
2663 set_zoom_real (view, 1.0, TRUE);
2667 w_view = GTK_WIDGET(view)->allocation.width;
2668 h_view = GTK_WIDGET(view)->allocation.height;
2670 gl_label_get_size (GL_LABEL(view->label), &w_label, &h_label);
2672 gl_debug (DEBUG_VIEW, "View size: %d, %d", w_view, h_view);
2673 gl_debug (DEBUG_VIEW, "Label size: %g, %g", w_label, h_label);
2675 /* Calculate best scale */
2676 x_scale = (double)(w_view - ZOOMTOFIT_PAD) / w_label;
2677 y_scale = (double)(h_view - ZOOMTOFIT_PAD) / h_label;
2678 scale = MIN (x_scale, y_scale);
2679 gl_debug (DEBUG_VIEW, "Candidate zooms: %g, %g => %g", x_scale, y_scale, scale);
2682 gl_debug (DEBUG_VIEW, "Scale: %g", scale);
2683 scale = MIN (scale, zooms[0]*view->home_scale);
2684 scale = MAX (scale, zooms[N_ZOOMS-1]*view->home_scale);
2685 gl_debug (DEBUG_VIEW, "Limitted scale: %g", scale);
2687 set_zoom_real (view, scale/view->home_scale, TRUE);
2691 /*****************************************************************************/
2692 /* Set current zoom factor to explicit value. */
2693 /*****************************************************************************/
2695 gl_view_set_zoom (glView *view,
2698 gl_debug (DEBUG_VIEW, "START");
2700 set_zoom_real (view, zoom, FALSE);
2702 gl_debug (DEBUG_VIEW, "END");
2706 /*---------------------------------------------------------------------------*/
2707 /* PRIVATE. Set canvas scale. */
2708 /*---------------------------------------------------------------------------*/
2710 set_zoom_real (glView *view,
2712 gboolean zoom_to_fit_flag)
2714 gl_debug (DEBUG_VIEW, "START");
2716 g_return_if_fail (view && GL_IS_VIEW (view));
2717 g_return_if_fail (zoom > 0.0);
2719 /* Limit, if needed */
2720 gl_debug (DEBUG_VIEW, "Zoom requested: %g", zoom);
2721 zoom = MIN (zoom, zooms[0]);
2722 zoom = MAX (zoom, zooms[N_ZOOMS-1]);
2723 gl_debug (DEBUG_VIEW, "Limitted zoom: %g", zoom);
2725 if ( zoom != view->zoom ) {
2728 view->zoom_to_fit_flag = zoom_to_fit_flag;
2730 gl_view_update (view);
2732 g_signal_emit (G_OBJECT(view), signals[ZOOM_CHANGED], 0, zoom);
2736 gl_debug (DEBUG_VIEW, "END");
2741 /*****************************************************************************/
2742 /* Get current zoom factor. */
2743 /*****************************************************************************/
2745 gl_view_get_zoom (glView *view)
2747 gl_debug (DEBUG_VIEW, "");
2749 g_return_val_if_fail (view && GL_IS_VIEW (view), 1.0);
2755 /*****************************************************************************/
2756 /* Is this the maximum zoom level. */
2757 /*****************************************************************************/
2759 gl_view_is_zoom_max (glView *view)
2761 gl_debug (DEBUG_VIEW, "");
2763 g_return_val_if_fail (GL_IS_VIEW (view), FALSE);
2765 return view->zoom >= zooms[0];
2769 /*****************************************************************************/
2770 /* Is this the minimum zoom level. */
2771 /*****************************************************************************/
2773 gl_view_is_zoom_min (glView *view)
2775 gl_debug (DEBUG_VIEW, "");
2777 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
2779 return view->zoom <= zooms[N_ZOOMS-1];
2783 /*---------------------------------------------------------------------------*/
2784 /* PRIVATE. Handle "selection-clear" signal. */
2785 /*---------------------------------------------------------------------------*/
2787 selection_clear_cb (GtkWidget *widget,
2788 GdkEventSelection *event,
2791 gl_debug (DEBUG_VIEW, "START");
2793 g_return_if_fail (view && GL_IS_VIEW (view));
2795 view->have_selection = FALSE;
2796 g_object_unref (view->selection_data);
2797 view->selection_data = NULL;
2799 gl_debug (DEBUG_VIEW, "END");
2803 /*---------------------------------------------------------------------------*/
2804 /* PRIVATE. Handle "selection-get" signal. */
2805 /*---------------------------------------------------------------------------*/
2807 selection_get_cb (GtkWidget *widget,
2808 GtkSelectionData *selection_data,
2814 glXMLLabelStatus status;
2816 gl_debug (DEBUG_VIEW, "START");
2818 g_return_if_fail (view && GL_IS_VIEW (view));
2820 if (view->have_selection) {
2822 buffer = gl_xml_label_save_buffer (view->selection_data,
2824 gtk_selection_data_set (selection_data,
2825 GDK_SELECTION_TYPE_STRING, 8,
2826 (guchar *)buffer, strlen (buffer));
2830 gl_debug (DEBUG_VIEW, "END");
2834 /*---------------------------------------------------------------------------*/
2835 /* PRIVATE. Handle "selection-received" signal. (Result of Paste) */
2836 /*---------------------------------------------------------------------------*/
2838 selection_received_cb (GtkWidget *widget,
2839 GtkSelectionData *selection_data,
2843 glLabel *label = NULL;
2844 glXMLLabelStatus status;
2846 glLabelObject *object, *newobject;
2848 gl_debug (DEBUG_VIEW, "START");
2850 g_return_if_fail (view && GL_IS_VIEW (view));
2852 if (selection_data->length < 0) {
2855 if (selection_data->type != GDK_SELECTION_TYPE_STRING) {
2859 gl_view_unselect_all (view);
2861 label = gl_xml_label_open_buffer ((gchar *)selection_data->data, &status);
2862 for (p = label->objects; p != NULL; p = p_next) {
2865 object = (glLabelObject *) p->data;
2866 newobject = gl_label_object_dup (object, view->label);
2868 gl_debug (DEBUG_VIEW, "object pasted");
2870 g_object_unref (label);
2872 gl_debug (DEBUG_VIEW, "END");
2876 /****************************************************************************/
2877 /* Set default font family. */
2878 /****************************************************************************/
2880 gl_view_set_default_font_family (glView *view,
2881 const gchar *font_family)
2883 gl_debug (DEBUG_VIEW, "START");
2885 g_return_if_fail (view && GL_IS_VIEW (view));
2887 if (view->default_font_family) {
2888 g_free (view->default_font_family);
2890 view->default_font_family = g_strdup (font_family);
2892 gl_debug (DEBUG_VIEW, "END");
2896 /****************************************************************************/
2897 /* Set default font size. */
2898 /****************************************************************************/
2900 gl_view_set_default_font_size (glView *view,
2903 gl_debug (DEBUG_VIEW, "START");
2905 g_return_if_fail (view && GL_IS_VIEW (view));
2907 view->default_font_size = font_size;
2909 gl_debug (DEBUG_VIEW, "END");
2913 /****************************************************************************/
2914 /* Set default font weight. */
2915 /****************************************************************************/
2917 gl_view_set_default_font_weight (glView *view,
2918 PangoWeight font_weight)
2920 gl_debug (DEBUG_VIEW, "START");
2922 g_return_if_fail (view && GL_IS_VIEW (view));
2924 view->default_font_weight = font_weight;
2926 gl_debug (DEBUG_VIEW, "END");
2930 /****************************************************************************/
2931 /* Set default font italic flag. */
2932 /****************************************************************************/
2934 gl_view_set_default_font_italic_flag (glView *view,
2935 gboolean font_italic_flag)
2937 gl_debug (DEBUG_VIEW, "START");
2939 g_return_if_fail (view && GL_IS_VIEW (view));
2941 view->default_font_italic_flag = font_italic_flag;
2943 gl_debug (DEBUG_VIEW, "END");
2947 /****************************************************************************/
2948 /* Set default text color. */
2949 /****************************************************************************/
2951 gl_view_set_default_text_color (glView *view,
2954 gl_debug (DEBUG_VIEW, "START");
2956 g_return_if_fail (view && GL_IS_VIEW (view));
2958 view->default_text_color = text_color;
2960 gl_debug (DEBUG_VIEW, "END");
2964 /****************************************************************************/
2965 /* Set default text alignment. */
2966 /****************************************************************************/
2968 gl_view_set_default_text_alignment (glView *view,
2969 PangoAlignment text_alignment)
2971 gl_debug (DEBUG_VIEW, "START");
2973 g_return_if_fail (view && GL_IS_VIEW (view));
2975 view->default_text_alignment = text_alignment;
2976 gl_debug (DEBUG_VIEW, "END");
2980 /****************************************************************************/
2981 /* Set default text line spacing. */
2982 /****************************************************************************/
2984 gl_view_set_default_text_line_spacing (glView *view,
2985 gdouble text_line_spacing)
2987 gl_debug (DEBUG_VIEW, "START");
2989 g_return_if_fail (view && GL_IS_VIEW (view));
2991 view->default_text_line_spacing = text_line_spacing;
2993 gl_debug (DEBUG_VIEW, "END");
2997 /****************************************************************************/
2998 /* Set default line width. */
2999 /****************************************************************************/
3001 gl_view_set_default_line_width (glView *view,
3004 gl_debug (DEBUG_VIEW, "START");
3006 g_return_if_fail (view && GL_IS_VIEW (view));
3008 view->default_line_width = line_width;
3010 gl_debug (DEBUG_VIEW, "END");
3014 /****************************************************************************/
3015 /* Set default line color. */
3016 /****************************************************************************/
3018 gl_view_set_default_line_color (glView *view,
3021 gl_debug (DEBUG_VIEW, "START");
3023 g_return_if_fail (view && GL_IS_VIEW (view));
3025 view->default_line_color = line_color;
3027 gl_debug (DEBUG_VIEW, "END");
3031 /****************************************************************************/
3032 /* Set default fill color. */
3033 /****************************************************************************/
3035 gl_view_set_default_fill_color (glView *view,
3038 gl_debug (DEBUG_VIEW, "START");
3040 g_return_if_fail (view && GL_IS_VIEW (view));
3042 view->default_fill_color = fill_color;
3044 gl_debug (DEBUG_VIEW, "END");
3048 /****************************************************************************/
3049 /* Get default font family. */
3050 /****************************************************************************/
3052 gl_view_get_default_font_family (glView *view)
3054 gl_debug (DEBUG_VIEW, "START");
3056 g_return_val_if_fail (view && GL_IS_VIEW (view), NULL);
3058 gl_debug (DEBUG_VIEW, "END");
3060 return g_strdup (view->default_font_family);
3064 /****************************************************************************/
3065 /* Get default font size. */
3066 /****************************************************************************/
3068 gl_view_get_default_font_size (glView *view)
3070 gl_debug (DEBUG_VIEW, "START");
3072 g_return_val_if_fail (view && GL_IS_VIEW (view), 12.0);
3074 gl_debug (DEBUG_VIEW, "END");
3076 return view->default_font_size;
3080 /****************************************************************************/
3081 /* Get default font weight. */
3082 /****************************************************************************/
3084 gl_view_get_default_font_weight (glView *view)
3086 gl_debug (DEBUG_VIEW, "START");
3088 g_return_val_if_fail (view && GL_IS_VIEW (view), PANGO_WEIGHT_NORMAL);
3090 gl_debug (DEBUG_VIEW, "END");
3092 return view->default_font_weight;
3096 /****************************************************************************/
3097 /* Get default font italic flag. */
3098 /****************************************************************************/
3100 gl_view_get_default_font_italic_flag (glView *view)
3102 gl_debug (DEBUG_VIEW, "START");
3104 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
3106 gl_debug (DEBUG_VIEW, "END");
3108 return view->default_font_italic_flag;
3112 /****************************************************************************/
3113 /* Get default text color. */
3114 /****************************************************************************/
3116 gl_view_get_default_text_color (glView *view)
3118 gl_debug (DEBUG_VIEW, "START");
3120 g_return_val_if_fail (view && GL_IS_VIEW (view), 0);
3122 gl_debug (DEBUG_VIEW, "END");
3124 return view->default_text_color;
3128 /****************************************************************************/
3129 /* Get default text alignment. */
3130 /****************************************************************************/
3132 gl_view_get_default_text_alignment (glView *view)
3134 gl_debug (DEBUG_VIEW, "START");
3136 g_return_val_if_fail (view && GL_IS_VIEW (view), PANGO_ALIGN_LEFT);
3138 gl_debug (DEBUG_VIEW, "END");
3140 return view->default_text_alignment;
3144 /****************************************************************************/
3145 /* Get default text line spacing. */
3146 /****************************************************************************/
3148 gl_view_get_default_text_line_spacing (glView *view)
3150 gl_debug (DEBUG_VIEW, "START");
3152 g_return_val_if_fail (view && GL_IS_VIEW (view), 1.0);
3154 gl_debug (DEBUG_VIEW, "END");
3156 return view->default_text_line_spacing;
3160 /****************************************************************************/
3161 /* Get default line width. */
3162 /****************************************************************************/
3164 gl_view_get_default_line_width (glView *view)
3166 gl_debug (DEBUG_VIEW, "START");
3168 g_return_val_if_fail (view && GL_IS_VIEW (view), 1.0);
3170 gl_debug (DEBUG_VIEW, "END");
3172 return view->default_line_width;
3176 /****************************************************************************/
3177 /* Get default line color. */
3178 /****************************************************************************/
3180 gl_view_get_default_line_color (glView *view)
3182 gl_debug (DEBUG_VIEW, "START");
3184 g_return_val_if_fail (view && GL_IS_VIEW (view), 0);
3186 gl_debug (DEBUG_VIEW, "END");
3188 return view->default_line_color;
3192 /****************************************************************************/
3193 /* Get default fill color. */
3194 /****************************************************************************/
3196 gl_view_get_default_fill_color (glView *view)
3198 gl_debug (DEBUG_VIEW, "START");
3200 g_return_val_if_fail (view && GL_IS_VIEW (view), 0);
3202 gl_debug (DEBUG_VIEW, "END");
3204 return view->default_fill_color;
3208 /*---------------------------------------------------------------------------*/
3209 /* PRIVATE. Focus in event handler. */
3210 /*---------------------------------------------------------------------------*/
3212 focus_in_event_cb (glView *view,
3213 GdkEventFocus *event)
3215 GTK_WIDGET_SET_FLAGS (GTK_WIDGET (view->canvas), GTK_HAS_FOCUS);
3221 /*---------------------------------------------------------------------------*/
3222 /* PRIVATE. Focus out event handler. */
3223 /*---------------------------------------------------------------------------*/
3225 focus_out_event_cb (glView *view,
3226 GdkEventFocus *event)
3228 GTK_WIDGET_UNSET_FLAGS (GTK_WIDGET (view->canvas), GTK_HAS_FOCUS);
3234 /*---------------------------------------------------------------------------*/
3235 /* PRIVATE. Enter notify event handler. */
3236 /*---------------------------------------------------------------------------*/
3238 enter_notify_event_cb (glView *view,
3239 GdkEventCrossing *event)
3241 gtk_widget_grab_focus(GTK_WIDGET (view->canvas));
3247 /*---------------------------------------------------------------------------*/
3248 /* PRIVATE. Leave notify event handler. */
3249 /*---------------------------------------------------------------------------*/
3251 leave_notify_event_cb (glView *view,
3252 GdkEventCrossing *event)
3255 g_signal_emit (G_OBJECT(view), signals[POINTER_EXIT], 0);
3261 /*---------------------------------------------------------------------------*/
3262 /* PRIVATE. Motion notify event handler. */
3263 /*---------------------------------------------------------------------------*/
3265 motion_notify_event_cb (glView *view,
3266 GdkEventMotion *event)
3268 gboolean return_value = FALSE;
3273 glViewObjectHandle handle;
3275 cr = gdk_cairo_create (GTK_LAYOUT (view->canvas)->bin_window);
3278 * Translate to label coordinates
3280 scale = view->zoom * view->home_scale;
3281 cairo_scale (cr, scale, scale);
3282 cairo_translate (cr, view->x0, view->y0);
3286 cairo_device_to_user (cr, &x, &y);
3289 * Emit signal regardless of mode
3291 g_signal_emit (G_OBJECT(view), signals[POINTER_MOVED], 0, x, y);
3294 * Handle event as appropriate for mode
3299 case GL_VIEW_MODE_ARROW:
3300 switch (view->state)
3304 if ( gl_view_is_selection_atomic (view) &&
3305 view_handle_at (view, cr, event->x, event->y, &handle) )
3307 cursor = gdk_cursor_new (GDK_CROSSHAIR);
3309 else if (view_view_object_at (view, cr, event->x, event->y))
3311 cursor = gdk_cursor_new (GDK_FLEUR);
3315 cursor = gdk_cursor_new (GDK_LEFT_PTR);
3317 gdk_window_set_cursor (view->canvas->window, cursor);
3318 gdk_cursor_unref (cursor);
3321 case GL_VIEW_ARROW_SELECT_REGION:
3323 gl_view_update_region (view, cr, &view->select_region);
3325 view->select_region.x2 = x;
3326 view->select_region.y2 = y;
3328 gl_view_update_region (view, cr, &view->select_region);
3330 gl_view_update (view);
3334 case GL_VIEW_ARROW_MOVE:
3335 gl_view_move_selection (view,
3336 (x - view->move_last_x),
3337 (y - view->move_last_y));
3338 view->move_last_x = x;
3339 view->move_last_y = y;
3342 case GL_VIEW_ARROW_RESIZE:
3343 gl_view_object_resize_event (view->resize_object,
3344 view->resize_handle,
3345 view->resize_honor_aspect,
3352 g_message ("Invalid arrow state."); /*Should not happen!*/
3354 return_value = TRUE;
3358 case GL_VIEW_MODE_OBJECT_CREATE:
3359 if (view->state != GL_VIEW_IDLE)
3361 switch (view->create_type)
3363 case GL_LABEL_OBJECT_BOX:
3364 gl_view_box_create_motion_event (view, x, y);
3366 case GL_LABEL_OBJECT_ELLIPSE:
3367 gl_view_ellipse_create_motion_event (view, x, y);
3369 case GL_LABEL_OBJECT_LINE:
3370 gl_view_line_create_motion_event (view, x, y);
3372 case GL_LABEL_OBJECT_IMAGE:
3373 gl_view_image_create_motion_event (view, x, y);
3375 case GL_LABEL_OBJECT_TEXT:
3376 gl_view_text_create_motion_event (view, x, y);
3378 case GL_LABEL_OBJECT_BARCODE:
3379 gl_view_barcode_create_motion_event (view, x, y);
3382 g_message ("Invalid create type."); /*Should not happen!*/
3389 g_message ("Invalid view mode."); /*Should not happen!*/
3396 * FIXME: we re-establish grabs here if the grab has been lost. We seem to be
3397 * losing grabs when we emit signals that lead to the manipulation of
3398 * the GtkUIManager. Needs more investigation
3400 if (view->grabbed_flag && !gdk_pointer_is_grabbed ())
3402 gdk_pointer_grab (GTK_LAYOUT (view->canvas)->bin_window,
3404 (GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK),
3410 return return_value;
3414 /*---------------------------------------------------------------------------*/
3415 /* PRIVATE. Button press event handler. */
3416 /*---------------------------------------------------------------------------*/
3418 button_press_event_cb (glView *view,
3419 GdkEventButton *event)
3421 gboolean return_value = FALSE;
3425 glViewObject *view_object;
3426 glViewObjectHandle handle;
3428 cr = gdk_cairo_create (GTK_LAYOUT (view->canvas)->bin_window);
3431 * Translate to label coordinates
3433 scale = view->zoom * view->home_scale;
3434 cairo_scale (cr, scale, scale);
3435 cairo_translate (cr, view->x0, view->y0);
3439 cairo_device_to_user (cr, &x, &y);
3441 switch (event->button)
3446 * Handle event as appropriate for mode
3450 case GL_VIEW_MODE_ARROW:
3451 if ( gl_view_is_selection_atomic (view) &&
3452 (view_object = view_handle_at (view, cr, event->x, event->y, &handle)) )
3454 view->resize_object = view_object;
3455 view->resize_handle = handle;
3456 view->resize_honor_aspect = event->state & GDK_CONTROL_MASK;
3458 view->state = GL_VIEW_ARROW_RESIZE;
3460 else if ((view_object = view_view_object_at (view, cr, event->x, event->y)))
3462 if (event->state & GDK_CONTROL_MASK)
3464 if (gl_view_is_object_selected (view, view_object))
3466 /* Un-selecting a selected item */
3467 gl_view_unselect_object (view, view_object);
3469 /* Add to current selection */
3470 gl_view_select_object (view, view_object);
3475 if (!gl_view_is_object_selected (view, view_object))
3477 /* remove any selections before adding */
3478 gl_view_unselect_all (view);
3479 /* Add to current selection */
3480 gl_view_select_object (view, view_object);
3483 view->move_last_x = x;
3484 view->move_last_y = y;
3486 view->state = GL_VIEW_ARROW_MOVE;
3490 if (!(event->state & GDK_CONTROL_MASK))
3492 gl_view_unselect_all (view);
3495 view->select_region_visible = TRUE;
3496 view->select_region.x1 = x;
3497 view->select_region.y1 = y;
3498 view->select_region.x2 = x;
3499 view->select_region.y2 = y;
3501 view->state = GL_VIEW_ARROW_SELECT_REGION;
3505 return_value = TRUE;
3508 case GL_VIEW_MODE_OBJECT_CREATE:
3509 switch (view->create_type)
3511 case GL_LABEL_OBJECT_BOX:
3512 gl_view_box_create_button_press_event (view, x, y);
3514 case GL_LABEL_OBJECT_ELLIPSE:
3515 gl_view_ellipse_create_button_press_event (view, x, y);
3517 case GL_LABEL_OBJECT_LINE:
3518 gl_view_line_create_button_press_event (view, x, y);
3520 case GL_LABEL_OBJECT_IMAGE:
3521 gl_view_image_create_button_press_event (view, x, y);
3523 case GL_LABEL_OBJECT_TEXT:
3524 gl_view_text_create_button_press_event (view, x, y);
3526 case GL_LABEL_OBJECT_BARCODE:
3527 gl_view_barcode_create_button_press_event (view, x, y);
3530 g_message ("Invalid create type."); /*Should not happen!*/
3532 view->state = GL_VIEW_CREATE_DRAG;
3533 return_value = TRUE;
3537 g_message ("Invalid view mode."); /*Should not happen!*/
3540 view->grabbed_flag = TRUE;
3541 gdk_pointer_grab (GTK_LAYOUT (view->canvas)->bin_window,
3543 (GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK),
3550 g_signal_emit (G_OBJECT (view),
3551 signals[CONTEXT_MENU_ACTIVATE], 0,
3552 event->button, event->time);
3553 return_value = TRUE;
3560 return return_value;
3564 /*---------------------------------------------------------------------------*/
3565 /* PRIVATE. Button release event handler. */
3566 /*---------------------------------------------------------------------------*/
3568 button_release_event_cb (glView *view,
3569 GdkEventButton *event)
3571 gboolean return_value = FALSE;
3577 cr = gdk_cairo_create (GTK_LAYOUT (view->canvas)->bin_window);
3580 * Translate to label coordinates
3582 scale = view->zoom * view->home_scale;
3583 cairo_scale (cr, scale, scale);
3584 cairo_translate (cr, view->x0, view->y0);
3588 cairo_device_to_user (cr, &x, &y);
3590 switch (event->button)
3594 view->grabbed_flag = FALSE;
3595 gdk_pointer_ungrab (event->time);
3597 * Handle event as appropriate for mode
3601 case GL_VIEW_MODE_ARROW:
3602 switch (view->state)
3604 case GL_VIEW_ARROW_RESIZE:
3605 view->resize_object = NULL;
3607 view->state = GL_VIEW_IDLE;
3610 case GL_VIEW_ARROW_SELECT_REGION:
3612 gl_view_update_region (view, cr, &view->select_region);
3614 gl_view_update (view);
3617 view->select_region_visible = FALSE;
3618 view->select_region.x2 = x;
3619 view->select_region.y2 = y;
3621 gl_view_select_region (view, &view->select_region);
3623 view->state = GL_VIEW_IDLE;
3627 view->state = GL_VIEW_IDLE;
3632 return_value = TRUE;
3636 case GL_VIEW_MODE_OBJECT_CREATE:
3637 switch (view->create_type)
3639 case GL_LABEL_OBJECT_BOX:
3640 gl_view_box_create_button_release_event (view, x, y);
3642 case GL_LABEL_OBJECT_ELLIPSE:
3643 gl_view_ellipse_create_button_release_event (view, x, y);
3645 case GL_LABEL_OBJECT_LINE:
3646 gl_view_line_create_button_release_event (view, x, y);
3648 case GL_LABEL_OBJECT_IMAGE:
3649 gl_view_image_create_button_release_event (view, x, y);
3651 case GL_LABEL_OBJECT_TEXT:
3652 gl_view_text_create_button_release_event (view, x, y);
3654 case GL_LABEL_OBJECT_BARCODE:
3655 gl_view_barcode_create_button_release_event (view, x, y);
3658 g_message ("Invalid create type."); /*Should not happen!*/
3660 view->mode = GL_VIEW_MODE_ARROW;
3661 view->state = GL_VIEW_IDLE;
3662 cursor = gdk_cursor_new (GDK_LEFT_PTR);
3663 gdk_window_set_cursor (view->canvas->window, cursor);
3664 gdk_cursor_unref (cursor);
3669 g_message ("Invalid view mode."); /*Should not happen!*/
3676 return return_value;
3680 /*---------------------------------------------------------------------------*/
3681 /* PRIVATE. Key press event handler. */
3682 /*---------------------------------------------------------------------------*/
3684 key_press_event_cb (glView *view,
3689 gl_debug (DEBUG_VIEW, "");
3691 if ( (view->mode == GL_VIEW_MODE_ARROW) &&
3692 (view->state == GL_VIEW_IDLE) )
3694 switch (event->keyval) {
3698 gl_view_move_selection (view, -1.0 / (view->zoom), 0.0);
3702 gl_view_move_selection (view, 0.0, -1.0 / (view->zoom));
3706 gl_view_move_selection (view, 1.0 / (view->zoom), 0.0);
3710 gl_view_move_selection (view, 0.0, 1.0 / (view->zoom));
3714 gl_view_delete_selection (view);
3715 cursor = gdk_cursor_new (GDK_LEFT_PTR);
3716 gdk_window_set_cursor (GTK_WIDGET (view->canvas)->window
3718 gdk_cursor_unref (cursor);
3725 return TRUE; /* We handled this or we were dragging. */
3731 * Local Variables: -- emacs
3733 * c-basic-offset: 8 -- emacs
3734 * tab-width: 8 -- emacs
3735 * indent-tabs-mode: nil -- emacs