+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
+
/*
* (GLABELS) Label and Business Card Creation program for GNOME
*
* view.c: GLabels View module
*
- * Copyright (C) 2001-2002 Jim Evins <evins@snaught.com>.
+ * Copyright (C) 2001-2007 Jim Evins <evins@snaught.com>.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#include <config.h>
-#include <gtk/gtk.h>
-#include <gtk/gtkinvisible.h>
+#include "view.h"
+#include <glib/gi18n.h>
+#include <gtk/gtkscrolledwindow.h>
+#include <gtk/gtklayout.h>
+#include <gtk/gtkselection.h>
+#include <gtk/gtkinvisible.h>
+#include <gdk/gdkkeysyms.h>
#include <string.h>
#include <math.h>
-#include "view.h"
+#include "label.h"
+#include "cairo-label-path.h"
+#include "cairo-markup-path.h"
#include "view-object.h"
#include "view-box.h"
#include "view-ellipse.h"
#include "view-barcode.h"
#include "xml-label.h"
#include "color.h"
-#include "stock.h"
-#include "merge-properties-dialog.h"
#include "prefs.h"
#include "marshal.h"
/*==========================================================================*/
#define BG_COLOR GL_COLOR (192, 192, 192)
-#define OUTLINE_COLOR GL_COLOR (173, 216, 230)
-#define PAPER_COLOR GL_COLOR (255, 255, 255)
-#define GRID_COLOR BG_COLOR
-#define MARKUP_COLOR GL_COLOR (240, 100, 100)
-#define SEL_LINE_COLOR GL_COLOR_A (0, 0, 255, 128)
-#define SEL_FILL_COLOR GL_COLOR_A (192, 192, 255, 128)
+#define PAPER_RGB_ARGS 1.0, 1.0, 1.0
+#define GRID_RGB_ARGS 0.753, 0.753, 0.753
+#define MARKUP_RGB_ARGS 0.94, 0.39, 0.39
+#define OUTLINE_RGB_ARGS 0.68, 0.85, 0.90
+#define SELECT_LINE_RGBA_ARGS 0.0, 0.0, 1.0, 0.5
+#define SELECT_FILL_RGBA_ARGS 0.75, 0.75, 1.0, 0.5
-#define ARC_FINE 2 /* Resolution in degrees of large arcs */
-#define ARC_COURSE 5 /* Resolution in degrees of small arcs */
+#define GRID_LINE_WIDTH_PIXELS 1.0
+#define MARKUP_LINE_WIDTH_PIXELS 1.0
+#define OUTLINE_WIDTH_PIXELS 3.0
+#define SELECT_LINE_WIDTH_PIXELS 3.0
#define ZOOMTOFIT_PAD 16
enum {
SELECTION_CHANGED,
+ CONTEXT_MENU_ACTIVATE,
ZOOM_CHANGED,
POINTER_MOVED,
POINTER_EXIT,
/* Private globals */
/*==========================================================================*/
-static GtkContainerClass *parent_class;
-
static guint signals[LAST_SIGNAL] = {0};
/* "CLIPBOARD" selection */
/* Local function prototypes */
/*==========================================================================*/
-static void gl_view_class_init (glViewClass *class);
-static void gl_view_init (glView *view);
-static void gl_view_finalize (GObject *object);
+static void gl_view_finalize (GObject *object);
+
+static void gl_view_construct (glView *view,
+ glLabel *label);
-static void gl_view_construct (glView *view);
-static GtkWidget *gl_view_construct_canvas (glView *view);
-static void gl_view_construct_selection (glView *view);
+static gdouble get_home_scale (glView *view);
-static gdouble get_home_scale (glView *view);
+static gboolean expose_cb (glView *view,
+ GdkEventExpose *event);
-static void draw_layers (glView *view);
+static void realize_cb (glView *view);
-static void label_resized_cb (glLabel *label,
- glView *view);
+static void size_allocate_cb (glView *view,
+ GtkAllocation *allocation);
-static void draw_label_layer (glView *view);
+static void screen_changed_cb (glView *view);
-static void draw_highlight_layer (glView *view);
+static void label_changed_cb (glView *view);
-static void draw_bg_fg_layers (glView *view);
-static void draw_bg_fg_rect (glView *view);
-static void draw_bg_fg_rounded_rect (glView *view);
-static void draw_bg_fg_round (glView *view);
-static void draw_bg_fg_cd (glView *view);
-static void draw_bg_fg_cd_bc (glView *view);
+static void label_resized_cb (glView *view);
-static void draw_grid_layer (glView *view);
+static void label_object_added_cb (glView *view,
+ glLabelObject *object);
-static void draw_markup_layer (glView *view);
+static void draw_layers (glView *view,
+ cairo_t *cr);
-static void draw_markup_margin (glView *view,
- glTemplateMarkupMargin *margin);
-static void draw_markup_margin_rect (glView *view,
- glTemplateMarkupMargin *margin);
-static void draw_markup_margin_rounded_rect (glView *view,
- glTemplateMarkupMargin *margin);
-static void draw_markup_margin_round (glView *view,
- glTemplateMarkupMargin *margin);
-static void draw_markup_margin_cd (glView *view,
- glTemplateMarkupMargin *margin);
-static void draw_markup_margin_cd_bc (glView *view,
- glTemplateMarkupMargin *margin);
+static void draw_bg_layer (glView *view,
+ cairo_t *cr);
+static void draw_grid_layer (glView *view,
+ cairo_t *cr);
+static void draw_markup_layer (glView *view,
+ cairo_t *cr);
+static void draw_objects_layer (glView *view,
+ cairo_t *cr);
+static void draw_fg_layer (glView *view,
+ cairo_t *cr);
+static void draw_highlight_layer (glView *view,
+ cairo_t *cr);
+static void draw_select_region_layer (glView *view,
+ cairo_t *cr);
-static void draw_markup_line (glView *view,
- glTemplateMarkupLine *line);
+static void select_object_real (glView *view,
+ glViewObject *view_object);
+static void unselect_object_real (glView *view,
+ glViewObject *view_object);
-static void draw_markup_circle (glView *view,
- glTemplateMarkupCircle *circle);
+static glViewObject *view_view_object_at (glView *view,
+ cairo_t *cr,
+ gdouble x,
+ gdouble y);
+static void set_zoom_real (glView *view,
+ gdouble zoom,
+ gboolean scale_to_fit_flag);
-static void select_object_real (glView *view,
- glViewObject *view_object);
-static void unselect_object_real (glView *view,
- glViewObject *view_object);
+static void selection_clear_cb (GtkWidget *widget,
+ GdkEventSelection *event,
+ glView *view);
-static gboolean object_at (glView *view,
- gdouble x, gdouble y);
+static void selection_get_cb (GtkWidget *widget,
+ GtkSelectionData *selection_data,
+ guint info,
+ guint time,
+ glView *view);
-static gboolean is_item_member_of_group (glView *view,
- GnomeCanvasItem *item,
- GnomeCanvasItem *group);
+static void selection_received_cb (GtkWidget *widget,
+ GtkSelectionData *selection_data,
+ guint time,
+ glView *view);
-static void set_zoom_real (glView *view,
- gdouble zoom,
- gboolean scale_to_fit_flag);
+static gboolean focus_in_event_cb (glView *view,
+ GdkEventFocus *event);
-static void size_allocate_cb (glView *view);
+static gboolean focus_out_event_cb (glView *view,
+ GdkEventFocus *event);
-static void screen_changed_cb (glView *view);
+static gboolean enter_notify_event_cb (glView *view,
+ GdkEventCrossing *event);
-static int canvas_event (GnomeCanvas *canvas,
- GdkEvent *event,
- glView *view);
-static int canvas_event_arrow_mode (GnomeCanvas *canvas,
- GdkEvent *event,
- glView *view);
+static gboolean leave_notify_event_cb (glView *view,
+ GdkEventCrossing *event);
-static void construct_selection_menu (glView *view);
+static gboolean motion_notify_event_cb (glView *view,
+ GdkEventMotion *event);
-static void construct_empty_selection_menu (glView *view);
+static gboolean button_press_event_cb (glView *view,
+ GdkEventButton *event);
-static void selection_clear_cb (GtkWidget *widget,
- GdkEventSelection *event,
- gpointer data);
+static gboolean button_release_event_cb (glView *view,
+ GdkEventButton *event);
-static void selection_get_cb (GtkWidget *widget,
- GtkSelectionData *selection_data,
- guint info,
- guint time,
- gpointer data);
+static gboolean key_press_event_cb (glView *view,
+ GdkEventKey *event);
-static void selection_received_cb (GtkWidget *widget,
- GtkSelectionData *selection_data,
- guint time,
- gpointer data);
\f
/****************************************************************************/
/* Boilerplate Object stuff. */
/****************************************************************************/
-guint
-gl_view_get_type (void)
-{
- static guint view_type = 0;
-
- if (!view_type) {
- GTypeInfo view_info = {
- sizeof (glViewClass),
- NULL,
- NULL,
- (GClassInitFunc) gl_view_class_init,
- NULL,
- NULL,
- sizeof (glView),
- 0,
- (GInstanceInitFunc) gl_view_init,
- };
-
- view_type =
- g_type_register_static (gtk_vbox_get_type (),
- "glView", &view_info, 0);
- }
-
- return view_type;
-}
+G_DEFINE_TYPE (glView, gl_view, GTK_TYPE_VBOX);
static void
gl_view_class_init (glViewClass *class)
{
- GObjectClass *object_class = (GObjectClass *) class;
+ GObjectClass *object_class = G_OBJECT_CLASS (class);
gl_debug (DEBUG_VIEW, "START");
- parent_class = g_type_class_peek_parent (class);
+ gl_view_parent_class = g_type_class_peek_parent (class);
object_class->finalize = gl_view_finalize;
G_TYPE_NONE,
0);
+ signals[CONTEXT_MENU_ACTIVATE] =
+ g_signal_new ("context_menu_activate",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (glViewClass, context_menu_activate),
+ NULL, NULL,
+ gl_marshal_VOID__INT_UINT,
+ G_TYPE_NONE,
+ 2, G_TYPE_INT, G_TYPE_UINT);
+
signals[ZOOM_CHANGED] =
g_signal_new ("zoom_changed",
G_OBJECT_CLASS_TYPE (object_class),
static void
gl_view_init (glView *view)
{
+ GtkWidget *wscroll;
+ GdkColor *bg_color;
+
gl_debug (DEBUG_VIEW, "START");
- view->label = NULL;
+ view->label = NULL;
+ view->grid_visible = TRUE;
+ view->grid_spacing = 9;
+ view->markup_visible = TRUE;
+ view->default_font_family = NULL;
+ view->mode = GL_VIEW_MODE_ARROW;
+ view->object_list = NULL;
+ view->selected_object_list = NULL;
+ view->zoom = 1.0;
+ view->home_scale = get_home_scale (view);
+
+ /*
+ * Canvas
+ */
+ view->canvas = gtk_layout_new (NULL, NULL);
+ wscroll = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (wscroll),
+ GTK_POLICY_AUTOMATIC,
+ GTK_POLICY_AUTOMATIC);
+ gtk_box_pack_start (GTK_BOX (view), wscroll, TRUE, TRUE, 0);
+ gtk_container_add (GTK_CONTAINER (wscroll), view->canvas);
- view->grid_spacing = 9;
+ bg_color = gl_color_to_gdk_color (BG_COLOR);
+ gtk_widget_modify_bg (GTK_WIDGET (view->canvas), GTK_STATE_NORMAL, bg_color);
+ g_free (bg_color);
- view->default_font_family = NULL;
+ GTK_WIDGET_SET_FLAGS (GTK_WIDGET (view->canvas), GTK_CAN_FOCUS);
+
+ gtk_widget_add_events (GTK_WIDGET (view->canvas),
+ (GDK_FOCUS_CHANGE_MASK |
+ GDK_ENTER_NOTIFY_MASK |
+ GDK_LEAVE_NOTIFY_MASK |
+ GDK_POINTER_MOTION_MASK |
+ GDK_BUTTON_PRESS_MASK |
+ GDK_BUTTON_RELEASE_MASK |
+ GDK_KEY_PRESS_MASK));
+
+ g_signal_connect_swapped (G_OBJECT (view->canvas), "expose-event",
+ G_CALLBACK (expose_cb), view);
+ g_signal_connect_swapped (G_OBJECT (view->canvas), "realize",
+ G_CALLBACK (realize_cb), view);
+ g_signal_connect_swapped (G_OBJECT (view->canvas), "size-allocate",
+ G_CALLBACK (size_allocate_cb), view);
+ g_signal_connect_swapped (G_OBJECT (view->canvas), "screen-changed",
+ G_CALLBACK (screen_changed_cb), view);
+ g_signal_connect_swapped (G_OBJECT (view->canvas), "focus-in-event",
+ G_CALLBACK (focus_in_event_cb), view);
+ g_signal_connect_swapped (G_OBJECT (view->canvas), "focus-out-event",
+ G_CALLBACK (focus_out_event_cb), view);
+ g_signal_connect_swapped (G_OBJECT (view->canvas), "enter-notify-event",
+ G_CALLBACK (enter_notify_event_cb), view);
+ g_signal_connect_swapped (G_OBJECT (view->canvas), "leave-notify-event",
+ G_CALLBACK (leave_notify_event_cb), view);
+ g_signal_connect_swapped (G_OBJECT (view->canvas), "motion-notify-event",
+ G_CALLBACK (motion_notify_event_cb), view);
+ g_signal_connect_swapped (G_OBJECT (view->canvas), "button-press-event",
+ G_CALLBACK (button_press_event_cb), view);
+ g_signal_connect_swapped (G_OBJECT (view->canvas), "button-release-event",
+ G_CALLBACK (button_release_event_cb), view);
+ g_signal_connect_swapped (G_OBJECT (view->canvas), "key-press-event",
+ G_CALLBACK (key_press_event_cb), view);
+
+ /*
+ * Clipboard
+ */
+ view->have_selection = FALSE;
+ view->selection_data = NULL;
+ view->invisible = gtk_invisible_new ();
+ if (!clipboard_atom) {
+ clipboard_atom = gdk_atom_intern ("GLABELS_CLIPBOARD", FALSE);
+ }
+ gtk_selection_add_target (view->invisible,
+ clipboard_atom, GDK_SELECTION_TYPE_STRING, 1);
+ g_signal_connect (G_OBJECT (view->invisible),
+ "selection_clear_event",
+ G_CALLBACK (selection_clear_cb), view);
+ g_signal_connect (G_OBJECT (view->invisible), "selection_get",
+ G_CALLBACK (selection_get_cb), view);
+ g_signal_connect (G_OBJECT (view->invisible),
+ "selection_received",
+ G_CALLBACK (selection_received_cb), view);
+
+ /*
+ * Defaults from preferences
+ */
+ gl_view_set_default_font_family (view, gl_prefs->default_font_family);
+ gl_view_set_default_font_size (view, gl_prefs->default_font_size);
+ gl_view_set_default_font_weight (view, gl_prefs->default_font_weight);
+ gl_view_set_default_font_italic_flag (view, gl_prefs->default_font_italic_flag);
+ gl_view_set_default_text_color (view, gl_prefs->default_text_color);
+ gl_view_set_default_text_alignment (view, gl_prefs->default_text_alignment);
+ gl_view_set_default_text_line_spacing (view, gl_prefs->default_text_line_spacing);
+ gl_view_set_default_line_width (view, gl_prefs->default_line_width);
+ gl_view_set_default_line_color (view, gl_prefs->default_line_color);
+ gl_view_set_default_fill_color (view, gl_prefs->default_fill_color);
gl_debug (DEBUG_VIEW, "END");
}
static void
gl_view_finalize (GObject *object)
{
- glView *view;
+ glView *view = GL_VIEW (object);
gl_debug (DEBUG_VIEW, "START");
g_return_if_fail (object != NULL);
g_return_if_fail (GL_IS_VIEW (object));
- view = GL_VIEW (object);
+ if (view->default_font_family) {
+ g_free (view->default_font_family);
+ }
- G_OBJECT_CLASS (parent_class)->finalize (object);
+ G_OBJECT_CLASS (gl_view_parent_class)->finalize (object);
gl_debug (DEBUG_VIEW, "END");
}
g_return_val_if_fail (label && GL_IS_LABEL (label), NULL);
- view = g_object_new (gl_view_get_type (), NULL);
- view->label = label;
+ view = g_object_new (GL_TYPE_VIEW, NULL);
- gl_view_construct (view);
+ gl_view_construct (view, label);
gl_debug (DEBUG_VIEW, "END");
/* PRIVATE. Construct composite widget. */
/*---------------------------------------------------------------------------*/
static void
-gl_view_construct (glView *view)
+gl_view_construct (glView *view,
+ glLabel *label)
{
- GtkWidget *wvbox, *wscroll;
+ GList *p_obj;
+ glLabelObject *object;
gl_debug (DEBUG_VIEW, "START");
g_return_if_fail (GL_IS_VIEW (view));
- wvbox = GTK_WIDGET (view);
-
- view->state = GL_VIEW_STATE_ARROW;
- view->object_list = NULL;
-
- gl_view_construct_canvas (view);
- wscroll = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (wscroll),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_AUTOMATIC);
- gtk_box_pack_start (GTK_BOX (wvbox), wscroll, TRUE, TRUE, 0);
- gtk_container_add (GTK_CONTAINER (wscroll), view->canvas);
-
- gl_view_construct_selection (view);
-
- construct_selection_menu (view);
- construct_empty_selection_menu (view);
-
- gl_view_set_default_font_family (view, gl_prefs->default_font_family);
- gl_view_set_default_font_size (view, gl_prefs->default_font_size);
- gl_view_set_default_font_weight (view, gl_prefs->default_font_weight);
- gl_view_set_default_font_italic_flag (view, gl_prefs->default_font_italic_flag);
- gl_view_set_default_text_color (view, gl_prefs->default_text_color);
- gl_view_set_default_text_alignment (view, gl_prefs->default_text_alignment);
- gl_view_set_default_line_width (view, gl_prefs->default_line_width);
- gl_view_set_default_line_color (view, gl_prefs->default_line_color);
- gl_view_set_default_fill_color (view, gl_prefs->default_fill_color);
-
- gl_debug (DEBUG_VIEW, "END");
-}
-
-/*---------------------------------------------------------------------------*/
-/* PRIVATE. Create canvas w/ a background in the shape of the label/card. */
-/*---------------------------------------------------------------------------*/
-static GtkWidget *
-gl_view_construct_canvas (glView *view)
-{
- glLabel *label;
- gdouble label_width, label_height;
- GdkColor *bg_color;
-
- gl_debug (DEBUG_VIEW, "START");
-
- g_return_val_if_fail (view && GL_IS_VIEW (view), NULL);
- g_return_val_if_fail (view->label && GL_IS_LABEL (view->label), NULL);
-
- label = view->label;
-
- gtk_widget_push_colormap (gdk_rgb_get_colormap ());
- view->canvas = gnome_canvas_new_aa ();
- gtk_widget_pop_colormap ();
-
- bg_color = gl_color_to_gdk_color (BG_COLOR);
- gtk_widget_modify_bg (GTK_WIDGET(view->canvas), GTK_STATE_NORMAL, bg_color);
- g_free (bg_color);
-
- gl_label_get_size (label, &label_width, &label_height);
- gl_debug (DEBUG_VIEW, "Label size: w=%lf, h=%lf",
- label_width, label_height);
-
- view->zoom = 1.0;
- view->home_scale = get_home_scale (view);
- gnome_canvas_set_pixels_per_unit (GNOME_CANVAS (view->canvas), view->home_scale);
-
- gnome_canvas_set_scroll_region (GNOME_CANVAS (view->canvas),
- 0.0, 0.0, label_width, label_height);
-
- draw_layers (view);
+ view->label = label;
- g_signal_connect (G_OBJECT (view->canvas), "event",
- G_CALLBACK (canvas_event), view);
+ for (p_obj = label->objects; p_obj != NULL; p_obj = p_obj->next)
+ {
+ object = GL_LABEL_OBJECT (p_obj->data);
- g_signal_connect_swapped (G_OBJECT (view->canvas), "size-allocate",
- G_CALLBACK (size_allocate_cb), view);
+ if (GL_IS_LABEL_BOX (object)) {
+ gl_view_box_new (GL_LABEL_BOX(object), view);
+ } else if (GL_IS_LABEL_ELLIPSE (object)) {
+ gl_view_ellipse_new (GL_LABEL_ELLIPSE(object), view);
+ } else if (GL_IS_LABEL_LINE (object)) {
+ gl_view_line_new (GL_LABEL_LINE(object), view);
+ } else if (GL_IS_LABEL_IMAGE (object)) {
+ gl_view_image_new (GL_LABEL_IMAGE(object), view);
+ } else if (GL_IS_LABEL_TEXT (object)) {
+ gl_view_text_new (GL_LABEL_TEXT(object), view);
+ } else if (GL_IS_LABEL_BARCODE (object)) {
+ gl_view_barcode_new (GL_LABEL_BARCODE(object), view);
+ } else {
+ /* Should not happen! */
+ g_message ("Invalid label object type.");
+ }
+ }
- g_signal_connect_swapped (G_OBJECT (view->canvas), "screen-changed",
- G_CALLBACK (screen_changed_cb), view);
+ g_signal_connect_swapped (G_OBJECT (view->label), "changed",
+ G_CALLBACK (label_changed_cb), view);
+ g_signal_connect_swapped (G_OBJECT (view->label), "size_changed",
+ G_CALLBACK (label_resized_cb), view);
+ g_signal_connect_swapped (G_OBJECT (view->label), "object_added",
+ G_CALLBACK (label_object_added_cb), view);
gl_debug (DEBUG_VIEW, "END");
-
- return view->canvas;
}
/*---------------------------------------------------------------------------*/
get_home_scale (glView *view)
{
GdkScreen *screen;
- gdouble screen_width_pixels, screen_width_mm;
- gdouble screen_height_pixels, screen_height_mm;
- gdouble x_pixels_per_mm, y_pixels_per_mm;
+ gdouble screen_width_pixels;
+ gdouble screen_width_mm;
+ gdouble screen_height_pixels;
+ gdouble screen_height_mm;
+ gdouble x_pixels_per_mm;
+ gdouble y_pixels_per_mm;
gdouble scale;
- if (!gtk_widget_has_screen) return 1.0;
+ if (view->canvas == NULL) return 1.0;
+
+ if (!gtk_widget_has_screen (GTK_WIDGET (view->canvas))) return 1.0;
screen = gtk_widget_get_screen (GTK_WIDGET (view->canvas));
}
/*---------------------------------------------------------------------------*/
-/* PRIVATE. Create clipboard selection targets. */
+/* Schedule canvas update. */
/*---------------------------------------------------------------------------*/
-static void
-gl_view_construct_selection (glView *view)
+void
+gl_view_update (glView *view)
{
+ GtkWidget *widget;
+ GdkRegion *region;
+
gl_debug (DEBUG_VIEW, "START");
- g_return_if_fail (GL_IS_VIEW (view));
-
- view->have_selection = FALSE;
- view->selection_data = NULL;
- view->invisible = gtk_invisible_new ();
+ widget = GTK_WIDGET (view->canvas);
- view->selected_object_list = NULL;
+ if (!widget->window) return;
- if (!clipboard_atom) {
- clipboard_atom = gdk_atom_intern ("GLABELS_CLIPBOARD", FALSE);
- }
+ if ( !view->update_scheduled_flag )
+ {
+ view->update_scheduled_flag = TRUE;
- gtk_selection_add_target (view->invisible,
- clipboard_atom, GDK_SELECTION_TYPE_STRING, 1);
-
- g_signal_connect (G_OBJECT (view->invisible),
- "selection_clear_event",
- G_CALLBACK (selection_clear_cb), view);
-
- g_signal_connect (G_OBJECT (view->invisible), "selection_get",
- G_CALLBACK (selection_get_cb), view);
-
- g_signal_connect (G_OBJECT (view->invisible),
- "selection_received",
- G_CALLBACK (selection_received_cb), view);
+ region = gdk_drawable_get_clip_region (widget->window);
+ /* redraw the cairo canvas completely by exposing it */
+ gdk_window_invalidate_region (widget->window, region, TRUE);
+ gdk_region_destroy (region);
+ }
gl_debug (DEBUG_VIEW, "END");
}
/*---------------------------------------------------------------------------*/
-/* PRIVATE. Create, draw and order layers. */
+/* Schedule canvas region update. */
/*---------------------------------------------------------------------------*/
-static void
-draw_layers (glView *view)
+void
+gl_view_update_region (glView *view,
+ cairo_t *cr,
+ glLabelRegion *region)
{
- g_return_if_fail (view && GL_IS_VIEW (view));
- g_return_if_fail (view->label && GL_IS_LABEL (view->label));
+ GtkWidget *widget;
+ GdkRectangle rect;
+ gdouble x, y, w, h;
- draw_bg_fg_layers (view);
- draw_grid_layer (view);
- draw_markup_layer (view);
- draw_highlight_layer (view); /* Must be done before label layer */
- draw_label_layer (view);
+ gl_debug (DEBUG_VIEW, "START");
- gnome_canvas_item_raise_to_top (GNOME_CANVAS_ITEM(view->fg_group));
- gnome_canvas_item_raise_to_top (GNOME_CANVAS_ITEM(view->highlight_group));
+ widget = GTK_WIDGET (view->canvas);
- g_signal_connect (G_OBJECT (view->label), "size_changed",
- G_CALLBACK (label_resized_cb), view);
-}
+ if (!widget->window) return;
-/*---------------------------------------------------------------------------*/
-/* PRIVATE. Handle label resize event. . */
-/*---------------------------------------------------------------------------*/
-static void
-label_resized_cb (glLabel *label,
- glView *view)
-{
- g_return_if_fail (label && GL_IS_LABEL (label));
- g_return_if_fail (view && GL_IS_VIEW (view));
+ x = MIN (region->x1, region->x2);
+ y = MIN (region->y1, region->y2);
+ w = fabs (region->x2 - region->x1);
+ h = fabs (region->y2 - region->y1);
+
+ cairo_user_to_device (cr, &x, &y);
+ cairo_user_to_device_distance (cr, &w, &h);
- gtk_object_destroy (GTK_OBJECT (view->bg_group));
- gtk_object_destroy (GTK_OBJECT (view->grid_group));
- gtk_object_destroy (GTK_OBJECT (view->markup_group));
- gtk_object_destroy (GTK_OBJECT (view->fg_group));
+ rect.x = x - 3;
+ rect.y = y - 3;
+ rect.width = w + 6;
+ rect.height = h + 6;
- draw_bg_fg_layers (view);
- draw_grid_layer (view);
- draw_markup_layer (view);
+ gdk_window_invalidate_rect (widget->window, &rect, TRUE);
- gnome_canvas_item_raise_to_top (GNOME_CANVAS_ITEM(view->label_group));
- gnome_canvas_item_raise_to_top (GNOME_CANVAS_ITEM(view->fg_group));
- gnome_canvas_item_raise_to_top (GNOME_CANVAS_ITEM(view->highlight_group));
+ gl_debug (DEBUG_VIEW, "END");
}
/*---------------------------------------------------------------------------*/
-/* PRIVATE. Draw label layer. */
+/* PRIVATE. Expose handler. */
/*---------------------------------------------------------------------------*/
-static void
-draw_label_layer (glView *view)
+static gboolean
+expose_cb (glView *view,
+ GdkEventExpose *event)
{
- GnomeCanvasGroup *group;
- glLabel *label;
- GList *p_obj;
- glLabelObject *object;
- glViewObject *view_object;
+ cairo_t *cr;
- g_return_if_fail (view && GL_IS_VIEW (view));
- g_return_if_fail (view->label && GL_IS_LABEL (view->label));
+ gl_debug (DEBUG_VIEW, "START");
- group = gnome_canvas_root (GNOME_CANVAS (view->canvas));
- view->label_group = GNOME_CANVAS_GROUP(
- gnome_canvas_item_new (group,
- gnome_canvas_group_get_type (),
- "x", 0.0,
- "y", 0.0,
- NULL));
+ view->update_scheduled_flag = FALSE;
- label = view->label;
+ /* get a cairo_t */
+ cr = gdk_cairo_create (GTK_LAYOUT (view->canvas)->bin_window);
- for (p_obj = label->objects; p_obj != NULL; p_obj = p_obj->next) {
- object = (glLabelObject *) p_obj->data;
+ cairo_rectangle (cr,
+ event->area.x, event->area.y,
+ event->area.width, event->area.height);
+ cairo_clip (cr);
+
+ draw_layers (view, cr);
- if (GL_IS_LABEL_BOX (object)) {
- view_object = gl_view_box_new (GL_LABEL_BOX(object),
- view);
- } else if (GL_IS_LABEL_ELLIPSE (object)) {
- view_object = gl_view_ellipse_new (GL_LABEL_ELLIPSE(object),
- view);
- } else if (GL_IS_LABEL_LINE (object)) {
- view_object = gl_view_line_new (GL_LABEL_LINE(object),
- view);
- } else if (GL_IS_LABEL_IMAGE (object)) {
- view_object = gl_view_image_new (GL_LABEL_IMAGE(object),
- view);
- } else if (GL_IS_LABEL_TEXT (object)) {
- view_object = gl_view_text_new (GL_LABEL_TEXT(object),
- view);
- } else if (GL_IS_LABEL_BARCODE (object)) {
- view_object = gl_view_barcode_new (GL_LABEL_BARCODE(object),
- view);
- } else {
- /* Should not happen! */
- view_object = NULL;
- g_warning ("Invalid label object type.");
- }
- }
+ cairo_destroy (cr);
+
+ gl_debug (DEBUG_VIEW, "END");
+
+ return FALSE;
}
/*---------------------------------------------------------------------------*/
-/* PRIVATE. Create highlight layer. */
+/* PRIVATE. Realize handler. */
/*---------------------------------------------------------------------------*/
static void
-draw_highlight_layer (glView *view)
+realize_cb (glView *view)
{
- GnomeCanvasGroup *group;
-
g_return_if_fail (view && GL_IS_VIEW (view));
- group = gnome_canvas_root (GNOME_CANVAS (view->canvas));
- view->highlight_group = GNOME_CANVAS_GROUP(
- gnome_canvas_item_new (group,
- gnome_canvas_group_get_type (),
- "x", 0.0,
- "y", 0.0,
- NULL));
+ gl_debug (DEBUG_VIEW, "START");
+
+ gl_debug (DEBUG_VIEW, "END");
}
/*---------------------------------------------------------------------------*/
-/* PRIVATE. Draw background and foreground outlines. */
+/* PRIVATE. Size allocation changed callback. */
/*---------------------------------------------------------------------------*/
static void
-draw_bg_fg_layers (glView *view)
+size_allocate_cb (glView *view,
+ GtkAllocation *allocation)
{
- glLabel *label;
- glTemplate *template;
- GnomeCanvasGroup *group;
-
- g_return_if_fail (view && GL_IS_VIEW (view));
- g_return_if_fail (view->label && GL_IS_LABEL (view->label));
-
- group = gnome_canvas_root (GNOME_CANVAS (view->canvas));
- view->bg_group = GNOME_CANVAS_GROUP(
- gnome_canvas_item_new (group,
- gnome_canvas_group_get_type (),
- "x", 0.0,
- "y", 0.0,
- NULL));
- view->fg_group = GNOME_CANVAS_GROUP(
- gnome_canvas_item_new (group,
- gnome_canvas_group_get_type (),
- "x", 0.0,
- "y", 0.0,
- NULL));
-
- label = view->label;
- template = gl_label_get_template (label);
-
- switch (template->label.style) {
-
- case GL_TEMPLATE_STYLE_RECT:
- if (template->label.rect.r == 0.0) {
- /* Square corners. */
- draw_bg_fg_rect (view);
- } else {
- /* Rounded corners. */
- draw_bg_fg_rounded_rect (view);
- }
- break;
+ gl_debug (DEBUG_VIEW, "START");
- case GL_TEMPLATE_STYLE_ROUND:
- draw_bg_fg_round (view);
- break;
+ GTK_LAYOUT (view->canvas)->hadjustment->page_size = allocation->width;
+ GTK_LAYOUT (view->canvas)->hadjustment->page_increment = allocation->width / 2;
+
+ GTK_LAYOUT (view->canvas)->vadjustment->page_size = allocation->height;
+ GTK_LAYOUT (view->canvas)->vadjustment->page_increment = allocation->height / 2;
- case GL_TEMPLATE_STYLE_CD:
- if ((template->label.cd.w == 0.0) && (template->label.cd.h == 0.0) ) {
- draw_bg_fg_cd (view);
- } else {
- draw_bg_fg_cd_bc (view);
- }
- break;
+ g_signal_emit_by_name (GTK_LAYOUT (view->canvas)->hadjustment, "changed");
+ g_signal_emit_by_name (GTK_LAYOUT (view->canvas)->vadjustment, "changed");
- default:
- g_warning ("Unknown template label style");
- break;
+ if (view->zoom_to_fit_flag) {
+ /* Maintain best fit zoom */
+ gl_view_zoom_to_fit (view);
}
+
+ gl_debug (DEBUG_VIEW, "END");
}
+
+
/*---------------------------------------------------------------------------*/
-/* PRIVATE. Draw simple recangular background. */
+/* PRIVATE. Screen changed callback. */
/*---------------------------------------------------------------------------*/
static void
-draw_bg_fg_rect (glView *view)
+screen_changed_cb (glView *view)
{
- glLabel *label;
- glTemplate *template;
- gdouble w, h;
- GnomeCanvasItem *item;
-
gl_debug (DEBUG_VIEW, "START");
- g_return_if_fail (view && GL_IS_VIEW (view));
- g_return_if_fail (view->label && GL_IS_LABEL (view->label));
+ if (gtk_widget_has_screen (GTK_WIDGET (view->canvas))) {
- label = view->label;
-
- gl_label_get_size (label, &w, &h);
- template = gl_label_get_template (label);
-
- /* Background */
- item = gnome_canvas_item_new (view->bg_group,
- gnome_canvas_rect_get_type (),
- "x1", 0.0,
- "y1", 0.0,
- "x2", w,
- "y2", h,
- "fill_color_rgba", PAPER_COLOR,
- NULL);
-
- /* Foreground */
- item = gnome_canvas_item_new (view->fg_group,
- gnome_canvas_rect_get_type (),
- "x1", 0.0,
- "y1", 0.0,
- "x2", w,
- "y2", h,
- "width_pixels", 2,
- "outline_color_rgba", OUTLINE_COLOR,
- NULL);
+ view->home_scale = get_home_scale (view);
+
+ if (view->zoom_to_fit_flag) {
+ /* Maintain best fit zoom */
+ gl_view_zoom_to_fit (view);
+ }
+ }
gl_debug (DEBUG_VIEW, "END");
}
/*---------------------------------------------------------------------------*/
-/* PRIVATE. Draw rounded recangular background. */
+/* PRIVATE. Handle label changed event. */
/*---------------------------------------------------------------------------*/
static void
-draw_bg_fg_rounded_rect (glView *view)
+label_changed_cb (glView *view)
{
- glLabel *label;
- GnomeCanvasPoints *points;
- gint i_coords, i_theta;
- glTemplate *template;
- gdouble r, w, h;
- GnomeCanvasItem *item;
-
- gl_debug (DEBUG_VIEW, "START");
-
g_return_if_fail (view && GL_IS_VIEW (view));
- g_return_if_fail (view->label && GL_IS_LABEL (view->label));
-
- label = view->label;
-
- gl_label_get_size (label, &w, &h);
- template = gl_label_get_template (label);
- r = template->label.rect.r;
-
- points = gnome_canvas_points_new (4 * (1 + 90 / ARC_COURSE));
- i_coords = 0;
- for (i_theta = 0; i_theta <= 90; i_theta += ARC_COURSE) {
- points->coords[i_coords++] =
- r - r * sin (i_theta * G_PI / 180.0);
- points->coords[i_coords++] =
- r - r * cos (i_theta * G_PI / 180.0);
- }
- for (i_theta = 0; i_theta <= 90; i_theta += ARC_COURSE) {
- points->coords[i_coords++] =
- r - r * cos (i_theta * G_PI / 180.0);
- points->coords[i_coords++] =
- (h - r) + r * sin (i_theta * G_PI / 180.0);
- }
- for (i_theta = 0; i_theta <= 90; i_theta += ARC_COURSE) {
- points->coords[i_coords++] =
- (w - r) + r * sin (i_theta * G_PI / 180.0);
- points->coords[i_coords++] =
- (h - r) + r * cos (i_theta * G_PI / 180.0);
- }
- for (i_theta = 0; i_theta <= 90; i_theta += ARC_COURSE) {
- points->coords[i_coords++] =
- (w - r) + r * cos (i_theta * G_PI / 180.0);
- points->coords[i_coords++] =
- r - r * sin (i_theta * G_PI / 180.0);
- }
-
- /* Background */
- item = gnome_canvas_item_new (view->bg_group,
- gnome_canvas_polygon_get_type (),
- "points", points,
- "fill_color_rgba", PAPER_COLOR,
- NULL);
- /* Foreground */
- item = gnome_canvas_item_new (view->fg_group,
- gnome_canvas_polygon_get_type (),
- "points", points,
- "width_pixels", 2,
- "outline_color_rgba", OUTLINE_COLOR,
- NULL);
+ gl_debug (DEBUG_VIEW, "START");
- gnome_canvas_points_free (points);
+ gl_view_update (view);
gl_debug (DEBUG_VIEW, "END");
}
+
/*---------------------------------------------------------------------------*/
-/* PRIVATE. Draw round background. */
+/* PRIVATE. Handle label resize event. */
/*---------------------------------------------------------------------------*/
static void
-draw_bg_fg_round (glView *view)
+label_resized_cb (glView *view)
{
- glLabel *label;
- glTemplate *template;
- gdouble r;
- GnomeCanvasItem *item;
+ g_return_if_fail (view && GL_IS_VIEW (view));
gl_debug (DEBUG_VIEW, "START");
- g_return_if_fail (view && GL_IS_VIEW (view));
- g_return_if_fail (view->label && GL_IS_LABEL(view->label));
+ g_signal_emit_by_name (GTK_LAYOUT (view->canvas)->hadjustment, "changed");
+ g_signal_emit_by_name (GTK_LAYOUT (view->canvas)->vadjustment, "changed");
- label = view->label;
- template = gl_label_get_template (label);
-
- r = template->label.round.r;
-
- /* Background */
- item = gnome_canvas_item_new (view->bg_group,
- gnome_canvas_ellipse_get_type (),
- "x1", 0.0,
- "y1", 0.0,
- "x2", 2.0*r,
- "y2", 2.0*r,
- "fill_color_rgba", PAPER_COLOR,
- NULL);
-
- /* Foreground */
- item = gnome_canvas_item_new (view->fg_group,
- gnome_canvas_ellipse_get_type (),
- "x1", 0.0,
- "y1", 0.0,
- "x2", 2.0*r,
- "y2", 2.0*r,
- "width_pixels", 2,
- "outline_color_rgba", OUTLINE_COLOR,
- NULL);
+ gl_view_update (view);
gl_debug (DEBUG_VIEW, "END");
}
+
/*---------------------------------------------------------------------------*/
-/* PRIVATE. Draw CD style background, circular w/ concentric hole. */
+/* PRIVATE. Handle new label object. */
/*---------------------------------------------------------------------------*/
static void
-draw_bg_fg_cd (glView *view)
+label_object_added_cb (glView *view,
+ glLabelObject *object)
{
- glLabel *label;
- glTemplate *template;
- gdouble r1, r2;
- GnomeCanvasItem *item;
-
- gl_debug (DEBUG_VIEW, "START");
+ glViewObject *view_object;
g_return_if_fail (view && GL_IS_VIEW (view));
- g_return_if_fail (view->label && GL_IS_LABEL (view->label));
+ g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
- label = view->label;
- template = gl_label_get_template (label);
-
- r1 = template->label.cd.r1;
- r2 = template->label.cd.r2;
-
- /* Background */
- /* outer circle */
- item = gnome_canvas_item_new (view->bg_group,
- gnome_canvas_ellipse_get_type (),
- "x1", 0.0,
- "y1", 0.0,
- "x2", 2.0*r1,
- "y2", 2.0*r1,
- "fill_color_rgba", PAPER_COLOR,
- NULL);
- /* hole */
- item = gnome_canvas_item_new (view->bg_group,
- gnome_canvas_ellipse_get_type (),
- "x1", r1 - r2,
- "y1", r1 - r2,
- "x2", r1 + r2,
- "y2", r1 + r2,
- "fill_color_rgba", GRID_COLOR,
- NULL);
-
- /* Foreground */
- /* outer circle */
- item = gnome_canvas_item_new (view->fg_group,
- gnome_canvas_ellipse_get_type (),
- "x1", 0.0,
- "y1", 0.0,
- "x2", 2.0*r1,
- "y2", 2.0*r1,
- "width_pixels", 2,
- "outline_color_rgba", OUTLINE_COLOR,
- NULL);
- /* hole */
- item = gnome_canvas_item_new (view->fg_group,
- gnome_canvas_ellipse_get_type (),
- "x1", r1 - r2,
- "y1", r1 - r2,
- "x2", r1 + r2,
- "y2", r1 + r2,
- "width_pixels", 2,
- "outline_color_rgba", OUTLINE_COLOR,
- NULL);
+ if (GL_IS_LABEL_BOX (object)) {
+ view_object = gl_view_box_new (GL_LABEL_BOX(object), view);
+ } else if (GL_IS_LABEL_ELLIPSE (object)) {
+ view_object = gl_view_ellipse_new (GL_LABEL_ELLIPSE(object), view);
+ } else if (GL_IS_LABEL_LINE (object)) {
+ view_object = gl_view_line_new (GL_LABEL_LINE(object), view);
+ } else if (GL_IS_LABEL_IMAGE (object)) {
+ view_object = gl_view_image_new (GL_LABEL_IMAGE(object), view);
+ } else if (GL_IS_LABEL_TEXT (object)) {
+ view_object = gl_view_text_new (GL_LABEL_TEXT(object), view);
+ } else if (GL_IS_LABEL_BARCODE (object)) {
+ view_object = gl_view_barcode_new (GL_LABEL_BARCODE(object), view);
+ } else {
+ /* Should not happen! */
+ view_object = NULL;
+ g_message ("Invalid label object type.");
+ }
- gl_debug (DEBUG_VIEW, "END");
+ gl_view_select_object (view, view_object);
}
/*---------------------------------------------------------------------------*/
-/* PRIVATE. Draw Business Card CD style background, CD w/ chopped ends. */
+/* PRIVATE. Create, draw and order layers. */
/*---------------------------------------------------------------------------*/
static void
-draw_bg_fg_cd_bc (glView *view)
+draw_layers (glView *view,
+ cairo_t *cr)
{
- glLabel *label;
- glTemplate *template;
- GnomeCanvasPoints *points;
- gint i_coords, i_theta;
- gdouble theta1, theta2;
- gdouble x0, y0, w, h, r1, r2;
- GnomeCanvasItem *item;
-
- gl_debug (DEBUG_VIEW, "START");
+ gdouble scale;
+ gdouble w, h;
+ gint canvas_w, canvas_h;
g_return_if_fail (view && GL_IS_VIEW (view));
g_return_if_fail (view->label && GL_IS_LABEL (view->label));
- label = view->label;
-
- template = gl_label_get_template (label);
- gl_label_get_size (label, &w, &h);
- x0 = w/2.0;
- y0 = h/2.0;
+ gl_debug (DEBUG_VIEW, "START");
- r1 = template->label.cd.r1;
- r2 = template->label.cd.r2;
+ scale = view->zoom * view->home_scale;
- theta1 = (180.0/G_PI) * acos (w / (2.0*r1));
- theta2 = (180.0/G_PI) * asin (h / (2.0*r1));
+ gl_label_get_size (view->label, &w, &h);
- points = gnome_canvas_points_new (360/ARC_FINE + 1);
- i_coords = 0;
+ scale = view->home_scale * view->zoom;
+ gtk_layout_set_size (GTK_LAYOUT (view->canvas), w*scale+8, h*scale+8);
- points->coords[i_coords++] = x0 + r1 * cos (theta1 * G_PI / 180.0);
- points->coords[i_coords++] = y0 + r1 * sin (theta1 * G_PI / 180.0);
+ gdk_drawable_get_size (GTK_LAYOUT (view->canvas)->bin_window, &canvas_w, &canvas_h);
- for ( i_theta = theta1 + ARC_FINE; i_theta < theta2; i_theta +=ARC_FINE ) {
- points->coords[i_coords++] = x0 + r1 * cos (i_theta * G_PI / 180.0);
- points->coords[i_coords++] = y0 + r1 * sin (i_theta * G_PI / 180.0);
- }
+ view->x0 = (canvas_w/scale - w) / 2.0;
+ view->y0 = (canvas_h/scale - h) / 2.0;
+ view->w = w;
+ view->h = h;
- points->coords[i_coords++] = x0 + r1 * cos (theta2 * G_PI / 180.0);
- points->coords[i_coords++] = y0 + r1 * sin (theta2 * G_PI / 180.0);
+ cairo_save (cr);
+ cairo_scale (cr, scale, scale);
+ cairo_translate (cr, view->x0, view->y0);
- if ( fabs (theta2 - 90.0) > GNOME_CANVAS_EPSILON ) {
- points->coords[i_coords++] = x0 + r1 * cos ((180-theta2) * G_PI / 180.0);
- points->coords[i_coords++] = y0 + r1 * sin ((180-theta2) * G_PI / 180.0);
- }
+ draw_bg_layer (view, cr);
+ draw_grid_layer (view, cr);
+ draw_markup_layer (view, cr);
+ draw_objects_layer (view, cr);
+ draw_fg_layer (view, cr);
+ draw_highlight_layer (view, cr);
+ draw_select_region_layer (view, cr);
- for ( i_theta = 180-theta2+ARC_FINE; i_theta < (180-theta1); i_theta +=ARC_FINE ) {
- points->coords[i_coords++] = x0 + r1 * cos (i_theta * G_PI / 180.0);
- points->coords[i_coords++] = y0 + r1 * sin (i_theta * G_PI / 180.0);
- }
-
- points->coords[i_coords++] = x0 + r1 * cos ((180-theta1) * G_PI / 180.0);
- points->coords[i_coords++] = y0 + r1 * sin ((180-theta1) * G_PI / 180.0);
-
- if ( fabs (theta1) > GNOME_CANVAS_EPSILON ) {
- points->coords[i_coords++] = x0 + r1 * cos ((180+theta1) * G_PI / 180.0);
- points->coords[i_coords++] = y0 + r1 * sin ((180+theta1) * G_PI / 180.0);
- }
-
- for ( i_theta = 180+theta1+ARC_FINE; i_theta < (180+theta2); i_theta +=ARC_FINE ) {
- points->coords[i_coords++] = x0 + r1 * cos (i_theta * G_PI / 180.0);
- points->coords[i_coords++] = y0 + r1 * sin (i_theta * G_PI / 180.0);
- }
-
- points->coords[i_coords++] = x0 + r1 * cos ((180+theta2) * G_PI / 180.0);
- points->coords[i_coords++] = y0 + r1 * sin ((180+theta2) * G_PI / 180.0);
-
- if ( fabs (theta2 - 90.0) > GNOME_CANVAS_EPSILON ) {
- points->coords[i_coords++] = x0 + r1 * cos ((360-theta2) * G_PI / 180.0);
- points->coords[i_coords++] = y0 + r1 * sin ((360-theta2) * G_PI / 180.0);
- }
-
- for ( i_theta = 360-theta2+ARC_FINE; i_theta < (360-theta1); i_theta +=ARC_FINE ) {
- points->coords[i_coords++] = x0 + r1 * cos (i_theta * G_PI / 180.0);
- points->coords[i_coords++] = y0 + r1 * sin (i_theta * G_PI / 180.0);
- }
-
- if ( fabs (theta1) > GNOME_CANVAS_EPSILON ) {
- points->coords[i_coords++] = x0 + r1 * cos ((360-theta1) * G_PI / 180.0);
- points->coords[i_coords++] = y0 + r1 * sin ((360-theta1) * G_PI / 180.0);
- }
-
- points->num_points = i_coords / 2;
-
- /* Background */
- /* outer circle */
- item = gnome_canvas_item_new (view->bg_group,
- gnome_canvas_polygon_get_type (),
- "points", points,
- "fill_color_rgba", PAPER_COLOR,
- NULL);
- /* hole */
- item = gnome_canvas_item_new (view->bg_group,
- gnome_canvas_ellipse_get_type (),
- "x1", x0 - r2,
- "y1", y0 - r2,
- "x2", x0 + r2,
- "y2", y0 + r2,
- "fill_color_rgba", GRID_COLOR,
- NULL);
-
- /* Foreground */
- /* outer circle */
- item = gnome_canvas_item_new (view->fg_group,
- gnome_canvas_polygon_get_type (),
- "points", points,
- "width_pixels", 2,
- "outline_color_rgba", OUTLINE_COLOR,
- NULL);
- /* hole */
- item = gnome_canvas_item_new (view->fg_group,
- gnome_canvas_ellipse_get_type (),
- "x1", x0 - r2,
- "y1", y0 - r2,
- "x2", x0 + r2,
- "y2", y0 + r2,
- "width_pixels", 2,
- "outline_color_rgba", OUTLINE_COLOR,
- NULL);
-
- gnome_canvas_points_free (points);
+ cairo_restore (cr);
gl_debug (DEBUG_VIEW, "END");
+
}
/*---------------------------------------------------------------------------*/
-/* PRIVATE. Draw grid lines. */
+/* PRIVATE. Draw background */
/*---------------------------------------------------------------------------*/
static void
-draw_grid_layer (glView *view)
+draw_bg_layer (glView *view,
+ cairo_t *cr)
{
- gdouble w, h, x, y;
- GnomeCanvasPoints *points;
- GnomeCanvasItem *item;
- GnomeCanvasGroup *group;
-
- gl_debug (DEBUG_VIEW, "START");
-
g_return_if_fail (view && GL_IS_VIEW (view));
- g_return_if_fail (view->label && GL_IS_LABEL(view->label));
-
- gl_label_get_size (view->label, &w, &h);
-
- group = gnome_canvas_root (GNOME_CANVAS (view->canvas));
- view->grid_group = GNOME_CANVAS_GROUP(
- gnome_canvas_item_new (group,
- gnome_canvas_group_get_type (),
- "x", 0.0,
- "y", 0.0,
- NULL));
- points = gnome_canvas_points_new (2);
-
- points->coords[1] = 0.0;
- points->coords[3] = h;
- for ( x=0.0; x < w; x += view->grid_spacing ) {
- points->coords[0] = points->coords[2] = x;
- item = gnome_canvas_item_new (view->grid_group,
- gnome_canvas_line_get_type (),
- "points", points,
- "width_pixels", 1,
- "fill_color_rgba", GRID_COLOR,
- NULL);
- }
- points->coords[0] = points->coords[2] = w;
- item = gnome_canvas_item_new (view->grid_group,
- gnome_canvas_line_get_type (),
- "points", points,
- "width_pixels", 1,
- "fill_color_rgba", GRID_COLOR,
- NULL);
-
- points->coords[0] = 0.0;
- points->coords[2] = w;
- for ( y=0.0; y < h; y += view->grid_spacing ) {
- points->coords[1] = points->coords[3] = y;
- item = gnome_canvas_item_new (view->grid_group,
- gnome_canvas_line_get_type (),
- "points", points,
- "width_pixels", 1,
- "fill_color_rgba", GRID_COLOR,
- NULL);
- }
- points->coords[1] = points->coords[3] = h;
- item = gnome_canvas_item_new (view->grid_group,
- gnome_canvas_line_get_type (),
- "points", points,
- "width_pixels", 1,
- "fill_color_rgba", GRID_COLOR,
- NULL);
+ g_return_if_fail (view->label && GL_IS_LABEL (view->label));
- gnome_canvas_points_free (points);
+ gl_cairo_label_path (cr, view->label->template, view->label->rotate_flag, FALSE);
- gl_debug (DEBUG_VIEW, "END");
+ cairo_set_source_rgb (cr, PAPER_RGB_ARGS);
+ cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD);
+ cairo_fill (cr);
}
/*---------------------------------------------------------------------------*/
-/* PRIVATE. Draw markup lines. */
+/* PRIVATE. Draw grid lines. */
/*---------------------------------------------------------------------------*/
static void
-draw_markup_layer (glView *view)
+draw_grid_layer (glView *view,
+ cairo_t *cr)
{
- GnomeCanvasGroup *group;
- glLabel *label;
- glTemplate *template;
- GList *p;
- glTemplateMarkup *markup;
+ gdouble w, h;
+ gdouble x, y;
+ gdouble x0, y0;
+ const lglTemplateFrame *frame;
+
+ gl_debug (DEBUG_VIEW, "START");
g_return_if_fail (view && GL_IS_VIEW (view));
- g_return_if_fail (view->label && GL_IS_LABEL (view->label));
+ g_return_if_fail (view->label && GL_IS_LABEL(view->label));
- group = gnome_canvas_root (GNOME_CANVAS (view->canvas));
- view->markup_group = GNOME_CANVAS_GROUP(
- gnome_canvas_item_new (group,
- gnome_canvas_group_get_type (),
- "x", 0.0,
- "y", 0.0,
- NULL));
-
- label = view->label;
- template = gl_label_get_template (label);
-
- for ( p=template->label.any.markups; p != NULL; p=p->next ) {
- markup = (glTemplateMarkup *)p->data;
-
- switch (markup->type) {
- case GL_TEMPLATE_MARKUP_MARGIN:
- draw_markup_margin (view,
- (glTemplateMarkupMargin *)markup);
- break;
- case GL_TEMPLATE_MARKUP_LINE:
- draw_markup_line (view,
- (glTemplateMarkupLine *)markup);
- break;
- case GL_TEMPLATE_MARKUP_CIRCLE:
- draw_markup_circle (view,
- (glTemplateMarkupCircle *)markup);
- break;
- default:
- g_warning ("Unknown template markup type");
- break;
- }
- }
-}
+ if (view->grid_visible)
+ {
-/*---------------------------------------------------------------------------*/
-/* PRIVATE. Draw margin markup. */
-/*---------------------------------------------------------------------------*/
-static void
-draw_markup_margin (glView *view,
- glTemplateMarkupMargin *margin)
-{
- glLabel *label;
- glTemplate *template;
+ frame = lgl_template_get_first_frame (view->label->template);
- g_return_if_fail (view && GL_IS_VIEW (view));
- g_return_if_fail (view->label && GL_IS_LABEL (view->label));
+ gl_label_get_size (view->label, &w, &h);
+
+ if (frame->shape == LGL_TEMPLATE_FRAME_SHAPE_RECT) {
+ x0 = 0.0;
+ y0 = 0.0;
+ } else {
+ /* round labels, adjust grid to line up with center of label. */
+ x0 = fmod (w/2.0, view->grid_spacing);
+ y0 = fmod (h/2.0, view->grid_spacing);
+ }
- label = view->label;
- template = gl_label_get_template (label);
- switch (template->label.style) {
+ cairo_save (cr);
- case GL_TEMPLATE_STYLE_RECT:
- if (template->label.rect.r == 0.0) {
- /* Square corners. */
- draw_markup_margin_rect (view, margin);
- } else {
- if ( margin->size < template->label.rect.r) {
- /* Rounded corners. */
- draw_markup_margin_rounded_rect (view, margin);
- } else {
- /* Square corners. */
- draw_markup_margin_rect (view, margin);
- }
- }
- break;
+ cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
+ cairo_set_line_width (cr, GRID_LINE_WIDTH_PIXELS/(view->home_scale * view->zoom));
+ cairo_set_source_rgb (cr, GRID_RGB_ARGS);
- case GL_TEMPLATE_STYLE_ROUND:
- draw_markup_margin_round (view, margin);
- break;
+ for ( x=x0+view->grid_spacing; x < w; x += view->grid_spacing )
+ {
+ cairo_move_to (cr, x, 0);
+ cairo_line_to (cr, x, h);
+ cairo_stroke (cr);
+ }
- case GL_TEMPLATE_STYLE_CD:
- if ((template->label.cd.w == 0.0) && (template->label.cd.h == 0.0) ) {
- draw_markup_margin_cd (view, margin);
- } else {
- draw_markup_margin_cd_bc (view, margin);
- }
- break;
+ for ( y=y0+view->grid_spacing; y < h; y += view->grid_spacing )
+ {
+ cairo_move_to (cr, 0, y);
+ cairo_line_to (cr, w, y);
+ cairo_stroke (cr);
+ }
- default:
- g_warning ("Unknown template label style");
- break;
- }
+ cairo_restore (cr);
+
+ }
+
+ gl_debug (DEBUG_VIEW, "END");
}
/*---------------------------------------------------------------------------*/
-/* PRIVATE. Draw simple recangular margin. */
+/* PRIVATE. Draw markup layer. */
/*---------------------------------------------------------------------------*/
static void
-draw_markup_margin_rect (glView *view,
- glTemplateMarkupMargin *margin)
+draw_markup_layer (glView *view,
+ cairo_t *cr)
{
- glLabel *label;
- glTemplate *template;
- gdouble w, h, m;
- GnomeCanvasItem *item;
-
- gl_debug (DEBUG_VIEW, "START");
+ glLabel *label;
+ const lglTemplateFrame *frame;
+ GList *p;
+ lglTemplateMarkup *markup;
g_return_if_fail (view && GL_IS_VIEW (view));
g_return_if_fail (view->label && GL_IS_LABEL (view->label));
- label = view->label;
+ if (view->markup_visible)
+ {
- gl_label_get_size (label, &w, &h);
- template = gl_label_get_template (label);
- m = margin->size;
+ label = view->label;
+ frame = lgl_template_get_first_frame (label->template);
- /* Bounding box @ margin */
- gnome_canvas_item_new (view->markup_group,
- gnome_canvas_rect_get_type (),
- "x1", m,
- "y1", m,
- "x2", w - m,
- "y2", h - m,
- "width_pixels", 1,
- "outline_color_rgba", MARKUP_COLOR,
- NULL);
+ cairo_save (cr);
- gl_debug (DEBUG_VIEW, "END");
-}
+ cairo_set_line_width (cr, MARKUP_LINE_WIDTH_PIXELS/(view->home_scale * view->zoom));
+ cairo_set_source_rgb (cr, MARKUP_RGB_ARGS);
-/*---------------------------------------------------------------------------*/
-/* PRIVATE. Draw rounded recangular markup. */
-/*---------------------------------------------------------------------------*/
-static void
-draw_markup_margin_rounded_rect (glView *view,
- glTemplateMarkupMargin *margin)
-{
- glLabel *label;
- GnomeCanvasPoints *points;
- gint i_coords, i_theta;
- glTemplate *template;
- gdouble r, w, h, m;
- GnomeCanvasItem *item;
+ for ( p=frame->all.markups; p != NULL; p=p->next )
+ {
+ markup = (lglTemplateMarkup *)p->data;
- gl_debug (DEBUG_VIEW, "START");
+ gl_cairo_markup_path (cr, markup, label);
- g_return_if_fail (view && GL_IS_VIEW (view));
- g_return_if_fail (view->label && GL_IS_LABEL (view->label));
+ cairo_stroke (cr);
+ }
- label = view->label;
-
- gl_label_get_size (label, &w, &h);
- template = gl_label_get_template (label);
- r = template->label.rect.r;
- m = margin->size;
-
- r = r - m;
- w = w - 2 * m;
- h = h - 2 * m;
-
- /* rectangle with rounded corners */
- points = gnome_canvas_points_new (4 * (1 + 90 / ARC_COURSE));
- i_coords = 0;
- for (i_theta = 0; i_theta <= 90; i_theta += ARC_COURSE) {
- points->coords[i_coords++] =
- m + r - r * sin (i_theta * G_PI / 180.0);
- points->coords[i_coords++] =
- m + r - r * cos (i_theta * G_PI / 180.0);
- }
- for (i_theta = 0; i_theta <= 90; i_theta += ARC_COURSE) {
- points->coords[i_coords++] =
- m + r - r * cos (i_theta * G_PI / 180.0);
- points->coords[i_coords++] =
- m + (h - r) + r * sin (i_theta * G_PI / 180.0);
- }
- for (i_theta = 0; i_theta <= 90; i_theta += ARC_COURSE) {
- points->coords[i_coords++] =
- m + (w - r) + r * sin (i_theta * G_PI / 180.0);
- points->coords[i_coords++] =
- m + (h - r) + r * cos (i_theta * G_PI / 180.0);
- }
- for (i_theta = 0; i_theta <= 90; i_theta += ARC_COURSE) {
- points->coords[i_coords++] =
- m + (w - r) + r * cos (i_theta * G_PI / 180.0);
- points->coords[i_coords++] =
- m + r - r * sin (i_theta * G_PI / 180.0);
- }
- item = gnome_canvas_item_new (view->markup_group,
- gnome_canvas_polygon_get_type (),
- "points", points,
- "width_pixels", 1,
- "outline_color_rgba", MARKUP_COLOR,
- NULL);
- gnome_canvas_points_free (points);
+ cairo_restore (cr);
+ }
- gl_debug (DEBUG_VIEW, "END");
}
/*---------------------------------------------------------------------------*/
-/* PRIVATE. Draw round margin. */
+/* PRIVATE. Draw objects layer. */
/*---------------------------------------------------------------------------*/
static void
-draw_markup_margin_round (glView *view,
- glTemplateMarkupMargin *margin)
+draw_objects_layer (glView *view,
+ cairo_t *cr)
{
- glLabel *label;
- glTemplate *template;
- gdouble r, m;
- GnomeCanvasItem *item;
-
- gl_debug (DEBUG_VIEW, "START");
-
- g_return_if_fail (view && GL_IS_VIEW (view));
- g_return_if_fail (view->label && GL_IS_LABEL (view->label));
-
- label = view->label;
- template = gl_label_get_template (label);
-
- r = template->label.round.r;
- m = margin->size;
-
- /* Margin outline */
- item = gnome_canvas_item_new (view->markup_group,
- gnome_canvas_ellipse_get_type (),
- "x1", m,
- "y1", m,
- "x2", 2.0*r - m,
- "y2", 2.0*r - m,
- "width_pixels", 1,
- "outline_color_rgba", MARKUP_COLOR,
- NULL);
-
- gl_debug (DEBUG_VIEW, "END");
+ gl_label_draw (view->label, cr, TRUE, NULL);
}
/*---------------------------------------------------------------------------*/
-/* PRIVATE. Draw CD margins. */
+/* PRIVATE. Draw foreground */
/*---------------------------------------------------------------------------*/
static void
-draw_markup_margin_cd (glView *view,
- glTemplateMarkupMargin *margin)
+draw_fg_layer (glView *view,
+ cairo_t *cr)
{
- glLabel *label;
- glTemplate *template;
- gdouble m, r1, r2;
- GnomeCanvasItem *item;
-
- gl_debug (DEBUG_VIEW, "START");
-
g_return_if_fail (view && GL_IS_VIEW (view));
g_return_if_fail (view->label && GL_IS_LABEL (view->label));
- label = view->label;
- template = gl_label_get_template (label);
-
- r1 = template->label.cd.r1;
- r2 = template->label.cd.r2;
- m = margin->size;
-
- /* outer margin */
- item = gnome_canvas_item_new (view->markup_group,
- gnome_canvas_ellipse_get_type (),
- "x1", m,
- "y1", m,
- "x2", 2.0*r1 - m,
- "y2", 2.0*r1 - m,
- "width_pixels", 1,
- "outline_color_rgba", MARKUP_COLOR,
- NULL);
- /* inner margin */
- item = gnome_canvas_item_new (view->markup_group,
- gnome_canvas_ellipse_get_type (),
- "x1", r1 - r2 - m,
- "y1", r1 - r2 - m,
- "x2", r1 + r2 + m,
- "y2", r1 + r2 + m,
- "width_pixels", 1,
- "outline_color_rgba", MARKUP_COLOR,
- NULL);
+ gl_cairo_label_path (cr, view->label->template, view->label->rotate_flag, FALSE);
- gl_debug (DEBUG_VIEW, "END");
+ cairo_set_line_width (cr, OUTLINE_WIDTH_PIXELS/(view->home_scale * view->zoom));
+ cairo_set_source_rgb (cr, OUTLINE_RGB_ARGS);
+ cairo_stroke (cr);
}
/*---------------------------------------------------------------------------*/
-/* PRIVATE. Draw Business Card CD margins. */
+/* PRIVATE. Create highlight layer. */
/*---------------------------------------------------------------------------*/
static void
-draw_markup_margin_cd_bc (glView *view,
- glTemplateMarkupMargin *margin)
+draw_highlight_layer (glView *view,
+ cairo_t *cr)
{
- glLabel *label;
- glTemplate *template;
- gdouble m, r1, r2;
- GnomeCanvasPoints *points;
- gint i_coords, i_theta;
- gdouble theta1, theta2;
- gdouble x0, y0, w, h, r;
- GnomeCanvasItem *item;
-
- gl_debug (DEBUG_VIEW, "START");
+ GList *p_obj;
+ glViewObject *view_object;
g_return_if_fail (view && GL_IS_VIEW (view));
- g_return_if_fail (view->label && GL_IS_LABEL (view->label));
-
- label = view->label;
- template = gl_label_get_template (label);
- gl_label_get_size (label, &w, &h);
- x0 = w/2.0;
- y0 = h/2.0;
- r1 = template->label.cd.r1;
- r2 = template->label.cd.r2;
- m = margin->size;
+ cairo_save (cr);
- /* outer margin */
- r = r1 - m;
- theta1 = (180.0/G_PI) * acos (w / (2.0*r1));
- theta2 = (180.0/G_PI) * asin (h / (2.0*r1));
+ cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
- points = gnome_canvas_points_new (360/ARC_FINE + 1);
- i_coords = 0;
+ for (p_obj = view->selected_object_list; p_obj != NULL; p_obj = p_obj->next)
+ {
+ view_object = GL_VIEW_OBJECT (p_obj->data);
- points->coords[i_coords++] = x0 + r * cos (theta1 * G_PI / 180.0);
- points->coords[i_coords++] = y0 + r * sin (theta1 * G_PI / 180.0);
-
- for ( i_theta = theta1 + ARC_FINE; i_theta < theta2; i_theta +=ARC_FINE ) {
- points->coords[i_coords++] = x0 + r * cos (i_theta * G_PI / 180.0);
- points->coords[i_coords++] = y0 + r * sin (i_theta * G_PI / 180.0);
- }
-
- points->coords[i_coords++] = x0 + r * cos (theta2 * G_PI / 180.0);
- points->coords[i_coords++] = y0 + r * sin (theta2 * G_PI / 180.0);
-
-
- if ( fabs (theta2 - 90.0) > GNOME_CANVAS_EPSILON ) {
- points->coords[i_coords++] = x0 + r * cos ((180-theta2) * G_PI / 180.0);
- points->coords[i_coords++] = y0 + r * sin ((180-theta2) * G_PI / 180.0);
- }
-
- for ( i_theta = 180-theta2+ARC_FINE; i_theta < (180-theta1); i_theta +=ARC_FINE ) {
- points->coords[i_coords++] = x0 + r * cos (i_theta * G_PI / 180.0);
- points->coords[i_coords++] = y0 + r * sin (i_theta * G_PI / 180.0);
+ gl_view_object_draw_handles (view_object, cr);
}
- points->coords[i_coords++] = x0 + r * cos ((180-theta1) * G_PI / 180.0);
- points->coords[i_coords++] = y0 + r * sin ((180-theta1) * G_PI / 180.0);
-
- if ( fabs (theta1) > GNOME_CANVAS_EPSILON ) {
- points->coords[i_coords++] = x0 + r * cos ((180+theta1) * G_PI / 180.0);
- points->coords[i_coords++] = y0 + r * sin ((180+theta1) * G_PI / 180.0);
- }
-
- for ( i_theta = 180+theta1+ARC_FINE; i_theta < (180+theta2); i_theta +=ARC_FINE ) {
- points->coords[i_coords++] = x0 + r * cos (i_theta * G_PI / 180.0);
- points->coords[i_coords++] = y0 + r * sin (i_theta * G_PI / 180.0);
- }
-
- points->coords[i_coords++] = x0 + r * cos ((180+theta2) * G_PI / 180.0);
- points->coords[i_coords++] = y0 + r * sin ((180+theta2) * G_PI / 180.0);
-
- if ( fabs (theta2 - 90.0) > GNOME_CANVAS_EPSILON ) {
- points->coords[i_coords++] = x0 + r * cos ((360-theta2) * G_PI / 180.0);
- points->coords[i_coords++] = y0 + r * sin ((360-theta2) * G_PI / 180.0);
- }
-
- for ( i_theta = 360-theta2+ARC_FINE; i_theta < (360-theta1); i_theta +=ARC_FINE ) {
- points->coords[i_coords++] = x0 + r * cos (i_theta * G_PI / 180.0);
- points->coords[i_coords++] = y0 + r * sin (i_theta * G_PI / 180.0);
- }
-
- if ( fabs (theta1) > GNOME_CANVAS_EPSILON ) {
- points->coords[i_coords++] = x0 + r * cos ((360-theta1) * G_PI / 180.0);
- points->coords[i_coords++] = y0 + r * sin ((360-theta1) * G_PI / 180.0);
- }
-
- points->num_points = i_coords / 2;
-
- item = gnome_canvas_item_new (view->markup_group,
- gnome_canvas_polygon_get_type (),
- "points", points,
- "width_pixels", 1,
- "outline_color_rgba", MARKUP_COLOR,
- NULL);
-
- gnome_canvas_points_free (points);
-
- /* inner margin */
- item = gnome_canvas_item_new (view->markup_group,
- gnome_canvas_ellipse_get_type (),
- "x1", x0 - r2 - m,
- "y1", y0 - r2 - m,
- "x2", x0 + r2 + m,
- "y2", y0 + r2 + m,
- "width_pixels", 1,
- "outline_color_rgba", MARKUP_COLOR,
- NULL);
-
- gl_debug (DEBUG_VIEW, "END");
+ cairo_restore (cr);
}
/*---------------------------------------------------------------------------*/
-/* PRIVATE. Draw line markup. */
+/* PRIVATE. Draw select region layer. */
/*---------------------------------------------------------------------------*/
static void
-draw_markup_line (glView *view,
- glTemplateMarkupLine *line)
+draw_select_region_layer (glView *view,
+ cairo_t *cr)
{
- GnomeCanvasPoints *points;
-
- gl_debug (DEBUG_VIEW, "START");
+ gdouble x1, y1;
+ gdouble w, h;
g_return_if_fail (view && GL_IS_VIEW (view));
- points = gnome_canvas_points_new (2);
- points->coords[0] = line->x1;
- points->coords[1] = line->y1;
- points->coords[2] = line->x2;
- points->coords[3] = line->y2;
+ if (view->select_region_visible)
+ {
+ x1 = MIN (view->select_region.x1, view->select_region.x2);
+ y1 = MIN (view->select_region.y1, view->select_region.y2);
+ w = fabs (view->select_region.x2 - view->select_region.x1);
+ h = fabs (view->select_region.y2 - view->select_region.y1);
- /* Bounding box @ margin */
- gnome_canvas_item_new (view->markup_group,
- gnome_canvas_line_get_type (),
- "points", points,
- "width_pixels", 1,
- "fill_color_rgba", MARKUP_COLOR,
- NULL);
+ cairo_save (cr);
- gnome_canvas_points_free (points);
+ cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
- gl_debug (DEBUG_VIEW, "END");
-}
-
-/*---------------------------------------------------------------------------*/
-/* PRIVATE. Draw circle markup. */
-/*---------------------------------------------------------------------------*/
-static void
-draw_markup_circle (glView *view,
- glTemplateMarkupCircle *circle)
-{
- gl_debug (DEBUG_VIEW, "START");
+ cairo_rectangle (cr, x1, y1, w, h);
- g_return_if_fail (view && GL_IS_VIEW (view));
+ cairo_set_source_rgba (cr, SELECT_FILL_RGBA_ARGS);
+ cairo_fill_preserve (cr);
- /* Circle outline */
- gnome_canvas_item_new (view->markup_group,
- gnome_canvas_ellipse_get_type (),
- "x1", circle->x0 - circle->r,
- "y1", circle->y0 - circle->r,
- "x2", circle->x0 + circle->r,
- "y2", circle->y0 + circle->r,
- "width_pixels", 1,
- "outline_color_rgba", MARKUP_COLOR,
- NULL);
+ cairo_set_line_width (cr, SELECT_LINE_WIDTH_PIXELS/(view->home_scale * view->zoom));
+ cairo_set_source_rgba (cr, SELECT_LINE_RGBA_ARGS);
+ cairo_stroke (cr);
- gl_debug (DEBUG_VIEW, "END");
+ cairo_restore (cr);
+ }
}
/*****************************************************************************/
/* Show grid. */
/*****************************************************************************/
-void gl_view_show_grid (glView *view)
+void
+gl_view_show_grid (glView *view)
{
g_return_if_fail (view && GL_IS_VIEW (view));
- gnome_canvas_item_show (GNOME_CANVAS_ITEM(view->grid_group));
+ view->grid_visible = TRUE;
+ gl_view_update (view);
}
/*****************************************************************************/
/* Hide grid. */
/*****************************************************************************/
-void gl_view_hide_grid (glView *view)
+void
+gl_view_hide_grid (glView *view)
{
g_return_if_fail (view && GL_IS_VIEW (view));
- gnome_canvas_item_hide (GNOME_CANVAS_ITEM(view->grid_group));
+ view->grid_visible = FALSE;
+ gl_view_update (view);
}
/*****************************************************************************/
/* Set grid spacing. */
/*****************************************************************************/
-void gl_view_set_grid_spacing (glView *view,
- gdouble spacing)
+void
+gl_view_set_grid_spacing (glView *view,
+ gdouble spacing)
{
g_return_if_fail (view && GL_IS_VIEW (view));
view->grid_spacing = spacing;
-
- gtk_object_destroy (GTK_OBJECT(view->grid_group));
- draw_grid_layer (view);
+ gl_view_update (view);
}
/*****************************************************************************/
/* Show markup. */
/*****************************************************************************/
-void gl_view_show_markup (glView *view)
+void
+gl_view_show_markup (glView *view)
{
g_return_if_fail (view && GL_IS_VIEW (view));
- gnome_canvas_item_show (GNOME_CANVAS_ITEM(view->markup_group));
+ view->markup_visible = TRUE;
+ gl_view_update (view);
}
/*****************************************************************************/
/* Hide markup. */
/*****************************************************************************/
-void gl_view_hide_markup (glView *view)
+void
+gl_view_hide_markup (glView *view)
{
g_return_if_fail (view && GL_IS_VIEW (view));
- gnome_canvas_item_hide (GNOME_CANVAS_ITEM(view->markup_group));
+ view->markup_visible = FALSE;
+ gl_view_update (view);
}
/*****************************************************************************/
void
gl_view_arrow_mode (glView *view)
{
- static GdkCursor *cursor = NULL;
+ GdkCursor *cursor;
gl_debug (DEBUG_VIEW, "START");
g_return_if_fail (view && GL_IS_VIEW (view));
- if (!cursor) {
- cursor = gdk_cursor_new (GDK_LEFT_PTR);
- }
-
+ cursor = gdk_cursor_new (GDK_LEFT_PTR);
gdk_window_set_cursor (view->canvas->window, cursor);
+ gdk_cursor_unref (cursor);
- view->state = GL_VIEW_STATE_ARROW;
+ view->mode = GL_VIEW_MODE_ARROW;
+ view->state = GL_VIEW_IDLE;
gl_debug (DEBUG_VIEW, "END");
}
/*****************************************************************************/
void
gl_view_object_create_mode (glView *view,
- glLabelObjectType type)
+ glLabelObjectType type)
{
- GdkCursor *cursor;
+ GdkCursor *cursor = NULL;
gl_debug (DEBUG_VIEW, "START");
g_return_if_fail (view && GL_IS_VIEW (view));
- switch (type) {
+ switch (type)
+ {
case GL_LABEL_OBJECT_BOX:
cursor = gl_view_box_get_create_cursor ();
break;
cursor = gl_view_barcode_get_create_cursor ();
break;
default:
- g_warning ("Invalid label object type.");/*Should not happen!*/
+ g_message ("Invalid label object type.");/*Should not happen!*/
break;
}
gdk_window_set_cursor (view->canvas->window, cursor);
+ gdk_cursor_unref (cursor);
- view->state = GL_VIEW_STATE_OBJECT_CREATE;
+ view->mode = GL_VIEW_MODE_OBJECT_CREATE;
+ view->state = GL_VIEW_IDLE;
view->create_type = type;
gl_debug (DEBUG_VIEW, "END");
void
gl_view_unselect_all (glView *view)
{
- GList *p, *p_next;
+ GList *p;
+ GList *p_next;
gl_debug (DEBUG_VIEW, "START");
/* Select all objects within given rectangular region (adding to selection). */
/*****************************************************************************/
void
-gl_view_select_region (glView *view,
- gdouble x1,
- gdouble y1,
- gdouble x2,
- gdouble y2)
+gl_view_select_region (glView *view,
+ glLabelRegion *region)
{
- GList *p;
- glViewObject *view_object;
+ GList *p;
+ glViewObject *view_object;
glLabelObject *object;
- gdouble i_x1, i_y1, i_x2, i_y2;
+ gdouble r_x1, r_y1;
+ gdouble r_x2, r_y2;
+ glLabelRegion obj_extent;
gl_debug (DEBUG_VIEW, "START");
g_return_if_fail (view && GL_IS_VIEW (view));
- g_return_if_fail ((x1 <= x2) && (y1 <= y2));
- for (p = view->object_list; p != NULL; p = p->next) {
+ r_x1 = MIN (region->x1, region->x2);
+ r_y1 = MIN (region->y1, region->y2);
+ r_x2 = MAX (region->x1, region->x2);
+ r_y2 = MAX (region->y1, region->y2);
+
+ for (p = view->object_list; p != NULL; p = p->next)
+ {
view_object = GL_VIEW_OBJECT(p->data);
- if (!gl_view_is_object_selected (view, view_object)) {
+ if (!gl_view_is_object_selected (view, view_object))
+ {
object = gl_view_object_get_object (view_object);
- gl_label_object_get_extent (object, &i_x1, &i_y1, &i_x2, &i_y2);
- if ((i_x1 >= x1) && (i_x2 <= x2) && (i_y1 >= y1)
- && (i_y2 <= y2)) {
+ gl_label_object_get_extent (object, &obj_extent);
+ if ((obj_extent.x1 >= r_x1) &&
+ (obj_extent.x2 <= r_x2) &&
+ (obj_extent.y1 >= r_y1) &&
+ (obj_extent.y2 <= r_y2))
+ {
select_object_real (view, view_object);
}
if (!gl_view_is_object_selected (view, view_object)) {
view->selected_object_list =
- g_list_prepend (view->selected_object_list, view_object);
+ g_list_append (view->selected_object_list, view_object);
}
- gl_view_object_show_highlight (view_object);
gtk_widget_grab_focus (GTK_WIDGET (view->canvas));
+ gl_view_update (view);
+
gl_debug (DEBUG_VIEW, "END");
}
g_return_if_fail (view && GL_IS_VIEW (view));
g_return_if_fail (GL_IS_VIEW_OBJECT (view_object));
- gl_view_object_hide_highlight (view_object);
-
view->selected_object_list =
g_list_remove (view->selected_object_list, view_object);
+ gl_view_update (view);
+
gl_debug (DEBUG_VIEW, "END");
}
/*---------------------------------------------------------------------------*/
/* PRIVATE. Return object at (x,y). */
/*---------------------------------------------------------------------------*/
-static gboolean
-object_at (glView *view,
- gdouble x,
- gdouble y)
+static glViewObject *
+view_view_object_at (glView *view,
+ cairo_t *cr,
+ gdouble x,
+ gdouble y)
{
- GnomeCanvasItem *item, *p_item;
- GList *p;
+ GList *p_obj;
+ glViewObject *view_object;
- gl_debug (DEBUG_VIEW, "");
+ g_return_val_if_fail (view && GL_IS_VIEW (view), NULL);
- g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
+ for (p_obj = g_list_last (view->object_list); p_obj != NULL; p_obj = p_obj->prev)
+ {
- item = gnome_canvas_get_item_at (GNOME_CANVAS (view->canvas), x, y);
+ view_object = GL_VIEW_OBJECT (p_obj->data);
- /* No item is at x, y */
- if (item == NULL)
- return FALSE;
+ if (gl_view_object_at (view_object, cr, x, y))
+ {
+ return view_object;
+ }
- /* ignore items not in label or highlight layers, e.g. background items */
- if (!is_item_member_of_group(view, item, GNOME_CANVAS_ITEM(view->label_group)) &&
- !is_item_member_of_group(view, item, GNOME_CANVAS_ITEM(view->highlight_group)))
- return FALSE;
+ }
- return TRUE;
+ return NULL;
}
/*---------------------------------------------------------------------------*/
-/* PRIVATE. Is the item a child (or grandchild, etc.) of group. */
+/* PRIVATE. Return object handle at (x,y). */
/*---------------------------------------------------------------------------*/
-static gboolean
-is_item_member_of_group (glView *view,
- GnomeCanvasItem *item,
- GnomeCanvasItem *group)
+static glViewObject *
+view_handle_at (glView *view,
+ cairo_t *cr,
+ gdouble x,
+ gdouble y,
+ glViewObjectHandle *handle)
{
- GnomeCanvasItem *parent;
- GnomeCanvasItem *root_group;
+ GList *p_obj;
+ glViewObject *view_object;
- g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
+ g_return_val_if_fail (view && GL_IS_VIEW (view), NULL);
+
+ for (p_obj = g_list_last (view->selected_object_list); p_obj != NULL; p_obj = p_obj->prev)
+ {
+
+ view_object = GL_VIEW_OBJECT (p_obj->data);
- root_group = GNOME_CANVAS_ITEM(gnome_canvas_root (GNOME_CANVAS (view->canvas)));
+ if ((*handle = gl_view_object_handle_at (view_object, cr, x, y)))
+ {
+ return view_object;
+ }
- for ( parent=item->parent; parent && (parent!=root_group); parent=parent->parent) {
- if (parent == group) return TRUE;
}
- return FALSE;
+
+ return NULL;
}
/*****************************************************************************/
/*****************************************************************************/
gboolean
gl_view_is_object_selected (glView *view,
- glViewObject *view_object)
+ glViewObject *view_object)
{
gl_debug (DEBUG_VIEW, "");
void
gl_view_delete_selection (glView *view)
{
- GList *p, *p_next;
+ GList *object_list;
+ GList *p;
+ GList *p_next;
+ glViewObject *view_object;
+ glLabelObject *object;
gl_debug (DEBUG_VIEW, "START");
g_return_if_fail (view && GL_IS_VIEW (view));
- for (p = view->selected_object_list; p != NULL; p = p_next) {
+ object_list = view->selected_object_list;
+ view->selected_object_list = NULL;
+ g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
+
+ for (p = object_list; p != NULL; p = p_next) {
p_next = p->next;
- g_object_unref (G_OBJECT (p->data));
+ view_object = GL_VIEW_OBJECT (p->data);
+ object = gl_view_object_get_object (view_object);
+ gl_label_object_remove (object);
}
- g_signal_emit (G_OBJECT(view), signals[SELECTION_CHANGED], 0);
+ g_list_free (object_list);
gl_debug (DEBUG_VIEW, "END");
}
gl_debug (DEBUG_VIEW, "START");
- g_return_if_fail (view && GL_IS_VIEW (view));
+ g_return_val_if_fail (view && GL_IS_VIEW (view), NULL);
if (!gl_view_is_selection_empty (view)) {
GList *p;
glViewObject *view_object;
glLabelObject *object;
- gdouble dx, x1min, x1, y1, x2, y2;
+ gdouble dx, x1_min;
+ glLabelRegion obj_extent;
gl_debug (DEBUG_VIEW, "START");
p = view->selected_object_list;
view_object = GL_VIEW_OBJECT (p->data);
object = gl_view_object_get_object (view_object);
- gl_label_object_get_extent (object, &x1min, &y1, &x2, &y2);
- for (p = p->next; p != NULL; p = p->next) {
+ gl_label_object_get_extent (object, &obj_extent);
+ x1_min = obj_extent.x1;
+ for (p = p->next; p != NULL; p = p->next)
+ {
view_object = GL_VIEW_OBJECT (p->data);
object = gl_view_object_get_object (view_object);
- gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
- if ( x1 < x1min ) x1min = x1;
+ gl_label_object_get_extent (object, &obj_extent);
+ if ( obj_extent.x1 < x1_min ) x1_min = obj_extent.x1;
}
/* now adjust the object positions to line up the left edges */
- for (p = view->selected_object_list; p != NULL; p = p->next) {
+ for (p = view->selected_object_list; p != NULL; p = p->next)
+ {
view_object = GL_VIEW_OBJECT (p->data);
object = gl_view_object_get_object (view_object);
- gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
- dx = x1min - x1;
+ gl_label_object_get_extent (object, &obj_extent);
+ dx = x1_min - obj_extent.x1;
gl_label_object_set_position_relative (object, dx, 0.0);
}
GList *p;
glViewObject *view_object;
glLabelObject *object;
- gdouble dx, x2max, x1, y1, x2, y2;
+ gdouble dx, x2_max;
+ glLabelRegion obj_extent;
gl_debug (DEBUG_VIEW, "START");
p = view->selected_object_list;
view_object = GL_VIEW_OBJECT (p->data);
object = gl_view_object_get_object (view_object);
- gl_label_object_get_extent (object, &x1, &y1, &x2max, &y2);
- for (p = p->next; p != NULL; p = p->next) {
+ gl_label_object_get_extent (object, &obj_extent);
+ x2_max = obj_extent.x2;
+ for (p = p->next; p != NULL; p = p->next)
+ {
view_object = GL_VIEW_OBJECT (p->data);
object = gl_view_object_get_object (view_object);
- gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
- if ( x2 > x2max ) x2max = x2;
+ gl_label_object_get_extent (object, &obj_extent);
+ if ( obj_extent.x2 > x2_max ) x2_max = obj_extent.x2;
}
/* now adjust the object positions to line up the right edges */
- for (p = view->selected_object_list; p != NULL; p = p->next) {
+ for (p = view->selected_object_list; p != NULL; p = p->next)
+ {
view_object = GL_VIEW_OBJECT (p->data);
object = gl_view_object_get_object (view_object);
- gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
- dx = x2max - x2;
+ gl_label_object_get_extent (object, &obj_extent);
+ dx = x2_max - obj_extent.x2;
gl_label_object_set_position_relative (object, dx, 0.0);
}
GList *p;
glViewObject *view_object;
glLabelObject *object;
- gdouble dx, dxmin, xsum, xavg, xcenter, x1, y1, x2, y2;
+ gdouble dx;
+ gdouble dxmin;
+ gdouble xsum, xavg;
+ glLabelRegion obj_extent;
+ gdouble xcenter;
gint n;
gl_debug (DEBUG_VIEW, "START");
/* find average center of objects */
xsum = 0.0;
n = 0;
- for (p = view->selected_object_list; p != NULL; p = p->next) {
+ for (p = view->selected_object_list; p != NULL; p = p->next)
+ {
view_object = GL_VIEW_OBJECT (p->data);
object = gl_view_object_get_object (view_object);
- gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
- xsum += (x1 + x2) / 2.0;
+ gl_label_object_get_extent (object, &obj_extent);
+ xsum += (obj_extent.x1 + obj_extent.x2) / 2.0;
n++;
}
xavg = xsum / n;
p = view->selected_object_list;
view_object = GL_VIEW_OBJECT (p->data);
object = gl_view_object_get_object (view_object);
- gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
- dxmin = fabs (xavg - (x1 + x2)/2.0);
- xcenter = (x1 + x2)/2.0;
- for (p = p->next; p != NULL; p = p->next) {
+ gl_label_object_get_extent (object, &obj_extent);
+ dxmin = fabs (xavg - (obj_extent.x1 + obj_extent.x2)/2.0);
+ xcenter = (obj_extent.x1 + obj_extent.x2)/2.0;
+ for (p = p->next; p != NULL; p = p->next)
+ {
view_object = GL_VIEW_OBJECT (p->data);
object = gl_view_object_get_object (view_object);
- gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
- dx = fabs (xavg - (x1 + x2)/2.0);
- if ( dx < dxmin ) {
+ gl_label_object_get_extent (object, &obj_extent);
+ dx = fabs (xavg - (obj_extent.x1 + obj_extent.x2)/2.0);
+ if ( dx < dxmin )
+ {
dxmin = dx;
- xcenter = (x1 + x2)/2.0;
+ xcenter = (obj_extent.x1 + obj_extent.x2)/2.0;
}
}
for (p = view->selected_object_list; p != NULL; p = p->next) {
view_object = GL_VIEW_OBJECT (p->data);
object = gl_view_object_get_object (view_object);
- gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
- dx = xcenter - (x1 + x2)/2.0;
+ gl_label_object_get_extent (object, &obj_extent);
+ dx = xcenter - (obj_extent.x1 + obj_extent.x2)/2.0;
gl_label_object_set_position_relative (object, dx, 0.0);
}
GList *p;
glViewObject *view_object;
glLabelObject *object;
- gdouble dy, y1min, x1, y1, x2, y2;
+ gdouble dy, y1_min;
+ glLabelRegion obj_extent;
gl_debug (DEBUG_VIEW, "START");
p = view->selected_object_list;
view_object = GL_VIEW_OBJECT (p->data);
object = gl_view_object_get_object (view_object);
- gl_label_object_get_extent (object, &x1, &y1min, &x2, &y2);
- for (p = p->next; p != NULL; p = p->next) {
+ gl_label_object_get_extent (object, &obj_extent);
+ y1_min = obj_extent.y1;
+ for (p = p->next; p != NULL; p = p->next)
+ {
view_object = GL_VIEW_OBJECT (p->data);
object = gl_view_object_get_object (view_object);
- gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
- if ( y1 < y1min ) y1min = y1;
+ gl_label_object_get_extent (object, &obj_extent);
+ if ( obj_extent.y1 < y1_min ) y1_min = obj_extent.y1;
}
/* now adjust the object positions to line up the top edges */
- for (p = view->selected_object_list; p != NULL; p = p->next) {
+ for (p = view->selected_object_list; p != NULL; p = p->next)
+ {
view_object = GL_VIEW_OBJECT (p->data);
object = gl_view_object_get_object (view_object);
- gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
- dy = y1min - y1;
+ gl_label_object_get_extent (object, &obj_extent);
+ dy = y1_min - obj_extent.y1;
gl_label_object_set_position_relative (object, 0.0, dy);
}
GList *p;
glViewObject *view_object;
glLabelObject *object;
- gdouble dy, y2max, x1, y1, x2, y2;
+ gdouble dy, y2_max;
+ glLabelRegion obj_extent;
gl_debug (DEBUG_VIEW, "START");
p = view->selected_object_list;
view_object = GL_VIEW_OBJECT (p->data);
object = gl_view_object_get_object (view_object);
- gl_label_object_get_extent (object, &x1, &y1, &x2, &y2max);
- for (p = p->next; p != NULL; p = p->next) {
+ gl_label_object_get_extent (object, &obj_extent);
+ y2_max = obj_extent.y2;
+ for (p = p->next; p != NULL; p = p->next)
+ {
view_object = GL_VIEW_OBJECT (p->data);
object = gl_view_object_get_object (view_object);
- gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
- if ( y2 > y2max ) y2max = y2;
+ gl_label_object_get_extent (object, &obj_extent);
+ if ( obj_extent.y2 > y2_max ) y2_max = obj_extent.y2;
}
/* now adjust the object positions to line up the bottom edges */
- for (p = view->selected_object_list; p != NULL; p = p->next) {
+ for (p = view->selected_object_list; p != NULL; p = p->next)
+ {
view_object = GL_VIEW_OBJECT (p->data);
object = gl_view_object_get_object (view_object);
- gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
- dy = y2max - y2;
+ gl_label_object_get_extent (object, &obj_extent);
+ dy = y2_max - obj_extent.y2;
gl_label_object_set_position_relative (object, 0.0, dy);
}
GList *p;
glViewObject *view_object;
glLabelObject *object;
- gdouble dy, dymin, ysum, yavg, ycenter, x1, y1, x2, y2;
+ gdouble dy;
+ gdouble dymin;
+ gdouble ysum, yavg;
+ glLabelRegion obj_extent;
+ gdouble ycenter;
gint n;
gl_debug (DEBUG_VIEW, "START");
/* find average center of objects */
ysum = 0.0;
n = 0;
- for (p = view->selected_object_list; p != NULL; p = p->next) {
+ for (p = view->selected_object_list; p != NULL; p = p->next)
+ {
view_object = GL_VIEW_OBJECT (p->data);
object = gl_view_object_get_object (view_object);
- gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
- ysum += (y1 + y2) / 2.0;
+ gl_label_object_get_extent (object, &obj_extent);
+ ysum += (obj_extent.y1 + obj_extent.y2) / 2.0;
n++;
}
yavg = ysum / n;
p = view->selected_object_list;
view_object = GL_VIEW_OBJECT (p->data);
object = gl_view_object_get_object (view_object);
- gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
- dymin = fabs (yavg - (y1 + y2)/2.0);
- ycenter = (y1 + y2)/2.0;
- for (p = p->next; p != NULL; p = p->next) {
+ gl_label_object_get_extent (object, &obj_extent);
+ dymin = fabs (yavg - (obj_extent.y1 + obj_extent.y2)/2.0);
+ ycenter = (obj_extent.y1 + obj_extent.y2)/2.0;
+ for (p = p->next; p != NULL; p = p->next)
+ {
view_object = GL_VIEW_OBJECT (p->data);
object = gl_view_object_get_object (view_object);
- gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
- dy = fabs (yavg - (y1 + y2)/2.0);
- if ( dy < dymin ) {
+ gl_label_object_get_extent (object, &obj_extent);
+ dy = fabs (yavg - (obj_extent.y1 + obj_extent.y2)/2.0);
+ if ( dy < dymin )
+ {
dymin = dy;
- ycenter = (y1 + y2)/2.0;
+ ycenter = (obj_extent.y1 + obj_extent.y2)/2.0;
}
}
/* now adjust the object positions to line up this center */
- for (p = view->selected_object_list; p != NULL; p = p->next) {
+ for (p = view->selected_object_list; p != NULL; p = p->next)
+ {
view_object = GL_VIEW_OBJECT (p->data);
object = gl_view_object_get_object (view_object);
- gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
- dy = ycenter - (y1 + y2)/2.0;
+ gl_label_object_get_extent (object, &obj_extent);
+ dy = ycenter - (obj_extent.y1 + obj_extent.y2)/2.0;
gl_label_object_set_position_relative (object, 0.0, dy);
}
GList *p;
glViewObject *view_object;
glLabelObject *object;
- gdouble dx, x_label_center, x_obj_center, x1, y1, x2, y2, w, h;
+ gdouble dx;
+ gdouble x_label_center;
+ gdouble x_obj_center;
+ glLabelRegion obj_extent;
+ gdouble w, h;
gl_debug (DEBUG_VIEW, "START");
x_label_center = w / 2.0;
/* adjust the object positions */
- for (p = view->selected_object_list; p != NULL; p = p->next) {
+ for (p = view->selected_object_list; p != NULL; p = p->next)
+ {
view_object = GL_VIEW_OBJECT (p->data);
object = gl_view_object_get_object (view_object);
- gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
- x_obj_center = (x1 + x2) / 2.0;
+ gl_label_object_get_extent (object, &obj_extent);
+ x_obj_center = (obj_extent.x1 + obj_extent.x2) / 2.0;
dx = x_label_center - x_obj_center;
gl_label_object_set_position_relative (object, dx, 0.0);
}
GList *p;
glViewObject *view_object;
glLabelObject *object;
- gdouble dy, y_label_center, y_obj_center, x1, y1, x2, y2, w, h;
+ gdouble dy;
+ gdouble y_label_center;
+ gdouble y_obj_center;
+ glLabelRegion obj_extent;
+ gdouble w, h;
gl_debug (DEBUG_VIEW, "START");
y_label_center = h / 2.0;
/* adjust the object positions */
- for (p = view->selected_object_list; p != NULL; p = p->next) {
+ for (p = view->selected_object_list; p != NULL; p = p->next)
+ {
view_object = GL_VIEW_OBJECT (p->data);
object = gl_view_object_get_object (view_object);
- gl_label_object_get_extent (object, &x1, &y1, &x2, &y2);
- y_obj_center = (y1 + y2) / 2.0;
+ gl_label_object_get_extent (object, &obj_extent);
+ y_obj_center = (obj_extent.y1 + obj_extent.y2) / 2.0;
dy = y_label_center - y_obj_center;
gl_label_object_set_position_relative (object, 0.0, dy);
}
/*****************************************************************************/
void
gl_view_move_selection (glView *view,
- gdouble dx,
- gdouble dy)
+ gdouble dx,
+ gdouble dy)
{
- GList *p;
+ GList *p;
glLabelObject *object;
gl_debug (DEBUG_VIEW, "START");
g_return_if_fail (view && GL_IS_VIEW (view));
- for (p = view->selected_object_list; p != NULL; p = p->next) {
+ for (p = view->selected_object_list; p != NULL; p = p->next)
+ {
object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
gl_label_object_set_position_relative (object, dx, dy);
/* Can text properties be set for selection? */
/*****************************************************************************/
gboolean
-gl_view_can_selection_text (glView *view)
+gl_view_can_selection_text (glView *view)
{
- GList *p;
+ GList *p;
glLabelObject *object;
gl_debug (DEBUG_VIEW, "");
g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
- for (p = view->selected_object_list; p != NULL; p = p->next) {
+ for (p = view->selected_object_list; p != NULL; p = p->next)
+ {
object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
- if (gl_label_object_can_text (object)) {
+ if (gl_label_object_can_text (object))
+ {
return TRUE;
}
/* Set font family for all text contained in selected objects. */
/*****************************************************************************/
void
-gl_view_set_selection_font_family (glView *view,
- const gchar *font_family)
+gl_view_set_selection_font_family (glView *view,
+ const gchar *font_family)
{
- GList *p;
+ GList *p;
glLabelObject *object;
gl_debug (DEBUG_VIEW, "START");
/* Set font size for all text contained in selected objects. */
/*****************************************************************************/
void
-gl_view_set_selection_font_size (glView *view,
- gdouble font_size)
+gl_view_set_selection_font_size (glView *view,
+ gdouble font_size)
{
- GList *p;
+ GList *p;
glLabelObject *object;
gl_debug (DEBUG_VIEW, "START");
/* Set font weight for all text contained in selected objects. */
/*****************************************************************************/
void
-gl_view_set_selection_font_weight (glView *view,
- GnomeFontWeight font_weight)
+gl_view_set_selection_font_weight (glView *view,
+ PangoWeight font_weight)
{
- GList *p;
+ GList *p;
glLabelObject *object;
gl_debug (DEBUG_VIEW, "START");
/* Set font italic flag for all text contained in selected objects. */
/*****************************************************************************/
void
-gl_view_set_selection_font_italic_flag (glView *view,
- gboolean font_italic_flag)
+gl_view_set_selection_font_italic_flag (glView *view,
+ gboolean font_italic_flag)
+{
+ GList *p;
+ glLabelObject *object;
+
+ gl_debug (DEBUG_VIEW, "START");
+
+ g_return_if_fail (view && GL_IS_VIEW (view));
+
+ for (p = view->selected_object_list; p != NULL; p = p->next) {
+
+ object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
+ gl_label_object_set_font_italic_flag (object, font_italic_flag);
+
+ }
+
+ gl_debug (DEBUG_VIEW, "END");
+}
+
+/*****************************************************************************/
+/* Set text alignment for all text contained in selected objects. */
+/*****************************************************************************/
+void
+gl_view_set_selection_text_alignment (glView *view,
+ PangoAlignment text_alignment)
{
- GList *p;
+ GList *p;
glLabelObject *object;
gl_debug (DEBUG_VIEW, "START");
for (p = view->selected_object_list; p != NULL; p = p->next) {
object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
- gl_label_object_set_font_italic_flag (object, font_italic_flag);
+ gl_label_object_set_text_alignment (object, text_alignment);
}
}
/*****************************************************************************/
-/* Set text alignment for all text contained in selected objects. */
+/* Set text line spacing for all text contained in selected objects. */
/*****************************************************************************/
void
-gl_view_set_selection_text_alignment (glView *view,
- GtkJustification text_alignment)
+gl_view_set_selection_text_line_spacing (glView *view,
+ gdouble text_line_spacing)
{
- GList *p;
+ GList *p;
glLabelObject *object;
gl_debug (DEBUG_VIEW, "START");
for (p = view->selected_object_list; p != NULL; p = p->next) {
object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
- gl_label_object_set_text_alignment (object, text_alignment);
+ gl_label_object_set_text_line_spacing (object, text_line_spacing);
}
gl_debug (DEBUG_VIEW, "END");
}
-
/*****************************************************************************/
/* Set text color for all text contained in selected objects. */
/*****************************************************************************/
void
-gl_view_set_selection_text_color (glView *view,
- guint text_color)
+gl_view_set_selection_text_color (glView *view,
+ glColorNode *text_color_node)
{
- GList *p;
+ GList *p;
glLabelObject *object;
gl_debug (DEBUG_VIEW, "START");
for (p = view->selected_object_list; p != NULL; p = p->next) {
object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
- gl_label_object_set_text_color (object, text_color);
+ gl_label_object_set_text_color (object, text_color_node);
}
/* Can fill properties be set for selection? */
/*****************************************************************************/
gboolean
-gl_view_can_selection_fill (glView *view)
+gl_view_can_selection_fill (glView *view)
{
- GList *p;
+ GList *p;
glLabelObject *object;
gl_debug (DEBUG_VIEW, "");
/* Set fill color for all selected objects. */
/*****************************************************************************/
void
-gl_view_set_selection_fill_color (glView *view,
- guint fill_color)
+gl_view_set_selection_fill_color (glView *view,
+ glColorNode *fill_color_node)
{
- GList *p;
+ GList *p;
glLabelObject *object;
gl_debug (DEBUG_VIEW, "START");
for (p = view->selected_object_list; p != NULL; p = p->next) {
object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
- gl_label_object_set_fill_color (object, fill_color);
+ gl_label_object_set_fill_color (object, fill_color_node);
}
/* Can line color properties be set for selection? */
/*****************************************************************************/
gboolean
-gl_view_can_selection_line_color (glView *view)
+gl_view_can_selection_line_color (glView *view)
{
- GList *p;
+ GList *p;
glLabelObject *object;
gl_debug (DEBUG_VIEW, "");
/* Set line color for all selected objects. */
/*****************************************************************************/
void
-gl_view_set_selection_line_color (glView *view,
- guint line_color)
+gl_view_set_selection_line_color (glView *view,
+ glColorNode *line_color_node)
{
- GList *p;
+ GList *p;
glLabelObject *object;
gl_debug (DEBUG_VIEW, "START");
for (p = view->selected_object_list; p != NULL; p = p->next) {
object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
- gl_label_object_set_line_color (object, line_color);
+ gl_label_object_set_line_color (object, line_color_node);
}
/* Can line width properties be set for selection? */
/*****************************************************************************/
gboolean
-gl_view_can_selection_line_width (glView *view)
+gl_view_can_selection_line_width (glView *view)
{
- GList *p;
+ GList *p;
glLabelObject *object;
gl_debug (DEBUG_VIEW, "");
/* Set line width for all selected objects. */
/*****************************************************************************/
void
-gl_view_set_selection_line_width (glView *view,
- gdouble line_width)
+gl_view_set_selection_line_width (glView *view,
+ gdouble line_width)
{
- GList *p;
+ GList *p;
glLabelObject *object;
gl_debug (DEBUG_VIEW, "START");
void
gl_view_copy (glView *view)
{
- GList *p;
- glViewObject *view_object;
+ GList *p;
+ glViewObject *view_object;
glLabelObject *object;
- glTemplate *template;
- gboolean rotate_flag;
gl_debug (DEBUG_VIEW, "START");
if ( view->selection_data ) {
g_object_unref (view->selection_data);
}
- template = gl_label_get_template (view->label);
- rotate_flag = gl_label_get_rotate_flag (view->label);
view->selection_data = GL_LABEL(gl_label_new ());
- gl_label_set_template (view->selection_data, template);
- gl_label_set_rotate_flag (view->selection_data, rotate_flag);
- gl_template_free (&template);
+ gl_label_set_template (view->selection_data, view->label->template);
+ gl_label_set_rotate_flag (view->selection_data, view->label->rotate_flag);
for (p = view->selected_object_list; p != NULL; p = p->next) {
void
gl_view_zoom_in (glView *view)
{
- gint i, i_min;
+ gint i, i_min;
gdouble dist, dist_min;
gl_debug (DEBUG_VIEW, "START");
void
gl_view_zoom_out (glView *view)
{
- gint i, i_min;
+ gint i, i_min;
gdouble dist, dist_min;
gl_debug (DEBUG_VIEW, "START");
void
gl_view_zoom_to_fit (glView *view)
{
- gint w_view, h_view;
+ gint w_view, h_view;
gdouble w_label, h_label;
gdouble x_scale, y_scale, scale;
/*****************************************************************************/
void
gl_view_set_zoom (glView *view,
- gdouble zoom)
+ gdouble zoom)
{
gl_debug (DEBUG_VIEW, "START");
}
/*---------------------------------------------------------------------------*/
-/* PRIVATE. Set canvas scale. *
+/* PRIVATE. Set canvas scale. */
/*---------------------------------------------------------------------------*/
static void
-set_zoom_real (glView *view,
- gdouble zoom,
- gboolean zoom_to_fit_flag)
+set_zoom_real (glView *view,
+ gdouble zoom,
+ gboolean zoom_to_fit_flag)
{
gl_debug (DEBUG_VIEW, "START");
view->zoom = zoom;
view->zoom_to_fit_flag = zoom_to_fit_flag;
- gnome_canvas_set_pixels_per_unit (GNOME_CANVAS (view->canvas),
- zoom*view->home_scale);
-
- g_signal_emit (G_OBJECT(view), signals[ZOOM_CHANGED], 0, zoom);
-
- }
-
- gl_debug (DEBUG_VIEW, "END");
-
-}
+ gl_view_update (view);
-/*---------------------------------------------------------------------------*/
-/* PRIVATE. Size allocation changed callback. */
-/*---------------------------------------------------------------------------*/
-static void
-size_allocate_cb (glView *view)
-{
- gl_debug (DEBUG_VIEW, "START");
+ g_signal_emit (G_OBJECT(view), signals[ZOOM_CHANGED], 0, zoom);
- if (view->zoom_to_fit_flag) {
- /* Maintain best fit zoom */
- gl_view_zoom_to_fit (view);
}
gl_debug (DEBUG_VIEW, "END");
-}
-
-
-/*---------------------------------------------------------------------------*/
-/* PRIVATE. Screen changed callback. */
-/*---------------------------------------------------------------------------*/
-static void
-screen_changed_cb (glView *view)
-{
- gl_debug (DEBUG_VIEW, "START");
-
- view->home_scale = get_home_scale (view);
-
- gnome_canvas_set_pixels_per_unit (GNOME_CANVAS (view->canvas),
- view->zoom * view->home_scale);
-
- if (view->zoom_to_fit_flag) {
- /* Maintain best fit zoom */
- gl_view_zoom_to_fit (view);
- }
-
- gl_debug (DEBUG_VIEW, "END");
}
-
/*****************************************************************************/
/* Get current zoom factor. */
/*****************************************************************************/
return view->zoom <= zooms[N_ZOOMS-1];
}
-/*****************************************************************************/
-/* Launch merge properties dialog. */
-/*****************************************************************************/
-void
-gl_view_edit_merge_props (glView *view)
-{
- gl_debug (DEBUG_VIEW, "");
-
- g_return_if_fail (view && GL_IS_VIEW (view));
-
- if (view->merge_props_dialog != NULL) {
- gtk_widget_show_all (view->merge_props_dialog);
- gtk_window_present (GTK_WINDOW(view->merge_props_dialog));
- return;
- }
-
- view->merge_props_dialog = gl_merge_properties_dialog_new (view);
- gtk_widget_show_all (view->merge_props_dialog);
-
- g_signal_connect (G_OBJECT(view->merge_props_dialog), "destroy",
- G_CALLBACK (gtk_widget_destroyed),
- &view->merge_props_dialog);
-}
-
-/*---------------------------------------------------------------------------*/
-/* PRIVATE. Canvas event handler. */
-/*---------------------------------------------------------------------------*/
-static int
-canvas_event (GnomeCanvas *canvas,
- GdkEvent *event,
- glView *view)
-{
- gdouble x, y;
-
- gl_debug (DEBUG_VIEW, "");
-
- g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
-
- /* emit pointer signals regardless of state */
- switch (event->type) {
- case GDK_MOTION_NOTIFY:
- gl_debug (DEBUG_VIEW, "MOTION_NOTIFY");
- gnome_canvas_window_to_world (canvas,
- event->motion.x,
- event->motion.y, &x, &y);
- g_signal_emit (G_OBJECT(view), signals[POINTER_MOVED], 0, x, y);
- break; /* fall through */
-
- case GDK_LEAVE_NOTIFY:
- gl_debug (DEBUG_VIEW, "LEAVEW_NOTIFY");
- g_signal_emit (G_OBJECT(view), signals[POINTER_EXIT], 0);
- break; /* fall through */
-
- default:
- break; /* fall through */
- }
-
-
- switch (view->state) {
-
- case GL_VIEW_STATE_ARROW:
- return canvas_event_arrow_mode (canvas, event, view);
-
- case GL_VIEW_STATE_OBJECT_CREATE:
- switch (view->create_type) {
- case GL_LABEL_OBJECT_BOX:
- return gl_view_box_create_event_handler (canvas,
- event,
- view);
- break;
- case GL_LABEL_OBJECT_ELLIPSE:
- return gl_view_ellipse_create_event_handler (canvas,
- event,
- view);
- break;
- case GL_LABEL_OBJECT_LINE:
- return gl_view_line_create_event_handler (canvas,
- event,
- view);
- break;
- case GL_LABEL_OBJECT_IMAGE:
- return gl_view_image_create_event_handler (canvas,
- event,
- view);
- break;
- case GL_LABEL_OBJECT_TEXT:
- return gl_view_text_create_event_handler (canvas,
- event,
- view);
- break;
- case GL_LABEL_OBJECT_BARCODE:
- return gl_view_barcode_create_event_handler (canvas,
- event,
- view);
- break;
- default:
- /*Should not happen!*/
- g_warning ("Invalid label object type.");
- return FALSE;
- }
-
- default:
- g_warning ("Invalid view state."); /*Should not happen!*/
- return FALSE;
-
- }
-}
-
-/*---------------------------------------------------------------------------*/
-/* PRIVATE. Canvas event handler (arrow mode) */
-/*---------------------------------------------------------------------------*/
-static int
-canvas_event_arrow_mode (GnomeCanvas *canvas,
- GdkEvent *event,
- glView *view)
-{
- static gdouble x0, y0;
- static gboolean dragging = FALSE;
- static GnomeCanvasItem *item;
- gdouble x, y, x1, y1, x2, y2;
- GnomeCanvasGroup *group;
- GdkCursor *cursor;
-
- gl_debug (DEBUG_VIEW, "");
-
- g_return_val_if_fail (view && GL_IS_VIEW (view), FALSE);
-
- switch (event->type) {
-
- case GDK_BUTTON_PRESS:
- gl_debug (DEBUG_VIEW, "BUTTON_PRESS");
- gtk_widget_grab_focus (GTK_WIDGET(canvas));
- switch (event->button.button) {
- case 1:
- gnome_canvas_window_to_world (canvas,
- event->button.x,
- event->button.y, &x, &y);
-
- if (!object_at (view, x, y)) {
- if (!(event->button.state & GDK_CONTROL_MASK)) {
- gl_view_unselect_all (view);
- }
-
- dragging = TRUE;
- gnome_canvas_item_grab (canvas->root,
- GDK_POINTER_MOTION_MASK |
- GDK_BUTTON_RELEASE_MASK |
- GDK_BUTTON_PRESS_MASK,
- NULL, event->button.time);
- group =
- gnome_canvas_root (GNOME_CANVAS
- (view->canvas));
- item =
- gnome_canvas_item_new (group,
- gnome_canvas_rect_get_type (),
- "x1", x, "y1", y,
- "x2", x, "y2", y,
- "width_pixels", 2,
- "outline_color_rgba",
- SEL_LINE_COLOR,
- "fill_color_rgba",
- SEL_FILL_COLOR,
- NULL);
- x0 = x;
- y0 = y;
-
- }
- return FALSE;
- case 3:
- gnome_canvas_window_to_world (canvas,
- event->button.x,
- event->button.y, &x, &y);
-
- if (!object_at (view, x, y)) {
- /* bring up apropriate menu for selection. */
- gl_view_popup_menu (view, event);
- }
- return FALSE;
- default:
- return FALSE;
- }
-
- case GDK_BUTTON_RELEASE:
- gl_debug (DEBUG_VIEW, "BUTTON_RELEASE");
- switch (event->button.button) {
- case 1:
- if (dragging) {
- dragging = FALSE;
- gnome_canvas_item_ungrab (canvas->root,
- event->button.time);
- gnome_canvas_window_to_world (canvas,
- event->button.x,
- event->button.y,
- &x, &y);
- x1 = MIN (x, x0);
- y1 = MIN (y, y0);
- x2 = MAX (x, x0);
- y2 = MAX (y, y0);
- gl_view_select_region (view, x1, y1, x2, y2);
- gtk_object_destroy (GTK_OBJECT (item));
- return TRUE;
- }
- return FALSE;
-
- default:
- return FALSE;
- }
-
- case GDK_MOTION_NOTIFY:
- gl_debug (DEBUG_VIEW, "MOTION_NOTIFY");
- gnome_canvas_window_to_world (canvas,
- event->motion.x,
- event->motion.y, &x, &y);
- if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
- gnome_canvas_item_set (item,
- "x1", MIN (x, x0),
- "y1", MIN (y, y0),
- "x2", MAX (x, x0),
- "y2", MAX (y, y0), NULL);
- return TRUE;
- } else {
- return FALSE;
- }
-
- case GDK_KEY_PRESS:
- gl_debug (DEBUG_VIEW, "KEY_PRESS");
- if (!dragging) {
- switch (event->key.keyval) {
- case GDK_Left:
- case GDK_KP_Left:
- gl_view_move_selection (view,
- -1.0 / (view->zoom), 0.0);
- break;
- case GDK_Up:
- case GDK_KP_Up:
- gl_view_move_selection (view,
- 0.0, -1.0 / (view->zoom));
- break;
- case GDK_Right:
- case GDK_KP_Right:
- gl_view_move_selection (view,
- 1.0 / (view->zoom), 0.0);
- break;
- case GDK_Down:
- case GDK_KP_Down:
- gl_view_move_selection (view,
- 0.0, 1.0 / (view->zoom));
- break;
- case GDK_Delete:
- case GDK_KP_Delete:
- gl_view_delete_selection (view);
- cursor = gdk_cursor_new (GDK_LEFT_PTR);
- gdk_window_set_cursor (view->canvas->window,
- cursor);
- gdk_cursor_unref (cursor);
- break;
- default:
- return FALSE;
- }
- }
- return TRUE; /* We handled this or we were dragging. */
-
- default:
- gl_debug (DEBUG_VIEW, "default");
- return FALSE;
- }
-
-}
-
-/*---------------------------------------------------------------------------*/
-/* PRIVATE. create menu for selections. */
-/*---------------------------------------------------------------------------*/
-void
-construct_selection_menu (glView *view)
-{
- GtkWidget *menu, *menuitem, *submenu;
-
- gl_debug (DEBUG_VIEW, "START");
-
- g_return_if_fail (view && GL_IS_VIEW (view));
-
- menu = gtk_menu_new ();
-
- /*
- * Submenu: Order
- */
- menuitem = gtk_menu_item_new_with_mnemonic (_("_Order"));
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
- gtk_widget_show (menuitem);
- submenu = gtk_menu_new ();
- gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
-
- menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ORDER_TOP, NULL);
- gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
- gtk_widget_show (menuitem);
- g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
- G_CALLBACK (gl_view_raise_selection), view);
-
- menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ORDER_BOTTOM, NULL);
- gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
- gtk_widget_show (menuitem);
- g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
- G_CALLBACK (gl_view_lower_selection), view);
-
- /*
- * Submenu: Rotate/Flip
- */
- menuitem = gtk_menu_item_new_with_mnemonic (_("_Rotate/Flip"));
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
- gtk_widget_show (menuitem);
- submenu = gtk_menu_new ();
- gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
-
- menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ROTATE_LEFT, NULL);
- gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
- gtk_widget_show (menuitem);
- g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
- G_CALLBACK (gl_view_rotate_selection_left), view);
-
- menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ROTATE_RIGHT, NULL);
- gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
- gtk_widget_show (menuitem);
- g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
- G_CALLBACK (gl_view_rotate_selection_right), view);
-
- menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_FLIP_HORIZ, NULL);
- gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
- gtk_widget_show (menuitem);
- g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
- G_CALLBACK (gl_view_flip_selection_horiz), view);
-
- menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_FLIP_VERT, NULL);
- gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
- gtk_widget_show (menuitem);
- g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
- G_CALLBACK (gl_view_flip_selection_vert), view);
-
- /*
- * Submenu: Align Horizontally
- */
- menuitem = gtk_menu_item_new_with_mnemonic (_("Align _Horizontally"));
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
- gtk_widget_show (menuitem);
- submenu = gtk_menu_new ();
- gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
-
- menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ALIGN_LEFT, NULL);
- gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
- gtk_widget_show (menuitem);
- g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
- G_CALLBACK (gl_view_align_selection_left), view);
- view->multi_selection_items =
- g_list_prepend (view->multi_selection_items, menuitem);
-
- menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ALIGN_HCENTER, NULL);
- gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
- gtk_widget_show (menuitem);
- g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
- G_CALLBACK (gl_view_align_selection_hcenter), view);
- view->multi_selection_items =
- g_list_prepend (view->multi_selection_items, menuitem);
-
- menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ALIGN_RIGHT, NULL);
- gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
- gtk_widget_show (menuitem);
- g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
- G_CALLBACK (gl_view_align_selection_right), view);
- view->multi_selection_items =
- g_list_prepend (view->multi_selection_items, menuitem);
-
- menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_CENTER_HORIZ, NULL);
- gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
- gtk_widget_show (menuitem);
- g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
- G_CALLBACK (gl_view_center_selection_horiz), view);
-
- /*
- * Submenu: Align Vertically
- */
- menuitem = gtk_menu_item_new_with_mnemonic (_("Align _Vertically"));
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
- gtk_widget_show (menuitem);
- submenu = gtk_menu_new ();
- gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
-
- menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ALIGN_TOP, NULL);
- gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
- gtk_widget_show (menuitem);
- g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
- G_CALLBACK (gl_view_align_selection_top), view);
- view->multi_selection_items =
- g_list_prepend (view->multi_selection_items, menuitem);
-
- menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ALIGN_VCENTER, NULL);
- gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
- gtk_widget_show (menuitem);
- g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
- G_CALLBACK (gl_view_align_selection_vcenter), view);
- view->multi_selection_items =
- g_list_prepend (view->multi_selection_items, menuitem);
-
- menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_ALIGN_BOTTOM, NULL);
- gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
- gtk_widget_show (menuitem);
- g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
- G_CALLBACK (gl_view_align_selection_bottom), view);
- view->multi_selection_items =
- g_list_prepend (view->multi_selection_items, menuitem);
-
- menuitem = gtk_image_menu_item_new_from_stock (GL_STOCK_CENTER_VERT, NULL);
- gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
- gtk_widget_show (menuitem);
- g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
- G_CALLBACK (gl_view_center_selection_vert), view);
-
- /*
- * Separator -------------------------
- */
- menuitem = gtk_menu_item_new ();
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
- gtk_widget_show (menuitem);
-
- menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_CUT, NULL);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
- gtk_widget_show (menuitem);
- g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
- G_CALLBACK (gl_view_cut), view);
-
- menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_COPY, NULL);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
- gtk_widget_show (menuitem);
- g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
- G_CALLBACK (gl_view_copy), view);
-
- menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_PASTE, NULL);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
- gtk_widget_show (menuitem);
- g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
- G_CALLBACK (gl_view_paste), view);
-
- menuitem = gtk_menu_item_new_with_mnemonic (_("_Delete"));
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
- gtk_widget_show (menuitem);
- g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
- G_CALLBACK (gl_view_delete_selection), view);
-
-
- view->selection_menu = menu;
-
- gl_debug (DEBUG_VIEW, "END");
-}
-
-/*---------------------------------------------------------------------------*/
-/* PRIVATE. create menu for empty selections. */
-/*---------------------------------------------------------------------------*/
-void
-construct_empty_selection_menu (glView *view)
-{
- GtkWidget *menu, *menuitem, *submenu;
-
- gl_debug (DEBUG_VIEW, "START");
-
- g_return_if_fail (view && GL_IS_VIEW (view));
-
- menu = gtk_menu_new ();
-
- menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_PASTE, NULL);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
- gtk_widget_show (menuitem);
- g_signal_connect_swapped (G_OBJECT (menuitem), "activate",
- G_CALLBACK (gl_view_paste), view);
-
-
- view->empty_selection_menu = menu;
-
- gl_debug (DEBUG_VIEW, "END");
-}
-
-/****************************************************************************/
-/* popup menu. */
-/****************************************************************************/
-void
-gl_view_popup_menu (glView *view,
- GdkEvent *event)
-{
- GtkMenu *menu;
- GList *p;
-
- gl_debug (DEBUG_VIEW, "START");
-
- g_return_if_fail (view && GL_IS_VIEW (view));
-
- if (gl_view_is_selection_empty (view)) {
-
- if (view->empty_selection_menu != NULL) {
- gtk_menu_popup (GTK_MENU (view->empty_selection_menu),
- NULL, NULL, NULL, NULL,
- event->button.button,
- event->button.time);
- }
-
- } else {
-
- for (p=view->atomic_selection_items; p!=NULL; p=p->next) {
- gtk_widget_set_sensitive (GTK_WIDGET(p->data),
- gl_view_is_selection_atomic(view));
- }
-
- for (p=view->multi_selection_items; p!=NULL; p=p->next) {
- gtk_widget_set_sensitive (GTK_WIDGET(p->data),
- !gl_view_is_selection_atomic(view));
- }
-
- if (view->selection_menu != NULL) {
- gtk_menu_popup (GTK_MENU (view->selection_menu),
- NULL, NULL, NULL, NULL,
- event->button.button,
- event->button.time);
- }
-
- }
-
- gl_debug (DEBUG_VIEW, "END");
-}
-
/*---------------------------------------------------------------------------*/
/* PRIVATE. Handle "selection-clear" signal. */
/*---------------------------------------------------------------------------*/
static void
selection_clear_cb (GtkWidget *widget,
GdkEventSelection *event,
- gpointer data)
+ glView *view)
{
- glView *view = GL_VIEW (data);
-
gl_debug (DEBUG_VIEW, "START");
g_return_if_fail (view && GL_IS_VIEW (view));
static void
selection_get_cb (GtkWidget *widget,
GtkSelectionData *selection_data,
- guint info,
- guint time,
- gpointer data)
+ guint info,
+ guint time,
+ glView *view)
{
- glView *view = GL_VIEW (data);
- gchar *buffer;
- glXMLLabelStatus status;
+ gchar *buffer;
+ glXMLLabelStatus status;
gl_debug (DEBUG_VIEW, "START");
buffer = gl_xml_label_save_buffer (view->selection_data,
&status);
gtk_selection_data_set (selection_data,
- GDK_SELECTION_TYPE_STRING, 8, buffer,
- strlen (buffer));
+ GDK_SELECTION_TYPE_STRING, 8,
+ (guchar *)buffer, strlen (buffer));
g_free (buffer);
}
static void
selection_received_cb (GtkWidget *widget,
GtkSelectionData *selection_data,
- guint time,
- gpointer data)
+ guint time,
+ glView *view)
{
- glView *view = GL_VIEW (data);
- glLabel *label = NULL;
- glXMLLabelStatus status;
- GList *p, *p_next;
- glLabelObject *object, *newobject;
- glViewObject *view_object;
+ glLabel *label = NULL;
+ glXMLLabelStatus status;
+ GList *p, *p_next;
+ glLabelObject *object, *newobject;
+ glViewObject *view_object;
gl_debug (DEBUG_VIEW, "START");
gl_view_unselect_all (view);
- label = gl_xml_label_open_buffer (selection_data->data, &status);
+ label = gl_xml_label_open_buffer ((gchar *)selection_data->data, &status);
for (p = label->objects; p != NULL; p = p_next) {
p_next = p->next;
} else {
/* Should not happen! */
view_object = NULL;
- g_warning ("Invalid label object type.");
+ g_message ("Invalid label object type.");
}
gl_view_select_object (view, view_object);
}
/* Set default font family. */
/****************************************************************************/
void
-gl_view_set_default_font_family (glView *view,
- const gchar *font_family)
+gl_view_set_default_font_family (glView *view,
+ const gchar *font_family)
{
gl_debug (DEBUG_VIEW, "START");
/* Set default font size. */
/****************************************************************************/
void
-gl_view_set_default_font_size (glView *view,
- gdouble font_size)
+gl_view_set_default_font_size (glView *view,
+ gdouble font_size)
{
gl_debug (DEBUG_VIEW, "START");
/* Set default font weight. */
/****************************************************************************/
void
-gl_view_set_default_font_weight (glView *view,
- GnomeFontWeight font_weight)
+gl_view_set_default_font_weight (glView *view,
+ PangoWeight font_weight)
{
gl_debug (DEBUG_VIEW, "START");
/* Set default font italic flag. */
/****************************************************************************/
void
-gl_view_set_default_font_italic_flag (glView *view,
- gboolean font_italic_flag)
+gl_view_set_default_font_italic_flag (glView *view,
+ gboolean font_italic_flag)
{
gl_debug (DEBUG_VIEW, "START");
/* Set default text color. */
/****************************************************************************/
void
-gl_view_set_default_text_color (glView *view,
- guint text_color)
+gl_view_set_default_text_color (glView *view,
+ guint text_color)
{
gl_debug (DEBUG_VIEW, "START");
/* Set default text alignment. */
/****************************************************************************/
void
-gl_view_set_default_text_alignment (glView *view,
- GtkJustification text_alignment)
+gl_view_set_default_text_alignment (glView *view,
+ PangoAlignment text_alignment)
{
gl_debug (DEBUG_VIEW, "START");
gl_debug (DEBUG_VIEW, "END");
}
+/****************************************************************************/
+/* Set default text line spacing. */
+/****************************************************************************/
+void
+gl_view_set_default_text_line_spacing (glView *view,
+ gdouble text_line_spacing)
+{
+ gl_debug (DEBUG_VIEW, "START");
+
+ g_return_if_fail (view && GL_IS_VIEW (view));
+
+ view->default_text_line_spacing = text_line_spacing;
+
+ gl_debug (DEBUG_VIEW, "END");
+}
+
/****************************************************************************/
/* Set default line width. */
/****************************************************************************/
void
-gl_view_set_default_line_width (glView *view,
- gdouble line_width)
+gl_view_set_default_line_width (glView *view,
+ gdouble line_width)
{
gl_debug (DEBUG_VIEW, "START");
/* Set default line color. */
/****************************************************************************/
void
-gl_view_set_default_line_color (glView *view,
- guint line_color)
+gl_view_set_default_line_color (glView *view,
+ guint line_color)
{
gl_debug (DEBUG_VIEW, "START");
/* Set default fill color. */
/****************************************************************************/
void
-gl_view_set_default_fill_color (glView *view,
- guint fill_color)
+gl_view_set_default_fill_color (glView *view,
+ guint fill_color)
{
gl_debug (DEBUG_VIEW, "START");
/* Get default font family. */
/****************************************************************************/
gchar *
-gl_view_get_default_font_family (glView *view)
+gl_view_get_default_font_family (glView *view)
{
gl_debug (DEBUG_VIEW, "START");
/* Get default font size. */
/****************************************************************************/
gdouble
-gl_view_get_default_font_size (glView *view)
+gl_view_get_default_font_size (glView *view)
{
gl_debug (DEBUG_VIEW, "START");
/****************************************************************************/
/* Get default font weight. */
/****************************************************************************/
-GnomeFontWeight
-gl_view_get_default_font_weight (glView *view)
+PangoWeight
+gl_view_get_default_font_weight (glView *view)
{
gl_debug (DEBUG_VIEW, "START");
- g_return_val_if_fail (view && GL_IS_VIEW (view), GNOME_FONT_BOOK);
+ g_return_val_if_fail (view && GL_IS_VIEW (view), PANGO_WEIGHT_NORMAL);
gl_debug (DEBUG_VIEW, "END");
/* Get default font italic flag. */
/****************************************************************************/
gboolean
-gl_view_get_default_font_italic_flag (glView *view)
+gl_view_get_default_font_italic_flag (glView *view)
{
gl_debug (DEBUG_VIEW, "START");
/* Get default text color. */
/****************************************************************************/
guint
-gl_view_get_default_text_color (glView *view)
+gl_view_get_default_text_color (glView *view)
{
gl_debug (DEBUG_VIEW, "START");
/****************************************************************************/
/* Get default text alignment. */
/****************************************************************************/
-GtkJustification
-gl_view_get_default_text_alignment (glView *view)
+PangoAlignment
+gl_view_get_default_text_alignment (glView *view)
{
gl_debug (DEBUG_VIEW, "START");
- g_return_val_if_fail (view && GL_IS_VIEW (view), GTK_JUSTIFY_LEFT);
+ g_return_val_if_fail (view && GL_IS_VIEW (view), PANGO_ALIGN_LEFT);
gl_debug (DEBUG_VIEW, "END");
return view->default_text_alignment;
}
+/****************************************************************************/
+/* Get default text line spacing. */
+/****************************************************************************/
+gdouble
+gl_view_get_default_text_line_spacing (glView *view)
+{
+ gl_debug (DEBUG_VIEW, "START");
+
+ g_return_val_if_fail (view && GL_IS_VIEW (view), 1.0);
+
+ gl_debug (DEBUG_VIEW, "END");
+
+ return view->default_text_line_spacing;
+}
+
+
/****************************************************************************/
/* Get default line width. */
/****************************************************************************/
gdouble
-gl_view_get_default_line_width (glView *view)
+gl_view_get_default_line_width (glView *view)
{
gl_debug (DEBUG_VIEW, "START");
/****************************************************************************/
/* Get default line color. */
/****************************************************************************/
-guint gl_view_get_default_line_color (glView *view)
+guint
+gl_view_get_default_line_color (glView *view)
{
gl_debug (DEBUG_VIEW, "START");
/****************************************************************************/
/* Get default fill color. */
/****************************************************************************/
-guint gl_view_get_default_fill_color (glView *view)
+guint
+gl_view_get_default_fill_color (glView *view)
{
gl_debug (DEBUG_VIEW, "START");
return view->default_fill_color;
}
+/*---------------------------------------------------------------------------*/
+/* PRIVATE. Focus in event handler. */
+/*---------------------------------------------------------------------------*/
+static gboolean
+focus_in_event_cb (glView *view,
+ GdkEventFocus *event)
+{
+ GTK_WIDGET_SET_FLAGS (GTK_WIDGET (view->canvas), GTK_HAS_FOCUS);
+
+ return FALSE;
+}
+
+/*---------------------------------------------------------------------------*/
+/* PRIVATE. Focus out event handler. */
+/*---------------------------------------------------------------------------*/
+static gboolean
+focus_out_event_cb (glView *view,
+ GdkEventFocus *event)
+{
+ GTK_WIDGET_UNSET_FLAGS (GTK_WIDGET (view->canvas), GTK_HAS_FOCUS);
+
+ return FALSE;
+}
+
+/*---------------------------------------------------------------------------*/
+/* PRIVATE. Enter notify event handler. */
+/*---------------------------------------------------------------------------*/
+static gboolean
+enter_notify_event_cb (glView *view,
+ GdkEventCrossing *event)
+{
+ gtk_widget_grab_focus(GTK_WIDGET (view->canvas));
+
+ return FALSE;
+}
+
+/*---------------------------------------------------------------------------*/
+/* PRIVATE. Leave notify event handler. */
+/*---------------------------------------------------------------------------*/
+static gboolean
+leave_notify_event_cb (glView *view,
+ GdkEventCrossing *event)
+{
+
+ g_signal_emit (G_OBJECT(view), signals[POINTER_EXIT], 0);
+
+ return FALSE;
+}
+
+/*---------------------------------------------------------------------------*/
+/* PRIVATE. Motion notify event handler. */
+/*---------------------------------------------------------------------------*/
+static gboolean
+motion_notify_event_cb (glView *view,
+ GdkEventMotion *event)
+{
+ gboolean return_value = FALSE;
+ cairo_t *cr;
+ gdouble scale;
+ gdouble x, y;
+ GdkCursor *cursor;
+ glViewObjectHandle handle;
+
+ cr = gdk_cairo_create (GTK_LAYOUT (view->canvas)->bin_window);
+
+ /*
+ * Translate to label coordinates
+ */
+ scale = view->zoom * view->home_scale;
+ cairo_scale (cr, scale, scale);
+ cairo_translate (cr, view->x0, view->y0);
+
+ x = event->x;
+ y = event->y;
+ cairo_device_to_user (cr, &x, &y);
+
+ /*
+ * Emit signal regardless of mode
+ */
+ g_signal_emit (G_OBJECT(view), signals[POINTER_MOVED], 0, x, y);
+
+ /*
+ * Handle event as appropriate for mode
+ */
+ switch (view->mode)
+ {
+
+ case GL_VIEW_MODE_ARROW:
+ switch (view->state)
+ {
+
+ case GL_VIEW_IDLE:
+ if (view_handle_at (view, cr, event->x, event->y, &handle))
+ {
+ cursor = gdk_cursor_new (GDK_CROSSHAIR);
+ }
+ else if (view_view_object_at (view, cr, event->x, event->y))
+ {
+ cursor = gdk_cursor_new (GDK_FLEUR);
+ }
+ else
+ {
+ cursor = gdk_cursor_new (GDK_LEFT_PTR);
+ }
+ gdk_window_set_cursor (view->canvas->window, cursor);
+ gdk_cursor_unref (cursor);
+ break;
+
+ case GL_VIEW_ARROW_SELECT_REGION:
+#ifdef CLIP_UPDATES
+ gl_view_update_region (view, cr, &view->select_region);
+#endif
+ view->select_region.x2 = x;
+ view->select_region.y2 = y;
+#ifdef CLIP_UPDATES
+ gl_view_update_region (view, cr, &view->select_region);
+#else
+ gl_view_update (view);
+#endif
+ break;
+
+ case GL_VIEW_ARROW_MOVE:
+ gl_view_move_selection (view,
+ (x - view->move_last_x),
+ (y - view->move_last_y));
+ view->move_last_x = x;
+ view->move_last_y = y;
+ break;
+
+ case GL_VIEW_ARROW_RESIZE:
+ gl_view_object_resize_event (view->resize_object,
+ view->resize_handle,
+ view->resize_honor_aspect,
+ cr,
+ event->x,
+ event->y);
+ break;
+
+ default:
+ g_message ("Invalid arrow state."); /*Should not happen!*/
+ }
+ return_value = TRUE;
+ break;
+
+
+ case GL_VIEW_MODE_OBJECT_CREATE:
+ if (view->state != GL_VIEW_IDLE)
+ {
+ switch (view->create_type)
+ {
+ case GL_LABEL_OBJECT_BOX:
+ gl_view_box_create_motion_event (view, x, y);
+ break;
+ case GL_LABEL_OBJECT_ELLIPSE:
+ gl_view_ellipse_create_motion_event (view, x, y);
+ break;
+ case GL_LABEL_OBJECT_LINE:
+ gl_view_line_create_motion_event (view, x, y);
+ break;
+ case GL_LABEL_OBJECT_IMAGE:
+ gl_view_image_create_motion_event (view, x, y);
+ break;
+ case GL_LABEL_OBJECT_TEXT:
+ gl_view_text_create_motion_event (view, x, y);
+ break;
+ case GL_LABEL_OBJECT_BARCODE:
+ gl_view_barcode_create_motion_event (view, x, y);
+ break;
+ default:
+ g_message ("Invalid create type."); /*Should not happen!*/
+ }
+ }
+ break;
+
+
+ default:
+ g_message ("Invalid view mode."); /*Should not happen!*/
+
+ }
+
+ cairo_destroy (cr);
+
+ /*
+ * FIXME: we re-establish grabs here if the grab has been lost. We seem to be
+ * losing grabs when we emit signals that lead to the manipulation of
+ * the GtkUIManager. Needs more investigation
+ */
+ if (view->grabbed_flag && !gdk_pointer_is_grabbed ())
+ {
+ gdk_pointer_grab (GTK_LAYOUT (view->canvas)->bin_window,
+ FALSE,
+ (GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK),
+ NULL,
+ NULL,
+ event->time);
+ }
+
+ return return_value;
+}
+
+/*---------------------------------------------------------------------------*/
+/* PRIVATE. Button press event handler. */
+/*---------------------------------------------------------------------------*/
+static gboolean
+button_press_event_cb (glView *view,
+ GdkEventButton *event)
+{
+ gboolean return_value = FALSE;
+ cairo_t *cr;
+ gdouble scale;
+ gdouble x, y;
+ glViewObject *view_object;
+ glViewObjectHandle handle;
+
+ cr = gdk_cairo_create (GTK_LAYOUT (view->canvas)->bin_window);
+
+ /*
+ * Translate to label coordinates
+ */
+ scale = view->zoom * view->home_scale;
+ cairo_scale (cr, scale, scale);
+ cairo_translate (cr, view->x0, view->y0);
+
+ x = event->x;
+ y = event->y;
+ cairo_device_to_user (cr, &x, &y);
+
+ switch (event->button)
+ {
+
+ case 1:
+ /*
+ * Handle event as appropriate for mode
+ */
+ switch (view->mode)
+ {
+ case GL_VIEW_MODE_ARROW:
+ if ((view_object = view_handle_at (view, cr, event->x, event->y, &handle)))
+ {
+ view->resize_object = view_object;
+ view->resize_handle = handle;
+ view->resize_honor_aspect = event->state & GDK_CONTROL_MASK;
+
+ view->state = GL_VIEW_ARROW_RESIZE;
+ }
+ else if ((view_object = view_view_object_at (view, cr, event->x, event->y)))
+ {
+ if (event->state & GDK_CONTROL_MASK)
+ {
+ if (gl_view_is_object_selected (view, view_object))
+ {
+ /* Un-selecting a selected item */
+ gl_view_unselect_object (view, view_object);
+ } else {
+ /* Add to current selection */
+ gl_view_select_object (view, view_object);
+ }
+ }
+ else
+ {
+ if (!gl_view_is_object_selected (view, view_object))
+ {
+ /* remove any selections before adding */
+ gl_view_unselect_all (view);
+ /* Add to current selection */
+ gl_view_select_object (view, view_object);
+ }
+ }
+ view->move_last_x = x;
+ view->move_last_y = y;
+
+ view->state = GL_VIEW_ARROW_MOVE;
+ }
+ else
+ {
+ if (!(event->state & GDK_CONTROL_MASK))
+ {
+ gl_view_unselect_all (view);
+ }
+
+ view->select_region_visible = TRUE;
+ view->select_region.x1 = x;
+ view->select_region.y1 = y;
+ view->select_region.x2 = x;
+ view->select_region.y2 = y;
+
+ view->state = GL_VIEW_ARROW_SELECT_REGION;
+ }
+
+
+ return_value = TRUE;
+ break;
+
+ case GL_VIEW_MODE_OBJECT_CREATE:
+ switch (view->create_type)
+ {
+ case GL_LABEL_OBJECT_BOX:
+ gl_view_box_create_button_press_event (view, x, y);
+ break;
+ case GL_LABEL_OBJECT_ELLIPSE:
+ gl_view_ellipse_create_button_press_event (view, x, y);
+ break;
+ case GL_LABEL_OBJECT_LINE:
+ gl_view_line_create_button_press_event (view, x, y);
+ break;
+ case GL_LABEL_OBJECT_IMAGE:
+ gl_view_image_create_button_press_event (view, x, y);
+ break;
+ case GL_LABEL_OBJECT_TEXT:
+ gl_view_text_create_button_press_event (view, x, y);
+ break;
+ case GL_LABEL_OBJECT_BARCODE:
+ gl_view_barcode_create_button_press_event (view, x, y);
+ break;
+ default:
+ g_message ("Invalid create type."); /*Should not happen!*/
+ }
+ view->state = GL_VIEW_CREATE_DRAG;
+ return_value = TRUE;
+ break;
+
+ default:
+ g_message ("Invalid view mode."); /*Should not happen!*/
+ }
+
+ view->grabbed_flag = TRUE;
+ gdk_pointer_grab (GTK_LAYOUT (view->canvas)->bin_window,
+ FALSE,
+ (GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK),
+ NULL,
+ NULL,
+ event->time);
+ break;
+
+ case 3:
+ g_signal_emit (G_OBJECT (view),
+ signals[CONTEXT_MENU_ACTIVATE], 0,
+ event->button, event->time);
+ return_value = TRUE;
+ break;
+
+ }
+
+ cairo_destroy (cr);
+
+ return return_value;
+}
+
+/*---------------------------------------------------------------------------*/
+/* PRIVATE. Button release event handler. */
+/*---------------------------------------------------------------------------*/
+static gboolean
+button_release_event_cb (glView *view,
+ GdkEventButton *event)
+{
+ gboolean return_value = FALSE;
+ cairo_t *cr;
+ gdouble scale;
+ gdouble x, y;
+ GdkCursor *cursor;
+
+ cr = gdk_cairo_create (GTK_LAYOUT (view->canvas)->bin_window);
+
+ /*
+ * Translate to label coordinates
+ */
+ scale = view->zoom * view->home_scale;
+ cairo_scale (cr, scale, scale);
+ cairo_translate (cr, view->x0, view->y0);
+
+ x = event->x;
+ y = event->y;
+ cairo_device_to_user (cr, &x, &y);
+
+ switch (event->button)
+ {
+
+ case 1:
+ view->grabbed_flag = FALSE;
+ gdk_pointer_ungrab (event->time);
+ /*
+ * Handle event as appropriate for mode
+ */
+ switch (view->mode)
+ {
+ case GL_VIEW_MODE_ARROW:
+ switch (view->state)
+ {
+ case GL_VIEW_ARROW_RESIZE:
+ view->resize_object = NULL;
+
+ view->state = GL_VIEW_IDLE;
+ break;
+
+ case GL_VIEW_ARROW_SELECT_REGION:
+#ifdef CLIP_UPDATES
+ gl_view_update_region (view, cr, &view->select_region);
+#else
+ gl_view_update (view);
+#endif
+
+ view->select_region_visible = FALSE;
+ view->select_region.x2 = x;
+ view->select_region.y2 = y;
+
+ gl_view_select_region (view, &view->select_region);
+
+ view->state = GL_VIEW_IDLE;
+ break;
+
+ default:
+ view->state = GL_VIEW_IDLE;
+ break;
+
+ }
+
+ return_value = TRUE;
+ break;
+
+
+ case GL_VIEW_MODE_OBJECT_CREATE:
+ switch (view->create_type)
+ {
+ case GL_LABEL_OBJECT_BOX:
+ gl_view_box_create_button_release_event (view, x, y);
+ break;
+ case GL_LABEL_OBJECT_ELLIPSE:
+ gl_view_ellipse_create_button_release_event (view, x, y);
+ break;
+ case GL_LABEL_OBJECT_LINE:
+ gl_view_line_create_button_release_event (view, x, y);
+ break;
+ case GL_LABEL_OBJECT_IMAGE:
+ gl_view_image_create_button_release_event (view, x, y);
+ break;
+ case GL_LABEL_OBJECT_TEXT:
+ gl_view_text_create_button_release_event (view, x, y);
+ break;
+ case GL_LABEL_OBJECT_BARCODE:
+ gl_view_barcode_create_button_release_event (view, x, y);
+ break;
+ default:
+ g_message ("Invalid create type."); /*Should not happen!*/
+ }
+ view->mode = GL_VIEW_MODE_ARROW;
+ view->state = GL_VIEW_IDLE;
+ cursor = gdk_cursor_new (GDK_LEFT_PTR);
+ gdk_window_set_cursor (view->canvas->window, cursor);
+ gdk_cursor_unref (cursor);
+ break;
+
+
+ default:
+ g_message ("Invalid view mode."); /*Should not happen!*/
+ }
+
+ }
+
+ cairo_destroy (cr);
+
+ return return_value;
+}
+
+/*---------------------------------------------------------------------------*/
+/* PRIVATE. Key press event handler. */
+/*---------------------------------------------------------------------------*/
+static gboolean
+key_press_event_cb (glView *view,
+ GdkEventKey *event)
+{
+ GdkCursor *cursor;
+
+ gl_debug (DEBUG_VIEW, "");
+
+ if ( (view->mode == GL_VIEW_MODE_ARROW) &&
+ (view->state == GL_VIEW_IDLE) )
+ {
+ switch (event->keyval) {
+
+ case GDK_Left:
+ case GDK_KP_Left:
+ gl_view_move_selection (view, -1.0 / (view->zoom), 0.0);
+ break;
+ case GDK_Up:
+ case GDK_KP_Up:
+ gl_view_move_selection (view, 0.0, -1.0 / (view->zoom));
+ break;
+ case GDK_Right:
+ case GDK_KP_Right:
+ gl_view_move_selection (view, 1.0 / (view->zoom), 0.0);
+ break;
+ case GDK_Down:
+ case GDK_KP_Down:
+ gl_view_move_selection (view, 0.0, 1.0 / (view->zoom));
+ break;
+ case GDK_Delete:
+ case GDK_KP_Delete:
+ gl_view_delete_selection (view);
+ cursor = gdk_cursor_new (GDK_LEFT_PTR);
+ gdk_window_set_cursor (GTK_WIDGET (view->canvas)->window
+, cursor);
+ gdk_cursor_unref (cursor);
+ break;
+ default:
+ return FALSE;
+
+ }
+ }
+ return TRUE; /* We handled this or we were dragging. */
+}
+