2 * (GLABELS) Label and Business Card Creation program for GNOME
4 * view.c: GLabels View module
6 * Copyright (C) 2001-2002 Jim Evins <evins@snaught.com>.
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 #include <gtk/gtkinvisible.h>
32 #include "view-object.h"
34 #include "view-ellipse.h"
35 #include "view-line.h"
36 #include "view-image.h"
37 #include "view-text.h"
38 #include "view-barcode.h"
39 #include "xml-label.h"
42 #include "merge-properties-dialog.h"
48 /*==========================================================================*/
49 /* Private macros and constants. */
50 /*==========================================================================*/
52 #define BG_COLOR GL_COLOR (192, 192, 192)
53 #define OUTLINE_COLOR GL_COLOR (173, 216, 230)
54 #define PAPER_COLOR GL_COLOR (255, 255, 255)
55 #define GRID_COLOR BG_COLOR
56 #define MARKUP_COLOR GL_COLOR (240, 100, 100)
58 #define SEL_LINE_COLOR GL_COLOR_A (0, 0, 255, 128)
59 #define SEL_FILL_COLOR GL_COLOR_A (192, 192, 255, 128)
61 #define ARC_FINE 2 /* Resolution in degrees of large arcs */
62 #define ARC_COURSE 5 /* Resolution in degrees of small arcs */
64 #define ZOOMTOFIT_PAD 16
66 #define POINTS_PER_MM 2.83464566929
70 /*==========================================================================*/
72 /*==========================================================================*/
84 /*==========================================================================*/
86 /*==========================================================================*/
88 static GtkContainerClass *parent_class;
90 static guint signals[LAST_SIGNAL] = {0};
92 /* "CLIPBOARD" selection */
93 static GdkAtom clipboard_atom = GDK_NONE;
95 static gdouble zooms[] = {
112 #define N_ZOOMS G_N_ELEMENTS(zooms)
115 /*==========================================================================*/
116 /* Local function prototypes */
117 /*==========================================================================*/
119 static void gl_view_class_init (glViewClass *class);
120 static void gl_view_init (glView *view);
121 static void gl_view_finalize (GObject *object);
123 static void gl_view_construct (glView *view);
124 static GtkWidget *gl_view_construct_canvas (glView *view);
125 static void gl_view_construct_selection (glView *view);
127 static gdouble get_home_scale (glView *view);
129 static void draw_layers (glView *view);
131 static void label_resized_cb (glLabel *label,
134 static void draw_label_layer (glView *view);
136 static void draw_highlight_layer (glView *view);
138 static void draw_bg_fg_layers (glView *view);
139 static void draw_bg_fg_rect (glView *view);
140 static void draw_bg_fg_rounded_rect (glView *view);
141 static void draw_bg_fg_round (glView *view);
142 static void draw_bg_fg_cd (glView *view);
143 static void draw_bg_fg_cd_bc (glView *view);
145 static void draw_grid_layer (glView *view);
147 static void draw_markup_layer (glView *view);
149 static void draw_markup_margin (glView *view,
150 glTemplateMarkup *margin);
151 static void draw_markup_margin_rect (glView *view,
152 glTemplateMarkup *margin);
153 static void draw_markup_margin_rounded_rect (glView *view,
154 glTemplateMarkup *margin);
155 static void draw_markup_margin_round (glView *view,
156 glTemplateMarkup *margin);
157 static void draw_markup_margin_cd (glView *view,
158 glTemplateMarkup *margin);
159 static void draw_markup_margin_cd_bc (glView *view,
160 glTemplateMarkup *margin);
162 static void draw_markup_line (glView *view,
163 glTemplateMarkup *line);
165 static void draw_markup_circle (glView *view,
166 glTemplateMarkup *circle);
169 static void select_object_real (glView *view,
170 glViewObject *view_object);
171 static void unselect_object_real (glView *view,
172 glViewObject *view_object);
174 static gboolean object_at (glView *view,
175 gdouble x, gdouble y);
177 static gboolean is_item_member_of_group (glView *view,
178 GnomeCanvasItem *item,
179 GnomeCanvasItem *group);
181 static void set_zoom_real (glView *view,
183 gboolean scale_to_fit_flag);
185 static void size_allocate_cb (glView *view);
187 static void screen_changed_cb (glView *view);
189 static int canvas_event (GnomeCanvas *canvas,
192 static int canvas_event_arrow_mode (GnomeCanvas *canvas,
196 static void construct_selection_menu (glView *view);
198 static void construct_empty_selection_menu (glView *view);
200 static void selection_clear_cb (GtkWidget *widget,
201 GdkEventSelection *event,
204 static void selection_get_cb (GtkWidget *widget,
205 GtkSelectionData *selection_data,
210 static void selection_received_cb (GtkWidget *widget,
211 GtkSelectionData *selection_data,
215 /****************************************************************************/
216 /* Boilerplate Object stuff. */
217 /****************************************************************************/
219 gl_view_get_type (void)
221 static guint view_type = 0;
224 GTypeInfo view_info = {
225 sizeof (glViewClass),
228 (GClassInitFunc) gl_view_class_init,
233 (GInstanceInitFunc) gl_view_init,
237 g_type_register_static (gtk_vbox_get_type (),
238 "glView", &view_info, 0);
245 gl_view_class_init (glViewClass *class)
247 GObjectClass *object_class = (GObjectClass *) class;
249 gl_debug (DEBUG_VIEW, "START");
251 parent_class = g_type_class_peek_parent (class);
253 object_class->finalize = gl_view_finalize;
255 signals[SELECTION_CHANGED] =
256 g_signal_new ("selection_changed",
257 G_OBJECT_CLASS_TYPE (object_class),
259 G_STRUCT_OFFSET (glViewClass, selection_changed),
261 gl_marshal_VOID__VOID,
265 signals[ZOOM_CHANGED] =
266 g_signal_new ("zoom_changed",
267 G_OBJECT_CLASS_TYPE (object_class),
269 G_STRUCT_OFFSET (glViewClass, zoom_changed),
271 gl_marshal_VOID__DOUBLE,
275 signals[POINTER_MOVED] =
276 g_signal_new ("pointer_moved",
277 G_OBJECT_CLASS_TYPE (object_class),
279 G_STRUCT_OFFSET (glViewClass, pointer_moved),
281 gl_marshal_VOID__DOUBLE_DOUBLE,
283 2, G_TYPE_DOUBLE, G_TYPE_DOUBLE);
285 signals[POINTER_EXIT] =
286 g_signal_new ("pointer_exit",
287 G_OBJECT_CLASS_TYPE (object_class),
289 G_STRUCT_OFFSET (glViewClass, pointer_exit),
291 gl_marshal_VOID__VOID,
295 signals[MODE_CHANGED] =
296 g_signal_new ("mode_changed",
297 G_OBJECT_CLASS_TYPE (object_class),
299 G_STRUCT_OFFSET (glViewClass, mode_changed),
301 gl_marshal_VOID__VOID,
305 gl_debug (DEBUG_VIEW, "END");
309 gl_view_init (glView *view)
311 gl_debug (DEBUG_VIEW, "START");
315 view->grid_spacing = 9;
317 view->default_font_family = NULL;
319 gl_debug (DEBUG_VIEW, "END");
323 gl_view_finalize (GObject *object)
327 gl_debug (DEBUG_VIEW, "START");
329 g_return_if_fail (object != NULL);
330 g_return_if_fail (GL_IS_VIEW (object));
332 view = GL_VIEW (object);
334 G_OBJECT_CLASS (parent_class)->finalize (object);
336 gl_debug (DEBUG_VIEW, "END");
339 /****************************************************************************/
340 /* NEW view object. */
341 /****************************************************************************/
343 gl_view_new (glLabel *label)
347 gl_debug (DEBUG_VIEW, "START");
349 g_return_val_if_fail (label && GL_IS_LABEL (label), NULL);
351 view = g_object_new (gl_view_get_type (), NULL);
354 gl_view_construct (view);
356 gl_debug (DEBUG_VIEW, "END");
358 return GTK_WIDGET (view);
361 /*---------------------------------------------------------------------------*/
362 /* PRIVATE. Construct composite widget. */
363 /*---------------------------------------------------------------------------*/
365 gl_view_construct (glView *view)
367 GtkWidget *wvbox, *wscroll;
369 gl_debug (DEBUG_VIEW, "START");
371 g_return_if_fail (GL_IS_VIEW (view));
373 wvbox = GTK_WIDGET (view);
375 view->state = GL_VIEW_STATE_ARROW;
376 view->object_list = NULL;
378 gl_view_construct_canvas (view);
379 wscroll = gtk_scrolled_window_new (NULL, NULL);
380 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (wscroll),
381 GTK_POLICY_AUTOMATIC,
382 GTK_POLICY_AUTOMATIC);
383 gtk_box_pack_start (GTK_BOX (wvbox), wscroll, TRUE, TRUE, 0);
384 gtk_container_add (GTK_CONTAINER (wscroll), view->canvas);
386 gl_view_construct_selection (view);
388 construct_selection_menu (view);
389 construct_empty_selection_menu (view);
391 gl_view_set_default_font_family (view, gl_prefs->default_font_family);
392 gl_view_set_default_font_size (view, gl_prefs->default_font_size);
393 gl_view_set_default_font_weight (view, gl_prefs->default_font_weight);
394 gl_view_set_default_font_italic_flag (view, gl_prefs->default_font_italic_flag);
395 gl_view_set_default_text_color (view, gl_prefs->default_text_color);
396 gl_view_set_default_text_alignment (view, gl_prefs->default_text_alignment);
397 gl_view_set_default_text_line_spacing (view, gl_prefs->default_text_line_spacing);
398 gl_view_set_default_line_width (view, gl_prefs->default_line_width);
399 gl_view_set_default_line_color (view, gl_prefs->default_line_color);
400 gl_view_set_default_fill_color (view, gl_prefs->default_fill_color);
402 gl_debug (DEBUG_VIEW, "END");
405 /*---------------------------------------------------------------------------*/
406 /* PRIVATE. Create canvas w/ a background in the shape of the label/card. */
407 /*---------------------------------------------------------------------------*/
409 gl_view_construct_canvas (glView *view)
412 gdouble label_width, label_height;
415 gl_debug (DEBUG_VIEW, "START");
417 g_return_val_if_fail (view && GL_IS_VIEW (view), NULL);
418 g_return_val_if_fail (view->label && GL_IS_LABEL (view->label), NULL);
422 gtk_widget_push_colormap (gdk_rgb_get_colormap ());
423 view->canvas = gnome_canvas_new_aa ();
424 gtk_widget_pop_colormap ();
426 bg_color = gl_color_to_gdk_color (BG_COLOR);
427 gtk_widget_modify_bg (GTK_WIDGET(view->canvas), GTK_STATE_NORMAL, bg_color);
430 gl_label_get_size (label, &label_width, &label_height);
431 gl_debug (DEBUG_VIEW, "Label size: w=%lf, h=%lf",
432 label_width, label_height);
435 view->home_scale = get_home_scale (view);
436 gnome_canvas_set_pixels_per_unit (GNOME_CANVAS (view->canvas), view->home_scale);
438 gnome_canvas_set_scroll_region (GNOME_CANVAS (view->canvas),
439 0.0, 0.0, label_width, label_height);
443 g_signal_connect (G_OBJECT (view->canvas), "event",
444 G_CALLBACK (canvas_event), view);
446 g_signal_connect_swapped (G_OBJECT (view->canvas), "size-allocate",
447 G_CALLBACK (size_allocate_cb), view);
449 g_signal_connect_swapped (G_OBJECT (view->canvas), "screen-changed",
450 G_CALLBACK (screen_changed_cb), view);
452 gl_debug (DEBUG_VIEW, "END");
457 /*---------------------------------------------------------------------------*/
458 /* PRIAVTE. Calculate 1:1 scale for screen. */
459 /*---------------------------------------------------------------------------*/
461 get_home_scale (glView *view)
464 gdouble screen_width_pixels, screen_width_mm;
465 gdouble screen_height_pixels, screen_height_mm;
466 gdouble x_pixels_per_mm, y_pixels_per_mm;
469 if (!gtk_widget_has_screen) return 1.0;
471 screen = gtk_widget_get_screen (GTK_WIDGET (view->canvas));
473 gl_debug (DEBUG_VIEW, "Screen = %p", screen);
475 screen_width_pixels = gdk_screen_get_width (screen);
476 screen_width_mm = gdk_screen_get_width_mm (screen);
477 screen_height_pixels = gdk_screen_get_height (screen);
478 screen_height_mm = gdk_screen_get_height_mm (screen);
480 x_pixels_per_mm = screen_width_pixels / screen_width_mm;
481 y_pixels_per_mm = screen_height_pixels / screen_height_mm;
483 gl_debug (DEBUG_VIEW, "Horizontal dot pitch: %g pixels/mm (%g dpi)",
484 x_pixels_per_mm, x_pixels_per_mm * 25.4);
485 gl_debug (DEBUG_VIEW, "Vertical dot pitch: %g pixels/mm (%g dpi)",
486 y_pixels_per_mm, y_pixels_per_mm * 25.4);
488 scale = (x_pixels_per_mm + y_pixels_per_mm) / 2.0;
490 gl_debug (DEBUG_VIEW, "Average dot pitch: %g pixels/mm (%g dpi)",
491 scale, scale * 25.4);
493 scale /= POINTS_PER_MM;
495 gl_debug (DEBUG_VIEW, "Scale = %g pixels/point", scale);
497 /* Make sure scale is somewhat sane. */
498 if ( (scale < 0.25) || (scale > 4.0) ) return 1.0;
503 /*---------------------------------------------------------------------------*/
504 /* PRIVATE. Create clipboard selection targets. */
505 /*---------------------------------------------------------------------------*/
507 gl_view_construct_selection (glView *view)
509 gl_debug (DEBUG_VIEW, "START");
511 g_return_if_fail (GL_IS_VIEW (view));
513 view->have_selection = FALSE;
514 view->selection_data = NULL;
515 view->invisible = gtk_invisible_new ();
517 view->selected_object_list = NULL;
519 if (!clipboard_atom) {
520 clipboard_atom = gdk_atom_intern ("GLABELS_CLIPBOARD", FALSE);
523 gtk_selection_add_target (view->invisible,
524 clipboard_atom, GDK_SELECTION_TYPE_STRING, 1);
526 g_signal_connect (G_OBJECT (view->invisible),
527 "selection_clear_event",
528 G_CALLBACK (selection_clear_cb), view);
530 g_signal_connect (G_OBJECT (view->invisible), "selection_get",
531 G_CALLBACK (selection_get_cb), view);
533 g_signal_connect (G_OBJECT (view->invisible),
534 "selection_received",
535 G_CALLBACK (selection_received_cb), view);
537 gl_debug (DEBUG_VIEW, "END");
540 /*---------------------------------------------------------------------------*/
541 /* PRIVATE. Create, draw and order layers. */
542 /*---------------------------------------------------------------------------*/
544 draw_layers (glView *view)
546 g_return_if_fail (view && GL_IS_VIEW (view));
547 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
549 draw_bg_fg_layers (view);
550 draw_grid_layer (view);
551 draw_markup_layer (view);
552 draw_highlight_layer (view); /* Must be done before label layer */
553 draw_label_layer (view);
555 gnome_canvas_item_raise_to_top (GNOME_CANVAS_ITEM(view->fg_group));
556 gnome_canvas_item_raise_to_top (GNOME_CANVAS_ITEM(view->highlight_group));
558 g_signal_connect (G_OBJECT (view->label), "size_changed",
559 G_CALLBACK (label_resized_cb), view);
562 /*---------------------------------------------------------------------------*/
563 /* PRIVATE. Handle label resize event. . */
564 /*---------------------------------------------------------------------------*/
566 label_resized_cb (glLabel *label,
569 gdouble label_width, label_height;
571 g_return_if_fail (label && GL_IS_LABEL (label));
572 g_return_if_fail (view && GL_IS_VIEW (view));
574 gl_label_get_size (label, &label_width, &label_height);
575 gnome_canvas_set_scroll_region (GNOME_CANVAS (view->canvas),
576 0.0, 0.0, label_width, label_height);
578 gtk_object_destroy (GTK_OBJECT (view->bg_group));
579 gtk_object_destroy (GTK_OBJECT (view->grid_group));
580 gtk_object_destroy (GTK_OBJECT (view->markup_group));
581 gtk_object_destroy (GTK_OBJECT (view->fg_group));
583 draw_bg_fg_layers (view);
584 draw_grid_layer (view);
585 draw_markup_layer (view);
587 gnome_canvas_item_raise_to_top (GNOME_CANVAS_ITEM(view->label_group));
588 gnome_canvas_item_raise_to_top (GNOME_CANVAS_ITEM(view->fg_group));
589 gnome_canvas_item_raise_to_top (GNOME_CANVAS_ITEM(view->highlight_group));
592 /*---------------------------------------------------------------------------*/
593 /* PRIVATE. Draw label layer. */
594 /*---------------------------------------------------------------------------*/
596 draw_label_layer (glView *view)
598 GnomeCanvasGroup *group;
601 glLabelObject *object;
602 glViewObject *view_object;
604 g_return_if_fail (view && GL_IS_VIEW (view));
605 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
607 group = gnome_canvas_root (GNOME_CANVAS (view->canvas));
608 view->label_group = GNOME_CANVAS_GROUP(
609 gnome_canvas_item_new (group,
610 gnome_canvas_group_get_type (),
617 for (p_obj = label->objects; p_obj != NULL; p_obj = p_obj->next) {
618 object = (glLabelObject *) p_obj->data;
620 if (GL_IS_LABEL_BOX (object)) {
621 view_object = gl_view_box_new (GL_LABEL_BOX(object),
623 } else if (GL_IS_LABEL_ELLIPSE (object)) {
624 view_object = gl_view_ellipse_new (GL_LABEL_ELLIPSE(object),
626 } else if (GL_IS_LABEL_LINE (object)) {
627 view_object = gl_view_line_new (GL_LABEL_LINE(object),
629 } else if (GL_IS_LABEL_IMAGE (object)) {
630 view_object = gl_view_image_new (GL_LABEL_IMAGE(object),
632 } else if (GL_IS_LABEL_TEXT (object)) {
633 view_object = gl_view_text_new (GL_LABEL_TEXT(object),
635 } else if (GL_IS_LABEL_BARCODE (object)) {
636 view_object = gl_view_barcode_new (GL_LABEL_BARCODE(object),
639 /* Should not happen! */
641 g_warning ("Invalid label object type.");
646 /*---------------------------------------------------------------------------*/
647 /* PRIVATE. Create highlight layer. */
648 /*---------------------------------------------------------------------------*/
650 draw_highlight_layer (glView *view)
652 GnomeCanvasGroup *group;
654 g_return_if_fail (view && GL_IS_VIEW (view));
656 group = gnome_canvas_root (GNOME_CANVAS (view->canvas));
657 view->highlight_group = GNOME_CANVAS_GROUP(
658 gnome_canvas_item_new (group,
659 gnome_canvas_group_get_type (),
665 /*---------------------------------------------------------------------------*/
666 /* PRIVATE. Draw background and foreground outlines. */
667 /*---------------------------------------------------------------------------*/
669 draw_bg_fg_layers (glView *view)
672 glTemplate *template;
673 const glTemplateLabelType *label_type;
674 GnomeCanvasGroup *group;
676 g_return_if_fail (view && GL_IS_VIEW (view));
677 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
679 group = gnome_canvas_root (GNOME_CANVAS (view->canvas));
680 view->bg_group = GNOME_CANVAS_GROUP(
681 gnome_canvas_item_new (group,
682 gnome_canvas_group_get_type (),
686 view->fg_group = GNOME_CANVAS_GROUP(
687 gnome_canvas_item_new (group,
688 gnome_canvas_group_get_type (),
694 template = gl_label_get_template (label);
695 label_type = gl_template_get_first_label_type (template);
697 switch (label_type->shape) {
699 case GL_TEMPLATE_SHAPE_RECT:
700 if (label_type->size.rect.r == 0.0) {
701 /* Square corners. */
702 draw_bg_fg_rect (view);
704 /* Rounded corners. */
705 draw_bg_fg_rounded_rect (view);
709 case GL_TEMPLATE_SHAPE_ROUND:
710 draw_bg_fg_round (view);
713 case GL_TEMPLATE_SHAPE_CD:
714 if ((label_type->size.cd.w == 0.0) && (label_type->size.cd.h == 0.0) ) {
715 draw_bg_fg_cd (view);
717 draw_bg_fg_cd_bc (view);
722 g_warning ("Unknown template label style");
727 /*---------------------------------------------------------------------------*/
728 /* PRIVATE. Draw simple recangular background. */
729 /*---------------------------------------------------------------------------*/
731 draw_bg_fg_rect (glView *view)
735 GnomeCanvasItem *item;
737 gl_debug (DEBUG_VIEW, "START");
739 g_return_if_fail (view && GL_IS_VIEW (view));
740 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
744 gl_label_get_size (label, &w, &h);
747 item = gnome_canvas_item_new (view->bg_group,
748 gnome_canvas_rect_get_type (),
753 "fill_color_rgba", PAPER_COLOR,
757 item = gnome_canvas_item_new (view->fg_group,
758 gnome_canvas_rect_get_type (),
764 "outline_color_rgba", OUTLINE_COLOR,
767 gl_debug (DEBUG_VIEW, "END");
770 /*---------------------------------------------------------------------------*/
771 /* PRIVATE. Draw rounded recangular background. */
772 /*---------------------------------------------------------------------------*/
774 draw_bg_fg_rounded_rect (glView *view)
777 GnomeCanvasPoints *points;
778 gint i_coords, i_theta;
779 glTemplate *template;
780 const glTemplateLabelType *label_type;
782 GnomeCanvasItem *item;
784 gl_debug (DEBUG_VIEW, "START");
786 g_return_if_fail (view && GL_IS_VIEW (view));
787 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
790 template = gl_label_get_template (label);
791 label_type = gl_template_get_first_label_type (template);
793 gl_label_get_size (label, &w, &h);
794 r = label_type->size.rect.r;
796 points = gnome_canvas_points_new (4 * (1 + 90 / ARC_COURSE));
798 for (i_theta = 0; i_theta <= 90; i_theta += ARC_COURSE) {
799 points->coords[i_coords++] =
800 r - r * sin (i_theta * G_PI / 180.0);
801 points->coords[i_coords++] =
802 r - r * cos (i_theta * G_PI / 180.0);
804 for (i_theta = 0; i_theta <= 90; i_theta += ARC_COURSE) {
805 points->coords[i_coords++] =
806 r - r * cos (i_theta * G_PI / 180.0);
807 points->coords[i_coords++] =
808 (h - r) + r * sin (i_theta * G_PI / 180.0);
810 for (i_theta = 0; i_theta <= 90; i_theta += ARC_COURSE) {
811 points->coords[i_coords++] =
812 (w - r) + r * sin (i_theta * G_PI / 180.0);
813 points->coords[i_coords++] =
814 (h - r) + r * cos (i_theta * G_PI / 180.0);
816 for (i_theta = 0; i_theta <= 90; i_theta += ARC_COURSE) {
817 points->coords[i_coords++] =
818 (w - r) + r * cos (i_theta * G_PI / 180.0);
819 points->coords[i_coords++] =
820 r - r * sin (i_theta * G_PI / 180.0);
824 item = gnome_canvas_item_new (view->bg_group,
825 gnome_canvas_polygon_get_type (),
827 "fill_color_rgba", PAPER_COLOR,
831 item = gnome_canvas_item_new (view->fg_group,
832 gnome_canvas_polygon_get_type (),
835 "outline_color_rgba", OUTLINE_COLOR,
838 gnome_canvas_points_free (points);
840 gl_debug (DEBUG_VIEW, "END");
843 /*---------------------------------------------------------------------------*/
844 /* PRIVATE. Draw round background. */
845 /*---------------------------------------------------------------------------*/
847 draw_bg_fg_round (glView *view)
850 glTemplate *template;
851 const glTemplateLabelType *label_type;
853 GnomeCanvasItem *item;
855 gl_debug (DEBUG_VIEW, "START");
857 g_return_if_fail (view && GL_IS_VIEW (view));
858 g_return_if_fail (view->label && GL_IS_LABEL(view->label));
861 template = gl_label_get_template (label);
862 label_type = gl_template_get_first_label_type (template);
864 r = label_type->size.round.r;
867 item = gnome_canvas_item_new (view->bg_group,
868 gnome_canvas_ellipse_get_type (),
873 "fill_color_rgba", PAPER_COLOR,
877 item = gnome_canvas_item_new (view->fg_group,
878 gnome_canvas_ellipse_get_type (),
884 "outline_color_rgba", OUTLINE_COLOR,
887 gl_debug (DEBUG_VIEW, "END");
890 /*---------------------------------------------------------------------------*/
891 /* PRIVATE. Draw CD style background, circular w/ concentric hole. */
892 /*---------------------------------------------------------------------------*/
894 draw_bg_fg_cd (glView *view)
897 glTemplate *template;
898 const glTemplateLabelType *label_type;
900 GnomeCanvasItem *item;
902 gl_debug (DEBUG_VIEW, "START");
904 g_return_if_fail (view && GL_IS_VIEW (view));
905 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
908 template = gl_label_get_template (label);
909 label_type = gl_template_get_first_label_type (template);
911 r1 = label_type->size.cd.r1;
912 r2 = label_type->size.cd.r2;
916 item = gnome_canvas_item_new (view->bg_group,
917 gnome_canvas_ellipse_get_type (),
922 "fill_color_rgba", PAPER_COLOR,
925 item = gnome_canvas_item_new (view->bg_group,
926 gnome_canvas_ellipse_get_type (),
931 "fill_color_rgba", GRID_COLOR,
936 item = gnome_canvas_item_new (view->fg_group,
937 gnome_canvas_ellipse_get_type (),
943 "outline_color_rgba", OUTLINE_COLOR,
946 item = gnome_canvas_item_new (view->fg_group,
947 gnome_canvas_ellipse_get_type (),
953 "outline_color_rgba", OUTLINE_COLOR,
956 gl_debug (DEBUG_VIEW, "END");
959 /*---------------------------------------------------------------------------*/
960 /* PRIVATE. Draw Business Card CD style background, CD w/ chopped ends. */
961 /*---------------------------------------------------------------------------*/
963 draw_bg_fg_cd_bc (glView *view)
966 glTemplate *template;
967 const glTemplateLabelType *label_type;
968 GnomeCanvasPoints *points;
969 gint i_coords, i_theta;
970 gdouble theta1, theta2;
971 gdouble x0, y0, w, h, r1, r2;
972 GnomeCanvasItem *item;
974 gl_debug (DEBUG_VIEW, "START");
976 g_return_if_fail (view && GL_IS_VIEW (view));
977 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
980 template = gl_label_get_template (label);
981 label_type = gl_template_get_first_label_type (template);
983 gl_label_get_size (label, &w, &h);
987 r1 = label_type->size.cd.r1;
988 r2 = label_type->size.cd.r2;
990 theta1 = (180.0/G_PI) * acos (w / (2.0*r1));
991 theta2 = (180.0/G_PI) * asin (h / (2.0*r1));
993 points = gnome_canvas_points_new (360/ARC_FINE + 1);
996 points->coords[i_coords++] = x0 + r1 * cos (theta1 * G_PI / 180.0);
997 points->coords[i_coords++] = y0 + r1 * sin (theta1 * G_PI / 180.0);
999 for ( i_theta = theta1 + ARC_FINE; i_theta < theta2; i_theta +=ARC_FINE ) {
1000 points->coords[i_coords++] = x0 + r1 * cos (i_theta * G_PI / 180.0);
1001 points->coords[i_coords++] = y0 + r1 * sin (i_theta * G_PI / 180.0);
1004 points->coords[i_coords++] = x0 + r1 * cos (theta2 * G_PI / 180.0);
1005 points->coords[i_coords++] = y0 + r1 * sin (theta2 * G_PI / 180.0);
1008 if ( fabs (theta2 - 90.0) > GNOME_CANVAS_EPSILON ) {
1009 points->coords[i_coords++] = x0 + r1 * cos ((180-theta2) * G_PI / 180.0);
1010 points->coords[i_coords++] = y0 + r1 * sin ((180-theta2) * G_PI / 180.0);
1013 for ( i_theta = 180-theta2+ARC_FINE; i_theta < (180-theta1); i_theta +=ARC_FINE ) {
1014 points->coords[i_coords++] = x0 + r1 * cos (i_theta * G_PI / 180.0);
1015 points->coords[i_coords++] = y0 + r1 * sin (i_theta * G_PI / 180.0);
1018 points->coords[i_coords++] = x0 + r1 * cos ((180-theta1) * G_PI / 180.0);
1019 points->coords[i_coords++] = y0 + r1 * sin ((180-theta1) * G_PI / 180.0);
1021 if ( fabs (theta1) > GNOME_CANVAS_EPSILON ) {
1022 points->coords[i_coords++] = x0 + r1 * cos ((180+theta1) * G_PI / 180.0);
1023 points->coords[i_coords++] = y0 + r1 * sin ((180+theta1) * G_PI / 180.0);
1026 for ( i_theta = 180+theta1+ARC_FINE; i_theta < (180+theta2); i_theta +=ARC_FINE ) {
1027 points->coords[i_coords++] = x0 + r1 * cos (i_theta * G_PI / 180.0);
1028 points->coords[i_coords++] = y0 + r1 * sin (i_theta * G_PI / 180.0);
1031 points->coords[i_coords++] = x0 + r1 * cos ((180+theta2) * G_PI / 180.0);
1032 points->coords[i_coords++] = y0 + r1 * sin ((180+theta2) * G_PI / 180.0);
1034 if ( fabs (theta2 - 90.0) > GNOME_CANVAS_EPSILON ) {
1035 points->coords[i_coords++] = x0 + r1 * cos ((360-theta2) * G_PI / 180.0);
1036 points->coords[i_coords++] = y0 + r1 * sin ((360-theta2) * G_PI / 180.0);
1039 for ( i_theta = 360-theta2+ARC_FINE; i_theta < (360-theta1); i_theta +=ARC_FINE ) {
1040 points->coords[i_coords++] = x0 + r1 * cos (i_theta * G_PI / 180.0);
1041 points->coords[i_coords++] = y0 + r1 * sin (i_theta * G_PI / 180.0);
1044 if ( fabs (theta1) > GNOME_CANVAS_EPSILON ) {
1045 points->coords[i_coords++] = x0 + r1 * cos ((360-theta1) * G_PI / 180.0);
1046 points->coords[i_coords++] = y0 + r1 * sin ((360-theta1) * G_PI / 180.0);
1049 points->num_points = i_coords / 2;
1053 item = gnome_canvas_item_new (view->bg_group,
1054 gnome_canvas_polygon_get_type (),
1056 "fill_color_rgba", PAPER_COLOR,
1059 item = gnome_canvas_item_new (view->bg_group,
1060 gnome_canvas_ellipse_get_type (),
1065 "fill_color_rgba", GRID_COLOR,
1070 item = gnome_canvas_item_new (view->fg_group,
1071 gnome_canvas_polygon_get_type (),
1074 "outline_color_rgba", OUTLINE_COLOR,
1077 item = gnome_canvas_item_new (view->fg_group,
1078 gnome_canvas_ellipse_get_type (),
1084 "outline_color_rgba", OUTLINE_COLOR,
1087 gnome_canvas_points_free (points);
1089 gl_debug (DEBUG_VIEW, "END");
1092 /*---------------------------------------------------------------------------*/
1093 /* PRIVATE. Draw grid lines. */
1094 /*---------------------------------------------------------------------------*/
1096 draw_grid_layer (glView *view)
1098 gdouble w, h, x, y, x0, y0;
1099 GnomeCanvasPoints *points;
1100 GnomeCanvasItem *item;
1101 GnomeCanvasGroup *group;
1102 glTemplate *template;
1103 const glTemplateLabelType *template_type;
1105 gl_debug (DEBUG_VIEW, "START");
1107 g_return_if_fail (view && GL_IS_VIEW (view));
1108 g_return_if_fail (view->label && GL_IS_LABEL(view->label));
1110 gl_label_get_size (view->label, &w, &h);
1111 template = gl_label_get_template (view->label);
1112 template_type = gl_template_get_first_label_type (template);
1114 if (template_type->shape == GL_TEMPLATE_SHAPE_RECT) {
1118 /* for round labels, adjust grid to line up with center of label. */
1119 x0 = fmod (w/2.0, view->grid_spacing);
1120 y0 = fmod (h/2.0, view->grid_spacing);
1123 group = gnome_canvas_root (GNOME_CANVAS (view->canvas));
1124 view->grid_group = GNOME_CANVAS_GROUP(
1125 gnome_canvas_item_new (group,
1126 gnome_canvas_group_get_type (),
1130 points = gnome_canvas_points_new (2);
1132 points->coords[1] = 0.0;
1133 points->coords[3] = h;
1134 for ( x=x0+view->grid_spacing; x < w; x += view->grid_spacing ) {
1135 points->coords[0] = points->coords[2] = x;
1136 item = gnome_canvas_item_new (view->grid_group,
1137 gnome_canvas_line_get_type (),
1140 "fill_color_rgba", GRID_COLOR,
1144 points->coords[0] = 0.0;
1145 points->coords[2] = w;
1146 for ( y=y0+view->grid_spacing; y < h; y += view->grid_spacing ) {
1147 points->coords[1] = points->coords[3] = y;
1148 item = gnome_canvas_item_new (view->grid_group,
1149 gnome_canvas_line_get_type (),
1152 "fill_color_rgba", GRID_COLOR,
1156 gnome_canvas_points_free (points);
1157 gl_template_free (template);
1159 gl_debug (DEBUG_VIEW, "END");
1162 /*---------------------------------------------------------------------------*/
1163 /* PRIVATE. Draw markup lines. */
1164 /*---------------------------------------------------------------------------*/
1166 draw_markup_layer (glView *view)
1168 GnomeCanvasGroup *group;
1170 glTemplate *template;
1171 const glTemplateLabelType *label_type;
1173 glTemplateMarkup *markup;
1175 g_return_if_fail (view && GL_IS_VIEW (view));
1176 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
1178 group = gnome_canvas_root (GNOME_CANVAS (view->canvas));
1179 view->markup_group = GNOME_CANVAS_GROUP(
1180 gnome_canvas_item_new (group,
1181 gnome_canvas_group_get_type (),
1186 label = view->label;
1187 template = gl_label_get_template (label);
1188 label_type = gl_template_get_first_label_type (template);
1190 for ( p=label_type->markups; p != NULL; p=p->next ) {
1191 markup = (glTemplateMarkup *)p->data;
1193 switch (markup->type) {
1194 case GL_TEMPLATE_MARKUP_MARGIN:
1195 draw_markup_margin (view, markup);
1197 case GL_TEMPLATE_MARKUP_LINE:
1198 draw_markup_line (view, markup);
1200 case GL_TEMPLATE_MARKUP_CIRCLE:
1201 draw_markup_circle (view, markup);
1204 g_warning ("Unknown template markup type");
1210 /*---------------------------------------------------------------------------*/
1211 /* PRIVATE. Draw margin markup. */
1212 /*---------------------------------------------------------------------------*/
1214 draw_markup_margin (glView *view,
1215 glTemplateMarkup *markup)
1218 glTemplate *template;
1219 const glTemplateLabelType *label_type;
1221 g_return_if_fail (view && GL_IS_VIEW (view));
1222 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
1224 label = view->label;
1225 template = gl_label_get_template (label);
1226 label_type = gl_template_get_first_label_type (template);
1228 switch (label_type->shape) {
1230 case GL_TEMPLATE_SHAPE_RECT:
1231 if (label_type->size.rect.r == 0.0) {
1232 /* Square corners. */
1233 draw_markup_margin_rect (view, markup);
1235 if ( markup->data.margin.size < label_type->size.rect.r) {
1236 /* Rounded corners. */
1237 draw_markup_margin_rounded_rect (view, markup);
1239 /* Square corners. */
1240 draw_markup_margin_rect (view, markup);
1245 case GL_TEMPLATE_SHAPE_ROUND:
1246 draw_markup_margin_round (view, markup);
1249 case GL_TEMPLATE_SHAPE_CD:
1250 if ((label_type->size.cd.w == 0.0) && (label_type->size.cd.h == 0.0) ) {
1251 draw_markup_margin_cd (view, markup);
1253 draw_markup_margin_cd_bc (view, markup);
1258 g_warning ("Unknown template label style");
1263 /*---------------------------------------------------------------------------*/
1264 /* PRIVATE. Draw simple recangular margin. */
1265 /*---------------------------------------------------------------------------*/
1267 draw_markup_margin_rect (glView *view,
1268 glTemplateMarkup *markup)
1271 glTemplate *template;
1272 const glTemplateLabelType *label_type;
1274 GnomeCanvasItem *item;
1276 gl_debug (DEBUG_VIEW, "START");
1278 g_return_if_fail (view && GL_IS_VIEW (view));
1279 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
1281 label = view->label;
1282 template = gl_label_get_template (label);
1283 label_type = gl_template_get_first_label_type (template);
1285 gl_label_get_size (label, &w, &h);
1286 m = markup->data.margin.size;
1288 /* Bounding box @ margin */
1289 gnome_canvas_item_new (view->markup_group,
1290 gnome_canvas_rect_get_type (),
1296 "outline_color_rgba", MARKUP_COLOR,
1299 gl_debug (DEBUG_VIEW, "END");
1302 /*---------------------------------------------------------------------------*/
1303 /* PRIVATE. Draw rounded recangular markup. */
1304 /*---------------------------------------------------------------------------*/
1306 draw_markup_margin_rounded_rect (glView *view,
1307 glTemplateMarkup *markup)
1310 glTemplate *template;
1311 const glTemplateLabelType *label_type;
1312 GnomeCanvasPoints *points;
1313 gint i_coords, i_theta;
1315 GnomeCanvasItem *item;
1317 gl_debug (DEBUG_VIEW, "START");
1319 g_return_if_fail (view && GL_IS_VIEW (view));
1320 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
1322 label = view->label;
1323 template = gl_label_get_template (label);
1324 label_type = gl_template_get_first_label_type (template);
1326 gl_label_get_size (label, &w, &h);
1327 r = label_type->size.rect.r;
1328 m = markup->data.margin.size;
1334 /* rectangle with rounded corners */
1335 points = gnome_canvas_points_new (4 * (1 + 90 / ARC_COURSE));
1337 for (i_theta = 0; i_theta <= 90; i_theta += ARC_COURSE) {
1338 points->coords[i_coords++] =
1339 m + r - r * sin (i_theta * G_PI / 180.0);
1340 points->coords[i_coords++] =
1341 m + r - r * cos (i_theta * G_PI / 180.0);
1343 for (i_theta = 0; i_theta <= 90; i_theta += ARC_COURSE) {
1344 points->coords[i_coords++] =
1345 m + r - r * cos (i_theta * G_PI / 180.0);
1346 points->coords[i_coords++] =
1347 m + (h - r) + r * sin (i_theta * G_PI / 180.0);
1349 for (i_theta = 0; i_theta <= 90; i_theta += ARC_COURSE) {
1350 points->coords[i_coords++] =
1351 m + (w - r) + r * sin (i_theta * G_PI / 180.0);
1352 points->coords[i_coords++] =
1353 m + (h - r) + r * cos (i_theta * G_PI / 180.0);
1355 for (i_theta = 0; i_theta <= 90; i_theta += ARC_COURSE) {
1356 points->coords[i_coords++] =
1357 m + (w - r) + r * cos (i_theta * G_PI / 180.0);
1358 points->coords[i_coords++] =
1359 m + r - r * sin (i_theta * G_PI / 180.0);
1361 item = gnome_canvas_item_new (view->markup_group,
1362 gnome_canvas_polygon_get_type (),
1365 "outline_color_rgba", MARKUP_COLOR,
1367 gnome_canvas_points_free (points);
1369 gl_debug (DEBUG_VIEW, "END");
1372 /*---------------------------------------------------------------------------*/
1373 /* PRIVATE. Draw round margin. */
1374 /*---------------------------------------------------------------------------*/
1376 draw_markup_margin_round (glView *view,
1377 glTemplateMarkup *markup)
1380 glTemplate *template;
1381 const glTemplateLabelType *label_type;
1383 GnomeCanvasItem *item;
1385 gl_debug (DEBUG_VIEW, "START");
1387 g_return_if_fail (view && GL_IS_VIEW (view));
1388 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
1390 label = view->label;
1391 template = gl_label_get_template (label);
1392 label_type = gl_template_get_first_label_type (template);
1394 r = label_type->size.round.r;
1395 m = markup->data.margin.size;
1397 /* Margin outline */
1398 item = gnome_canvas_item_new (view->markup_group,
1399 gnome_canvas_ellipse_get_type (),
1405 "outline_color_rgba", MARKUP_COLOR,
1408 gl_debug (DEBUG_VIEW, "END");
1411 /*---------------------------------------------------------------------------*/
1412 /* PRIVATE. Draw CD margins. */
1413 /*---------------------------------------------------------------------------*/
1415 draw_markup_margin_cd (glView *view,
1416 glTemplateMarkup *markup)
1419 glTemplate *template;
1420 const glTemplateLabelType *label_type;
1422 GnomeCanvasItem *item;
1424 gl_debug (DEBUG_VIEW, "START");
1426 g_return_if_fail (view && GL_IS_VIEW (view));
1427 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
1429 label = view->label;
1430 template = gl_label_get_template (label);
1431 label_type = gl_template_get_first_label_type (template);
1433 r1 = label_type->size.cd.r1;
1434 r2 = label_type->size.cd.r2;
1435 m = markup->data.margin.size;
1438 item = gnome_canvas_item_new (view->markup_group,
1439 gnome_canvas_ellipse_get_type (),
1445 "outline_color_rgba", MARKUP_COLOR,
1448 item = gnome_canvas_item_new (view->markup_group,
1449 gnome_canvas_ellipse_get_type (),
1455 "outline_color_rgba", MARKUP_COLOR,
1458 gl_debug (DEBUG_VIEW, "END");
1461 /*---------------------------------------------------------------------------*/
1462 /* PRIVATE. Draw Business Card CD margins. */
1463 /*---------------------------------------------------------------------------*/
1465 draw_markup_margin_cd_bc (glView *view,
1466 glTemplateMarkup *markup)
1469 glTemplate *template;
1470 const glTemplateLabelType *label_type;
1472 GnomeCanvasPoints *points;
1473 gint i_coords, i_theta;
1474 gdouble theta1, theta2;
1475 gdouble x0, y0, w, h, r;
1476 GnomeCanvasItem *item;
1478 gl_debug (DEBUG_VIEW, "START");
1480 g_return_if_fail (view && GL_IS_VIEW (view));
1481 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
1483 label = view->label;
1484 template = gl_label_get_template (label);
1485 label_type = gl_template_get_first_label_type (template);
1487 gl_label_get_size (label, &w, &h);
1491 r1 = label_type->size.cd.r1;
1492 r2 = label_type->size.cd.r2;
1493 m = markup->data.margin.size;
1497 theta1 = (180.0/G_PI) * acos (w / (2.0*r1));
1498 theta2 = (180.0/G_PI) * asin (h / (2.0*r1));
1500 points = gnome_canvas_points_new (360/ARC_FINE + 1);
1503 points->coords[i_coords++] = x0 + r * cos (theta1 * G_PI / 180.0);
1504 points->coords[i_coords++] = y0 + r * sin (theta1 * G_PI / 180.0);
1506 for ( i_theta = theta1 + ARC_FINE; i_theta < theta2; i_theta +=ARC_FINE ) {
1507 points->coords[i_coords++] = x0 + r * cos (i_theta * G_PI / 180.0);
1508 points->coords[i_coords++] = y0 + r * sin (i_theta * G_PI / 180.0);
1511 points->coords[i_coords++] = x0 + r * cos (theta2 * G_PI / 180.0);
1512 points->coords[i_coords++] = y0 + r * sin (theta2 * G_PI / 180.0);
1515 if ( fabs (theta2 - 90.0) > GNOME_CANVAS_EPSILON ) {
1516 points->coords[i_coords++] = x0 + r * cos ((180-theta2) * G_PI / 180.0);
1517 points->coords[i_coords++] = y0 + r * sin ((180-theta2) * G_PI / 180.0);
1520 for ( i_theta = 180-theta2+ARC_FINE; i_theta < (180-theta1); i_theta +=ARC_FINE ) {
1521 points->coords[i_coords++] = x0 + r * cos (i_theta * G_PI / 180.0);
1522 points->coords[i_coords++] = y0 + r * sin (i_theta * G_PI / 180.0);
1525 points->coords[i_coords++] = x0 + r * cos ((180-theta1) * G_PI / 180.0);
1526 points->coords[i_coords++] = y0 + r * sin ((180-theta1) * G_PI / 180.0);
1528 if ( fabs (theta1) > GNOME_CANVAS_EPSILON ) {
1529 points->coords[i_coords++] = x0 + r * cos ((180+theta1) * G_PI / 180.0);
1530 points->coords[i_coords++] = y0 + r * sin ((180+theta1) * G_PI / 180.0);
1533 for ( i_theta = 180+theta1+ARC_FINE; i_theta < (180+theta2); i_theta +=ARC_FINE ) {
1534 points->coords[i_coords++] = x0 + r * cos (i_theta * G_PI / 180.0);
1535 points->coords[i_coords++] = y0 + r * sin (i_theta * G_PI / 180.0);
1538 points->coords[i_coords++] = x0 + r * cos ((180+theta2) * G_PI / 180.0);
1539 points->coords[i_coords++] = y0 + r * sin ((180+theta2) * G_PI / 180.0);
1541 if ( fabs (theta2 - 90.0) > GNOME_CANVAS_EPSILON ) {
1542 points->coords[i_coords++] = x0 + r * cos ((360-theta2) * G_PI / 180.0);
1543 points->coords[i_coords++] = y0 + r * sin ((360-theta2) * G_PI / 180.0);
1546 for ( i_theta = 360-theta2+ARC_FINE; i_theta < (360-theta1); i_theta +=ARC_FINE ) {
1547 points->coords[i_coords++] = x0 + r * cos (i_theta * G_PI / 180.0);
1548 points->coords[i_coords++] = y0 + r * sin (i_theta * G_PI / 180.0);
1551 if ( fabs (theta1) > GNOME_CANVAS_EPSILON ) {
1552 points->coords[i_coords++] = x0 + r * cos ((360-theta1) * G_PI / 180.0);
1553 points->coords[i_coords++] = y0 + r * sin ((360-theta1) * G_PI / 180.0);
1556 points->num_points = i_coords / 2;
1558 item = gnome_canvas_item_new (view->markup_group,
1559 gnome_canvas_polygon_get_type (),
1562 "outline_color_rgba", MARKUP_COLOR,
1565 gnome_canvas_points_free (points);
1568 item = gnome_canvas_item_new (view->markup_group,
1569 gnome_canvas_ellipse_get_type (),
1575 "outline_color_rgba", MARKUP_COLOR,
1578 gl_debug (DEBUG_VIEW, "END");
1581 /*---------------------------------------------------------------------------*/
1582 /* PRIVATE. Draw line markup. */
1583 /*---------------------------------------------------------------------------*/
1585 draw_markup_line (glView *view,
1586 glTemplateMarkup *markup)
1588 GnomeCanvasPoints *points;
1590 gl_debug (DEBUG_VIEW, "START");
1592 g_return_if_fail (view && GL_IS_VIEW (view));
1594 points = gnome_canvas_points_new (2);
1595 points->coords[0] = markup->data.line.x1;
1596 points->coords[1] = markup->data.line.y1;
1597 points->coords[2] = markup->data.line.x2;
1598 points->coords[3] = markup->data.line.y2;
1600 gnome_canvas_item_new (view->markup_group,
1601 gnome_canvas_line_get_type (),
1604 "fill_color_rgba", MARKUP_COLOR,
1607 gnome_canvas_points_free (points);
1609 gl_debug (DEBUG_VIEW, "END");
1612 /*---------------------------------------------------------------------------*/
1613 /* PRIVATE. Draw circle markup. */
1614 /*---------------------------------------------------------------------------*/
1616 draw_markup_circle (glView *view,
1617 glTemplateMarkup *markup)
1619 gl_debug (DEBUG_VIEW, "START");
1621 g_return_if_fail (view && GL_IS_VIEW (view));
1623 /* Circle outline */
1624 gnome_canvas_item_new (view->markup_group,
1625 gnome_canvas_ellipse_get_type (),
1626 "x1", markup->data.circle.x0 - markup->data.circle.r,
1627 "y1", markup->data.circle.y0 - markup->data.circle.r,
1628 "x2", markup->data.circle.x0 + markup->data.circle.r,
1629 "y2", markup->data.circle.y0 + markup->data.circle.r,
1631 "outline_color_rgba", MARKUP_COLOR,
1634 gl_debug (DEBUG_VIEW, "END");
1637 /*****************************************************************************/
1639 /*****************************************************************************/
1640 void gl_view_show_grid (glView *view)
1642 g_return_if_fail (view && GL_IS_VIEW (view));
1644 gnome_canvas_item_show (GNOME_CANVAS_ITEM(view->grid_group));
1647 /*****************************************************************************/
1649 /*****************************************************************************/
1650 void gl_view_hide_grid (glView *view)
1652 g_return_if_fail (view && GL_IS_VIEW (view));
1654 gnome_canvas_item_hide (GNOME_CANVAS_ITEM(view->grid_group));
1657 /*****************************************************************************/
1658 /* Set grid spacing. */
1659 /*****************************************************************************/
1660 void gl_view_set_grid_spacing (glView *view,
1663 g_return_if_fail (view && GL_IS_VIEW (view));
1665 view->grid_spacing = spacing;
1667 gtk_object_destroy (GTK_OBJECT(view->grid_group));
1668 draw_grid_layer (view);
1671 /*****************************************************************************/
1673 /*****************************************************************************/
1674 void gl_view_show_markup (glView *view)
1676 g_return_if_fail (view && GL_IS_VIEW (view));
1678 gnome_canvas_item_show (GNOME_CANVAS_ITEM(view->markup_group));
1681 /*****************************************************************************/
1683 /*****************************************************************************/
1684 void gl_view_hide_markup (glView *view)
1686 g_return_if_fail (view && GL_IS_VIEW (view));
1688 gnome_canvas_item_hide (GNOME_CANVAS_ITEM(view->markup_group));
1691 /*****************************************************************************/
1692 /* Set arrow mode. */
1693 /*****************************************************************************/
1695 gl_view_arrow_mode (glView *view)
1697 static GdkCursor *cursor = NULL;
1699 gl_debug (DEBUG_VIEW, "START");
1701 g_return_if_fail (view && GL_IS_VIEW (view));
1704 cursor = gdk_cursor_new (GDK_LEFT_PTR);
1707 gdk_window_set_cursor (view->canvas->window, cursor);
1709 view->state = GL_VIEW_STATE_ARROW;
1711 gl_debug (DEBUG_VIEW, "END");
1714 /*****************************************************************************/
1715 /* Set create text object mode. */
1716 /*****************************************************************************/
1718 gl_view_object_create_mode (glView *view,
1719 glLabelObjectType type)
1723 gl_debug (DEBUG_VIEW, "START");
1725 g_return_if_fail (view && GL_IS_VIEW (view));
1728 case GL_LABEL_OBJECT_BOX:
1729 cursor = gl_view_box_get_create_cursor ();
1731 case GL_LABEL_OBJECT_ELLIPSE:
1732 cursor = gl_view_ellipse_get_create_cursor ();
1734 case GL_LABEL_OBJECT_LINE:
1735 cursor = gl_view_line_get_create_cursor ();
1737 case GL_LABEL_OBJECT_IMAGE:
1738 cursor = gl_view_image_get_create_cursor ();
1740 case GL_LABEL_OBJECT_TEXT:
1741 cursor = gl_view_text_get_create_cursor ();
1743 case GL_LABEL_OBJECT_BARCODE:
1744 cursor = gl_view_barcode_get_create_cursor ();
1747 g_warning ("Invalid label object type.");/*Should not happen!*/
1751 gdk_window_set_cursor (view->canvas->window, cursor);
1753 view->state = GL_VIEW_STATE_OBJECT_CREATE;
1754 view->create_type = type;
1756 gl_debug (DEBUG_VIEW, "END");
1759 /*****************************************************************************/
1760 /* Select given object (adding to current selection). */
1761 /*****************************************************************************/
1763 gl_view_select_object (glView *view,
1764 glViewObject *view_object)
1766 gl_debug (DEBUG_VIEW, "START");
1768 g_return_if_fail (view && GL_IS_VIEW (view));
1770 select_object_real (view, view_object);
1772 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1774 gl_debug (DEBUG_VIEW, "END");
1777 /*****************************************************************************/
1778 /* Unselect given object (removing from current selection). */
1779 /*****************************************************************************/
1781 gl_view_unselect_object (glView *view,
1782 glViewObject *view_object)
1784 gl_debug (DEBUG_VIEW, "START");
1786 g_return_if_fail (view && GL_IS_VIEW (view));
1788 unselect_object_real (view, view_object);
1790 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1792 gl_debug (DEBUG_VIEW, "END");
1795 /*****************************************************************************/
1796 /* Select all items. */
1797 /*****************************************************************************/
1799 gl_view_select_all (glView *view)
1803 gl_debug (DEBUG_VIEW, "START");
1805 g_return_if_fail (view && GL_IS_VIEW (view));
1807 /* 1st unselect anything already selected. */
1808 for (p = view->selected_object_list; p != NULL; p = p_next) {
1810 unselect_object_real (view, GL_VIEW_OBJECT (p->data));
1813 /* Finally select all objects. */
1814 for (p = view->object_list; p != NULL; p = p->next) {
1815 select_object_real (view, GL_VIEW_OBJECT (p->data));
1818 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1820 gl_debug (DEBUG_VIEW, "END");
1823 /*****************************************************************************/
1824 /* Remove all selections */
1825 /*****************************************************************************/
1827 gl_view_unselect_all (glView *view)
1831 gl_debug (DEBUG_VIEW, "START");
1833 g_return_if_fail (view && GL_IS_VIEW (view));
1835 for (p = view->selected_object_list; p != NULL; p = p_next) {
1837 unselect_object_real (view, GL_VIEW_OBJECT (p->data));
1840 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1842 gl_debug (DEBUG_VIEW, "END");
1845 /*****************************************************************************/
1846 /* Select all objects within given rectangular region (adding to selection). */
1847 /*****************************************************************************/
1849 gl_view_select_region (glView *view,
1856 glViewObject *view_object;
1857 glLabelObject *object;
1858 gdouble i_x1, i_y1, i_x2, i_y2;
1860 gl_debug (DEBUG_VIEW, "START");
1862 g_return_if_fail (view && GL_IS_VIEW (view));
1863 g_return_if_fail ((x1 <= x2) && (y1 <= y2));
1865 for (p = view->object_list; p != NULL; p = p->next) {
1866 view_object = GL_VIEW_OBJECT(p->data);
1867 if (!gl_view_is_object_selected (view, view_object)) {
1869 object = gl_view_object_get_object (view_object);
1871 gl_label_object_get_extent (object, &i_x1, &i_y1, &i_x2, &i_y2);
1872 if ((i_x1 >= x1) && (i_x2 <= x2) && (i_y1 >= y1)
1874 select_object_real (view, view_object);
1880 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1882 gl_debug (DEBUG_VIEW, "END");
1885 /*---------------------------------------------------------------------------*/
1886 /* PRIVATE. Select an object. */
1887 /*---------------------------------------------------------------------------*/
1889 select_object_real (glView *view,
1890 glViewObject *view_object)
1892 gl_debug (DEBUG_VIEW, "START");
1894 g_return_if_fail (view && GL_IS_VIEW (view));
1895 g_return_if_fail (GL_IS_VIEW_OBJECT (view_object));
1897 if (!gl_view_is_object_selected (view, view_object)) {
1898 view->selected_object_list =
1899 g_list_prepend (view->selected_object_list, view_object);
1901 gl_view_object_show_highlight (view_object);
1902 gtk_widget_grab_focus (GTK_WIDGET (view->canvas));
1904 gl_debug (DEBUG_VIEW, "END");
1907 /*---------------------------------------------------------------------------*/
1908 /* PRIVATE. Un-select object. */
1909 /*---------------------------------------------------------------------------*/
1911 unselect_object_real (glView *view,
1912 glViewObject *view_object)
1914 gl_debug (DEBUG_VIEW, "START");
1916 g_return_if_fail (view && GL_IS_VIEW (view));
1917 g_return_if_fail (GL_IS_VIEW_OBJECT (view_object));
1919 gl_view_object_hide_highlight (view_object);
1921 view->selected_object_list =
1922 g_list_remove (view->selected_object_list, view_object);
1924 gl_debug (DEBUG_VIEW, "END");
1927 /*---------------------------------------------------------------------------*/
1928 /* PRIVATE. Return object at (x,y). */
1929 /*---------------------------------------------------------------------------*/
1931 object_at (glView *view,
1935 GnomeCanvasItem *item, *p_item;
1938 gl_debug (DEBUG_VIEW, "");
1940 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
1942 item = gnome_canvas_get_item_at (GNOME_CANVAS (view->canvas), x, y);
1944 /* No item is at x, y */
1948 /* ignore items not in label or highlight layers, e.g. background items */
1949 if (!is_item_member_of_group(view, item, GNOME_CANVAS_ITEM(view->label_group)) &&
1950 !is_item_member_of_group(view, item, GNOME_CANVAS_ITEM(view->highlight_group)))
1956 /*---------------------------------------------------------------------------*/
1957 /* PRIVATE. Is the item a child (or grandchild, etc.) of group. */
1958 /*---------------------------------------------------------------------------*/
1960 is_item_member_of_group (glView *view,
1961 GnomeCanvasItem *item,
1962 GnomeCanvasItem *group)
1964 GnomeCanvasItem *parent;
1965 GnomeCanvasItem *root_group;
1967 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
1969 root_group = GNOME_CANVAS_ITEM(gnome_canvas_root (GNOME_CANVAS (view->canvas)));
1971 for ( parent=item->parent; parent && (parent!=root_group); parent=parent->parent) {
1972 if (parent == group) return TRUE;
1977 /*****************************************************************************/
1978 /* Is the object in our current selection? */
1979 /*****************************************************************************/
1981 gl_view_is_object_selected (glView *view,
1982 glViewObject *view_object)
1984 gl_debug (DEBUG_VIEW, "");
1986 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
1987 g_return_val_if_fail (GL_IS_VIEW_OBJECT (view_object), FALSE);
1989 if (g_list_find (view->selected_object_list, view_object) == NULL) {
1995 /*****************************************************************************/
1996 /* Is our current selection empty? */
1997 /*****************************************************************************/
1999 gl_view_is_selection_empty (glView *view)
2001 gl_debug (DEBUG_VIEW, "");
2003 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
2005 if (view->selected_object_list == NULL) {
2012 /*****************************************************************************/
2013 /* Is our current selection atomic? I.e. only one item selected. */
2014 /*****************************************************************************/
2016 gl_view_is_selection_atomic (glView *view)
2018 gl_debug (DEBUG_VIEW, "");
2020 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
2022 if (view->selected_object_list == NULL)
2024 if (view->selected_object_list->next == NULL)
2029 /*****************************************************************************/
2030 /* Delete selected objects. (Bypass clipboard) */
2031 /*****************************************************************************/
2033 gl_view_delete_selection (glView *view)
2035 GList *object_list, *p, *p_next;
2037 gl_debug (DEBUG_VIEW, "START");
2039 g_return_if_fail (view && GL_IS_VIEW (view));
2041 object_list = view->selected_object_list;
2042 view->selected_object_list = NULL;
2043 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
2045 for (p = object_list; p != NULL; p = p_next) {
2047 g_object_unref (G_OBJECT (p->data));
2048 object_list = g_list_delete_link (object_list, p);
2051 gl_debug (DEBUG_VIEW, "END");
2054 /*****************************************************************************/
2055 /* Get object property editor of first selected object. */
2056 /*****************************************************************************/
2058 gl_view_get_editor (glView *view)
2060 glViewObject *view_object;
2061 GtkWidget *editor = NULL;
2063 gl_debug (DEBUG_VIEW, "START");
2065 g_return_if_fail (view && GL_IS_VIEW (view));
2067 if (!gl_view_is_selection_empty (view)) {
2069 view_object = GL_VIEW_OBJECT(view->selected_object_list->data);
2070 editor = gl_view_object_get_editor (view_object);
2074 gl_debug (DEBUG_VIEW, "END");
2079 /*****************************************************************************/
2080 /* Raise selected items to top. */
2081 /*****************************************************************************/
2083 gl_view_raise_selection (glView *view)
2086 glViewObject *view_object;
2087 glLabelObject *object;
2089 gl_debug (DEBUG_VIEW, "START");
2091 g_return_if_fail (view && GL_IS_VIEW (view));
2093 for (p = view->selected_object_list; p != NULL; p = p->next) {
2094 view_object = GL_VIEW_OBJECT (p->data);
2095 object = gl_view_object_get_object (view_object);
2096 gl_label_object_raise_to_top (object);
2099 gl_debug (DEBUG_VIEW, "END");
2102 /*****************************************************************************/
2103 /* Lower selected items to bottom. */
2104 /*****************************************************************************/
2106 gl_view_lower_selection (glView *view)
2109 glViewObject *view_object;
2110 glLabelObject *object;
2112 gl_debug (DEBUG_VIEW, "START");
2114 g_return_if_fail (view && GL_IS_VIEW (view));
2116 for (p = view->selected_object_list; p != NULL; p = p->next) {
2117 view_object = GL_VIEW_OBJECT (p->data);
2118 object = gl_view_object_get_object (view_object);
2119 gl_label_object_lower_to_bottom (object);
2122 gl_debug (DEBUG_VIEW, "END");
2125 /*****************************************************************************/
2126 /* Rotate selected objects by given angle. */
2127 /*****************************************************************************/
2129 gl_view_rotate_selection (glView *view,
2133 glViewObject *view_object;
2134 glLabelObject *object;
2136 gl_debug (DEBUG_VIEW, "START");
2138 g_return_if_fail (view && GL_IS_VIEW (view));
2140 for (p = view->selected_object_list; p != NULL; p = p->next) {
2141 view_object = GL_VIEW_OBJECT (p->data);
2142 object = gl_view_object_get_object (view_object);
2143 gl_label_object_rotate (object, theta_degs);
2146 gl_debug (DEBUG_VIEW, "END");
2149 /*****************************************************************************/
2150 /* Rotate selected objects 90 degrees left. */
2151 /*****************************************************************************/
2153 gl_view_rotate_selection_left (glView *view)
2156 glViewObject *view_object;
2157 glLabelObject *object;
2159 gl_debug (DEBUG_VIEW, "START");
2161 g_return_if_fail (view && GL_IS_VIEW (view));
2163 for (p = view->selected_object_list; p != NULL; p = p->next) {
2164 view_object = GL_VIEW_OBJECT (p->data);
2165 object = gl_view_object_get_object (view_object);
2166 gl_label_object_rotate (object, -90.0);
2169 gl_debug (DEBUG_VIEW, "END");
2172 /*****************************************************************************/
2173 /* Rotate selected objects 90 degrees right. */
2174 /*****************************************************************************/
2176 gl_view_rotate_selection_right (glView *view)
2179 glViewObject *view_object;
2180 glLabelObject *object;
2182 gl_debug (DEBUG_VIEW, "START");
2184 g_return_if_fail (view && GL_IS_VIEW (view));
2186 for (p = view->selected_object_list; p != NULL; p = p->next) {
2187 view_object = GL_VIEW_OBJECT (p->data);
2188 object = gl_view_object_get_object (view_object);
2189 gl_label_object_rotate (object, 90.0);
2192 gl_debug (DEBUG_VIEW, "END");
2195 /*****************************************************************************/
2196 /* Flip selected objects horizontally. */
2197 /*****************************************************************************/
2199 gl_view_flip_selection_horiz (glView *view)
2202 glViewObject *view_object;
2203 glLabelObject *object;
2205 gl_debug (DEBUG_VIEW, "START");
2207 g_return_if_fail (view && GL_IS_VIEW (view));
2209 for (p = view->selected_object_list; p != NULL; p = p->next) {
2210 view_object = GL_VIEW_OBJECT (p->data);
2211 object = gl_view_object_get_object (view_object);
2212 gl_label_object_flip_horiz (object);
2215 gl_debug (DEBUG_VIEW, "END");
2218 /*****************************************************************************/
2219 /* Flip selected objects vertically. */
2220 /*****************************************************************************/
2222 gl_view_flip_selection_vert (glView *view)
2225 glViewObject *view_object;
2226 glLabelObject *object;
2228 gl_debug (DEBUG_VIEW, "START");
2230 g_return_if_fail (view && GL_IS_VIEW (view));
2232 for (p = view->selected_object_list; p != NULL; p = p->next) {
2233 view_object = GL_VIEW_OBJECT (p->data);
2234 object = gl_view_object_get_object (view_object);
2235 gl_label_object_flip_vert (object);
2238 gl_debug (DEBUG_VIEW, "END");
2241 /*****************************************************************************/
2242 /* Align selected objects to left most edge. */
2243 /*****************************************************************************/
2245 gl_view_align_selection_left (glView *view)
2248 glViewObject *view_object;
2249 glLabelObject *object;
2250 gdouble dx, x1min, x1, y1, x2, y2;
2252 gl_debug (DEBUG_VIEW, "START");
2254 g_return_if_fail (view && GL_IS_VIEW (view));
2256 g_return_if_fail (!gl_view_is_selection_empty (view) &&
2257 !gl_view_is_selection_atomic (view));
2259 /* find left most edge */
2260 p = view->selected_object_list;
2261 view_object = GL_VIEW_OBJECT (p->data);
2262 object = gl_view_object_get_object (view_object);
2263 gl_label_object_get_extent (object, &x1min, &y1, &x2, &y2);
2264 for (p = p->next; p != NULL; p = p->next) {
2265 view_object = GL_VIEW_OBJECT (p->data);
2266 object = gl_view_object_get_object (view_object);
2267 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2268 if ( x1 < x1min ) x1min = x1;
2271 /* now adjust the object positions to line up the left edges */
2272 for (p = view->selected_object_list; p != NULL; p = p->next) {
2273 view_object = GL_VIEW_OBJECT (p->data);
2274 object = gl_view_object_get_object (view_object);
2275 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2277 gl_label_object_set_position_relative (object, dx, 0.0);
2280 gl_debug (DEBUG_VIEW, "END");
2284 /*****************************************************************************/
2285 /* Align selected objects to right most edge. */
2286 /*****************************************************************************/
2288 gl_view_align_selection_right (glView *view)
2291 glViewObject *view_object;
2292 glLabelObject *object;
2293 gdouble dx, x2max, x1, y1, x2, y2;
2295 gl_debug (DEBUG_VIEW, "START");
2297 g_return_if_fail (view && GL_IS_VIEW (view));
2299 g_return_if_fail (!gl_view_is_selection_empty (view) &&
2300 !gl_view_is_selection_atomic (view));
2302 /* find right most edge */
2303 p = view->selected_object_list;
2304 view_object = GL_VIEW_OBJECT (p->data);
2305 object = gl_view_object_get_object (view_object);
2306 gl_label_object_get_extent (object, &x1, &y1, &x2max, &y2);
2307 for (p = p->next; p != NULL; p = p->next) {
2308 view_object = GL_VIEW_OBJECT (p->data);
2309 object = gl_view_object_get_object (view_object);
2310 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2311 if ( x2 > x2max ) x2max = x2;
2314 /* now adjust the object positions to line up the right edges */
2315 for (p = view->selected_object_list; p != NULL; p = p->next) {
2316 view_object = GL_VIEW_OBJECT (p->data);
2317 object = gl_view_object_get_object (view_object);
2318 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2320 gl_label_object_set_position_relative (object, dx, 0.0);
2323 gl_debug (DEBUG_VIEW, "END");
2326 /*****************************************************************************/
2327 /* Align selected objects to horizontal center of objects. */
2328 /*****************************************************************************/
2330 gl_view_align_selection_hcenter (glView *view)
2333 glViewObject *view_object;
2334 glLabelObject *object;
2335 gdouble dx, dxmin, xsum, xavg, xcenter, x1, y1, x2, y2;
2338 gl_debug (DEBUG_VIEW, "START");
2340 g_return_if_fail (view && GL_IS_VIEW (view));
2342 g_return_if_fail (!gl_view_is_selection_empty (view) &&
2343 !gl_view_is_selection_atomic (view));
2345 /* find average center of objects */
2348 for (p = view->selected_object_list; p != NULL; p = p->next) {
2349 view_object = GL_VIEW_OBJECT (p->data);
2350 object = gl_view_object_get_object (view_object);
2351 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2352 xsum += (x1 + x2) / 2.0;
2357 /* find center of object closest to average center */
2358 p = view->selected_object_list;
2359 view_object = GL_VIEW_OBJECT (p->data);
2360 object = gl_view_object_get_object (view_object);
2361 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2362 dxmin = fabs (xavg - (x1 + x2)/2.0);
2363 xcenter = (x1 + x2)/2.0;
2364 for (p = p->next; p != NULL; p = p->next) {
2365 view_object = GL_VIEW_OBJECT (p->data);
2366 object = gl_view_object_get_object (view_object);
2367 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2368 dx = fabs (xavg - (x1 + x2)/2.0);
2371 xcenter = (x1 + x2)/2.0;
2375 /* now adjust the object positions to line up this center */
2376 for (p = view->selected_object_list; p != NULL; p = p->next) {
2377 view_object = GL_VIEW_OBJECT (p->data);
2378 object = gl_view_object_get_object (view_object);
2379 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2380 dx = xcenter - (x1 + x2)/2.0;
2381 gl_label_object_set_position_relative (object, dx, 0.0);
2384 gl_debug (DEBUG_VIEW, "END");
2387 /*****************************************************************************/
2388 /* Align selected objects to top most edge. */
2389 /*****************************************************************************/
2391 gl_view_align_selection_top (glView *view)
2394 glViewObject *view_object;
2395 glLabelObject *object;
2396 gdouble dy, y1min, x1, y1, x2, y2;
2398 gl_debug (DEBUG_VIEW, "START");
2400 g_return_if_fail (view && GL_IS_VIEW (view));
2402 g_return_if_fail (!gl_view_is_selection_empty (view) &&
2403 !gl_view_is_selection_atomic (view));
2405 /* find top most edge */
2406 p = view->selected_object_list;
2407 view_object = GL_VIEW_OBJECT (p->data);
2408 object = gl_view_object_get_object (view_object);
2409 gl_label_object_get_extent (object, &x1, &y1min, &x2, &y2);
2410 for (p = p->next; p != NULL; p = p->next) {
2411 view_object = GL_VIEW_OBJECT (p->data);
2412 object = gl_view_object_get_object (view_object);
2413 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2414 if ( y1 < y1min ) y1min = y1;
2417 /* now adjust the object positions to line up the top edges */
2418 for (p = view->selected_object_list; p != NULL; p = p->next) {
2419 view_object = GL_VIEW_OBJECT (p->data);
2420 object = gl_view_object_get_object (view_object);
2421 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2423 gl_label_object_set_position_relative (object, 0.0, dy);
2426 gl_debug (DEBUG_VIEW, "END");
2429 /*****************************************************************************/
2430 /* Align selected objects to bottom most edge. */
2431 /*****************************************************************************/
2433 gl_view_align_selection_bottom (glView *view)
2436 glViewObject *view_object;
2437 glLabelObject *object;
2438 gdouble dy, y2max, x1, y1, x2, y2;
2440 gl_debug (DEBUG_VIEW, "START");
2442 g_return_if_fail (view && GL_IS_VIEW (view));
2444 g_return_if_fail (!gl_view_is_selection_empty (view) &&
2445 !gl_view_is_selection_atomic (view));
2447 /* find bottom most edge */
2448 p = view->selected_object_list;
2449 view_object = GL_VIEW_OBJECT (p->data);
2450 object = gl_view_object_get_object (view_object);
2451 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2max);
2452 for (p = p->next; p != NULL; p = p->next) {
2453 view_object = GL_VIEW_OBJECT (p->data);
2454 object = gl_view_object_get_object (view_object);
2455 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2456 if ( y2 > y2max ) y2max = y2;
2459 /* now adjust the object positions to line up the bottom edges */
2460 for (p = view->selected_object_list; p != NULL; p = p->next) {
2461 view_object = GL_VIEW_OBJECT (p->data);
2462 object = gl_view_object_get_object (view_object);
2463 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2465 gl_label_object_set_position_relative (object, 0.0, dy);
2468 gl_debug (DEBUG_VIEW, "END");
2471 /*****************************************************************************/
2472 /* Align selected objects to viertical center of objects. */
2473 /*****************************************************************************/
2475 gl_view_align_selection_vcenter (glView *view)
2478 glViewObject *view_object;
2479 glLabelObject *object;
2480 gdouble dy, dymin, ysum, yavg, ycenter, x1, y1, x2, y2;
2483 gl_debug (DEBUG_VIEW, "START");
2485 g_return_if_fail (view && GL_IS_VIEW (view));
2487 g_return_if_fail (!gl_view_is_selection_empty (view) &&
2488 !gl_view_is_selection_atomic (view));
2490 /* find average center of objects */
2493 for (p = view->selected_object_list; p != NULL; p = p->next) {
2494 view_object = GL_VIEW_OBJECT (p->data);
2495 object = gl_view_object_get_object (view_object);
2496 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2497 ysum += (y1 + y2) / 2.0;
2502 /* find center of object closest to average center */
2503 p = view->selected_object_list;
2504 view_object = GL_VIEW_OBJECT (p->data);
2505 object = gl_view_object_get_object (view_object);
2506 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2507 dymin = fabs (yavg - (y1 + y2)/2.0);
2508 ycenter = (y1 + y2)/2.0;
2509 for (p = p->next; p != NULL; p = p->next) {
2510 view_object = GL_VIEW_OBJECT (p->data);
2511 object = gl_view_object_get_object (view_object);
2512 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2513 dy = fabs (yavg - (y1 + y2)/2.0);
2516 ycenter = (y1 + y2)/2.0;
2520 /* now adjust the object positions to line up this center */
2521 for (p = view->selected_object_list; p != NULL; p = p->next) {
2522 view_object = GL_VIEW_OBJECT (p->data);
2523 object = gl_view_object_get_object (view_object);
2524 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2525 dy = ycenter - (y1 + y2)/2.0;
2526 gl_label_object_set_position_relative (object, 0.0, dy);
2529 gl_debug (DEBUG_VIEW, "END");
2532 /*****************************************************************************/
2533 /* Center selected objects to in center of label. */
2534 /*****************************************************************************/
2536 gl_view_center_selection_horiz (glView *view)
2539 glViewObject *view_object;
2540 glLabelObject *object;
2541 gdouble dx, x_label_center, x_obj_center, x1, y1, x2, y2, w, h;
2543 gl_debug (DEBUG_VIEW, "START");
2545 g_return_if_fail (view && GL_IS_VIEW (view));
2547 g_return_if_fail (!gl_view_is_selection_empty (view));
2549 gl_label_get_size (view->label, &w, &h);
2550 x_label_center = w / 2.0;
2552 /* adjust the object positions */
2553 for (p = view->selected_object_list; p != NULL; p = p->next) {
2554 view_object = GL_VIEW_OBJECT (p->data);
2555 object = gl_view_object_get_object (view_object);
2556 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2557 x_obj_center = (x1 + x2) / 2.0;
2558 dx = x_label_center - x_obj_center;
2559 gl_label_object_set_position_relative (object, dx, 0.0);
2562 gl_debug (DEBUG_VIEW, "END");
2566 /*****************************************************************************/
2567 /* Center selected objects to in center of label. */
2568 /*****************************************************************************/
2570 gl_view_center_selection_vert (glView *view)
2573 glViewObject *view_object;
2574 glLabelObject *object;
2575 gdouble dy, y_label_center, y_obj_center, x1, y1, x2, y2, w, h;
2577 gl_debug (DEBUG_VIEW, "START");
2579 g_return_if_fail (view && GL_IS_VIEW (view));
2581 g_return_if_fail (!gl_view_is_selection_empty (view));
2583 gl_label_get_size (view->label, &w, &h);
2584 y_label_center = h / 2.0;
2586 /* adjust the object positions */
2587 for (p = view->selected_object_list; p != NULL; p = p->next) {
2588 view_object = GL_VIEW_OBJECT (p->data);
2589 object = gl_view_object_get_object (view_object);
2590 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2591 y_obj_center = (y1 + y2) / 2.0;
2592 dy = y_label_center - y_obj_center;
2593 gl_label_object_set_position_relative (object, 0.0, dy);
2596 gl_debug (DEBUG_VIEW, "END");
2600 /*****************************************************************************/
2601 /* Move selected objects */
2602 /*****************************************************************************/
2604 gl_view_move_selection (glView *view,
2609 glLabelObject *object;
2611 gl_debug (DEBUG_VIEW, "START");
2613 g_return_if_fail (view && GL_IS_VIEW (view));
2615 for (p = view->selected_object_list; p != NULL; p = p->next) {
2617 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2618 gl_label_object_set_position_relative (object, dx, dy);
2622 gl_debug (DEBUG_VIEW, "END");
2625 /*****************************************************************************/
2626 /* Can text properties be set for selection? */
2627 /*****************************************************************************/
2629 gl_view_can_selection_text (glView *view)
2632 glLabelObject *object;
2634 gl_debug (DEBUG_VIEW, "");
2636 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
2638 for (p = view->selected_object_list; p != NULL; p = p->next) {
2640 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2641 if (gl_label_object_can_text (object)) {
2650 /*****************************************************************************/
2651 /* Set font family for all text contained in selected objects. */
2652 /*****************************************************************************/
2654 gl_view_set_selection_font_family (glView *view,
2655 const gchar *font_family)
2658 glLabelObject *object;
2660 gl_debug (DEBUG_VIEW, "START");
2662 g_return_if_fail (view && GL_IS_VIEW (view));
2664 for (p = view->selected_object_list; p != NULL; p = p->next) {
2666 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2667 gl_label_object_set_font_family (object, font_family);
2671 gl_debug (DEBUG_VIEW, "END");
2674 /*****************************************************************************/
2675 /* Set font size for all text contained in selected objects. */
2676 /*****************************************************************************/
2678 gl_view_set_selection_font_size (glView *view,
2682 glLabelObject *object;
2684 gl_debug (DEBUG_VIEW, "START");
2686 g_return_if_fail (view && GL_IS_VIEW (view));
2688 for (p = view->selected_object_list; p != NULL; p = p->next) {
2690 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2691 gl_label_object_set_font_size (object, font_size);
2695 gl_debug (DEBUG_VIEW, "END");
2698 /*****************************************************************************/
2699 /* Set font weight for all text contained in selected objects. */
2700 /*****************************************************************************/
2702 gl_view_set_selection_font_weight (glView *view,
2703 GnomeFontWeight font_weight)
2706 glLabelObject *object;
2708 gl_debug (DEBUG_VIEW, "START");
2710 g_return_if_fail (view && GL_IS_VIEW (view));
2712 for (p = view->selected_object_list; p != NULL; p = p->next) {
2714 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2715 gl_label_object_set_font_weight (object, font_weight);
2719 gl_debug (DEBUG_VIEW, "END");
2722 /*****************************************************************************/
2723 /* Set font italic flag for all text contained in selected objects. */
2724 /*****************************************************************************/
2726 gl_view_set_selection_font_italic_flag (glView *view,
2727 gboolean font_italic_flag)
2730 glLabelObject *object;
2732 gl_debug (DEBUG_VIEW, "START");
2734 g_return_if_fail (view && GL_IS_VIEW (view));
2736 for (p = view->selected_object_list; p != NULL; p = p->next) {
2738 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2739 gl_label_object_set_font_italic_flag (object, font_italic_flag);
2743 gl_debug (DEBUG_VIEW, "END");
2746 /*****************************************************************************/
2747 /* Set text alignment for all text contained in selected objects. */
2748 /*****************************************************************************/
2750 gl_view_set_selection_text_alignment (glView *view,
2751 GtkJustification text_alignment)
2754 glLabelObject *object;
2756 gl_debug (DEBUG_VIEW, "START");
2758 g_return_if_fail (view && GL_IS_VIEW (view));
2760 for (p = view->selected_object_list; p != NULL; p = p->next) {
2762 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2763 gl_label_object_set_text_alignment (object, text_alignment);
2767 gl_debug (DEBUG_VIEW, "END");
2770 /*****************************************************************************/
2771 /* Set text line spacing for all text contained in selected objects. */
2772 /*****************************************************************************/
2774 gl_view_set_selection_text_line_spacing (glView *view,
2775 gdouble text_line_spacing)
2778 glLabelObject *object;
2780 gl_debug (DEBUG_VIEW, "START");
2782 g_return_if_fail (view && GL_IS_VIEW (view));
2784 for (p = view->selected_object_list; p != NULL; p = p->next) {
2786 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2787 gl_label_object_set_text_line_spacing (object, text_line_spacing);
2791 gl_debug (DEBUG_VIEW, "END");
2793 /*****************************************************************************/
2794 /* Set text color for all text contained in selected objects. */
2795 /*****************************************************************************/
2797 gl_view_set_selection_text_color (glView *view,
2801 glLabelObject *object;
2803 gl_debug (DEBUG_VIEW, "START");
2805 g_return_if_fail (view && GL_IS_VIEW (view));
2807 for (p = view->selected_object_list; p != NULL; p = p->next) {
2809 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2810 gl_label_object_set_text_color (object, text_color);
2814 gl_debug (DEBUG_VIEW, "END");
2817 /*****************************************************************************/
2818 /* Can fill properties be set for selection? */
2819 /*****************************************************************************/
2821 gl_view_can_selection_fill (glView *view)
2824 glLabelObject *object;
2826 gl_debug (DEBUG_VIEW, "");
2828 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
2830 for (p = view->selected_object_list; p != NULL; p = p->next) {
2832 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2833 if (gl_label_object_can_fill (object)) {
2842 /*****************************************************************************/
2843 /* Set fill color for all selected objects. */
2844 /*****************************************************************************/
2846 gl_view_set_selection_fill_color (glView *view,
2850 glLabelObject *object;
2852 gl_debug (DEBUG_VIEW, "START");
2854 g_return_if_fail (view && GL_IS_VIEW (view));
2856 for (p = view->selected_object_list; p != NULL; p = p->next) {
2858 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2859 gl_label_object_set_fill_color (object, fill_color);
2863 gl_debug (DEBUG_VIEW, "END");
2866 /*****************************************************************************/
2867 /* Can line color properties be set for selection? */
2868 /*****************************************************************************/
2870 gl_view_can_selection_line_color (glView *view)
2873 glLabelObject *object;
2875 gl_debug (DEBUG_VIEW, "");
2877 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
2879 for (p = view->selected_object_list; p != NULL; p = p->next) {
2881 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2882 if (gl_label_object_can_line_color (object)) {
2891 /*****************************************************************************/
2892 /* Set line color for all selected objects. */
2893 /*****************************************************************************/
2895 gl_view_set_selection_line_color (glView *view,
2899 glLabelObject *object;
2901 gl_debug (DEBUG_VIEW, "START");
2903 g_return_if_fail (view && GL_IS_VIEW (view));
2905 for (p = view->selected_object_list; p != NULL; p = p->next) {
2907 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2908 gl_label_object_set_line_color (object, line_color);
2912 gl_debug (DEBUG_VIEW, "END");
2915 /*****************************************************************************/
2916 /* Can line width properties be set for selection? */
2917 /*****************************************************************************/
2919 gl_view_can_selection_line_width (glView *view)
2922 glLabelObject *object;
2924 gl_debug (DEBUG_VIEW, "");
2926 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
2928 for (p = view->selected_object_list; p != NULL; p = p->next) {
2930 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2931 if (gl_label_object_can_line_width (object)) {
2940 /*****************************************************************************/
2941 /* Set line width for all selected objects. */
2942 /*****************************************************************************/
2944 gl_view_set_selection_line_width (glView *view,
2948 glLabelObject *object;
2950 gl_debug (DEBUG_VIEW, "START");
2952 g_return_if_fail (view && GL_IS_VIEW (view));
2954 for (p = view->selected_object_list; p != NULL; p = p->next) {
2956 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2957 gl_label_object_set_line_width (object, line_width);
2961 gl_debug (DEBUG_VIEW, "END");
2964 /*****************************************************************************/
2965 /* "Cut" selected items and place in clipboard selections. */
2966 /*****************************************************************************/
2968 gl_view_cut (glView *view)
2970 gl_debug (DEBUG_VIEW, "START");
2972 g_return_if_fail (view && GL_IS_VIEW (view));
2974 gl_view_copy (view);
2975 gl_view_delete_selection (view);
2977 gl_debug (DEBUG_VIEW, "END");
2980 /*****************************************************************************/
2981 /* "Copy" selected items to clipboard selections. */
2982 /*****************************************************************************/
2984 gl_view_copy (glView *view)
2987 glViewObject *view_object;
2988 glLabelObject *object;
2989 glTemplate *template;
2990 gboolean rotate_flag;
2992 gl_debug (DEBUG_VIEW, "START");
2994 g_return_if_fail (view && GL_IS_VIEW (view));
2996 if (view->selected_object_list) {
2998 if ( view->selection_data ) {
2999 g_object_unref (view->selection_data);
3001 template = gl_label_get_template (view->label);
3002 rotate_flag = gl_label_get_rotate_flag (view->label);
3003 view->selection_data = GL_LABEL(gl_label_new ());
3004 gl_label_set_template (view->selection_data, template);
3005 gl_label_set_rotate_flag (view->selection_data, rotate_flag);
3006 gl_template_free (template);
3008 for (p = view->selected_object_list; p != NULL; p = p->next) {
3010 view_object = GL_VIEW_OBJECT (p->data);
3011 object = gl_view_object_get_object (view_object);
3013 gl_label_object_dup (object, view->selection_data);
3017 gtk_selection_owner_set (view->invisible,
3018 clipboard_atom, GDK_CURRENT_TIME);
3019 view->have_selection = TRUE;
3023 gl_debug (DEBUG_VIEW, "END");
3026 /*****************************************************************************/
3027 /* "Paste" from private clipboard selection. */
3028 /*****************************************************************************/
3030 gl_view_paste (glView *view)
3032 gl_debug (DEBUG_VIEW, "START");
3034 g_return_if_fail (view && GL_IS_VIEW (view));
3036 gtk_selection_convert (GTK_WIDGET (view->invisible),
3037 clipboard_atom, GDK_SELECTION_TYPE_STRING,
3040 gl_debug (DEBUG_VIEW, "END");
3043 /*****************************************************************************/
3044 /* Zoom in one "notch" */
3045 /*****************************************************************************/
3047 gl_view_zoom_in (glView *view)
3050 gdouble dist, dist_min;
3052 gl_debug (DEBUG_VIEW, "START");
3054 g_return_if_fail (view && GL_IS_VIEW (view));
3056 /* Find index of current scale (or best match) */
3057 i_min = 1; /* start with 2nd largest scale */
3058 dist_min = fabs (zooms[1] - view->zoom);
3059 for (i = 2; i < N_ZOOMS; i++) {
3060 dist = fabs (zooms[i] - view->zoom);
3061 if (dist < dist_min) {
3067 /* zoom in one "notch" */
3068 i = MAX (0, i_min - 1);
3069 gl_debug (DEBUG_VIEW, "zoom[%d] = %g", i, zooms[i]);
3070 set_zoom_real (view, zooms[i], FALSE);
3072 gl_debug (DEBUG_VIEW, "END");
3075 /*****************************************************************************/
3076 /* Zoom out one "notch" */
3077 /*****************************************************************************/
3079 gl_view_zoom_out (glView *view)
3082 gdouble dist, dist_min;
3084 gl_debug (DEBUG_VIEW, "START");
3086 g_return_if_fail (view && GL_IS_VIEW (view));
3088 /* Find index of current scale (or best match) */
3089 i_min = 0; /* start with largest scale */
3090 dist_min = fabs (zooms[0] - view->zoom);
3091 for (i = 1; i < N_ZOOMS; i++) {
3092 dist = fabs (zooms[i] - view->zoom);
3093 if (dist < dist_min) {
3099 /* zoom out one "notch" */
3100 if (i_min >= N_ZOOMS)
3105 set_zoom_real (view, zooms[i], FALSE);
3107 gl_debug (DEBUG_VIEW, "END");
3110 /*****************************************************************************/
3111 /* Set zoom to best fit. */
3112 /*****************************************************************************/
3114 gl_view_zoom_to_fit (glView *view)
3116 gint w_view, h_view;
3117 gdouble w_label, h_label;
3118 gdouble x_scale, y_scale, scale;
3120 gl_debug (DEBUG_VIEW, "");
3122 if ( ! GTK_WIDGET_VISIBLE(view)) {
3123 set_zoom_real (view, 1.0, TRUE);
3127 w_view = GTK_WIDGET(view)->allocation.width;
3128 h_view = GTK_WIDGET(view)->allocation.height;
3130 gl_label_get_size (GL_LABEL(view->label), &w_label, &h_label);
3132 gl_debug (DEBUG_VIEW, "View size: %d, %d", w_view, h_view);
3133 gl_debug (DEBUG_VIEW, "Label size: %g, %g", w_label, h_label);
3135 /* Calculate best scale */
3136 x_scale = (double)(w_view - ZOOMTOFIT_PAD) / w_label;
3137 y_scale = (double)(h_view - ZOOMTOFIT_PAD) / h_label;
3138 scale = MIN (x_scale, y_scale);
3139 gl_debug (DEBUG_VIEW, "Candidate zooms: %g, %g => %g", x_scale, y_scale, scale);
3142 gl_debug (DEBUG_VIEW, "Scale: %g", scale);
3143 scale = MIN (scale, zooms[0]*view->home_scale);
3144 scale = MAX (scale, zooms[N_ZOOMS-1]*view->home_scale);
3145 gl_debug (DEBUG_VIEW, "Limitted scale: %g", scale);
3147 set_zoom_real (view, scale/view->home_scale, TRUE);
3150 /*****************************************************************************/
3151 /* Set current zoom factor to explicit value. */
3152 /*****************************************************************************/
3154 gl_view_set_zoom (glView *view,
3157 gl_debug (DEBUG_VIEW, "START");
3159 set_zoom_real (view, zoom, FALSE);
3161 gl_debug (DEBUG_VIEW, "END");
3164 /*---------------------------------------------------------------------------*/
3165 /* PRIVATE. Set canvas scale. *
3166 /*---------------------------------------------------------------------------*/
3168 set_zoom_real (glView *view,
3170 gboolean zoom_to_fit_flag)
3172 gl_debug (DEBUG_VIEW, "START");
3174 g_return_if_fail (view && GL_IS_VIEW (view));
3175 g_return_if_fail (zoom > 0.0);
3177 /* Limit, if needed */
3178 gl_debug (DEBUG_VIEW, "Zoom requested: %g", zoom);
3179 zoom = MIN (zoom, zooms[0]);
3180 zoom = MAX (zoom, zooms[N_ZOOMS-1]);
3181 gl_debug (DEBUG_VIEW, "Limitted zoom: %g", zoom);
3183 if ( zoom != view->zoom ) {
3186 view->zoom_to_fit_flag = zoom_to_fit_flag;
3187 gnome_canvas_set_pixels_per_unit (GNOME_CANVAS (view->canvas),
3188 zoom*view->home_scale);
3190 g_signal_emit (G_OBJECT(view), signals[ZOOM_CHANGED], 0, zoom);
3194 gl_debug (DEBUG_VIEW, "END");
3199 /*---------------------------------------------------------------------------*/
3200 /* PRIVATE. Size allocation changed callback. */
3201 /*---------------------------------------------------------------------------*/
3203 size_allocate_cb (glView *view)
3205 gl_debug (DEBUG_VIEW, "START");
3207 if (view->zoom_to_fit_flag) {
3208 /* Maintain best fit zoom */
3209 gl_view_zoom_to_fit (view);
3212 gl_debug (DEBUG_VIEW, "END");
3217 /*---------------------------------------------------------------------------*/
3218 /* PRIVATE. Screen changed callback. */
3219 /*---------------------------------------------------------------------------*/
3221 screen_changed_cb (glView *view)
3223 gl_debug (DEBUG_VIEW, "START");
3225 view->home_scale = get_home_scale (view);
3227 gnome_canvas_set_pixels_per_unit (GNOME_CANVAS (view->canvas),
3228 view->zoom * view->home_scale);
3230 if (view->zoom_to_fit_flag) {
3231 /* Maintain best fit zoom */
3232 gl_view_zoom_to_fit (view);
3235 gl_debug (DEBUG_VIEW, "END");
3240 /*****************************************************************************/
3241 /* Get current zoom factor. */
3242 /*****************************************************************************/
3244 gl_view_get_zoom (glView *view)
3246 gl_debug (DEBUG_VIEW, "");
3248 g_return_val_if_fail (view && GL_IS_VIEW (view), 1.0);
3253 /*****************************************************************************/
3254 /* Is this the maximum zoom level. */
3255 /*****************************************************************************/
3257 gl_view_is_zoom_max (glView *view)
3259 gl_debug (DEBUG_VIEW, "");
3261 g_return_val_if_fail (GL_IS_VIEW (view), FALSE);
3263 return view->zoom >= zooms[0];
3266 /*****************************************************************************/
3267 /* Is this the minimum zoom level. */
3268 /*****************************************************************************/
3270 gl_view_is_zoom_min (glView *view)
3272 gl_debug (DEBUG_VIEW, "");
3274 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
3276 return view->zoom <= zooms[N_ZOOMS-1];
3279 /*****************************************************************************/
3280 /* Launch merge properties dialog. */
3281 /*****************************************************************************/
3283 gl_view_edit_merge_props (glView *view)
3285 gl_debug (DEBUG_VIEW, "");
3287 g_return_if_fail (view && GL_IS_VIEW (view));
3289 if (view->merge_props_dialog != NULL) {
3290 gtk_widget_show_all (view->merge_props_dialog);
3291 gtk_window_present (GTK_WINDOW(view->merge_props_dialog));
3295 view->merge_props_dialog = gl_merge_properties_dialog_new (view);
3296 gtk_widget_show_all (view->merge_props_dialog);
3298 g_signal_connect (G_OBJECT(view->merge_props_dialog), "destroy",
3299 G_CALLBACK (gtk_widget_destroyed),
3300 &view->merge_props_dialog);
3303 /*---------------------------------------------------------------------------*/
3304 /* PRIVATE. Canvas event handler. */
3305 /*---------------------------------------------------------------------------*/
3307 canvas_event (GnomeCanvas *canvas,
3313 gl_debug (DEBUG_VIEW, "");
3315 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
3317 /* emit pointer signals regardless of state */
3318 switch (event->type) {
3319 case GDK_MOTION_NOTIFY:
3320 gl_debug (DEBUG_VIEW, "MOTION_NOTIFY");
3321 gnome_canvas_window_to_world (canvas,
3323 event->motion.y, &x, &y);
3324 g_signal_emit (G_OBJECT(view), signals[POINTER_MOVED], 0, x, y);
3325 break; /* fall through */
3327 case GDK_LEAVE_NOTIFY:
3328 gl_debug (DEBUG_VIEW, "LEAVEW_NOTIFY");
3329 g_signal_emit (G_OBJECT(view), signals[POINTER_EXIT], 0);
3330 break; /* fall through */
3333 break; /* fall through */
3337 switch (view->state) {
3339 case GL_VIEW_STATE_ARROW:
3340 return canvas_event_arrow_mode (canvas, event, view);
3342 case GL_VIEW_STATE_OBJECT_CREATE:
3343 switch (view->create_type) {
3344 case GL_LABEL_OBJECT_BOX:
3345 return gl_view_box_create_event_handler (canvas,
3349 case GL_LABEL_OBJECT_ELLIPSE:
3350 return gl_view_ellipse_create_event_handler (canvas,
3354 case GL_LABEL_OBJECT_LINE:
3355 return gl_view_line_create_event_handler (canvas,
3359 case GL_LABEL_OBJECT_IMAGE:
3360 return gl_view_image_create_event_handler (canvas,
3364 case GL_LABEL_OBJECT_TEXT:
3365 return gl_view_text_create_event_handler (canvas,
3369 case GL_LABEL_OBJECT_BARCODE:
3370 return gl_view_barcode_create_event_handler (canvas,
3375 /*Should not happen!*/
3376 g_warning ("Invalid label object type.");
3381 g_warning ("Invalid view state."); /*Should not happen!*/
3387 /*---------------------------------------------------------------------------*/
3388 /* PRIVATE. Canvas event handler (arrow mode) */
3389 /*---------------------------------------------------------------------------*/
3391 canvas_event_arrow_mode (GnomeCanvas *canvas,
3395 static gdouble x0, y0;
3396 static gboolean dragging = FALSE;
3397 static GnomeCanvasItem *item;
3398 gdouble x, y, x1, y1, x2, y2;
3399 GnomeCanvasGroup *group;
3402 gl_debug (DEBUG_VIEW, "");
3404 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
3406 switch (event->type) {
3408 case GDK_BUTTON_PRESS:
3409 gl_debug (DEBUG_VIEW, "BUTTON_PRESS");
3410 gtk_widget_grab_focus (GTK_WIDGET(canvas));
3411 switch (event->button.button) {
3413 gnome_canvas_window_to_world (canvas,
3415 event->button.y, &x, &y);
3417 if (!object_at (view, x, y)) {
3418 if (!(event->button.state & GDK_CONTROL_MASK)) {
3419 gl_view_unselect_all (view);
3423 gnome_canvas_item_grab (canvas->root,
3424 GDK_POINTER_MOTION_MASK |
3425 GDK_BUTTON_RELEASE_MASK |
3426 GDK_BUTTON_PRESS_MASK,
3427 NULL, event->button.time);
3429 gnome_canvas_root (GNOME_CANVAS
3432 gnome_canvas_item_new (group,
3433 gnome_canvas_rect_get_type (),
3439 "outline_color_rgba",
3450 gnome_canvas_window_to_world (canvas,
3452 event->button.y, &x, &y);
3454 if (!object_at (view, x, y)) {
3455 /* bring up apropriate menu for selection. */
3456 gl_view_popup_menu (view, event);
3463 case GDK_BUTTON_RELEASE:
3464 gl_debug (DEBUG_VIEW, "BUTTON_RELEASE");
3465 switch (event->button.button) {
3469 gnome_canvas_item_ungrab (canvas->root,
3470 event->button.time);
3471 gnome_canvas_window_to_world (canvas,
3479 gl_view_select_region (view, x1, y1, x2, y2);
3480 gtk_object_destroy (GTK_OBJECT (item));
3489 case GDK_MOTION_NOTIFY:
3490 gl_debug (DEBUG_VIEW, "MOTION_NOTIFY");
3491 gnome_canvas_window_to_world (canvas,
3493 event->motion.y, &x, &y);
3494 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
3495 gl_debug (DEBUG_VIEW,
3496 "Dragging: (x0=%g, y0=%g), (x=%g, y=%g)", x0, y0, x, y);
3497 gnome_canvas_item_set (item,
3498 "x1", MIN (x, x0) - DELTA,
3499 "y1", MIN (y, y0) - DELTA,
3500 "x2", MAX (x, x0) + DELTA,
3501 "y2", MAX (y, y0) + DELTA,
3509 gl_debug (DEBUG_VIEW, "KEY_PRESS");
3511 switch (event->key.keyval) {
3514 gl_view_move_selection (view,
3515 -1.0 / (view->zoom), 0.0);
3519 gl_view_move_selection (view,
3520 0.0, -1.0 / (view->zoom));
3524 gl_view_move_selection (view,
3525 1.0 / (view->zoom), 0.0);
3529 gl_view_move_selection (view,
3530 0.0, 1.0 / (view->zoom));
3534 gl_view_delete_selection (view);
3535 cursor = gdk_cursor_new (GDK_LEFT_PTR);
3536 gdk_window_set_cursor (view->canvas->window,
3538 gdk_cursor_unref (cursor);
3544 return TRUE; /* We handled this or we were dragging. */
3547 gl_debug (DEBUG_VIEW, "default");
3553 /*---------------------------------------------------------------------------*/
3554 /* PRIVATE. create menu for selections. */
3555 /*---------------------------------------------------------------------------*/
3557 construct_selection_menu (glView *view)
3559 GtkWidget *menu, *menuitem, *submenu;
3561 gl_debug (DEBUG_VIEW, "START");
3563 g_return_if_fail (view && GL_IS_VIEW (view));
3565 menu = gtk_menu_new ();
3570 menuitem = gtk_menu_item_new_with_mnemonic (_("_Order"));
3571 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3572 gtk_widget_show (menuitem);
3573 submenu = gtk_menu_new ();
3574 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3576 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ORDER_TOP, NULL);
3577 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3578 gtk_widget_show (menuitem);
3579 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3580 G_CALLBACK (gl_view_raise_selection), view);
3582 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ORDER_BOTTOM, NULL);
3583 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3584 gtk_widget_show (menuitem);
3585 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3586 G_CALLBACK (gl_view_lower_selection), view);
3589 * Submenu: Rotate/Flip
3591 menuitem = gtk_menu_item_new_with_mnemonic (_("_Rotate/Flip"));
3592 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3593 gtk_widget_show (menuitem);
3594 submenu = gtk_menu_new ();
3595 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3597 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ROTATE_LEFT, NULL);
3598 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3599 gtk_widget_show (menuitem);
3600 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3601 G_CALLBACK (gl_view_rotate_selection_left), view);
3603 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ROTATE_RIGHT, NULL);
3604 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3605 gtk_widget_show (menuitem);
3606 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3607 G_CALLBACK (gl_view_rotate_selection_right), view);
3609 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_FLIP_HORIZ, NULL);
3610 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3611 gtk_widget_show (menuitem);
3612 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3613 G_CALLBACK (gl_view_flip_selection_horiz), view);
3615 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_FLIP_VERT, NULL);
3616 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3617 gtk_widget_show (menuitem);
3618 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3619 G_CALLBACK (gl_view_flip_selection_vert), view);
3622 * Submenu: Align Horizontally
3624 menuitem = gtk_menu_item_new_with_mnemonic (_("Align _Horizontally"));
3625 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3626 gtk_widget_show (menuitem);
3627 submenu = gtk_menu_new ();
3628 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3630 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ALIGN_LEFT, NULL);
3631 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3632 gtk_widget_show (menuitem);
3633 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3634 G_CALLBACK (gl_view_align_selection_left), view);
3635 view->multi_selection_items =
3636 g_list_prepend (view->multi_selection_items, menuitem);
3638 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ALIGN_HCENTER, NULL);
3639 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3640 gtk_widget_show (menuitem);
3641 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3642 G_CALLBACK (gl_view_align_selection_hcenter), view);
3643 view->multi_selection_items =
3644 g_list_prepend (view->multi_selection_items, menuitem);
3646 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ALIGN_RIGHT, NULL);
3647 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3648 gtk_widget_show (menuitem);
3649 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3650 G_CALLBACK (gl_view_align_selection_right), view);
3651 view->multi_selection_items =
3652 g_list_prepend (view->multi_selection_items, menuitem);
3654 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_CENTER_HORIZ, NULL);
3655 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3656 gtk_widget_show (menuitem);
3657 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3658 G_CALLBACK (gl_view_center_selection_horiz), view);
3661 * Submenu: Align Vertically
3663 menuitem = gtk_menu_item_new_with_mnemonic (_("Align _Vertically"));
3664 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3665 gtk_widget_show (menuitem);
3666 submenu = gtk_menu_new ();
3667 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3669 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ALIGN_TOP, NULL);
3670 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3671 gtk_widget_show (menuitem);
3672 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3673 G_CALLBACK (gl_view_align_selection_top), view);
3674 view->multi_selection_items =
3675 g_list_prepend (view->multi_selection_items, menuitem);
3677 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ALIGN_VCENTER, NULL);
3678 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3679 gtk_widget_show (menuitem);
3680 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3681 G_CALLBACK (gl_view_align_selection_vcenter), view);
3682 view->multi_selection_items =
3683 g_list_prepend (view->multi_selection_items, menuitem);
3685 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ALIGN_BOTTOM, NULL);
3686 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3687 gtk_widget_show (menuitem);
3688 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3689 G_CALLBACK (gl_view_align_selection_bottom), view);
3690 view->multi_selection_items =
3691 g_list_prepend (view->multi_selection_items, menuitem);
3693 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_CENTER_VERT, NULL);
3694 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3695 gtk_widget_show (menuitem);
3696 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3697 G_CALLBACK (gl_view_center_selection_vert), view);
3700 * Separator -------------------------
3702 menuitem = gtk_menu_item_new ();
3703 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3704 gtk_widget_show (menuitem);
3706 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_CUT, NULL);
3707 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3708 gtk_widget_show (menuitem);
3709 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3710 G_CALLBACK (gl_view_cut), view);
3712 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_COPY, NULL);
3713 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3714 gtk_widget_show (menuitem);
3715 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3716 G_CALLBACK (gl_view_copy), view);
3718 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_PASTE, NULL);
3719 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3720 gtk_widget_show (menuitem);
3721 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3722 G_CALLBACK (gl_view_paste), view);
3724 menuitem = gtk_menu_item_new_with_mnemonic (_("_Delete"));
3725 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3726 gtk_widget_show (menuitem);
3727 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3728 G_CALLBACK (gl_view_delete_selection), view);
3731 view->selection_menu = menu;
3733 gl_debug (DEBUG_VIEW, "END");
3736 /*---------------------------------------------------------------------------*/
3737 /* PRIVATE. create menu for empty selections. */
3738 /*---------------------------------------------------------------------------*/
3740 construct_empty_selection_menu (glView *view)
3742 GtkWidget *menu, *menuitem, *submenu;
3744 gl_debug (DEBUG_VIEW, "START");
3746 g_return_if_fail (view && GL_IS_VIEW (view));
3748 menu = gtk_menu_new ();
3750 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_PASTE, NULL);
3751 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3752 gtk_widget_show (menuitem);
3753 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3754 G_CALLBACK (gl_view_paste), view);
3757 view->empty_selection_menu = menu;
3759 gl_debug (DEBUG_VIEW, "END");
3762 /****************************************************************************/
3764 /****************************************************************************/
3766 gl_view_popup_menu (glView *view,
3772 gl_debug (DEBUG_VIEW, "START");
3774 g_return_if_fail (view && GL_IS_VIEW (view));
3776 if (gl_view_is_selection_empty (view)) {
3778 if (view->empty_selection_menu != NULL) {
3779 gtk_menu_popup (GTK_MENU (view->empty_selection_menu),
3780 NULL, NULL, NULL, NULL,
3781 event->button.button,
3782 event->button.time);
3787 for (p=view->atomic_selection_items; p!=NULL; p=p->next) {
3788 gtk_widget_set_sensitive (GTK_WIDGET(p->data),
3789 gl_view_is_selection_atomic(view));
3792 for (p=view->multi_selection_items; p!=NULL; p=p->next) {
3793 gtk_widget_set_sensitive (GTK_WIDGET(p->data),
3794 !gl_view_is_selection_atomic(view));
3797 if (view->selection_menu != NULL) {
3798 gtk_menu_popup (GTK_MENU (view->selection_menu),
3799 NULL, NULL, NULL, NULL,
3800 event->button.button,
3801 event->button.time);
3806 gl_debug (DEBUG_VIEW, "END");
3809 /*---------------------------------------------------------------------------*/
3810 /* PRIVATE. Handle "selection-clear" signal. */
3811 /*---------------------------------------------------------------------------*/
3813 selection_clear_cb (GtkWidget *widget,
3814 GdkEventSelection *event,
3817 glView *view = GL_VIEW (data);
3819 gl_debug (DEBUG_VIEW, "START");
3821 g_return_if_fail (view && GL_IS_VIEW (view));
3823 view->have_selection = FALSE;
3824 g_object_unref (view->selection_data);
3825 view->selection_data = NULL;
3827 gl_debug (DEBUG_VIEW, "END");
3830 /*---------------------------------------------------------------------------*/
3831 /* PRIVATE. Handle "selection-get" signal. */
3832 /*---------------------------------------------------------------------------*/
3834 selection_get_cb (GtkWidget *widget,
3835 GtkSelectionData *selection_data,
3840 glView *view = GL_VIEW (data);
3842 glXMLLabelStatus status;
3844 gl_debug (DEBUG_VIEW, "START");
3846 g_return_if_fail (view && GL_IS_VIEW (view));
3848 if (view->have_selection) {
3850 buffer = gl_xml_label_save_buffer (view->selection_data,
3852 gtk_selection_data_set (selection_data,
3853 GDK_SELECTION_TYPE_STRING, 8, buffer,
3858 gl_debug (DEBUG_VIEW, "END");
3861 /*---------------------------------------------------------------------------*/
3862 /* PRIVATE. Handle "selection-received" signal. (Result of Paste) */
3863 /*---------------------------------------------------------------------------*/
3865 selection_received_cb (GtkWidget *widget,
3866 GtkSelectionData *selection_data,
3870 glView *view = GL_VIEW (data);
3871 glLabel *label = NULL;
3872 glXMLLabelStatus status;
3874 glLabelObject *object, *newobject;
3875 glViewObject *view_object;
3877 gl_debug (DEBUG_VIEW, "START");
3879 g_return_if_fail (view && GL_IS_VIEW (view));
3881 if (selection_data->length < 0) {
3884 if (selection_data->type != GDK_SELECTION_TYPE_STRING) {
3888 gl_view_unselect_all (view);
3890 label = gl_xml_label_open_buffer (selection_data->data, &status);
3891 for (p = label->objects; p != NULL; p = p_next) {
3894 object = (glLabelObject *) p->data;
3895 newobject = gl_label_object_dup (object, view->label);
3897 gl_debug (DEBUG_VIEW, "object pasted");
3899 if (GL_IS_LABEL_BOX (newobject)) {
3900 view_object = gl_view_box_new (GL_LABEL_BOX(newobject),
3902 } else if (GL_IS_LABEL_ELLIPSE (newobject)) {
3903 view_object = gl_view_ellipse_new (GL_LABEL_ELLIPSE(newobject),
3905 } else if (GL_IS_LABEL_LINE (newobject)) {
3906 view_object = gl_view_line_new (GL_LABEL_LINE(newobject),
3908 } else if (GL_IS_LABEL_IMAGE (newobject)) {
3909 view_object = gl_view_image_new (GL_LABEL_IMAGE(newobject),
3911 } else if (GL_IS_LABEL_TEXT (newobject)) {
3912 view_object = gl_view_text_new (GL_LABEL_TEXT(newobject),
3914 } else if (GL_IS_LABEL_BARCODE (newobject)) {
3915 view_object = gl_view_barcode_new (GL_LABEL_BARCODE(newobject),
3918 /* Should not happen! */
3920 g_warning ("Invalid label object type.");
3922 gl_view_select_object (view, view_object);
3924 g_object_unref (label);
3926 gl_debug (DEBUG_VIEW, "END");
3929 /****************************************************************************/
3930 /* Set default font family. */
3931 /****************************************************************************/
3933 gl_view_set_default_font_family (glView *view,
3934 const gchar *font_family)
3936 gl_debug (DEBUG_VIEW, "START");
3938 g_return_if_fail (view && GL_IS_VIEW (view));
3940 if (view->default_font_family) {
3941 g_free (view->default_font_family);
3943 view->default_font_family = g_strdup (font_family);
3945 gl_debug (DEBUG_VIEW, "END");
3949 /****************************************************************************/
3950 /* Set default font size. */
3951 /****************************************************************************/
3953 gl_view_set_default_font_size (glView *view,
3956 gl_debug (DEBUG_VIEW, "START");
3958 g_return_if_fail (view && GL_IS_VIEW (view));
3960 view->default_font_size = font_size;
3962 gl_debug (DEBUG_VIEW, "END");
3966 /****************************************************************************/
3967 /* Set default font weight. */
3968 /****************************************************************************/
3970 gl_view_set_default_font_weight (glView *view,
3971 GnomeFontWeight font_weight)
3973 gl_debug (DEBUG_VIEW, "START");
3975 g_return_if_fail (view && GL_IS_VIEW (view));
3977 view->default_font_weight = font_weight;
3979 gl_debug (DEBUG_VIEW, "END");
3983 /****************************************************************************/
3984 /* Set default font italic flag. */
3985 /****************************************************************************/
3987 gl_view_set_default_font_italic_flag (glView *view,
3988 gboolean font_italic_flag)
3990 gl_debug (DEBUG_VIEW, "START");
3992 g_return_if_fail (view && GL_IS_VIEW (view));
3994 view->default_font_italic_flag = font_italic_flag;
3996 gl_debug (DEBUG_VIEW, "END");
4000 /****************************************************************************/
4001 /* Set default text color. */
4002 /****************************************************************************/
4004 gl_view_set_default_text_color (glView *view,
4007 gl_debug (DEBUG_VIEW, "START");
4009 g_return_if_fail (view && GL_IS_VIEW (view));
4011 view->default_text_color = text_color;
4013 gl_debug (DEBUG_VIEW, "END");
4017 /****************************************************************************/
4018 /* Set default text alignment. */
4019 /****************************************************************************/
4021 gl_view_set_default_text_alignment (glView *view,
4022 GtkJustification text_alignment)
4024 gl_debug (DEBUG_VIEW, "START");
4026 g_return_if_fail (view && GL_IS_VIEW (view));
4028 view->default_text_alignment = text_alignment;
4029 gl_debug (DEBUG_VIEW, "END");
4032 /****************************************************************************/
4033 /* Set default text line spacing. */
4034 /****************************************************************************/
4036 gl_view_set_default_text_line_spacing (glView *view,
4037 gdouble text_line_spacing)
4039 gl_debug (DEBUG_VIEW, "START");
4041 g_return_if_fail (view && GL_IS_VIEW (view));
4043 view->default_text_line_spacing = text_line_spacing;
4045 gl_debug (DEBUG_VIEW, "END");
4049 /****************************************************************************/
4050 /* Set default line width. */
4051 /****************************************************************************/
4053 gl_view_set_default_line_width (glView *view,
4056 gl_debug (DEBUG_VIEW, "START");
4058 g_return_if_fail (view && GL_IS_VIEW (view));
4060 view->default_line_width = line_width;
4062 gl_debug (DEBUG_VIEW, "END");
4066 /****************************************************************************/
4067 /* Set default line color. */
4068 /****************************************************************************/
4070 gl_view_set_default_line_color (glView *view,
4073 gl_debug (DEBUG_VIEW, "START");
4075 g_return_if_fail (view && GL_IS_VIEW (view));
4077 view->default_line_color = line_color;
4079 gl_debug (DEBUG_VIEW, "END");
4083 /****************************************************************************/
4084 /* Set default fill color. */
4085 /****************************************************************************/
4087 gl_view_set_default_fill_color (glView *view,
4090 gl_debug (DEBUG_VIEW, "START");
4092 g_return_if_fail (view && GL_IS_VIEW (view));
4094 view->default_fill_color = fill_color;
4096 gl_debug (DEBUG_VIEW, "END");
4101 /****************************************************************************/
4102 /* Get default font family. */
4103 /****************************************************************************/
4105 gl_view_get_default_font_family (glView *view)
4107 gl_debug (DEBUG_VIEW, "START");
4109 g_return_val_if_fail (view && GL_IS_VIEW (view), NULL);
4111 gl_debug (DEBUG_VIEW, "END");
4113 return g_strdup (view->default_font_family);
4117 /****************************************************************************/
4118 /* Get default font size. */
4119 /****************************************************************************/
4121 gl_view_get_default_font_size (glView *view)
4123 gl_debug (DEBUG_VIEW, "START");
4125 g_return_val_if_fail (view && GL_IS_VIEW (view), 12.0);
4127 gl_debug (DEBUG_VIEW, "END");
4129 return view->default_font_size;
4133 /****************************************************************************/
4134 /* Get default font weight. */
4135 /****************************************************************************/
4137 gl_view_get_default_font_weight (glView *view)
4139 gl_debug (DEBUG_VIEW, "START");
4141 g_return_val_if_fail (view && GL_IS_VIEW (view), GNOME_FONT_BOOK);
4143 gl_debug (DEBUG_VIEW, "END");
4145 return view->default_font_weight;
4149 /****************************************************************************/
4150 /* Get default font italic flag. */
4151 /****************************************************************************/
4153 gl_view_get_default_font_italic_flag (glView *view)
4155 gl_debug (DEBUG_VIEW, "START");
4157 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
4159 gl_debug (DEBUG_VIEW, "END");
4161 return view->default_font_italic_flag;
4165 /****************************************************************************/
4166 /* Get default text color. */
4167 /****************************************************************************/
4169 gl_view_get_default_text_color (glView *view)
4171 gl_debug (DEBUG_VIEW, "START");
4173 g_return_val_if_fail (view && GL_IS_VIEW (view), 0);
4175 gl_debug (DEBUG_VIEW, "END");
4177 return view->default_text_color;
4181 /****************************************************************************/
4182 /* Get default text alignment. */
4183 /****************************************************************************/
4185 gl_view_get_default_text_alignment (glView *view)
4187 gl_debug (DEBUG_VIEW, "START");
4189 g_return_val_if_fail (view && GL_IS_VIEW (view), GTK_JUSTIFY_LEFT);
4191 gl_debug (DEBUG_VIEW, "END");
4193 return view->default_text_alignment;
4196 /****************************************************************************/
4197 /* Get default text line spacing. */
4198 /****************************************************************************/
4200 gl_view_get_default_text_line_spacing (glView *view)
4202 gl_debug (DEBUG_VIEW, "START");
4204 g_return_val_if_fail (view && GL_IS_VIEW (view), 1.0);
4206 gl_debug (DEBUG_VIEW, "END");
4208 return view->default_text_line_spacing;
4213 /****************************************************************************/
4214 /* Get default line width. */
4215 /****************************************************************************/
4217 gl_view_get_default_line_width (glView *view)
4219 gl_debug (DEBUG_VIEW, "START");
4221 g_return_val_if_fail (view && GL_IS_VIEW (view), 1.0);
4223 gl_debug (DEBUG_VIEW, "END");
4225 return view->default_line_width;
4229 /****************************************************************************/
4230 /* Get default line color. */
4231 /****************************************************************************/
4232 guint gl_view_get_default_line_color (glView *view)
4234 gl_debug (DEBUG_VIEW, "START");
4236 g_return_val_if_fail (view && GL_IS_VIEW (view), 0);
4238 gl_debug (DEBUG_VIEW, "END");
4240 return view->default_line_color;
4244 /****************************************************************************/
4245 /* Get default fill color. */
4246 /****************************************************************************/
4247 guint gl_view_get_default_fill_color (glView *view)
4249 gl_debug (DEBUG_VIEW, "START");
4251 g_return_val_if_fail (view && GL_IS_VIEW (view), 0);
4253 gl_debug (DEBUG_VIEW, "END");
4255 return view->default_fill_color;