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
68 /*==========================================================================*/
70 /*==========================================================================*/
82 /*==========================================================================*/
84 /*==========================================================================*/
86 static GtkContainerClass *parent_class;
88 static guint signals[LAST_SIGNAL] = {0};
90 /* "CLIPBOARD" selection */
91 static GdkAtom clipboard_atom = GDK_NONE;
93 static gdouble zooms[] = {
110 #define N_ZOOMS G_N_ELEMENTS(zooms)
113 /*==========================================================================*/
114 /* Local function prototypes */
115 /*==========================================================================*/
117 static void gl_view_class_init (glViewClass *class);
118 static void gl_view_init (glView *view);
119 static void gl_view_finalize (GObject *object);
121 static void gl_view_construct (glView *view);
122 static GtkWidget *gl_view_construct_canvas (glView *view);
123 static void gl_view_construct_selection (glView *view);
125 static gdouble get_home_scale (glView *view);
127 static void draw_layers (glView *view);
129 static void label_resized_cb (glLabel *label,
132 static void draw_label_layer (glView *view);
134 static void draw_highlight_layer (glView *view);
136 static void draw_bg_fg_layers (glView *view);
137 static void draw_bg_fg_rect (glView *view);
138 static void draw_bg_fg_rounded_rect (glView *view);
139 static void draw_bg_fg_round (glView *view);
140 static void draw_bg_fg_cd (glView *view);
141 static void draw_bg_fg_cd_bc (glView *view);
143 static void draw_grid_layer (glView *view);
145 static void draw_markup_layer (glView *view);
147 static void draw_markup_margin (glView *view,
148 glTemplateMarkupMargin *margin);
149 static void draw_markup_margin_rect (glView *view,
150 glTemplateMarkupMargin *margin);
151 static void draw_markup_margin_rounded_rect (glView *view,
152 glTemplateMarkupMargin *margin);
153 static void draw_markup_margin_round (glView *view,
154 glTemplateMarkupMargin *margin);
155 static void draw_markup_margin_cd (glView *view,
156 glTemplateMarkupMargin *margin);
157 static void draw_markup_margin_cd_bc (glView *view,
158 glTemplateMarkupMargin *margin);
160 static void draw_markup_line (glView *view,
161 glTemplateMarkupLine *line);
163 static void draw_markup_circle (glView *view,
164 glTemplateMarkupCircle *circle);
167 static void select_object_real (glView *view,
168 glViewObject *view_object);
169 static void unselect_object_real (glView *view,
170 glViewObject *view_object);
172 static gboolean object_at (glView *view,
173 gdouble x, gdouble y);
175 static gboolean is_item_member_of_group (glView *view,
176 GnomeCanvasItem *item,
177 GnomeCanvasItem *group);
179 static void set_zoom_real (glView *view,
181 gboolean scale_to_fit_flag);
183 static void size_allocate_cb (glView *view);
185 static void screen_changed_cb (glView *view);
187 static int canvas_event (GnomeCanvas *canvas,
190 static int canvas_event_arrow_mode (GnomeCanvas *canvas,
194 static void construct_selection_menu (glView *view);
196 static void construct_empty_selection_menu (glView *view);
198 static void selection_clear_cb (GtkWidget *widget,
199 GdkEventSelection *event,
202 static void selection_get_cb (GtkWidget *widget,
203 GtkSelectionData *selection_data,
208 static void selection_received_cb (GtkWidget *widget,
209 GtkSelectionData *selection_data,
213 /****************************************************************************/
214 /* Boilerplate Object stuff. */
215 /****************************************************************************/
217 gl_view_get_type (void)
219 static guint view_type = 0;
222 GTypeInfo view_info = {
223 sizeof (glViewClass),
226 (GClassInitFunc) gl_view_class_init,
231 (GInstanceInitFunc) gl_view_init,
235 g_type_register_static (gtk_vbox_get_type (),
236 "glView", &view_info, 0);
243 gl_view_class_init (glViewClass *class)
245 GObjectClass *object_class = (GObjectClass *) class;
247 gl_debug (DEBUG_VIEW, "START");
249 parent_class = g_type_class_peek_parent (class);
251 object_class->finalize = gl_view_finalize;
253 signals[SELECTION_CHANGED] =
254 g_signal_new ("selection_changed",
255 G_OBJECT_CLASS_TYPE (object_class),
257 G_STRUCT_OFFSET (glViewClass, selection_changed),
259 gl_marshal_VOID__VOID,
263 signals[ZOOM_CHANGED] =
264 g_signal_new ("zoom_changed",
265 G_OBJECT_CLASS_TYPE (object_class),
267 G_STRUCT_OFFSET (glViewClass, zoom_changed),
269 gl_marshal_VOID__DOUBLE,
273 signals[POINTER_MOVED] =
274 g_signal_new ("pointer_moved",
275 G_OBJECT_CLASS_TYPE (object_class),
277 G_STRUCT_OFFSET (glViewClass, pointer_moved),
279 gl_marshal_VOID__DOUBLE_DOUBLE,
281 2, G_TYPE_DOUBLE, G_TYPE_DOUBLE);
283 signals[POINTER_EXIT] =
284 g_signal_new ("pointer_exit",
285 G_OBJECT_CLASS_TYPE (object_class),
287 G_STRUCT_OFFSET (glViewClass, pointer_exit),
289 gl_marshal_VOID__VOID,
293 signals[MODE_CHANGED] =
294 g_signal_new ("mode_changed",
295 G_OBJECT_CLASS_TYPE (object_class),
297 G_STRUCT_OFFSET (glViewClass, mode_changed),
299 gl_marshal_VOID__VOID,
303 gl_debug (DEBUG_VIEW, "END");
307 gl_view_init (glView *view)
309 gl_debug (DEBUG_VIEW, "START");
313 view->grid_spacing = 9;
315 view->default_font_family = NULL;
317 gl_debug (DEBUG_VIEW, "END");
321 gl_view_finalize (GObject *object)
325 gl_debug (DEBUG_VIEW, "START");
327 g_return_if_fail (object != NULL);
328 g_return_if_fail (GL_IS_VIEW (object));
330 view = GL_VIEW (object);
332 G_OBJECT_CLASS (parent_class)->finalize (object);
334 gl_debug (DEBUG_VIEW, "END");
337 /****************************************************************************/
338 /* NEW view object. */
339 /****************************************************************************/
341 gl_view_new (glLabel *label)
345 gl_debug (DEBUG_VIEW, "START");
347 g_return_val_if_fail (label && GL_IS_LABEL (label), NULL);
349 view = g_object_new (gl_view_get_type (), NULL);
352 gl_view_construct (view);
354 gl_debug (DEBUG_VIEW, "END");
356 return GTK_WIDGET (view);
359 /*---------------------------------------------------------------------------*/
360 /* PRIVATE. Construct composite widget. */
361 /*---------------------------------------------------------------------------*/
363 gl_view_construct (glView *view)
365 GtkWidget *wvbox, *wscroll;
367 gl_debug (DEBUG_VIEW, "START");
369 g_return_if_fail (GL_IS_VIEW (view));
371 wvbox = GTK_WIDGET (view);
373 view->state = GL_VIEW_STATE_ARROW;
374 view->object_list = NULL;
376 gl_view_construct_canvas (view);
377 wscroll = gtk_scrolled_window_new (NULL, NULL);
378 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (wscroll),
379 GTK_POLICY_AUTOMATIC,
380 GTK_POLICY_AUTOMATIC);
381 gtk_box_pack_start (GTK_BOX (wvbox), wscroll, TRUE, TRUE, 0);
382 gtk_container_add (GTK_CONTAINER (wscroll), view->canvas);
384 gl_view_construct_selection (view);
386 construct_selection_menu (view);
387 construct_empty_selection_menu (view);
389 gl_view_set_default_font_family (view, gl_prefs->default_font_family);
390 gl_view_set_default_font_size (view, gl_prefs->default_font_size);
391 gl_view_set_default_font_weight (view, gl_prefs->default_font_weight);
392 gl_view_set_default_font_italic_flag (view, gl_prefs->default_font_italic_flag);
393 gl_view_set_default_text_color (view, gl_prefs->default_text_color);
394 gl_view_set_default_text_alignment (view, gl_prefs->default_text_alignment);
395 gl_view_set_default_line_width (view, gl_prefs->default_line_width);
396 gl_view_set_default_line_color (view, gl_prefs->default_line_color);
397 gl_view_set_default_fill_color (view, gl_prefs->default_fill_color);
399 gl_debug (DEBUG_VIEW, "END");
402 /*---------------------------------------------------------------------------*/
403 /* PRIVATE. Create canvas w/ a background in the shape of the label/card. */
404 /*---------------------------------------------------------------------------*/
406 gl_view_construct_canvas (glView *view)
409 gdouble label_width, label_height;
412 gl_debug (DEBUG_VIEW, "START");
414 g_return_val_if_fail (view && GL_IS_VIEW (view), NULL);
415 g_return_val_if_fail (view->label && GL_IS_LABEL (view->label), NULL);
419 gtk_widget_push_colormap (gdk_rgb_get_colormap ());
420 view->canvas = gnome_canvas_new_aa ();
421 gtk_widget_pop_colormap ();
423 bg_color = gl_color_to_gdk_color (BG_COLOR);
424 gtk_widget_modify_bg (GTK_WIDGET(view->canvas), GTK_STATE_NORMAL, bg_color);
427 gl_label_get_size (label, &label_width, &label_height);
428 gl_debug (DEBUG_VIEW, "Label size: w=%lf, h=%lf",
429 label_width, label_height);
432 view->home_scale = get_home_scale (view);
433 gnome_canvas_set_pixels_per_unit (GNOME_CANVAS (view->canvas), view->home_scale);
435 gnome_canvas_set_scroll_region (GNOME_CANVAS (view->canvas),
436 0.0, 0.0, label_width, label_height);
440 g_signal_connect (G_OBJECT (view->canvas), "event",
441 G_CALLBACK (canvas_event), view);
443 g_signal_connect_swapped (G_OBJECT (view->canvas), "size-allocate",
444 G_CALLBACK (size_allocate_cb), view);
446 g_signal_connect_swapped (G_OBJECT (view->canvas), "screen-changed",
447 G_CALLBACK (screen_changed_cb), view);
449 gl_debug (DEBUG_VIEW, "END");
454 /*---------------------------------------------------------------------------*/
455 /* PRIAVTE. Calculate 1:1 scale for screen. */
456 /*---------------------------------------------------------------------------*/
458 get_home_scale (glView *view)
461 gdouble screen_width_pixels, screen_width_mm;
462 gdouble screen_height_pixels, screen_height_mm;
463 gdouble x_pixels_per_mm, y_pixels_per_mm;
466 if (!gtk_widget_has_screen) return 1.0;
468 screen = gtk_widget_get_screen (GTK_WIDGET (view->canvas));
470 gl_debug (DEBUG_VIEW, "Screen = %p", screen);
472 screen_width_pixels = gdk_screen_get_width (screen);
473 screen_width_mm = gdk_screen_get_width_mm (screen);
474 screen_height_pixels = gdk_screen_get_height (screen);
475 screen_height_mm = gdk_screen_get_height_mm (screen);
477 x_pixels_per_mm = screen_width_pixels / screen_width_mm;
478 y_pixels_per_mm = screen_height_pixels / screen_height_mm;
480 gl_debug (DEBUG_VIEW, "Horizontal dot pitch: %g pixels/mm (%g dpi)",
481 x_pixels_per_mm, x_pixels_per_mm * 25.4);
482 gl_debug (DEBUG_VIEW, "Vertical dot pitch: %g pixels/mm (%g dpi)",
483 y_pixels_per_mm, y_pixels_per_mm * 25.4);
485 scale = (x_pixels_per_mm + y_pixels_per_mm) / 2.0;
487 gl_debug (DEBUG_VIEW, "Average dot pitch: %g pixels/mm (%g dpi)",
488 scale, scale * 25.4);
490 scale /= POINTS_PER_MM;
492 gl_debug (DEBUG_VIEW, "Scale = %g pixels/point", scale);
494 /* Make sure scale is somewhat sane. */
495 if ( (scale < 0.25) || (scale > 4.0) ) return 1.0;
500 /*---------------------------------------------------------------------------*/
501 /* PRIVATE. Create clipboard selection targets. */
502 /*---------------------------------------------------------------------------*/
504 gl_view_construct_selection (glView *view)
506 gl_debug (DEBUG_VIEW, "START");
508 g_return_if_fail (GL_IS_VIEW (view));
510 view->have_selection = FALSE;
511 view->selection_data = NULL;
512 view->invisible = gtk_invisible_new ();
514 view->selected_object_list = NULL;
516 if (!clipboard_atom) {
517 clipboard_atom = gdk_atom_intern ("GLABELS_CLIPBOARD", FALSE);
520 gtk_selection_add_target (view->invisible,
521 clipboard_atom, GDK_SELECTION_TYPE_STRING, 1);
523 g_signal_connect (G_OBJECT (view->invisible),
524 "selection_clear_event",
525 G_CALLBACK (selection_clear_cb), view);
527 g_signal_connect (G_OBJECT (view->invisible), "selection_get",
528 G_CALLBACK (selection_get_cb), view);
530 g_signal_connect (G_OBJECT (view->invisible),
531 "selection_received",
532 G_CALLBACK (selection_received_cb), view);
534 gl_debug (DEBUG_VIEW, "END");
537 /*---------------------------------------------------------------------------*/
538 /* PRIVATE. Create, draw and order layers. */
539 /*---------------------------------------------------------------------------*/
541 draw_layers (glView *view)
543 g_return_if_fail (view && GL_IS_VIEW (view));
544 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
546 draw_bg_fg_layers (view);
547 draw_grid_layer (view);
548 draw_markup_layer (view);
549 draw_highlight_layer (view); /* Must be done before label layer */
550 draw_label_layer (view);
552 gnome_canvas_item_raise_to_top (GNOME_CANVAS_ITEM(view->fg_group));
553 gnome_canvas_item_raise_to_top (GNOME_CANVAS_ITEM(view->highlight_group));
555 g_signal_connect (G_OBJECT (view->label), "size_changed",
556 G_CALLBACK (label_resized_cb), view);
559 /*---------------------------------------------------------------------------*/
560 /* PRIVATE. Handle label resize event. . */
561 /*---------------------------------------------------------------------------*/
563 label_resized_cb (glLabel *label,
566 g_return_if_fail (label && GL_IS_LABEL (label));
567 g_return_if_fail (view && GL_IS_VIEW (view));
569 gtk_object_destroy (GTK_OBJECT (view->bg_group));
570 gtk_object_destroy (GTK_OBJECT (view->grid_group));
571 gtk_object_destroy (GTK_OBJECT (view->markup_group));
572 gtk_object_destroy (GTK_OBJECT (view->fg_group));
574 draw_bg_fg_layers (view);
575 draw_grid_layer (view);
576 draw_markup_layer (view);
578 gnome_canvas_item_raise_to_top (GNOME_CANVAS_ITEM(view->label_group));
579 gnome_canvas_item_raise_to_top (GNOME_CANVAS_ITEM(view->fg_group));
580 gnome_canvas_item_raise_to_top (GNOME_CANVAS_ITEM(view->highlight_group));
583 /*---------------------------------------------------------------------------*/
584 /* PRIVATE. Draw label layer. */
585 /*---------------------------------------------------------------------------*/
587 draw_label_layer (glView *view)
589 GnomeCanvasGroup *group;
592 glLabelObject *object;
593 glViewObject *view_object;
595 g_return_if_fail (view && GL_IS_VIEW (view));
596 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
598 group = gnome_canvas_root (GNOME_CANVAS (view->canvas));
599 view->label_group = GNOME_CANVAS_GROUP(
600 gnome_canvas_item_new (group,
601 gnome_canvas_group_get_type (),
608 for (p_obj = label->objects; p_obj != NULL; p_obj = p_obj->next) {
609 object = (glLabelObject *) p_obj->data;
611 if (GL_IS_LABEL_BOX (object)) {
612 view_object = gl_view_box_new (GL_LABEL_BOX(object),
614 } else if (GL_IS_LABEL_ELLIPSE (object)) {
615 view_object = gl_view_ellipse_new (GL_LABEL_ELLIPSE(object),
617 } else if (GL_IS_LABEL_LINE (object)) {
618 view_object = gl_view_line_new (GL_LABEL_LINE(object),
620 } else if (GL_IS_LABEL_IMAGE (object)) {
621 view_object = gl_view_image_new (GL_LABEL_IMAGE(object),
623 } else if (GL_IS_LABEL_TEXT (object)) {
624 view_object = gl_view_text_new (GL_LABEL_TEXT(object),
626 } else if (GL_IS_LABEL_BARCODE (object)) {
627 view_object = gl_view_barcode_new (GL_LABEL_BARCODE(object),
630 /* Should not happen! */
632 g_warning ("Invalid label object type.");
637 /*---------------------------------------------------------------------------*/
638 /* PRIVATE. Create highlight layer. */
639 /*---------------------------------------------------------------------------*/
641 draw_highlight_layer (glView *view)
643 GnomeCanvasGroup *group;
645 g_return_if_fail (view && GL_IS_VIEW (view));
647 group = gnome_canvas_root (GNOME_CANVAS (view->canvas));
648 view->highlight_group = GNOME_CANVAS_GROUP(
649 gnome_canvas_item_new (group,
650 gnome_canvas_group_get_type (),
656 /*---------------------------------------------------------------------------*/
657 /* PRIVATE. Draw background and foreground outlines. */
658 /*---------------------------------------------------------------------------*/
660 draw_bg_fg_layers (glView *view)
663 glTemplate *template;
664 GnomeCanvasGroup *group;
666 g_return_if_fail (view && GL_IS_VIEW (view));
667 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
669 group = gnome_canvas_root (GNOME_CANVAS (view->canvas));
670 view->bg_group = GNOME_CANVAS_GROUP(
671 gnome_canvas_item_new (group,
672 gnome_canvas_group_get_type (),
676 view->fg_group = GNOME_CANVAS_GROUP(
677 gnome_canvas_item_new (group,
678 gnome_canvas_group_get_type (),
684 template = gl_label_get_template (label);
686 switch (template->label.style) {
688 case GL_TEMPLATE_STYLE_RECT:
689 if (template->label.rect.r == 0.0) {
690 /* Square corners. */
691 draw_bg_fg_rect (view);
693 /* Rounded corners. */
694 draw_bg_fg_rounded_rect (view);
698 case GL_TEMPLATE_STYLE_ROUND:
699 draw_bg_fg_round (view);
702 case GL_TEMPLATE_STYLE_CD:
703 if ((template->label.cd.w == 0.0) && (template->label.cd.h == 0.0) ) {
704 draw_bg_fg_cd (view);
706 draw_bg_fg_cd_bc (view);
711 g_warning ("Unknown template label style");
716 /*---------------------------------------------------------------------------*/
717 /* PRIVATE. Draw simple recangular background. */
718 /*---------------------------------------------------------------------------*/
720 draw_bg_fg_rect (glView *view)
723 glTemplate *template;
725 GnomeCanvasItem *item;
727 gl_debug (DEBUG_VIEW, "START");
729 g_return_if_fail (view && GL_IS_VIEW (view));
730 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
734 gl_label_get_size (label, &w, &h);
735 template = gl_label_get_template (label);
738 item = gnome_canvas_item_new (view->bg_group,
739 gnome_canvas_rect_get_type (),
744 "fill_color_rgba", PAPER_COLOR,
748 item = gnome_canvas_item_new (view->fg_group,
749 gnome_canvas_rect_get_type (),
755 "outline_color_rgba", OUTLINE_COLOR,
758 gl_debug (DEBUG_VIEW, "END");
761 /*---------------------------------------------------------------------------*/
762 /* PRIVATE. Draw rounded recangular background. */
763 /*---------------------------------------------------------------------------*/
765 draw_bg_fg_rounded_rect (glView *view)
768 GnomeCanvasPoints *points;
769 gint i_coords, i_theta;
770 glTemplate *template;
772 GnomeCanvasItem *item;
774 gl_debug (DEBUG_VIEW, "START");
776 g_return_if_fail (view && GL_IS_VIEW (view));
777 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
781 gl_label_get_size (label, &w, &h);
782 template = gl_label_get_template (label);
783 r = template->label.rect.r;
785 points = gnome_canvas_points_new (4 * (1 + 90 / ARC_COURSE));
787 for (i_theta = 0; i_theta <= 90; i_theta += ARC_COURSE) {
788 points->coords[i_coords++] =
789 r - r * sin (i_theta * G_PI / 180.0);
790 points->coords[i_coords++] =
791 r - r * cos (i_theta * G_PI / 180.0);
793 for (i_theta = 0; i_theta <= 90; i_theta += ARC_COURSE) {
794 points->coords[i_coords++] =
795 r - r * cos (i_theta * G_PI / 180.0);
796 points->coords[i_coords++] =
797 (h - r) + r * sin (i_theta * G_PI / 180.0);
799 for (i_theta = 0; i_theta <= 90; i_theta += ARC_COURSE) {
800 points->coords[i_coords++] =
801 (w - r) + r * sin (i_theta * G_PI / 180.0);
802 points->coords[i_coords++] =
803 (h - r) + r * cos (i_theta * G_PI / 180.0);
805 for (i_theta = 0; i_theta <= 90; i_theta += ARC_COURSE) {
806 points->coords[i_coords++] =
807 (w - r) + r * cos (i_theta * G_PI / 180.0);
808 points->coords[i_coords++] =
809 r - r * sin (i_theta * G_PI / 180.0);
813 item = gnome_canvas_item_new (view->bg_group,
814 gnome_canvas_polygon_get_type (),
816 "fill_color_rgba", PAPER_COLOR,
820 item = gnome_canvas_item_new (view->fg_group,
821 gnome_canvas_polygon_get_type (),
824 "outline_color_rgba", OUTLINE_COLOR,
827 gnome_canvas_points_free (points);
829 gl_debug (DEBUG_VIEW, "END");
832 /*---------------------------------------------------------------------------*/
833 /* PRIVATE. Draw round background. */
834 /*---------------------------------------------------------------------------*/
836 draw_bg_fg_round (glView *view)
839 glTemplate *template;
841 GnomeCanvasItem *item;
843 gl_debug (DEBUG_VIEW, "START");
845 g_return_if_fail (view && GL_IS_VIEW (view));
846 g_return_if_fail (view->label && GL_IS_LABEL(view->label));
849 template = gl_label_get_template (label);
851 r = template->label.round.r;
854 item = gnome_canvas_item_new (view->bg_group,
855 gnome_canvas_ellipse_get_type (),
860 "fill_color_rgba", PAPER_COLOR,
864 item = gnome_canvas_item_new (view->fg_group,
865 gnome_canvas_ellipse_get_type (),
871 "outline_color_rgba", OUTLINE_COLOR,
874 gl_debug (DEBUG_VIEW, "END");
877 /*---------------------------------------------------------------------------*/
878 /* PRIVATE. Draw CD style background, circular w/ concentric hole. */
879 /*---------------------------------------------------------------------------*/
881 draw_bg_fg_cd (glView *view)
884 glTemplate *template;
886 GnomeCanvasItem *item;
888 gl_debug (DEBUG_VIEW, "START");
890 g_return_if_fail (view && GL_IS_VIEW (view));
891 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
894 template = gl_label_get_template (label);
896 r1 = template->label.cd.r1;
897 r2 = template->label.cd.r2;
901 item = gnome_canvas_item_new (view->bg_group,
902 gnome_canvas_ellipse_get_type (),
907 "fill_color_rgba", PAPER_COLOR,
910 item = gnome_canvas_item_new (view->bg_group,
911 gnome_canvas_ellipse_get_type (),
916 "fill_color_rgba", GRID_COLOR,
921 item = gnome_canvas_item_new (view->fg_group,
922 gnome_canvas_ellipse_get_type (),
928 "outline_color_rgba", OUTLINE_COLOR,
931 item = gnome_canvas_item_new (view->fg_group,
932 gnome_canvas_ellipse_get_type (),
938 "outline_color_rgba", OUTLINE_COLOR,
941 gl_debug (DEBUG_VIEW, "END");
944 /*---------------------------------------------------------------------------*/
945 /* PRIVATE. Draw Business Card CD style background, CD w/ chopped ends. */
946 /*---------------------------------------------------------------------------*/
948 draw_bg_fg_cd_bc (glView *view)
951 glTemplate *template;
952 GnomeCanvasPoints *points;
953 gint i_coords, i_theta;
954 gdouble theta1, theta2;
955 gdouble x0, y0, w, h, r1, r2;
956 GnomeCanvasItem *item;
958 gl_debug (DEBUG_VIEW, "START");
960 g_return_if_fail (view && GL_IS_VIEW (view));
961 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
965 template = gl_label_get_template (label);
966 gl_label_get_size (label, &w, &h);
970 r1 = template->label.cd.r1;
971 r2 = template->label.cd.r2;
973 theta1 = (180.0/G_PI) * acos (w / (2.0*r1));
974 theta2 = (180.0/G_PI) * asin (h / (2.0*r1));
976 points = gnome_canvas_points_new (360/ARC_FINE + 1);
979 points->coords[i_coords++] = x0 + r1 * cos (theta1 * G_PI / 180.0);
980 points->coords[i_coords++] = y0 + r1 * sin (theta1 * G_PI / 180.0);
982 for ( i_theta = theta1 + ARC_FINE; i_theta < theta2; i_theta +=ARC_FINE ) {
983 points->coords[i_coords++] = x0 + r1 * cos (i_theta * G_PI / 180.0);
984 points->coords[i_coords++] = y0 + r1 * sin (i_theta * G_PI / 180.0);
987 points->coords[i_coords++] = x0 + r1 * cos (theta2 * G_PI / 180.0);
988 points->coords[i_coords++] = y0 + r1 * sin (theta2 * G_PI / 180.0);
991 if ( fabs (theta2 - 90.0) > GNOME_CANVAS_EPSILON ) {
992 points->coords[i_coords++] = x0 + r1 * cos ((180-theta2) * G_PI / 180.0);
993 points->coords[i_coords++] = y0 + r1 * sin ((180-theta2) * G_PI / 180.0);
996 for ( i_theta = 180-theta2+ARC_FINE; i_theta < (180-theta1); i_theta +=ARC_FINE ) {
997 points->coords[i_coords++] = x0 + r1 * cos (i_theta * G_PI / 180.0);
998 points->coords[i_coords++] = y0 + r1 * sin (i_theta * G_PI / 180.0);
1001 points->coords[i_coords++] = x0 + r1 * cos ((180-theta1) * G_PI / 180.0);
1002 points->coords[i_coords++] = y0 + r1 * sin ((180-theta1) * G_PI / 180.0);
1004 if ( fabs (theta1) > GNOME_CANVAS_EPSILON ) {
1005 points->coords[i_coords++] = x0 + r1 * cos ((180+theta1) * G_PI / 180.0);
1006 points->coords[i_coords++] = y0 + r1 * sin ((180+theta1) * G_PI / 180.0);
1009 for ( i_theta = 180+theta1+ARC_FINE; i_theta < (180+theta2); i_theta +=ARC_FINE ) {
1010 points->coords[i_coords++] = x0 + r1 * cos (i_theta * G_PI / 180.0);
1011 points->coords[i_coords++] = y0 + r1 * sin (i_theta * G_PI / 180.0);
1014 points->coords[i_coords++] = x0 + r1 * cos ((180+theta2) * G_PI / 180.0);
1015 points->coords[i_coords++] = y0 + r1 * sin ((180+theta2) * G_PI / 180.0);
1017 if ( fabs (theta2 - 90.0) > GNOME_CANVAS_EPSILON ) {
1018 points->coords[i_coords++] = x0 + r1 * cos ((360-theta2) * G_PI / 180.0);
1019 points->coords[i_coords++] = y0 + r1 * sin ((360-theta2) * G_PI / 180.0);
1022 for ( i_theta = 360-theta2+ARC_FINE; i_theta < (360-theta1); i_theta +=ARC_FINE ) {
1023 points->coords[i_coords++] = x0 + r1 * cos (i_theta * G_PI / 180.0);
1024 points->coords[i_coords++] = y0 + r1 * sin (i_theta * G_PI / 180.0);
1027 if ( fabs (theta1) > GNOME_CANVAS_EPSILON ) {
1028 points->coords[i_coords++] = x0 + r1 * cos ((360-theta1) * G_PI / 180.0);
1029 points->coords[i_coords++] = y0 + r1 * sin ((360-theta1) * G_PI / 180.0);
1032 points->num_points = i_coords / 2;
1036 item = gnome_canvas_item_new (view->bg_group,
1037 gnome_canvas_polygon_get_type (),
1039 "fill_color_rgba", PAPER_COLOR,
1042 item = gnome_canvas_item_new (view->bg_group,
1043 gnome_canvas_ellipse_get_type (),
1048 "fill_color_rgba", GRID_COLOR,
1053 item = gnome_canvas_item_new (view->fg_group,
1054 gnome_canvas_polygon_get_type (),
1057 "outline_color_rgba", OUTLINE_COLOR,
1060 item = gnome_canvas_item_new (view->fg_group,
1061 gnome_canvas_ellipse_get_type (),
1067 "outline_color_rgba", OUTLINE_COLOR,
1070 gnome_canvas_points_free (points);
1072 gl_debug (DEBUG_VIEW, "END");
1075 /*---------------------------------------------------------------------------*/
1076 /* PRIVATE. Draw grid lines. */
1077 /*---------------------------------------------------------------------------*/
1079 draw_grid_layer (glView *view)
1082 GnomeCanvasPoints *points;
1083 GnomeCanvasItem *item;
1084 GnomeCanvasGroup *group;
1086 gl_debug (DEBUG_VIEW, "START");
1088 g_return_if_fail (view && GL_IS_VIEW (view));
1089 g_return_if_fail (view->label && GL_IS_LABEL(view->label));
1091 gl_label_get_size (view->label, &w, &h);
1093 group = gnome_canvas_root (GNOME_CANVAS (view->canvas));
1094 view->grid_group = GNOME_CANVAS_GROUP(
1095 gnome_canvas_item_new (group,
1096 gnome_canvas_group_get_type (),
1100 points = gnome_canvas_points_new (2);
1102 points->coords[1] = 0.0;
1103 points->coords[3] = h;
1104 for ( x=0.0; x < w; x += view->grid_spacing ) {
1105 points->coords[0] = points->coords[2] = x;
1106 item = gnome_canvas_item_new (view->grid_group,
1107 gnome_canvas_line_get_type (),
1110 "fill_color_rgba", GRID_COLOR,
1113 points->coords[0] = points->coords[2] = w;
1114 item = gnome_canvas_item_new (view->grid_group,
1115 gnome_canvas_line_get_type (),
1118 "fill_color_rgba", GRID_COLOR,
1121 points->coords[0] = 0.0;
1122 points->coords[2] = w;
1123 for ( y=0.0; y < h; y += view->grid_spacing ) {
1124 points->coords[1] = points->coords[3] = y;
1125 item = gnome_canvas_item_new (view->grid_group,
1126 gnome_canvas_line_get_type (),
1129 "fill_color_rgba", GRID_COLOR,
1132 points->coords[1] = points->coords[3] = h;
1133 item = gnome_canvas_item_new (view->grid_group,
1134 gnome_canvas_line_get_type (),
1137 "fill_color_rgba", GRID_COLOR,
1140 gnome_canvas_points_free (points);
1142 gl_debug (DEBUG_VIEW, "END");
1145 /*---------------------------------------------------------------------------*/
1146 /* PRIVATE. Draw markup lines. */
1147 /*---------------------------------------------------------------------------*/
1149 draw_markup_layer (glView *view)
1151 GnomeCanvasGroup *group;
1153 glTemplate *template;
1155 glTemplateMarkup *markup;
1157 g_return_if_fail (view && GL_IS_VIEW (view));
1158 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
1160 group = gnome_canvas_root (GNOME_CANVAS (view->canvas));
1161 view->markup_group = GNOME_CANVAS_GROUP(
1162 gnome_canvas_item_new (group,
1163 gnome_canvas_group_get_type (),
1168 label = view->label;
1169 template = gl_label_get_template (label);
1171 for ( p=template->label.any.markups; p != NULL; p=p->next ) {
1172 markup = (glTemplateMarkup *)p->data;
1174 switch (markup->type) {
1175 case GL_TEMPLATE_MARKUP_MARGIN:
1176 draw_markup_margin (view,
1177 (glTemplateMarkupMargin *)markup);
1179 case GL_TEMPLATE_MARKUP_LINE:
1180 draw_markup_line (view,
1181 (glTemplateMarkupLine *)markup);
1183 case GL_TEMPLATE_MARKUP_CIRCLE:
1184 draw_markup_circle (view,
1185 (glTemplateMarkupCircle *)markup);
1188 g_warning ("Unknown template markup type");
1194 /*---------------------------------------------------------------------------*/
1195 /* PRIVATE. Draw margin markup. */
1196 /*---------------------------------------------------------------------------*/
1198 draw_markup_margin (glView *view,
1199 glTemplateMarkupMargin *margin)
1202 glTemplate *template;
1204 g_return_if_fail (view && GL_IS_VIEW (view));
1205 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
1207 label = view->label;
1208 template = gl_label_get_template (label);
1210 switch (template->label.style) {
1212 case GL_TEMPLATE_STYLE_RECT:
1213 if (template->label.rect.r == 0.0) {
1214 /* Square corners. */
1215 draw_markup_margin_rect (view, margin);
1217 if ( margin->size < template->label.rect.r) {
1218 /* Rounded corners. */
1219 draw_markup_margin_rounded_rect (view, margin);
1221 /* Square corners. */
1222 draw_markup_margin_rect (view, margin);
1227 case GL_TEMPLATE_STYLE_ROUND:
1228 draw_markup_margin_round (view, margin);
1231 case GL_TEMPLATE_STYLE_CD:
1232 if ((template->label.cd.w == 0.0) && (template->label.cd.h == 0.0) ) {
1233 draw_markup_margin_cd (view, margin);
1235 draw_markup_margin_cd_bc (view, margin);
1240 g_warning ("Unknown template label style");
1245 /*---------------------------------------------------------------------------*/
1246 /* PRIVATE. Draw simple recangular margin. */
1247 /*---------------------------------------------------------------------------*/
1249 draw_markup_margin_rect (glView *view,
1250 glTemplateMarkupMargin *margin)
1253 glTemplate *template;
1255 GnomeCanvasItem *item;
1257 gl_debug (DEBUG_VIEW, "START");
1259 g_return_if_fail (view && GL_IS_VIEW (view));
1260 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
1262 label = view->label;
1264 gl_label_get_size (label, &w, &h);
1265 template = gl_label_get_template (label);
1268 /* Bounding box @ margin */
1269 gnome_canvas_item_new (view->markup_group,
1270 gnome_canvas_rect_get_type (),
1276 "outline_color_rgba", MARKUP_COLOR,
1279 gl_debug (DEBUG_VIEW, "END");
1282 /*---------------------------------------------------------------------------*/
1283 /* PRIVATE. Draw rounded recangular markup. */
1284 /*---------------------------------------------------------------------------*/
1286 draw_markup_margin_rounded_rect (glView *view,
1287 glTemplateMarkupMargin *margin)
1290 GnomeCanvasPoints *points;
1291 gint i_coords, i_theta;
1292 glTemplate *template;
1294 GnomeCanvasItem *item;
1296 gl_debug (DEBUG_VIEW, "START");
1298 g_return_if_fail (view && GL_IS_VIEW (view));
1299 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
1301 label = view->label;
1303 gl_label_get_size (label, &w, &h);
1304 template = gl_label_get_template (label);
1305 r = template->label.rect.r;
1312 /* rectangle with rounded corners */
1313 points = gnome_canvas_points_new (4 * (1 + 90 / ARC_COURSE));
1315 for (i_theta = 0; i_theta <= 90; i_theta += ARC_COURSE) {
1316 points->coords[i_coords++] =
1317 m + r - r * sin (i_theta * G_PI / 180.0);
1318 points->coords[i_coords++] =
1319 m + r - r * cos (i_theta * G_PI / 180.0);
1321 for (i_theta = 0; i_theta <= 90; i_theta += ARC_COURSE) {
1322 points->coords[i_coords++] =
1323 m + r - r * cos (i_theta * G_PI / 180.0);
1324 points->coords[i_coords++] =
1325 m + (h - r) + r * sin (i_theta * G_PI / 180.0);
1327 for (i_theta = 0; i_theta <= 90; i_theta += ARC_COURSE) {
1328 points->coords[i_coords++] =
1329 m + (w - r) + r * sin (i_theta * G_PI / 180.0);
1330 points->coords[i_coords++] =
1331 m + (h - r) + r * cos (i_theta * G_PI / 180.0);
1333 for (i_theta = 0; i_theta <= 90; i_theta += ARC_COURSE) {
1334 points->coords[i_coords++] =
1335 m + (w - r) + r * cos (i_theta * G_PI / 180.0);
1336 points->coords[i_coords++] =
1337 m + r - r * sin (i_theta * G_PI / 180.0);
1339 item = gnome_canvas_item_new (view->markup_group,
1340 gnome_canvas_polygon_get_type (),
1343 "outline_color_rgba", MARKUP_COLOR,
1345 gnome_canvas_points_free (points);
1347 gl_debug (DEBUG_VIEW, "END");
1350 /*---------------------------------------------------------------------------*/
1351 /* PRIVATE. Draw round margin. */
1352 /*---------------------------------------------------------------------------*/
1354 draw_markup_margin_round (glView *view,
1355 glTemplateMarkupMargin *margin)
1358 glTemplate *template;
1360 GnomeCanvasItem *item;
1362 gl_debug (DEBUG_VIEW, "START");
1364 g_return_if_fail (view && GL_IS_VIEW (view));
1365 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
1367 label = view->label;
1368 template = gl_label_get_template (label);
1370 r = template->label.round.r;
1373 /* Margin outline */
1374 item = gnome_canvas_item_new (view->markup_group,
1375 gnome_canvas_ellipse_get_type (),
1381 "outline_color_rgba", MARKUP_COLOR,
1384 gl_debug (DEBUG_VIEW, "END");
1387 /*---------------------------------------------------------------------------*/
1388 /* PRIVATE. Draw CD margins. */
1389 /*---------------------------------------------------------------------------*/
1391 draw_markup_margin_cd (glView *view,
1392 glTemplateMarkupMargin *margin)
1395 glTemplate *template;
1397 GnomeCanvasItem *item;
1399 gl_debug (DEBUG_VIEW, "START");
1401 g_return_if_fail (view && GL_IS_VIEW (view));
1402 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
1404 label = view->label;
1405 template = gl_label_get_template (label);
1407 r1 = template->label.cd.r1;
1408 r2 = template->label.cd.r2;
1412 item = gnome_canvas_item_new (view->markup_group,
1413 gnome_canvas_ellipse_get_type (),
1419 "outline_color_rgba", MARKUP_COLOR,
1422 item = gnome_canvas_item_new (view->markup_group,
1423 gnome_canvas_ellipse_get_type (),
1429 "outline_color_rgba", MARKUP_COLOR,
1432 gl_debug (DEBUG_VIEW, "END");
1435 /*---------------------------------------------------------------------------*/
1436 /* PRIVATE. Draw Business Card CD margins. */
1437 /*---------------------------------------------------------------------------*/
1439 draw_markup_margin_cd_bc (glView *view,
1440 glTemplateMarkupMargin *margin)
1443 glTemplate *template;
1445 GnomeCanvasPoints *points;
1446 gint i_coords, i_theta;
1447 gdouble theta1, theta2;
1448 gdouble x0, y0, w, h, r;
1449 GnomeCanvasItem *item;
1451 gl_debug (DEBUG_VIEW, "START");
1453 g_return_if_fail (view && GL_IS_VIEW (view));
1454 g_return_if_fail (view->label && GL_IS_LABEL (view->label));
1456 label = view->label;
1457 template = gl_label_get_template (label);
1458 gl_label_get_size (label, &w, &h);
1462 r1 = template->label.cd.r1;
1463 r2 = template->label.cd.r2;
1468 theta1 = (180.0/G_PI) * acos (w / (2.0*r1));
1469 theta2 = (180.0/G_PI) * asin (h / (2.0*r1));
1471 points = gnome_canvas_points_new (360/ARC_FINE + 1);
1474 points->coords[i_coords++] = x0 + r * cos (theta1 * G_PI / 180.0);
1475 points->coords[i_coords++] = y0 + r * sin (theta1 * G_PI / 180.0);
1477 for ( i_theta = theta1 + ARC_FINE; i_theta < theta2; i_theta +=ARC_FINE ) {
1478 points->coords[i_coords++] = x0 + r * cos (i_theta * G_PI / 180.0);
1479 points->coords[i_coords++] = y0 + r * sin (i_theta * G_PI / 180.0);
1482 points->coords[i_coords++] = x0 + r * cos (theta2 * G_PI / 180.0);
1483 points->coords[i_coords++] = y0 + r * sin (theta2 * G_PI / 180.0);
1486 if ( fabs (theta2 - 90.0) > GNOME_CANVAS_EPSILON ) {
1487 points->coords[i_coords++] = x0 + r * cos ((180-theta2) * G_PI / 180.0);
1488 points->coords[i_coords++] = y0 + r * sin ((180-theta2) * G_PI / 180.0);
1491 for ( i_theta = 180-theta2+ARC_FINE; i_theta < (180-theta1); i_theta +=ARC_FINE ) {
1492 points->coords[i_coords++] = x0 + r * cos (i_theta * G_PI / 180.0);
1493 points->coords[i_coords++] = y0 + r * sin (i_theta * G_PI / 180.0);
1496 points->coords[i_coords++] = x0 + r * cos ((180-theta1) * G_PI / 180.0);
1497 points->coords[i_coords++] = y0 + r * sin ((180-theta1) * G_PI / 180.0);
1499 if ( fabs (theta1) > GNOME_CANVAS_EPSILON ) {
1500 points->coords[i_coords++] = x0 + r * cos ((180+theta1) * G_PI / 180.0);
1501 points->coords[i_coords++] = y0 + r * sin ((180+theta1) * G_PI / 180.0);
1504 for ( i_theta = 180+theta1+ARC_FINE; i_theta < (180+theta2); i_theta +=ARC_FINE ) {
1505 points->coords[i_coords++] = x0 + r * cos (i_theta * G_PI / 180.0);
1506 points->coords[i_coords++] = y0 + r * sin (i_theta * G_PI / 180.0);
1509 points->coords[i_coords++] = x0 + r * cos ((180+theta2) * G_PI / 180.0);
1510 points->coords[i_coords++] = y0 + r * sin ((180+theta2) * G_PI / 180.0);
1512 if ( fabs (theta2 - 90.0) > GNOME_CANVAS_EPSILON ) {
1513 points->coords[i_coords++] = x0 + r * cos ((360-theta2) * G_PI / 180.0);
1514 points->coords[i_coords++] = y0 + r * sin ((360-theta2) * G_PI / 180.0);
1517 for ( i_theta = 360-theta2+ARC_FINE; i_theta < (360-theta1); i_theta +=ARC_FINE ) {
1518 points->coords[i_coords++] = x0 + r * cos (i_theta * G_PI / 180.0);
1519 points->coords[i_coords++] = y0 + r * sin (i_theta * G_PI / 180.0);
1522 if ( fabs (theta1) > GNOME_CANVAS_EPSILON ) {
1523 points->coords[i_coords++] = x0 + r * cos ((360-theta1) * G_PI / 180.0);
1524 points->coords[i_coords++] = y0 + r * sin ((360-theta1) * G_PI / 180.0);
1527 points->num_points = i_coords / 2;
1529 item = gnome_canvas_item_new (view->markup_group,
1530 gnome_canvas_polygon_get_type (),
1533 "outline_color_rgba", MARKUP_COLOR,
1536 gnome_canvas_points_free (points);
1539 item = gnome_canvas_item_new (view->markup_group,
1540 gnome_canvas_ellipse_get_type (),
1546 "outline_color_rgba", MARKUP_COLOR,
1549 gl_debug (DEBUG_VIEW, "END");
1552 /*---------------------------------------------------------------------------*/
1553 /* PRIVATE. Draw line markup. */
1554 /*---------------------------------------------------------------------------*/
1556 draw_markup_line (glView *view,
1557 glTemplateMarkupLine *line)
1559 GnomeCanvasPoints *points;
1561 gl_debug (DEBUG_VIEW, "START");
1563 g_return_if_fail (view && GL_IS_VIEW (view));
1565 points = gnome_canvas_points_new (2);
1566 points->coords[0] = line->x1;
1567 points->coords[1] = line->y1;
1568 points->coords[2] = line->x2;
1569 points->coords[3] = line->y2;
1571 /* Bounding box @ margin */
1572 gnome_canvas_item_new (view->markup_group,
1573 gnome_canvas_line_get_type (),
1576 "fill_color_rgba", MARKUP_COLOR,
1579 gnome_canvas_points_free (points);
1581 gl_debug (DEBUG_VIEW, "END");
1584 /*---------------------------------------------------------------------------*/
1585 /* PRIVATE. Draw circle markup. */
1586 /*---------------------------------------------------------------------------*/
1588 draw_markup_circle (glView *view,
1589 glTemplateMarkupCircle *circle)
1591 gl_debug (DEBUG_VIEW, "START");
1593 g_return_if_fail (view && GL_IS_VIEW (view));
1595 /* Circle outline */
1596 gnome_canvas_item_new (view->markup_group,
1597 gnome_canvas_ellipse_get_type (),
1598 "x1", circle->x0 - circle->r,
1599 "y1", circle->y0 - circle->r,
1600 "x2", circle->x0 + circle->r,
1601 "y2", circle->y0 + circle->r,
1603 "outline_color_rgba", MARKUP_COLOR,
1606 gl_debug (DEBUG_VIEW, "END");
1609 /*****************************************************************************/
1611 /*****************************************************************************/
1612 void gl_view_show_grid (glView *view)
1614 g_return_if_fail (view && GL_IS_VIEW (view));
1616 gnome_canvas_item_show (GNOME_CANVAS_ITEM(view->grid_group));
1619 /*****************************************************************************/
1621 /*****************************************************************************/
1622 void gl_view_hide_grid (glView *view)
1624 g_return_if_fail (view && GL_IS_VIEW (view));
1626 gnome_canvas_item_hide (GNOME_CANVAS_ITEM(view->grid_group));
1629 /*****************************************************************************/
1630 /* Set grid spacing. */
1631 /*****************************************************************************/
1632 void gl_view_set_grid_spacing (glView *view,
1635 g_return_if_fail (view && GL_IS_VIEW (view));
1637 view->grid_spacing = spacing;
1639 gtk_object_destroy (GTK_OBJECT(view->grid_group));
1640 draw_grid_layer (view);
1643 /*****************************************************************************/
1645 /*****************************************************************************/
1646 void gl_view_show_markup (glView *view)
1648 g_return_if_fail (view && GL_IS_VIEW (view));
1650 gnome_canvas_item_show (GNOME_CANVAS_ITEM(view->markup_group));
1653 /*****************************************************************************/
1655 /*****************************************************************************/
1656 void gl_view_hide_markup (glView *view)
1658 g_return_if_fail (view && GL_IS_VIEW (view));
1660 gnome_canvas_item_hide (GNOME_CANVAS_ITEM(view->markup_group));
1663 /*****************************************************************************/
1664 /* Set arrow mode. */
1665 /*****************************************************************************/
1667 gl_view_arrow_mode (glView *view)
1669 static GdkCursor *cursor = NULL;
1671 gl_debug (DEBUG_VIEW, "START");
1673 g_return_if_fail (view && GL_IS_VIEW (view));
1676 cursor = gdk_cursor_new (GDK_LEFT_PTR);
1679 gdk_window_set_cursor (view->canvas->window, cursor);
1681 view->state = GL_VIEW_STATE_ARROW;
1683 gl_debug (DEBUG_VIEW, "END");
1686 /*****************************************************************************/
1687 /* Set create text object mode. */
1688 /*****************************************************************************/
1690 gl_view_object_create_mode (glView *view,
1691 glLabelObjectType type)
1695 gl_debug (DEBUG_VIEW, "START");
1697 g_return_if_fail (view && GL_IS_VIEW (view));
1700 case GL_LABEL_OBJECT_BOX:
1701 cursor = gl_view_box_get_create_cursor ();
1703 case GL_LABEL_OBJECT_ELLIPSE:
1704 cursor = gl_view_ellipse_get_create_cursor ();
1706 case GL_LABEL_OBJECT_LINE:
1707 cursor = gl_view_line_get_create_cursor ();
1709 case GL_LABEL_OBJECT_IMAGE:
1710 cursor = gl_view_image_get_create_cursor ();
1712 case GL_LABEL_OBJECT_TEXT:
1713 cursor = gl_view_text_get_create_cursor ();
1715 case GL_LABEL_OBJECT_BARCODE:
1716 cursor = gl_view_barcode_get_create_cursor ();
1719 g_warning ("Invalid label object type.");/*Should not happen!*/
1723 gdk_window_set_cursor (view->canvas->window, cursor);
1725 view->state = GL_VIEW_STATE_OBJECT_CREATE;
1726 view->create_type = type;
1728 gl_debug (DEBUG_VIEW, "END");
1731 /*****************************************************************************/
1732 /* Select given object (adding to current selection). */
1733 /*****************************************************************************/
1735 gl_view_select_object (glView *view,
1736 glViewObject *view_object)
1738 gl_debug (DEBUG_VIEW, "START");
1740 g_return_if_fail (view && GL_IS_VIEW (view));
1742 select_object_real (view, view_object);
1744 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1746 gl_debug (DEBUG_VIEW, "END");
1749 /*****************************************************************************/
1750 /* Unselect given object (removing from current selection). */
1751 /*****************************************************************************/
1753 gl_view_unselect_object (glView *view,
1754 glViewObject *view_object)
1756 gl_debug (DEBUG_VIEW, "START");
1758 g_return_if_fail (view && GL_IS_VIEW (view));
1760 unselect_object_real (view, view_object);
1762 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1764 gl_debug (DEBUG_VIEW, "END");
1767 /*****************************************************************************/
1768 /* Select all items. */
1769 /*****************************************************************************/
1771 gl_view_select_all (glView *view)
1775 gl_debug (DEBUG_VIEW, "START");
1777 g_return_if_fail (view && GL_IS_VIEW (view));
1779 /* 1st unselect anything already selected. */
1780 for (p = view->selected_object_list; p != NULL; p = p_next) {
1782 unselect_object_real (view, GL_VIEW_OBJECT (p->data));
1785 /* Finally select all objects. */
1786 for (p = view->object_list; p != NULL; p = p->next) {
1787 select_object_real (view, GL_VIEW_OBJECT (p->data));
1790 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1792 gl_debug (DEBUG_VIEW, "END");
1795 /*****************************************************************************/
1796 /* Remove all selections */
1797 /*****************************************************************************/
1799 gl_view_unselect_all (glView *view)
1803 gl_debug (DEBUG_VIEW, "START");
1805 g_return_if_fail (view && GL_IS_VIEW (view));
1807 for (p = view->selected_object_list; p != NULL; p = p_next) {
1809 unselect_object_real (view, GL_VIEW_OBJECT (p->data));
1812 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1814 gl_debug (DEBUG_VIEW, "END");
1817 /*****************************************************************************/
1818 /* Select all objects within given rectangular region (adding to selection). */
1819 /*****************************************************************************/
1821 gl_view_select_region (glView *view,
1828 glViewObject *view_object;
1829 glLabelObject *object;
1830 gdouble i_x1, i_y1, i_x2, i_y2;
1832 gl_debug (DEBUG_VIEW, "START");
1834 g_return_if_fail (view && GL_IS_VIEW (view));
1835 g_return_if_fail ((x1 <= x2) && (y1 <= y2));
1837 for (p = view->object_list; p != NULL; p = p->next) {
1838 view_object = GL_VIEW_OBJECT(p->data);
1839 if (!gl_view_is_object_selected (view, view_object)) {
1841 object = gl_view_object_get_object (view_object);
1843 gl_label_object_get_extent (object, &i_x1, &i_y1, &i_x2, &i_y2);
1844 if ((i_x1 >= x1) && (i_x2 <= x2) && (i_y1 >= y1)
1846 select_object_real (view, view_object);
1852 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
1854 gl_debug (DEBUG_VIEW, "END");
1857 /*---------------------------------------------------------------------------*/
1858 /* PRIVATE. Select an object. */
1859 /*---------------------------------------------------------------------------*/
1861 select_object_real (glView *view,
1862 glViewObject *view_object)
1864 gl_debug (DEBUG_VIEW, "START");
1866 g_return_if_fail (view && GL_IS_VIEW (view));
1867 g_return_if_fail (GL_IS_VIEW_OBJECT (view_object));
1869 if (!gl_view_is_object_selected (view, view_object)) {
1870 view->selected_object_list =
1871 g_list_prepend (view->selected_object_list, view_object);
1873 gl_view_object_show_highlight (view_object);
1874 gtk_widget_grab_focus (GTK_WIDGET (view->canvas));
1876 gl_debug (DEBUG_VIEW, "END");
1879 /*---------------------------------------------------------------------------*/
1880 /* PRIVATE. Un-select object. */
1881 /*---------------------------------------------------------------------------*/
1883 unselect_object_real (glView *view,
1884 glViewObject *view_object)
1886 gl_debug (DEBUG_VIEW, "START");
1888 g_return_if_fail (view && GL_IS_VIEW (view));
1889 g_return_if_fail (GL_IS_VIEW_OBJECT (view_object));
1891 gl_view_object_hide_highlight (view_object);
1893 view->selected_object_list =
1894 g_list_remove (view->selected_object_list, view_object);
1896 gl_debug (DEBUG_VIEW, "END");
1899 /*---------------------------------------------------------------------------*/
1900 /* PRIVATE. Return object at (x,y). */
1901 /*---------------------------------------------------------------------------*/
1903 object_at (glView *view,
1907 GnomeCanvasItem *item, *p_item;
1910 gl_debug (DEBUG_VIEW, "");
1912 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
1914 item = gnome_canvas_get_item_at (GNOME_CANVAS (view->canvas), x, y);
1916 /* No item is at x, y */
1920 /* ignore items not in label or highlight layers, e.g. background items */
1921 if (!is_item_member_of_group(view, item, GNOME_CANVAS_ITEM(view->label_group)) &&
1922 !is_item_member_of_group(view, item, GNOME_CANVAS_ITEM(view->highlight_group)))
1928 /*---------------------------------------------------------------------------*/
1929 /* PRIVATE. Is the item a child (or grandchild, etc.) of group. */
1930 /*---------------------------------------------------------------------------*/
1932 is_item_member_of_group (glView *view,
1933 GnomeCanvasItem *item,
1934 GnomeCanvasItem *group)
1936 GnomeCanvasItem *parent;
1937 GnomeCanvasItem *root_group;
1939 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
1941 root_group = GNOME_CANVAS_ITEM(gnome_canvas_root (GNOME_CANVAS (view->canvas)));
1943 for ( parent=item->parent; parent && (parent!=root_group); parent=parent->parent) {
1944 if (parent == group) return TRUE;
1949 /*****************************************************************************/
1950 /* Is the object in our current selection? */
1951 /*****************************************************************************/
1953 gl_view_is_object_selected (glView *view,
1954 glViewObject *view_object)
1956 gl_debug (DEBUG_VIEW, "");
1958 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
1959 g_return_val_if_fail (GL_IS_VIEW_OBJECT (view_object), FALSE);
1961 if (g_list_find (view->selected_object_list, view_object) == NULL) {
1967 /*****************************************************************************/
1968 /* Is our current selection empty? */
1969 /*****************************************************************************/
1971 gl_view_is_selection_empty (glView *view)
1973 gl_debug (DEBUG_VIEW, "");
1975 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
1977 if (view->selected_object_list == NULL) {
1984 /*****************************************************************************/
1985 /* Is our current selection atomic? I.e. only one item selected. */
1986 /*****************************************************************************/
1988 gl_view_is_selection_atomic (glView *view)
1990 gl_debug (DEBUG_VIEW, "");
1992 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
1994 if (view->selected_object_list == NULL)
1996 if (view->selected_object_list->next == NULL)
2001 /*****************************************************************************/
2002 /* Delete selected objects. (Bypass clipboard) */
2003 /*****************************************************************************/
2005 gl_view_delete_selection (glView *view)
2009 gl_debug (DEBUG_VIEW, "START");
2011 g_return_if_fail (view && GL_IS_VIEW (view));
2013 for (p = view->selected_object_list; p != NULL; p = p_next) {
2015 g_object_unref (G_OBJECT (p->data));
2018 g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
2020 gl_debug (DEBUG_VIEW, "END");
2023 /*****************************************************************************/
2024 /* Get object property editor of first selected object. */
2025 /*****************************************************************************/
2027 gl_view_get_editor (glView *view)
2029 glViewObject *view_object;
2030 GtkWidget *editor = NULL;
2032 gl_debug (DEBUG_VIEW, "START");
2034 g_return_if_fail (view && GL_IS_VIEW (view));
2036 if (!gl_view_is_selection_empty (view)) {
2038 view_object = GL_VIEW_OBJECT(view->selected_object_list->data);
2039 editor = gl_view_object_get_editor (view_object);
2043 gl_debug (DEBUG_VIEW, "END");
2048 /*****************************************************************************/
2049 /* Raise selected items to top. */
2050 /*****************************************************************************/
2052 gl_view_raise_selection (glView *view)
2055 glViewObject *view_object;
2056 glLabelObject *object;
2058 gl_debug (DEBUG_VIEW, "START");
2060 g_return_if_fail (view && GL_IS_VIEW (view));
2062 for (p = view->selected_object_list; p != NULL; p = p->next) {
2063 view_object = GL_VIEW_OBJECT (p->data);
2064 object = gl_view_object_get_object (view_object);
2065 gl_label_object_raise_to_top (object);
2068 gl_debug (DEBUG_VIEW, "END");
2071 /*****************************************************************************/
2072 /* Lower selected items to bottom. */
2073 /*****************************************************************************/
2075 gl_view_lower_selection (glView *view)
2078 glViewObject *view_object;
2079 glLabelObject *object;
2081 gl_debug (DEBUG_VIEW, "START");
2083 g_return_if_fail (view && GL_IS_VIEW (view));
2085 for (p = view->selected_object_list; p != NULL; p = p->next) {
2086 view_object = GL_VIEW_OBJECT (p->data);
2087 object = gl_view_object_get_object (view_object);
2088 gl_label_object_lower_to_bottom (object);
2091 gl_debug (DEBUG_VIEW, "END");
2094 /*****************************************************************************/
2095 /* Rotate selected objects by given angle. */
2096 /*****************************************************************************/
2098 gl_view_rotate_selection (glView *view,
2102 glViewObject *view_object;
2103 glLabelObject *object;
2105 gl_debug (DEBUG_VIEW, "START");
2107 g_return_if_fail (view && GL_IS_VIEW (view));
2109 for (p = view->selected_object_list; p != NULL; p = p->next) {
2110 view_object = GL_VIEW_OBJECT (p->data);
2111 object = gl_view_object_get_object (view_object);
2112 gl_label_object_rotate (object, theta_degs);
2115 gl_debug (DEBUG_VIEW, "END");
2118 /*****************************************************************************/
2119 /* Rotate selected objects 90 degrees left. */
2120 /*****************************************************************************/
2122 gl_view_rotate_selection_left (glView *view)
2125 glViewObject *view_object;
2126 glLabelObject *object;
2128 gl_debug (DEBUG_VIEW, "START");
2130 g_return_if_fail (view && GL_IS_VIEW (view));
2132 for (p = view->selected_object_list; p != NULL; p = p->next) {
2133 view_object = GL_VIEW_OBJECT (p->data);
2134 object = gl_view_object_get_object (view_object);
2135 gl_label_object_rotate (object, -90.0);
2138 gl_debug (DEBUG_VIEW, "END");
2141 /*****************************************************************************/
2142 /* Rotate selected objects 90 degrees right. */
2143 /*****************************************************************************/
2145 gl_view_rotate_selection_right (glView *view)
2148 glViewObject *view_object;
2149 glLabelObject *object;
2151 gl_debug (DEBUG_VIEW, "START");
2153 g_return_if_fail (view && GL_IS_VIEW (view));
2155 for (p = view->selected_object_list; p != NULL; p = p->next) {
2156 view_object = GL_VIEW_OBJECT (p->data);
2157 object = gl_view_object_get_object (view_object);
2158 gl_label_object_rotate (object, 90.0);
2161 gl_debug (DEBUG_VIEW, "END");
2164 /*****************************************************************************/
2165 /* Flip selected objects horizontally. */
2166 /*****************************************************************************/
2168 gl_view_flip_selection_horiz (glView *view)
2171 glViewObject *view_object;
2172 glLabelObject *object;
2174 gl_debug (DEBUG_VIEW, "START");
2176 g_return_if_fail (view && GL_IS_VIEW (view));
2178 for (p = view->selected_object_list; p != NULL; p = p->next) {
2179 view_object = GL_VIEW_OBJECT (p->data);
2180 object = gl_view_object_get_object (view_object);
2181 gl_label_object_flip_horiz (object);
2184 gl_debug (DEBUG_VIEW, "END");
2187 /*****************************************************************************/
2188 /* Flip selected objects vertically. */
2189 /*****************************************************************************/
2191 gl_view_flip_selection_vert (glView *view)
2194 glViewObject *view_object;
2195 glLabelObject *object;
2197 gl_debug (DEBUG_VIEW, "START");
2199 g_return_if_fail (view && GL_IS_VIEW (view));
2201 for (p = view->selected_object_list; p != NULL; p = p->next) {
2202 view_object = GL_VIEW_OBJECT (p->data);
2203 object = gl_view_object_get_object (view_object);
2204 gl_label_object_flip_vert (object);
2207 gl_debug (DEBUG_VIEW, "END");
2210 /*****************************************************************************/
2211 /* Align selected objects to left most edge. */
2212 /*****************************************************************************/
2214 gl_view_align_selection_left (glView *view)
2217 glViewObject *view_object;
2218 glLabelObject *object;
2219 gdouble dx, x1min, x1, y1, x2, y2;
2221 gl_debug (DEBUG_VIEW, "START");
2223 g_return_if_fail (view && GL_IS_VIEW (view));
2225 g_return_if_fail (!gl_view_is_selection_empty (view) &&
2226 !gl_view_is_selection_atomic (view));
2228 /* find left most edge */
2229 p = view->selected_object_list;
2230 view_object = GL_VIEW_OBJECT (p->data);
2231 object = gl_view_object_get_object (view_object);
2232 gl_label_object_get_extent (object, &x1min, &y1, &x2, &y2);
2233 for (p = p->next; p != NULL; p = p->next) {
2234 view_object = GL_VIEW_OBJECT (p->data);
2235 object = gl_view_object_get_object (view_object);
2236 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2237 if ( x1 < x1min ) x1min = x1;
2240 /* now adjust the object positions to line up the left edges */
2241 for (p = view->selected_object_list; p != NULL; p = p->next) {
2242 view_object = GL_VIEW_OBJECT (p->data);
2243 object = gl_view_object_get_object (view_object);
2244 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2246 gl_label_object_set_position_relative (object, dx, 0.0);
2249 gl_debug (DEBUG_VIEW, "END");
2253 /*****************************************************************************/
2254 /* Align selected objects to right most edge. */
2255 /*****************************************************************************/
2257 gl_view_align_selection_right (glView *view)
2260 glViewObject *view_object;
2261 glLabelObject *object;
2262 gdouble dx, x2max, x1, y1, x2, y2;
2264 gl_debug (DEBUG_VIEW, "START");
2266 g_return_if_fail (view && GL_IS_VIEW (view));
2268 g_return_if_fail (!gl_view_is_selection_empty (view) &&
2269 !gl_view_is_selection_atomic (view));
2271 /* find right most edge */
2272 p = view->selected_object_list;
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, &x2max, &y2);
2276 for (p = p->next; p != NULL; p = p->next) {
2277 view_object = GL_VIEW_OBJECT (p->data);
2278 object = gl_view_object_get_object (view_object);
2279 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2280 if ( x2 > x2max ) x2max = x2;
2283 /* now adjust the object positions to line up the right edges */
2284 for (p = view->selected_object_list; p != NULL; p = p->next) {
2285 view_object = GL_VIEW_OBJECT (p->data);
2286 object = gl_view_object_get_object (view_object);
2287 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2289 gl_label_object_set_position_relative (object, dx, 0.0);
2292 gl_debug (DEBUG_VIEW, "END");
2295 /*****************************************************************************/
2296 /* Align selected objects to horizontal center of objects. */
2297 /*****************************************************************************/
2299 gl_view_align_selection_hcenter (glView *view)
2302 glViewObject *view_object;
2303 glLabelObject *object;
2304 gdouble dx, dxmin, xsum, xavg, xcenter, x1, y1, x2, y2;
2307 gl_debug (DEBUG_VIEW, "START");
2309 g_return_if_fail (view && GL_IS_VIEW (view));
2311 g_return_if_fail (!gl_view_is_selection_empty (view) &&
2312 !gl_view_is_selection_atomic (view));
2314 /* find average center of objects */
2317 for (p = view->selected_object_list; p != NULL; p = p->next) {
2318 view_object = GL_VIEW_OBJECT (p->data);
2319 object = gl_view_object_get_object (view_object);
2320 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2321 xsum += (x1 + x2) / 2.0;
2326 /* find center of object closest to average center */
2327 p = view->selected_object_list;
2328 view_object = GL_VIEW_OBJECT (p->data);
2329 object = gl_view_object_get_object (view_object);
2330 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2331 dxmin = fabs (xavg - (x1 + x2)/2.0);
2332 xcenter = (x1 + x2)/2.0;
2333 for (p = p->next; p != NULL; p = p->next) {
2334 view_object = GL_VIEW_OBJECT (p->data);
2335 object = gl_view_object_get_object (view_object);
2336 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2337 dx = fabs (xavg - (x1 + x2)/2.0);
2340 xcenter = (x1 + x2)/2.0;
2344 /* now adjust the object positions to line up this center */
2345 for (p = view->selected_object_list; p != NULL; p = p->next) {
2346 view_object = GL_VIEW_OBJECT (p->data);
2347 object = gl_view_object_get_object (view_object);
2348 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2349 dx = xcenter - (x1 + x2)/2.0;
2350 gl_label_object_set_position_relative (object, dx, 0.0);
2353 gl_debug (DEBUG_VIEW, "END");
2356 /*****************************************************************************/
2357 /* Align selected objects to top most edge. */
2358 /*****************************************************************************/
2360 gl_view_align_selection_top (glView *view)
2363 glViewObject *view_object;
2364 glLabelObject *object;
2365 gdouble dy, y1min, x1, y1, x2, y2;
2367 gl_debug (DEBUG_VIEW, "START");
2369 g_return_if_fail (view && GL_IS_VIEW (view));
2371 g_return_if_fail (!gl_view_is_selection_empty (view) &&
2372 !gl_view_is_selection_atomic (view));
2374 /* find top most edge */
2375 p = view->selected_object_list;
2376 view_object = GL_VIEW_OBJECT (p->data);
2377 object = gl_view_object_get_object (view_object);
2378 gl_label_object_get_extent (object, &x1, &y1min, &x2, &y2);
2379 for (p = p->next; p != NULL; p = p->next) {
2380 view_object = GL_VIEW_OBJECT (p->data);
2381 object = gl_view_object_get_object (view_object);
2382 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2383 if ( y1 < y1min ) y1min = y1;
2386 /* now adjust the object positions to line up the top edges */
2387 for (p = view->selected_object_list; p != NULL; p = p->next) {
2388 view_object = GL_VIEW_OBJECT (p->data);
2389 object = gl_view_object_get_object (view_object);
2390 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2392 gl_label_object_set_position_relative (object, 0.0, dy);
2395 gl_debug (DEBUG_VIEW, "END");
2398 /*****************************************************************************/
2399 /* Align selected objects to bottom most edge. */
2400 /*****************************************************************************/
2402 gl_view_align_selection_bottom (glView *view)
2405 glViewObject *view_object;
2406 glLabelObject *object;
2407 gdouble dy, y2max, x1, y1, x2, y2;
2409 gl_debug (DEBUG_VIEW, "START");
2411 g_return_if_fail (view && GL_IS_VIEW (view));
2413 g_return_if_fail (!gl_view_is_selection_empty (view) &&
2414 !gl_view_is_selection_atomic (view));
2416 /* find bottom most edge */
2417 p = view->selected_object_list;
2418 view_object = GL_VIEW_OBJECT (p->data);
2419 object = gl_view_object_get_object (view_object);
2420 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2max);
2421 for (p = p->next; p != NULL; p = p->next) {
2422 view_object = GL_VIEW_OBJECT (p->data);
2423 object = gl_view_object_get_object (view_object);
2424 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2425 if ( y2 > y2max ) y2max = y2;
2428 /* now adjust the object positions to line up the bottom edges */
2429 for (p = view->selected_object_list; p != NULL; p = p->next) {
2430 view_object = GL_VIEW_OBJECT (p->data);
2431 object = gl_view_object_get_object (view_object);
2432 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2434 gl_label_object_set_position_relative (object, 0.0, dy);
2437 gl_debug (DEBUG_VIEW, "END");
2440 /*****************************************************************************/
2441 /* Align selected objects to viertical center of objects. */
2442 /*****************************************************************************/
2444 gl_view_align_selection_vcenter (glView *view)
2447 glViewObject *view_object;
2448 glLabelObject *object;
2449 gdouble dy, dymin, ysum, yavg, ycenter, x1, y1, x2, y2;
2452 gl_debug (DEBUG_VIEW, "START");
2454 g_return_if_fail (view && GL_IS_VIEW (view));
2456 g_return_if_fail (!gl_view_is_selection_empty (view) &&
2457 !gl_view_is_selection_atomic (view));
2459 /* find average center of objects */
2462 for (p = view->selected_object_list; p != NULL; p = p->next) {
2463 view_object = GL_VIEW_OBJECT (p->data);
2464 object = gl_view_object_get_object (view_object);
2465 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2466 ysum += (y1 + y2) / 2.0;
2471 /* find center of object closest to average center */
2472 p = view->selected_object_list;
2473 view_object = GL_VIEW_OBJECT (p->data);
2474 object = gl_view_object_get_object (view_object);
2475 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2476 dymin = fabs (yavg - (y1 + y2)/2.0);
2477 ycenter = (y1 + y2)/2.0;
2478 for (p = p->next; p != NULL; p = p->next) {
2479 view_object = GL_VIEW_OBJECT (p->data);
2480 object = gl_view_object_get_object (view_object);
2481 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2482 dy = fabs (yavg - (y1 + y2)/2.0);
2485 ycenter = (y1 + y2)/2.0;
2489 /* now adjust the object positions to line up this center */
2490 for (p = view->selected_object_list; p != NULL; p = p->next) {
2491 view_object = GL_VIEW_OBJECT (p->data);
2492 object = gl_view_object_get_object (view_object);
2493 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2494 dy = ycenter - (y1 + y2)/2.0;
2495 gl_label_object_set_position_relative (object, 0.0, dy);
2498 gl_debug (DEBUG_VIEW, "END");
2501 /*****************************************************************************/
2502 /* Center selected objects to in center of label. */
2503 /*****************************************************************************/
2505 gl_view_center_selection_horiz (glView *view)
2508 glViewObject *view_object;
2509 glLabelObject *object;
2510 gdouble dx, x_label_center, x_obj_center, x1, y1, x2, y2, w, h;
2512 gl_debug (DEBUG_VIEW, "START");
2514 g_return_if_fail (view && GL_IS_VIEW (view));
2516 g_return_if_fail (!gl_view_is_selection_empty (view));
2518 gl_label_get_size (view->label, &w, &h);
2519 x_label_center = w / 2.0;
2521 /* adjust the object positions */
2522 for (p = view->selected_object_list; p != NULL; p = p->next) {
2523 view_object = GL_VIEW_OBJECT (p->data);
2524 object = gl_view_object_get_object (view_object);
2525 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2526 x_obj_center = (x1 + x2) / 2.0;
2527 dx = x_label_center - x_obj_center;
2528 gl_label_object_set_position_relative (object, dx, 0.0);
2531 gl_debug (DEBUG_VIEW, "END");
2535 /*****************************************************************************/
2536 /* Center selected objects to in center of label. */
2537 /*****************************************************************************/
2539 gl_view_center_selection_vert (glView *view)
2542 glViewObject *view_object;
2543 glLabelObject *object;
2544 gdouble dy, y_label_center, y_obj_center, x1, y1, x2, y2, w, h;
2546 gl_debug (DEBUG_VIEW, "START");
2548 g_return_if_fail (view && GL_IS_VIEW (view));
2550 g_return_if_fail (!gl_view_is_selection_empty (view));
2552 gl_label_get_size (view->label, &w, &h);
2553 y_label_center = h / 2.0;
2555 /* adjust the object positions */
2556 for (p = view->selected_object_list; p != NULL; p = p->next) {
2557 view_object = GL_VIEW_OBJECT (p->data);
2558 object = gl_view_object_get_object (view_object);
2559 gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
2560 y_obj_center = (y1 + y2) / 2.0;
2561 dy = y_label_center - y_obj_center;
2562 gl_label_object_set_position_relative (object, 0.0, dy);
2565 gl_debug (DEBUG_VIEW, "END");
2569 /*****************************************************************************/
2570 /* Move selected objects */
2571 /*****************************************************************************/
2573 gl_view_move_selection (glView *view,
2578 glLabelObject *object;
2580 gl_debug (DEBUG_VIEW, "START");
2582 g_return_if_fail (view && GL_IS_VIEW (view));
2584 for (p = view->selected_object_list; p != NULL; p = p->next) {
2586 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2587 gl_label_object_set_position_relative (object, dx, dy);
2591 gl_debug (DEBUG_VIEW, "END");
2594 /*****************************************************************************/
2595 /* Can text properties be set for selection? */
2596 /*****************************************************************************/
2598 gl_view_can_selection_text (glView *view)
2601 glLabelObject *object;
2603 gl_debug (DEBUG_VIEW, "");
2605 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
2607 for (p = view->selected_object_list; p != NULL; p = p->next) {
2609 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2610 if (gl_label_object_can_text (object)) {
2619 /*****************************************************************************/
2620 /* Set font family for all text contained in selected objects. */
2621 /*****************************************************************************/
2623 gl_view_set_selection_font_family (glView *view,
2624 const gchar *font_family)
2627 glLabelObject *object;
2629 gl_debug (DEBUG_VIEW, "START");
2631 g_return_if_fail (view && GL_IS_VIEW (view));
2633 for (p = view->selected_object_list; p != NULL; p = p->next) {
2635 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2636 gl_label_object_set_font_family (object, font_family);
2640 gl_debug (DEBUG_VIEW, "END");
2643 /*****************************************************************************/
2644 /* Set font size for all text contained in selected objects. */
2645 /*****************************************************************************/
2647 gl_view_set_selection_font_size (glView *view,
2651 glLabelObject *object;
2653 gl_debug (DEBUG_VIEW, "START");
2655 g_return_if_fail (view && GL_IS_VIEW (view));
2657 for (p = view->selected_object_list; p != NULL; p = p->next) {
2659 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2660 gl_label_object_set_font_size (object, font_size);
2664 gl_debug (DEBUG_VIEW, "END");
2667 /*****************************************************************************/
2668 /* Set font weight for all text contained in selected objects. */
2669 /*****************************************************************************/
2671 gl_view_set_selection_font_weight (glView *view,
2672 GnomeFontWeight font_weight)
2675 glLabelObject *object;
2677 gl_debug (DEBUG_VIEW, "START");
2679 g_return_if_fail (view && GL_IS_VIEW (view));
2681 for (p = view->selected_object_list; p != NULL; p = p->next) {
2683 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2684 gl_label_object_set_font_weight (object, font_weight);
2688 gl_debug (DEBUG_VIEW, "END");
2691 /*****************************************************************************/
2692 /* Set font italic flag for all text contained in selected objects. */
2693 /*****************************************************************************/
2695 gl_view_set_selection_font_italic_flag (glView *view,
2696 gboolean font_italic_flag)
2699 glLabelObject *object;
2701 gl_debug (DEBUG_VIEW, "START");
2703 g_return_if_fail (view && GL_IS_VIEW (view));
2705 for (p = view->selected_object_list; p != NULL; p = p->next) {
2707 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2708 gl_label_object_set_font_italic_flag (object, font_italic_flag);
2712 gl_debug (DEBUG_VIEW, "END");
2715 /*****************************************************************************/
2716 /* Set text alignment for all text contained in selected objects. */
2717 /*****************************************************************************/
2719 gl_view_set_selection_text_alignment (glView *view,
2720 GtkJustification text_alignment)
2723 glLabelObject *object;
2725 gl_debug (DEBUG_VIEW, "START");
2727 g_return_if_fail (view && GL_IS_VIEW (view));
2729 for (p = view->selected_object_list; p != NULL; p = p->next) {
2731 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2732 gl_label_object_set_text_alignment (object, text_alignment);
2736 gl_debug (DEBUG_VIEW, "END");
2739 /*****************************************************************************/
2740 /* Set text color for all text contained in selected objects. */
2741 /*****************************************************************************/
2743 gl_view_set_selection_text_color (glView *view,
2747 glLabelObject *object;
2749 gl_debug (DEBUG_VIEW, "START");
2751 g_return_if_fail (view && GL_IS_VIEW (view));
2753 for (p = view->selected_object_list; p != NULL; p = p->next) {
2755 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2756 gl_label_object_set_text_color (object, text_color);
2760 gl_debug (DEBUG_VIEW, "END");
2763 /*****************************************************************************/
2764 /* Can fill properties be set for selection? */
2765 /*****************************************************************************/
2767 gl_view_can_selection_fill (glView *view)
2770 glLabelObject *object;
2772 gl_debug (DEBUG_VIEW, "");
2774 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
2776 for (p = view->selected_object_list; p != NULL; p = p->next) {
2778 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2779 if (gl_label_object_can_fill (object)) {
2788 /*****************************************************************************/
2789 /* Set fill color for all selected objects. */
2790 /*****************************************************************************/
2792 gl_view_set_selection_fill_color (glView *view,
2796 glLabelObject *object;
2798 gl_debug (DEBUG_VIEW, "START");
2800 g_return_if_fail (view && GL_IS_VIEW (view));
2802 for (p = view->selected_object_list; p != NULL; p = p->next) {
2804 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2805 gl_label_object_set_fill_color (object, fill_color);
2809 gl_debug (DEBUG_VIEW, "END");
2812 /*****************************************************************************/
2813 /* Can line color properties be set for selection? */
2814 /*****************************************************************************/
2816 gl_view_can_selection_line_color (glView *view)
2819 glLabelObject *object;
2821 gl_debug (DEBUG_VIEW, "");
2823 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
2825 for (p = view->selected_object_list; p != NULL; p = p->next) {
2827 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2828 if (gl_label_object_can_line_color (object)) {
2837 /*****************************************************************************/
2838 /* Set line color for all selected objects. */
2839 /*****************************************************************************/
2841 gl_view_set_selection_line_color (glView *view,
2845 glLabelObject *object;
2847 gl_debug (DEBUG_VIEW, "START");
2849 g_return_if_fail (view && GL_IS_VIEW (view));
2851 for (p = view->selected_object_list; p != NULL; p = p->next) {
2853 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2854 gl_label_object_set_line_color (object, line_color);
2858 gl_debug (DEBUG_VIEW, "END");
2861 /*****************************************************************************/
2862 /* Can line width properties be set for selection? */
2863 /*****************************************************************************/
2865 gl_view_can_selection_line_width (glView *view)
2868 glLabelObject *object;
2870 gl_debug (DEBUG_VIEW, "");
2872 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
2874 for (p = view->selected_object_list; p != NULL; p = p->next) {
2876 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2877 if (gl_label_object_can_line_width (object)) {
2886 /*****************************************************************************/
2887 /* Set line width for all selected objects. */
2888 /*****************************************************************************/
2890 gl_view_set_selection_line_width (glView *view,
2894 glLabelObject *object;
2896 gl_debug (DEBUG_VIEW, "START");
2898 g_return_if_fail (view && GL_IS_VIEW (view));
2900 for (p = view->selected_object_list; p != NULL; p = p->next) {
2902 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
2903 gl_label_object_set_line_width (object, line_width);
2907 gl_debug (DEBUG_VIEW, "END");
2910 /*****************************************************************************/
2911 /* "Cut" selected items and place in clipboard selections. */
2912 /*****************************************************************************/
2914 gl_view_cut (glView *view)
2916 gl_debug (DEBUG_VIEW, "START");
2918 g_return_if_fail (view && GL_IS_VIEW (view));
2920 gl_view_copy (view);
2921 gl_view_delete_selection (view);
2923 gl_debug (DEBUG_VIEW, "END");
2926 /*****************************************************************************/
2927 /* "Copy" selected items to clipboard selections. */
2928 /*****************************************************************************/
2930 gl_view_copy (glView *view)
2933 glViewObject *view_object;
2934 glLabelObject *object;
2935 glTemplate *template;
2936 gboolean rotate_flag;
2938 gl_debug (DEBUG_VIEW, "START");
2940 g_return_if_fail (view && GL_IS_VIEW (view));
2942 if (view->selected_object_list) {
2944 if ( view->selection_data ) {
2945 g_object_unref (view->selection_data);
2947 template = gl_label_get_template (view->label);
2948 rotate_flag = gl_label_get_rotate_flag (view->label);
2949 view->selection_data = GL_LABEL(gl_label_new ());
2950 gl_label_set_template (view->selection_data, template);
2951 gl_label_set_rotate_flag (view->selection_data, rotate_flag);
2952 gl_template_free (&template);
2954 for (p = view->selected_object_list; p != NULL; p = p->next) {
2956 view_object = GL_VIEW_OBJECT (p->data);
2957 object = gl_view_object_get_object (view_object);
2959 gl_label_object_dup (object, view->selection_data);
2963 gtk_selection_owner_set (view->invisible,
2964 clipboard_atom, GDK_CURRENT_TIME);
2965 view->have_selection = TRUE;
2969 gl_debug (DEBUG_VIEW, "END");
2972 /*****************************************************************************/
2973 /* "Paste" from private clipboard selection. */
2974 /*****************************************************************************/
2976 gl_view_paste (glView *view)
2978 gl_debug (DEBUG_VIEW, "START");
2980 g_return_if_fail (view && GL_IS_VIEW (view));
2982 gtk_selection_convert (GTK_WIDGET (view->invisible),
2983 clipboard_atom, GDK_SELECTION_TYPE_STRING,
2986 gl_debug (DEBUG_VIEW, "END");
2989 /*****************************************************************************/
2990 /* Zoom in one "notch" */
2991 /*****************************************************************************/
2993 gl_view_zoom_in (glView *view)
2996 gdouble dist, dist_min;
2998 gl_debug (DEBUG_VIEW, "START");
3000 g_return_if_fail (view && GL_IS_VIEW (view));
3002 /* Find index of current scale (or best match) */
3003 i_min = 1; /* start with 2nd largest scale */
3004 dist_min = fabs (zooms[1] - view->zoom);
3005 for (i = 2; i < N_ZOOMS; i++) {
3006 dist = fabs (zooms[i] - view->zoom);
3007 if (dist < dist_min) {
3013 /* zoom in one "notch" */
3014 i = MAX (0, i_min - 1);
3015 gl_debug (DEBUG_VIEW, "zoom[%d] = %g", i, zooms[i]);
3016 set_zoom_real (view, zooms[i], FALSE);
3018 gl_debug (DEBUG_VIEW, "END");
3021 /*****************************************************************************/
3022 /* Zoom out one "notch" */
3023 /*****************************************************************************/
3025 gl_view_zoom_out (glView *view)
3028 gdouble dist, dist_min;
3030 gl_debug (DEBUG_VIEW, "START");
3032 g_return_if_fail (view && GL_IS_VIEW (view));
3034 /* Find index of current scale (or best match) */
3035 i_min = 0; /* start with largest scale */
3036 dist_min = fabs (zooms[0] - view->zoom);
3037 for (i = 1; i < N_ZOOMS; i++) {
3038 dist = fabs (zooms[i] - view->zoom);
3039 if (dist < dist_min) {
3045 /* zoom out one "notch" */
3046 if (i_min >= N_ZOOMS)
3051 set_zoom_real (view, zooms[i], FALSE);
3053 gl_debug (DEBUG_VIEW, "END");
3056 /*****************************************************************************/
3057 /* Set zoom to best fit. */
3058 /*****************************************************************************/
3060 gl_view_zoom_to_fit (glView *view)
3062 gint w_view, h_view;
3063 gdouble w_label, h_label;
3064 gdouble x_scale, y_scale, scale;
3066 gl_debug (DEBUG_VIEW, "");
3068 if ( ! GTK_WIDGET_VISIBLE(view)) {
3069 set_zoom_real (view, 1.0, TRUE);
3073 w_view = GTK_WIDGET(view)->allocation.width;
3074 h_view = GTK_WIDGET(view)->allocation.height;
3076 gl_label_get_size (GL_LABEL(view->label), &w_label, &h_label);
3078 gl_debug (DEBUG_VIEW, "View size: %d, %d", w_view, h_view);
3079 gl_debug (DEBUG_VIEW, "Label size: %g, %g", w_label, h_label);
3081 /* Calculate best scale */
3082 x_scale = (double)(w_view - ZOOMTOFIT_PAD) / w_label;
3083 y_scale = (double)(h_view - ZOOMTOFIT_PAD) / h_label;
3084 scale = MIN (x_scale, y_scale);
3085 gl_debug (DEBUG_VIEW, "Candidate zooms: %g, %g => %g", x_scale, y_scale, scale);
3088 gl_debug (DEBUG_VIEW, "Scale: %g", scale);
3089 scale = MIN (scale, zooms[0]*view->home_scale);
3090 scale = MAX (scale, zooms[N_ZOOMS-1]*view->home_scale);
3091 gl_debug (DEBUG_VIEW, "Limitted scale: %g", scale);
3093 set_zoom_real (view, scale/view->home_scale, TRUE);
3096 /*****************************************************************************/
3097 /* Set current zoom factor to explicit value. */
3098 /*****************************************************************************/
3100 gl_view_set_zoom (glView *view,
3103 gl_debug (DEBUG_VIEW, "START");
3105 set_zoom_real (view, zoom, FALSE);
3107 gl_debug (DEBUG_VIEW, "END");
3110 /*---------------------------------------------------------------------------*/
3111 /* PRIVATE. Set canvas scale. *
3112 /*---------------------------------------------------------------------------*/
3114 set_zoom_real (glView *view,
3116 gboolean zoom_to_fit_flag)
3118 gl_debug (DEBUG_VIEW, "START");
3120 g_return_if_fail (view && GL_IS_VIEW (view));
3121 g_return_if_fail (zoom > 0.0);
3123 /* Limit, if needed */
3124 gl_debug (DEBUG_VIEW, "Zoom requested: %g", zoom);
3125 zoom = MIN (zoom, zooms[0]);
3126 zoom = MAX (zoom, zooms[N_ZOOMS-1]);
3127 gl_debug (DEBUG_VIEW, "Limitted zoom: %g", zoom);
3129 if ( zoom != view->zoom ) {
3132 view->zoom_to_fit_flag = zoom_to_fit_flag;
3133 gnome_canvas_set_pixels_per_unit (GNOME_CANVAS (view->canvas),
3134 zoom*view->home_scale);
3136 g_signal_emit (G_OBJECT(view), signals[ZOOM_CHANGED], 0, zoom);
3140 gl_debug (DEBUG_VIEW, "END");
3145 /*---------------------------------------------------------------------------*/
3146 /* PRIVATE. Size allocation changed callback. */
3147 /*---------------------------------------------------------------------------*/
3149 size_allocate_cb (glView *view)
3151 gl_debug (DEBUG_VIEW, "START");
3153 if (view->zoom_to_fit_flag) {
3154 /* Maintain best fit zoom */
3155 gl_view_zoom_to_fit (view);
3158 gl_debug (DEBUG_VIEW, "END");
3163 /*---------------------------------------------------------------------------*/
3164 /* PRIVATE. Screen changed callback. */
3165 /*---------------------------------------------------------------------------*/
3167 screen_changed_cb (glView *view)
3169 gl_debug (DEBUG_VIEW, "START");
3171 view->home_scale = get_home_scale (view);
3173 gnome_canvas_set_pixels_per_unit (GNOME_CANVAS (view->canvas),
3174 view->zoom * view->home_scale);
3176 if (view->zoom_to_fit_flag) {
3177 /* Maintain best fit zoom */
3178 gl_view_zoom_to_fit (view);
3181 gl_debug (DEBUG_VIEW, "END");
3186 /*****************************************************************************/
3187 /* Get current zoom factor. */
3188 /*****************************************************************************/
3190 gl_view_get_zoom (glView *view)
3192 gl_debug (DEBUG_VIEW, "");
3194 g_return_val_if_fail (view && GL_IS_VIEW (view), 1.0);
3199 /*****************************************************************************/
3200 /* Is this the maximum zoom level. */
3201 /*****************************************************************************/
3203 gl_view_is_zoom_max (glView *view)
3205 gl_debug (DEBUG_VIEW, "");
3207 g_return_val_if_fail (GL_IS_VIEW (view), FALSE);
3209 return view->zoom >= zooms[0];
3212 /*****************************************************************************/
3213 /* Is this the minimum zoom level. */
3214 /*****************************************************************************/
3216 gl_view_is_zoom_min (glView *view)
3218 gl_debug (DEBUG_VIEW, "");
3220 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
3222 return view->zoom <= zooms[N_ZOOMS-1];
3225 /*****************************************************************************/
3226 /* Launch merge properties dialog. */
3227 /*****************************************************************************/
3229 gl_view_edit_merge_props (glView *view)
3231 gl_debug (DEBUG_VIEW, "");
3233 g_return_if_fail (view && GL_IS_VIEW (view));
3235 if (view->merge_props_dialog != NULL) {
3236 gtk_widget_show_all (view->merge_props_dialog);
3237 gtk_window_present (GTK_WINDOW(view->merge_props_dialog));
3241 view->merge_props_dialog = gl_merge_properties_dialog_new (view);
3242 gtk_widget_show_all (view->merge_props_dialog);
3244 g_signal_connect (G_OBJECT(view->merge_props_dialog), "destroy",
3245 G_CALLBACK (gtk_widget_destroyed),
3246 &view->merge_props_dialog);
3249 /*---------------------------------------------------------------------------*/
3250 /* PRIVATE. Canvas event handler. */
3251 /*---------------------------------------------------------------------------*/
3253 canvas_event (GnomeCanvas *canvas,
3259 gl_debug (DEBUG_VIEW, "");
3261 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
3263 /* emit pointer signals regardless of state */
3264 switch (event->type) {
3265 case GDK_MOTION_NOTIFY:
3266 gl_debug (DEBUG_VIEW, "MOTION_NOTIFY");
3267 gnome_canvas_window_to_world (canvas,
3269 event->motion.y, &x, &y);
3270 g_signal_emit (G_OBJECT(view), signals[POINTER_MOVED], 0, x, y);
3271 break; /* fall through */
3273 case GDK_LEAVE_NOTIFY:
3274 gl_debug (DEBUG_VIEW, "LEAVEW_NOTIFY");
3275 g_signal_emit (G_OBJECT(view), signals[POINTER_EXIT], 0);
3276 break; /* fall through */
3279 break; /* fall through */
3283 switch (view->state) {
3285 case GL_VIEW_STATE_ARROW:
3286 return canvas_event_arrow_mode (canvas, event, view);
3288 case GL_VIEW_STATE_OBJECT_CREATE:
3289 switch (view->create_type) {
3290 case GL_LABEL_OBJECT_BOX:
3291 return gl_view_box_create_event_handler (canvas,
3295 case GL_LABEL_OBJECT_ELLIPSE:
3296 return gl_view_ellipse_create_event_handler (canvas,
3300 case GL_LABEL_OBJECT_LINE:
3301 return gl_view_line_create_event_handler (canvas,
3305 case GL_LABEL_OBJECT_IMAGE:
3306 return gl_view_image_create_event_handler (canvas,
3310 case GL_LABEL_OBJECT_TEXT:
3311 return gl_view_text_create_event_handler (canvas,
3315 case GL_LABEL_OBJECT_BARCODE:
3316 return gl_view_barcode_create_event_handler (canvas,
3321 /*Should not happen!*/
3322 g_warning ("Invalid label object type.");
3327 g_warning ("Invalid view state."); /*Should not happen!*/
3333 /*---------------------------------------------------------------------------*/
3334 /* PRIVATE. Canvas event handler (arrow mode) */
3335 /*---------------------------------------------------------------------------*/
3337 canvas_event_arrow_mode (GnomeCanvas *canvas,
3341 static gdouble x0, y0;
3342 static gboolean dragging = FALSE;
3343 static GnomeCanvasItem *item;
3344 gdouble x, y, x1, y1, x2, y2;
3345 GnomeCanvasGroup *group;
3348 gl_debug (DEBUG_VIEW, "");
3350 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
3352 switch (event->type) {
3354 case GDK_BUTTON_PRESS:
3355 gl_debug (DEBUG_VIEW, "BUTTON_PRESS");
3356 switch (event->button.button) {
3358 gnome_canvas_window_to_world (canvas,
3360 event->button.y, &x, &y);
3362 if (!object_at (view, x, y)) {
3363 if (!(event->button.state & GDK_CONTROL_MASK)) {
3364 gl_view_unselect_all (view);
3368 gnome_canvas_item_grab (canvas->root,
3369 GDK_POINTER_MOTION_MASK |
3370 GDK_BUTTON_RELEASE_MASK |
3371 GDK_BUTTON_PRESS_MASK,
3372 NULL, event->button.time);
3374 gnome_canvas_root (GNOME_CANVAS
3377 gnome_canvas_item_new (group,
3378 gnome_canvas_rect_get_type (),
3382 "outline_color_rgba",
3393 gnome_canvas_window_to_world (canvas,
3395 event->button.y, &x, &y);
3397 if (!object_at (view, x, y)) {
3398 /* bring up apropriate menu for selection. */
3399 gl_view_popup_menu (view, event);
3406 case GDK_BUTTON_RELEASE:
3407 gl_debug (DEBUG_VIEW, "BUTTON_RELEASE");
3408 switch (event->button.button) {
3412 gnome_canvas_item_ungrab (canvas->root,
3413 event->button.time);
3414 gnome_canvas_window_to_world (canvas,
3422 gl_view_select_region (view, x1, y1, x2, y2);
3423 gtk_object_destroy (GTK_OBJECT (item));
3432 case GDK_MOTION_NOTIFY:
3433 gl_debug (DEBUG_VIEW, "MOTION_NOTIFY");
3434 gnome_canvas_window_to_world (canvas,
3436 event->motion.y, &x, &y);
3437 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
3438 gnome_canvas_item_set (item,
3442 "y2", MAX (y, y0), NULL);
3449 gl_debug (DEBUG_VIEW, "KEY_PRESS");
3451 switch (event->key.keyval) {
3454 gl_view_move_selection (view,
3455 -1.0 / (view->zoom), 0.0);
3459 gl_view_move_selection (view,
3460 0.0, -1.0 / (view->zoom));
3464 gl_view_move_selection (view,
3465 1.0 / (view->zoom), 0.0);
3469 gl_view_move_selection (view,
3470 0.0, 1.0 / (view->zoom));
3474 gl_view_delete_selection (view);
3475 cursor = gdk_cursor_new (GDK_LEFT_PTR);
3476 gdk_window_set_cursor (view->canvas->window,
3478 gdk_cursor_unref (cursor);
3484 return TRUE; /* We handled this or we were dragging. */
3487 gl_debug (DEBUG_VIEW, "default");
3493 /*---------------------------------------------------------------------------*/
3494 /* PRIVATE. create menu for selections. */
3495 /*---------------------------------------------------------------------------*/
3497 construct_selection_menu (glView *view)
3499 GtkWidget *menu, *menuitem, *submenu;
3501 gl_debug (DEBUG_VIEW, "START");
3503 g_return_if_fail (view && GL_IS_VIEW (view));
3505 menu = gtk_menu_new ();
3510 menuitem = gtk_menu_item_new_with_mnemonic (_("_Order"));
3511 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3512 gtk_widget_show (menuitem);
3513 submenu = gtk_menu_new ();
3514 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3516 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ORDER_TOP, NULL);
3517 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3518 gtk_widget_show (menuitem);
3519 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3520 G_CALLBACK (gl_view_raise_selection), view);
3522 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ORDER_BOTTOM, NULL);
3523 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3524 gtk_widget_show (menuitem);
3525 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3526 G_CALLBACK (gl_view_lower_selection), view);
3529 * Submenu: Rotate/Flip
3531 menuitem = gtk_menu_item_new_with_mnemonic (_("_Rotate/Flip"));
3532 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3533 gtk_widget_show (menuitem);
3534 submenu = gtk_menu_new ();
3535 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3537 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ROTATE_LEFT, NULL);
3538 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3539 gtk_widget_show (menuitem);
3540 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3541 G_CALLBACK (gl_view_rotate_selection_left), view);
3543 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ROTATE_RIGHT, NULL);
3544 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3545 gtk_widget_show (menuitem);
3546 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3547 G_CALLBACK (gl_view_rotate_selection_right), view);
3549 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_FLIP_HORIZ, NULL);
3550 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3551 gtk_widget_show (menuitem);
3552 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3553 G_CALLBACK (gl_view_flip_selection_horiz), view);
3555 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_FLIP_VERT, NULL);
3556 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3557 gtk_widget_show (menuitem);
3558 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3559 G_CALLBACK (gl_view_flip_selection_vert), view);
3562 * Submenu: Align Horizontally
3564 menuitem = gtk_menu_item_new_with_mnemonic (_("Align _Horizontally"));
3565 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3566 gtk_widget_show (menuitem);
3567 submenu = gtk_menu_new ();
3568 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3570 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ALIGN_LEFT, NULL);
3571 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3572 gtk_widget_show (menuitem);
3573 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3574 G_CALLBACK (gl_view_align_selection_left), view);
3575 view->multi_selection_items =
3576 g_list_prepend (view->multi_selection_items, menuitem);
3578 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ALIGN_HCENTER, NULL);
3579 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3580 gtk_widget_show (menuitem);
3581 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3582 G_CALLBACK (gl_view_align_selection_hcenter), view);
3583 view->multi_selection_items =
3584 g_list_prepend (view->multi_selection_items, menuitem);
3586 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ALIGN_RIGHT, NULL);
3587 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3588 gtk_widget_show (menuitem);
3589 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3590 G_CALLBACK (gl_view_align_selection_right), view);
3591 view->multi_selection_items =
3592 g_list_prepend (view->multi_selection_items, menuitem);
3594 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_CENTER_HORIZ, NULL);
3595 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3596 gtk_widget_show (menuitem);
3597 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3598 G_CALLBACK (gl_view_center_selection_horiz), view);
3601 * Submenu: Align Vertically
3603 menuitem = gtk_menu_item_new_with_mnemonic (_("Align _Vertically"));
3604 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3605 gtk_widget_show (menuitem);
3606 submenu = gtk_menu_new ();
3607 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3609 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ALIGN_TOP, 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_align_selection_top), view);
3614 view->multi_selection_items =
3615 g_list_prepend (view->multi_selection_items, menuitem);
3617 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ALIGN_VCENTER, NULL);
3618 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3619 gtk_widget_show (menuitem);
3620 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3621 G_CALLBACK (gl_view_align_selection_vcenter), view);
3622 view->multi_selection_items =
3623 g_list_prepend (view->multi_selection_items, menuitem);
3625 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ALIGN_BOTTOM, NULL);
3626 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3627 gtk_widget_show (menuitem);
3628 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3629 G_CALLBACK (gl_view_align_selection_bottom), view);
3630 view->multi_selection_items =
3631 g_list_prepend (view->multi_selection_items, menuitem);
3633 menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_CENTER_VERT, NULL);
3634 gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
3635 gtk_widget_show (menuitem);
3636 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3637 G_CALLBACK (gl_view_center_selection_vert), view);
3640 * Separator -------------------------
3642 menuitem = gtk_menu_item_new ();
3643 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3644 gtk_widget_show (menuitem);
3646 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_CUT, NULL);
3647 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3648 gtk_widget_show (menuitem);
3649 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3650 G_CALLBACK (gl_view_cut), view);
3652 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_COPY, NULL);
3653 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3654 gtk_widget_show (menuitem);
3655 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3656 G_CALLBACK (gl_view_copy), view);
3658 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_PASTE, NULL);
3659 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3660 gtk_widget_show (menuitem);
3661 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3662 G_CALLBACK (gl_view_paste), view);
3664 menuitem = gtk_menu_item_new_with_mnemonic (_("_Delete"));
3665 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3666 gtk_widget_show (menuitem);
3667 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3668 G_CALLBACK (gl_view_delete_selection), view);
3671 view->selection_menu = menu;
3673 gl_debug (DEBUG_VIEW, "END");
3676 /*---------------------------------------------------------------------------*/
3677 /* PRIVATE. create menu for empty selections. */
3678 /*---------------------------------------------------------------------------*/
3680 construct_empty_selection_menu (glView *view)
3682 GtkWidget *menu, *menuitem, *submenu;
3684 gl_debug (DEBUG_VIEW, "START");
3686 g_return_if_fail (view && GL_IS_VIEW (view));
3688 menu = gtk_menu_new ();
3690 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_PASTE, NULL);
3691 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3692 gtk_widget_show (menuitem);
3693 g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
3694 G_CALLBACK (gl_view_paste), view);
3697 view->empty_selection_menu = menu;
3699 gl_debug (DEBUG_VIEW, "END");
3702 /****************************************************************************/
3704 /****************************************************************************/
3706 gl_view_popup_menu (glView *view,
3712 gl_debug (DEBUG_VIEW, "START");
3714 g_return_if_fail (view && GL_IS_VIEW (view));
3716 if (gl_view_is_selection_empty (view)) {
3718 if (view->empty_selection_menu != NULL) {
3719 gtk_menu_popup (GTK_MENU (view->empty_selection_menu),
3720 NULL, NULL, NULL, NULL,
3721 event->button.button,
3722 event->button.time);
3727 for (p=view->atomic_selection_items; p!=NULL; p=p->next) {
3728 gtk_widget_set_sensitive (GTK_WIDGET(p->data),
3729 gl_view_is_selection_atomic(view));
3732 for (p=view->multi_selection_items; p!=NULL; p=p->next) {
3733 gtk_widget_set_sensitive (GTK_WIDGET(p->data),
3734 !gl_view_is_selection_atomic(view));
3737 if (view->selection_menu != NULL) {
3738 gtk_menu_popup (GTK_MENU (view->selection_menu),
3739 NULL, NULL, NULL, NULL,
3740 event->button.button,
3741 event->button.time);
3746 gl_debug (DEBUG_VIEW, "END");
3749 /*---------------------------------------------------------------------------*/
3750 /* PRIVATE. Handle "selection-clear" signal. */
3751 /*---------------------------------------------------------------------------*/
3753 selection_clear_cb (GtkWidget *widget,
3754 GdkEventSelection *event,
3757 glView *view = GL_VIEW (data);
3759 gl_debug (DEBUG_VIEW, "START");
3761 g_return_if_fail (view && GL_IS_VIEW (view));
3763 view->have_selection = FALSE;
3764 g_object_unref (view->selection_data);
3765 view->selection_data = NULL;
3767 gl_debug (DEBUG_VIEW, "END");
3770 /*---------------------------------------------------------------------------*/
3771 /* PRIVATE. Handle "selection-get" signal. */
3772 /*---------------------------------------------------------------------------*/
3774 selection_get_cb (GtkWidget *widget,
3775 GtkSelectionData *selection_data,
3780 glView *view = GL_VIEW (data);
3782 glXMLLabelStatus status;
3784 gl_debug (DEBUG_VIEW, "START");
3786 g_return_if_fail (view && GL_IS_VIEW (view));
3788 if (view->have_selection) {
3790 buffer = gl_xml_label_save_buffer (view->selection_data,
3792 gtk_selection_data_set (selection_data,
3793 GDK_SELECTION_TYPE_STRING, 8, buffer,
3798 gl_debug (DEBUG_VIEW, "END");
3801 /*---------------------------------------------------------------------------*/
3802 /* PRIVATE. Handle "selection-received" signal. (Result of Paste) */
3803 /*---------------------------------------------------------------------------*/
3805 selection_received_cb (GtkWidget *widget,
3806 GtkSelectionData *selection_data,
3810 glView *view = GL_VIEW (data);
3811 glLabel *label = NULL;
3812 glXMLLabelStatus status;
3814 glLabelObject *object, *newobject;
3815 glViewObject *view_object;
3817 gl_debug (DEBUG_VIEW, "START");
3819 g_return_if_fail (view && GL_IS_VIEW (view));
3821 if (selection_data->length < 0) {
3824 if (selection_data->type != GDK_SELECTION_TYPE_STRING) {
3828 gl_view_unselect_all (view);
3830 label = gl_xml_label_open_buffer (selection_data->data, &status);
3831 for (p = label->objects; p != NULL; p = p_next) {
3834 object = (glLabelObject *) p->data;
3835 newobject = gl_label_object_dup (object, view->label);
3837 gl_debug (DEBUG_VIEW, "object pasted");
3839 if (GL_IS_LABEL_BOX (newobject)) {
3840 view_object = gl_view_box_new (GL_LABEL_BOX(newobject),
3842 } else if (GL_IS_LABEL_ELLIPSE (newobject)) {
3843 view_object = gl_view_ellipse_new (GL_LABEL_ELLIPSE(newobject),
3845 } else if (GL_IS_LABEL_LINE (newobject)) {
3846 view_object = gl_view_line_new (GL_LABEL_LINE(newobject),
3848 } else if (GL_IS_LABEL_IMAGE (newobject)) {
3849 view_object = gl_view_image_new (GL_LABEL_IMAGE(newobject),
3851 } else if (GL_IS_LABEL_TEXT (newobject)) {
3852 view_object = gl_view_text_new (GL_LABEL_TEXT(newobject),
3854 } else if (GL_IS_LABEL_BARCODE (newobject)) {
3855 view_object = gl_view_barcode_new (GL_LABEL_BARCODE(newobject),
3858 /* Should not happen! */
3860 g_warning ("Invalid label object type.");
3862 gl_view_select_object (view, view_object);
3864 g_object_unref (label);
3866 gl_debug (DEBUG_VIEW, "END");
3869 /****************************************************************************/
3870 /* Set default font family. */
3871 /****************************************************************************/
3873 gl_view_set_default_font_family (glView *view,
3874 const gchar *font_family)
3876 gl_debug (DEBUG_VIEW, "START");
3878 g_return_if_fail (view && GL_IS_VIEW (view));
3880 if (view->default_font_family) {
3881 g_free (view->default_font_family);
3883 view->default_font_family = g_strdup (font_family);
3885 gl_debug (DEBUG_VIEW, "END");
3889 /****************************************************************************/
3890 /* Set default font size. */
3891 /****************************************************************************/
3893 gl_view_set_default_font_size (glView *view,
3896 gl_debug (DEBUG_VIEW, "START");
3898 g_return_if_fail (view && GL_IS_VIEW (view));
3900 view->default_font_size = font_size;
3902 gl_debug (DEBUG_VIEW, "END");
3906 /****************************************************************************/
3907 /* Set default font weight. */
3908 /****************************************************************************/
3910 gl_view_set_default_font_weight (glView *view,
3911 GnomeFontWeight font_weight)
3913 gl_debug (DEBUG_VIEW, "START");
3915 g_return_if_fail (view && GL_IS_VIEW (view));
3917 view->default_font_weight = font_weight;
3919 gl_debug (DEBUG_VIEW, "END");
3923 /****************************************************************************/
3924 /* Set default font italic flag. */
3925 /****************************************************************************/
3927 gl_view_set_default_font_italic_flag (glView *view,
3928 gboolean font_italic_flag)
3930 gl_debug (DEBUG_VIEW, "START");
3932 g_return_if_fail (view && GL_IS_VIEW (view));
3934 view->default_font_italic_flag = font_italic_flag;
3936 gl_debug (DEBUG_VIEW, "END");
3940 /****************************************************************************/
3941 /* Set default text color. */
3942 /****************************************************************************/
3944 gl_view_set_default_text_color (glView *view,
3947 gl_debug (DEBUG_VIEW, "START");
3949 g_return_if_fail (view && GL_IS_VIEW (view));
3951 view->default_text_color = text_color;
3953 gl_debug (DEBUG_VIEW, "END");
3957 /****************************************************************************/
3958 /* Set default text alignment. */
3959 /****************************************************************************/
3961 gl_view_set_default_text_alignment (glView *view,
3962 GtkJustification text_alignment)
3964 gl_debug (DEBUG_VIEW, "START");
3966 g_return_if_fail (view && GL_IS_VIEW (view));
3968 view->default_text_alignment = text_alignment;
3969 gl_debug (DEBUG_VIEW, "END");
3973 /****************************************************************************/
3974 /* Set default line width. */
3975 /****************************************************************************/
3977 gl_view_set_default_line_width (glView *view,
3980 gl_debug (DEBUG_VIEW, "START");
3982 g_return_if_fail (view && GL_IS_VIEW (view));
3984 view->default_line_width = line_width;
3986 gl_debug (DEBUG_VIEW, "END");
3990 /****************************************************************************/
3991 /* Set default line color. */
3992 /****************************************************************************/
3994 gl_view_set_default_line_color (glView *view,
3997 gl_debug (DEBUG_VIEW, "START");
3999 g_return_if_fail (view && GL_IS_VIEW (view));
4001 view->default_line_color = line_color;
4003 gl_debug (DEBUG_VIEW, "END");
4007 /****************************************************************************/
4008 /* Set default fill color. */
4009 /****************************************************************************/
4011 gl_view_set_default_fill_color (glView *view,
4014 gl_debug (DEBUG_VIEW, "START");
4016 g_return_if_fail (view && GL_IS_VIEW (view));
4018 view->default_fill_color = fill_color;
4020 gl_debug (DEBUG_VIEW, "END");
4025 /****************************************************************************/
4026 /* Get default font family. */
4027 /****************************************************************************/
4029 gl_view_get_default_font_family (glView *view)
4031 gl_debug (DEBUG_VIEW, "START");
4033 g_return_val_if_fail (view && GL_IS_VIEW (view), NULL);
4035 gl_debug (DEBUG_VIEW, "END");
4037 return g_strdup (view->default_font_family);
4041 /****************************************************************************/
4042 /* Get default font size. */
4043 /****************************************************************************/
4045 gl_view_get_default_font_size (glView *view)
4047 gl_debug (DEBUG_VIEW, "START");
4049 g_return_val_if_fail (view && GL_IS_VIEW (view), 12.0);
4051 gl_debug (DEBUG_VIEW, "END");
4053 return view->default_font_size;
4057 /****************************************************************************/
4058 /* Get default font weight. */
4059 /****************************************************************************/
4061 gl_view_get_default_font_weight (glView *view)
4063 gl_debug (DEBUG_VIEW, "START");
4065 g_return_val_if_fail (view && GL_IS_VIEW (view), GNOME_FONT_BOOK);
4067 gl_debug (DEBUG_VIEW, "END");
4069 return view->default_font_weight;
4073 /****************************************************************************/
4074 /* Get default font italic flag. */
4075 /****************************************************************************/
4077 gl_view_get_default_font_italic_flag (glView *view)
4079 gl_debug (DEBUG_VIEW, "START");
4081 g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
4083 gl_debug (DEBUG_VIEW, "END");
4085 return view->default_font_italic_flag;
4089 /****************************************************************************/
4090 /* Get default text color. */
4091 /****************************************************************************/
4093 gl_view_get_default_text_color (glView *view)
4095 gl_debug (DEBUG_VIEW, "START");
4097 g_return_val_if_fail (view && GL_IS_VIEW (view), 0);
4099 gl_debug (DEBUG_VIEW, "END");
4101 return view->default_text_color;
4105 /****************************************************************************/
4106 /* Get default text alignment. */
4107 /****************************************************************************/
4109 gl_view_get_default_text_alignment (glView *view)
4111 gl_debug (DEBUG_VIEW, "START");
4113 g_return_val_if_fail (view && GL_IS_VIEW (view), GTK_JUSTIFY_LEFT);
4115 gl_debug (DEBUG_VIEW, "END");
4117 return view->default_text_alignment;
4121 /****************************************************************************/
4122 /* Get default line width. */
4123 /****************************************************************************/
4125 gl_view_get_default_line_width (glView *view)
4127 gl_debug (DEBUG_VIEW, "START");
4129 g_return_val_if_fail (view && GL_IS_VIEW (view), 1.0);
4131 gl_debug (DEBUG_VIEW, "END");
4133 return view->default_line_width;
4137 /****************************************************************************/
4138 /* Get default line color. */
4139 /****************************************************************************/
4140 guint gl_view_get_default_line_color (glView *view)
4142 gl_debug (DEBUG_VIEW, "START");
4144 g_return_val_if_fail (view && GL_IS_VIEW (view), 0);
4146 gl_debug (DEBUG_VIEW, "END");
4148 return view->default_line_color;
4152 /****************************************************************************/
4153 /* Get default fill color. */
4154 /****************************************************************************/
4155 guint gl_view_get_default_fill_color (glView *view)
4157 gl_debug (DEBUG_VIEW, "START");
4159 g_return_val_if_fail (view && GL_IS_VIEW (view), 0);
4161 gl_debug (DEBUG_VIEW, "END");
4163 return view->default_fill_color;