1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
4 * (GLABELS) Label and Business Card Creation program for GNOME
6 * view_barcode.c: GLabels label barcode object view
8 * Copyright (C) 2001-2007 Jim Evins <evins@snaught.com>.
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 #include "view-barcode.h"
28 #include <glib/gi18n.h>
29 #include <glib/gmem.h>
32 #include "object-editor.h"
35 #include "pixmaps/cursor_barcode.xbm"
36 #include "pixmaps/cursor_barcode_mask.xbm"
40 /*========================================================*/
41 /* Private macros and constants. */
42 /*========================================================*/
44 /*========================================================*/
46 /*========================================================*/
48 struct _glViewBarcodePrivate {
51 /*========================================================*/
52 /* Private globals. */
53 /*========================================================*/
56 /*========================================================*/
57 /* Private function prototypes. */
58 /*========================================================*/
60 static void gl_view_barcode_finalize (GObject *object);
62 static GtkWidget *construct_properties_editor (glViewObject *view_object);
64 static void update_object_from_editor_cb (glObjectEditor *editor,
65 glLabelObject *object);
67 static void update_editor_from_object_cb (glLabelObject *object,
68 glObjectEditor *editor);
70 static void update_editor_from_move_cb (glLabelObject *object,
73 glObjectEditor *editor);
75 static void update_editor_from_label_cb (glLabel *label,
76 glObjectEditor *editor);
78 static gboolean object_at (glViewObject *view_object,
86 /*****************************************************************************/
87 /* Boilerplate object stuff. */
88 /*****************************************************************************/
89 G_DEFINE_TYPE (glViewBarcode, gl_view_barcode, GL_TYPE_VIEW_OBJECT);
93 gl_view_barcode_class_init (glViewBarcodeClass *class)
95 GObjectClass *object_class = G_OBJECT_CLASS (class);
96 glViewObjectClass *view_object_class = GL_VIEW_OBJECT_CLASS (class);
98 gl_debug (DEBUG_VIEW, "START");
100 gl_view_barcode_parent_class = g_type_class_peek_parent (class);
102 object_class->finalize = gl_view_barcode_finalize;
104 view_object_class->construct_editor = construct_properties_editor;
105 view_object_class->object_at = object_at;
107 gl_debug (DEBUG_VIEW, "END");
111 gl_view_barcode_init (glViewBarcode *view_barcode)
113 gl_debug (DEBUG_VIEW, "START");
115 view_barcode->priv = g_new0 (glViewBarcodePrivate, 1);
117 gl_debug (DEBUG_VIEW, "END");
121 gl_view_barcode_finalize (GObject *object)
123 glViewBarcode *view_barcode = GL_VIEW_BARCODE (object);
125 gl_debug (DEBUG_VIEW, "START");
127 g_return_if_fail (object && GL_IS_VIEW_BARCODE (object));
129 g_free (view_barcode->priv);
131 G_OBJECT_CLASS (gl_view_barcode_parent_class)->finalize (object);
133 gl_debug (DEBUG_VIEW, "END");
136 /*****************************************************************************/
137 /* NEW barcode object view. */
138 /*****************************************************************************/
140 gl_view_barcode_new (glLabelBarcode *object,
143 glViewBarcode *view_barcode;
145 gl_debug (DEBUG_VIEW, "START");
147 g_return_val_if_fail (object && GL_IS_LABEL_BARCODE (object), NULL);
148 g_return_val_if_fail (view && GL_IS_VIEW (view), NULL);
150 view_barcode = g_object_new (gl_view_barcode_get_type(), NULL);
152 gl_view_object_set_object (GL_VIEW_OBJECT(view_barcode),
153 GL_LABEL_OBJECT(object),
154 GL_VIEW_OBJECT_HANDLES_BOX);
155 gl_view_object_set_view (GL_VIEW_OBJECT(view_barcode), view);
157 gl_debug (DEBUG_VIEW, "END");
159 return GL_VIEW_OBJECT (view_barcode);
162 /*****************************************************************************/
163 /* Create a properties dialog for a barcode object. */
164 /*****************************************************************************/
166 construct_properties_editor (glViewObject *view_object)
169 glViewBarcode *view_bc = (glViewBarcode *)view_object;
170 glLabelObject *object;
172 gl_debug (DEBUG_VIEW, "START");
174 object = gl_view_object_get_object (GL_VIEW_OBJECT(view_bc));
177 editor = gl_object_editor_new (GL_STOCK_BARCODE, _("Barcode object properties"),
178 GL_OBJECT_EDITOR_POSITION_PAGE,
179 GL_OBJECT_EDITOR_SIZE_PAGE,
180 GL_OBJECT_EDITOR_BC_PAGE,
181 GL_OBJECT_EDITOR_DATA_PAGE,
185 update_editor_from_label_cb (object->parent, GL_OBJECT_EDITOR(editor));
186 update_editor_from_object_cb (object, GL_OBJECT_EDITOR(editor));
187 update_editor_from_move_cb (object, 0, 0, GL_OBJECT_EDITOR(editor));
189 /* Connect signals. */
190 g_signal_connect (G_OBJECT (editor), "changed",
191 G_CALLBACK(update_object_from_editor_cb), object);
192 g_signal_connect (G_OBJECT (object), "changed",
193 G_CALLBACK (update_editor_from_object_cb), editor);
194 g_signal_connect (G_OBJECT (object), "moved",
195 G_CALLBACK (update_editor_from_move_cb), editor);
196 g_signal_connect (G_OBJECT (object->parent), "size_changed",
197 G_CALLBACK (update_editor_from_label_cb), editor);
198 g_signal_connect (G_OBJECT (object->parent), "merge_changed",
199 G_CALLBACK (update_editor_from_label_cb), editor);
201 gl_debug (DEBUG_VIEW, "END");
206 /*---------------------------------------------------------------------------*/
207 /* PRIVATE. editor "changed" callback. */
208 /*---------------------------------------------------------------------------*/
210 update_object_from_editor_cb (glObjectEditor *editor,
211 glLabelObject *object)
214 glTextNode *text_node;
216 gboolean text_flag, cs_flag;
217 glColorNode *color_node;
220 gl_debug (DEBUG_VIEW, "START");
222 g_signal_handlers_block_by_func (G_OBJECT(object),
223 update_editor_from_object_cb,
225 g_signal_handlers_block_by_func (G_OBJECT(object),
226 update_editor_from_move_cb,
230 gl_object_editor_get_position (editor, &x, &y);
231 gl_label_object_set_position (object, x, y);
233 gl_object_editor_get_size (editor, &w, &h);
234 gl_label_object_set_size (object, w, h);
236 text_node = gl_object_editor_get_data (editor);
237 gl_label_barcode_set_data (GL_LABEL_BARCODE(object), text_node);
238 gl_text_node_free (&text_node);
240 gl_object_editor_get_bc_style (editor, &id, &text_flag, &cs_flag, &format_digits);
241 color_node = gl_object_editor_get_bc_color (editor);
242 gl_label_barcode_set_props (GL_LABEL_BARCODE(object),
243 id, text_flag, cs_flag, format_digits);
244 gl_label_object_set_line_color (object, color_node);
245 gl_color_node_free (&color_node);
248 g_signal_handlers_unblock_by_func (G_OBJECT(object),
249 update_editor_from_object_cb,
251 g_signal_handlers_unblock_by_func (G_OBJECT(object),
252 update_editor_from_move_cb,
255 gl_debug (DEBUG_VIEW, "END");
258 /*---------------------------------------------------------------------------*/
259 /* PRIVATE. label object "changed" callback. */
260 /*---------------------------------------------------------------------------*/
262 update_editor_from_object_cb (glLabelObject *object,
263 glObjectEditor *editor)
266 glTextNode *text_node;
268 gboolean text_flag, cs_flag;
269 glColorNode *color_node;
273 gl_debug (DEBUG_VIEW, "START");
275 gl_label_object_get_size (object, &w, &h);
276 gl_object_editor_set_size (editor, w, h);
278 merge = gl_label_get_merge (GL_LABEL(object->parent));
280 gl_label_barcode_get_props (GL_LABEL_BARCODE(object),
281 &id, &text_flag, &cs_flag, &format_digits);
282 color_node = gl_label_object_get_line_color (object);
283 gl_object_editor_set_bc_style (editor, id, text_flag, cs_flag, format_digits);
284 gl_object_editor_set_bc_color (editor, (merge != NULL), color_node);
285 gl_color_node_free (&color_node);
288 text_node = gl_label_barcode_get_data (GL_LABEL_BARCODE(object));
289 gl_object_editor_set_data (editor, (merge != NULL), text_node);
290 gl_text_node_free (&text_node);
293 gl_debug (DEBUG_VIEW, "END");
296 /*---------------------------------------------------------------------------*/
297 /* PRIVATE. label object "moved" callback. */
298 /*---------------------------------------------------------------------------*/
300 update_editor_from_move_cb (glLabelObject *object,
303 glObjectEditor *editor)
307 gl_debug (DEBUG_VIEW, "START");
309 gl_label_object_get_position (object, &x, &y);
310 gl_object_editor_set_position (editor, x, y);
312 gl_debug (DEBUG_VIEW, "END");
315 /*---------------------------------------------------------------------------*/
316 /* PRIVATE. label "changed" callback. */
317 /*---------------------------------------------------------------------------*/
319 update_editor_from_label_cb (glLabel *label,
320 glObjectEditor *editor)
322 gdouble label_width, label_height;
325 gl_debug (DEBUG_VIEW, "START");
327 gl_label_get_size (label, &label_width, &label_height);
328 gl_object_editor_set_max_position (GL_OBJECT_EDITOR (editor),
329 label_width, label_height);
330 gl_object_editor_set_max_size (GL_OBJECT_EDITOR (editor),
331 label_width, label_height);
333 merge = gl_label_get_merge (label);
334 gl_object_editor_set_key_names (editor, merge);
336 gl_debug (DEBUG_VIEW, "END");
339 /*****************************************************************************/
340 /* Is object at (x,y)? */
341 /*****************************************************************************/
343 object_at (glViewObject *view_object,
348 glLabelObject *object;
351 object = gl_view_object_get_object (view_object);
353 gl_label_object_get_size (object, &w, &h);
355 cairo_rectangle (cr, 0.0, 0.0, w, h);
357 if (cairo_in_fill (cr, x, y))
366 /*****************************************************************************/
367 /* Return apropos cursor for create object mode. */
368 /*****************************************************************************/
370 gl_view_barcode_get_create_cursor (void)
372 GdkCursor *cursor = NULL;
373 GdkPixmap *pixmap_data, *pixmap_mask;
374 GdkColor fg = { 0, 0, 0, 0 };
375 GdkColor bg = { 0, 65535, 65535, 65535 };
377 gl_debug (DEBUG_VIEW, "START");
379 pixmap_data = gdk_bitmap_create_from_data (NULL,
380 (gchar *)cursor_barcode_bits,
381 cursor_barcode_width,
382 cursor_barcode_height);
383 pixmap_mask = gdk_bitmap_create_from_data (NULL,
384 (gchar *)cursor_barcode_mask_bits,
385 cursor_barcode_mask_width,
386 cursor_barcode_mask_height);
387 cursor = gdk_cursor_new_from_pixmap (pixmap_data, pixmap_mask, &fg,
388 &bg, cursor_barcode_x_hot,
389 cursor_barcode_y_hot);
391 gl_debug (DEBUG_VIEW, "END");
396 /*****************************************************************************/
397 /* Object creation handler: button press event. */
398 /*****************************************************************************/
400 gl_view_barcode_create_button_press_event (glView *view,
405 glTextNode *text_node;
406 glColorNode *line_color_node;
407 glViewObject *view_barcode;
409 gl_view_unselect_all (view);
411 line_color_node = gl_color_node_new_default ();
413 object = gl_label_barcode_new (view->label);
414 gl_label_object_set_position (GL_LABEL_OBJECT(object), x, y);
415 text_node = gl_text_node_new_from_text ("123456789");
416 gl_label_barcode_set_data (GL_LABEL_BARCODE(object), text_node);
417 line_color_node->color = gl_color_set_opacity (gl_view_get_default_line_color(view), 0.5);
418 gl_label_object_set_line_color (GL_LABEL_OBJECT(object),
421 gl_color_node_free (&line_color_node);
423 view->create_object = GL_LABEL_OBJECT (object);
428 /*****************************************************************************/
429 /* Object creation handler: motion event. */
430 /*****************************************************************************/
432 gl_view_barcode_create_motion_event (glView *view,
436 gl_label_object_set_position (GL_LABEL_OBJECT(view->create_object), x, y);
439 /*****************************************************************************/
440 /* Object creation handler: button relesase event. */
441 /*****************************************************************************/
443 gl_view_barcode_create_button_release_event (glView *view,
447 glColorNode *line_color_node;
449 line_color_node = gl_color_node_new_default ();
451 gl_label_object_set_position (GL_LABEL_OBJECT(view->create_object), x, y);
452 line_color_node->color = gl_view_get_default_line_color(view);
453 gl_label_object_set_line_color (GL_LABEL_OBJECT(view->create_object), line_color_node);
454 gl_color_node_free (&line_color_node);