]> git.sur5r.net Git - glabels/blob - glabels1/src/item.c
2009-09-22 Jim Evins <evins@snaught.com>
[glabels] / glabels1 / src / item.c
1 /*
2  *  (GLABELS) Label and Business Card Creation program for GNOME
3  *
4  *  item.c:  GLabels canvas item wrapper module module
5  *
6  *  Copyright (C) 2001-2002  Jim Evins <evins@snaught.com>.
7  *
8  *  This program is free software; you can redistribute it and/or modify
9  *  it under the terms of the GNU General Public License as published by
10  *  the Free Software Foundation; either version 2 of the License, or
11  *  (at your option) any later version.
12  *
13  *  This program is distributed in the hope that it will be useful,
14  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *  GNU General Public License for more details.
17  *
18  *  You should have received a copy of the GNU General Public License
19  *  along with this program; if not, write to the Free Software
20  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
21  */
22
23 #include <config.h>
24
25 #include "item.h"
26
27 #include "display.h"
28 #include "item_text.h"
29 #include "item_box.h"
30 #include "item_line.h"
31 #include "item_ellipse.h"
32 #include "item_image.h"
33 #include "item_barcode.h"
34
35 #include "debug.h"
36
37 /*===========================================*/
38 /* Private types                            */
39 /*===========================================*/
40
41 /*===========================================*/
42 /* Private globals                           */
43 /*===========================================*/
44
45 /*===========================================*/
46 /* Local function prototypes                 */
47 /*===========================================*/
48 \f
49 /*****************************************************************************/
50 /* Create new canvas item from object.                                       */
51 /*****************************************************************************/
52 GnomeCanvasItem *
53 gl_item_new (glLabelObject * object,
54              glDisplay * display)
55 {
56         GnomeCanvasItem *item;
57
58         g_return_val_if_fail (object != NULL, NULL);
59         g_return_val_if_fail (GL_IS_DISPLAY (display), NULL);
60
61         switch (object->type) {
62         case GL_LABEL_OBJECT_TEXT:
63                 item = gl_item_text_new (object, display);
64                 break;
65         case GL_LABEL_OBJECT_BOX:
66                 item = gl_item_box_new (object, display);
67                 break;
68         case GL_LABEL_OBJECT_LINE:
69                 item = gl_item_line_new (object, display);
70                 break;
71         case GL_LABEL_OBJECT_ELLIPSE:
72                 item = gl_item_ellipse_new (object, display);
73                 break;
74         case GL_LABEL_OBJECT_IMAGE:
75                 item = gl_item_image_new (object, display);
76                 break;
77         case GL_LABEL_OBJECT_BARCODE:
78                 item = gl_item_barcode_new (object, display);
79                 break;
80         default:
81                 item = NULL;
82                 WARN ("Invalid label object type.");    /* Should not happen! */
83                 break;
84         }
85
86         return item;
87 }
88
89 /*****************************************************************************/
90 /* Free a canvas item and all our associated data.                           */
91 /*****************************************************************************/
92 void
93 gl_item_free (GnomeCanvasItem ** item)
94 {
95         glLabelObject *object;
96         GtkWidget *menu;
97         GnomeCanvasItem *highlight;
98
99         g_return_if_fail (GNOME_IS_CANVAS_ITEM (*item));
100
101         menu = gtk_object_get_data (GTK_OBJECT (*item), "object_menu");
102         object = gtk_object_get_data (GTK_OBJECT (*item), "label_object");
103         highlight = gtk_object_get_data (GTK_OBJECT (*item), "highlight");
104
105         gtk_menu_popdown (GTK_MENU (menu));
106         gtk_widget_unref (GTK_WIDGET (menu));
107
108         gl_label_object_free (&object);
109
110         if (highlight != NULL) {
111                 gtk_object_destroy (GTK_OBJECT (highlight));
112         }
113
114         gtk_object_destroy (GTK_OBJECT (*item));
115         *item = NULL;
116 }
117
118 /*****************************************************************************/
119 /* Get position and size of object.                                          */
120 /*****************************************************************************/
121 void
122 gl_item_get_position_size (GnomeCanvasItem * item,
123                            gdouble * x,
124                            gdouble * y,
125                            gdouble * w,
126                            gdouble * h)
127 {
128         glLabelObject *object;
129
130         g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
131
132         object = gtk_object_get_data (GTK_OBJECT (item), "label_object");
133
134         switch (object->type) {
135         case GL_LABEL_OBJECT_TEXT:
136                 gl_item_text_get_position_size (item, x, y, w, h);
137                 break;
138         case GL_LABEL_OBJECT_BOX:
139                 gl_item_box_get_position_size (item, x, y, w, h);
140                 break;
141         case GL_LABEL_OBJECT_LINE:
142                 gl_item_line_get_position_size (item, x, y, w, h);
143                 break;
144         case GL_LABEL_OBJECT_ELLIPSE:
145                 gl_item_ellipse_get_position_size (item, x, y, w, h);
146                 break;
147         case GL_LABEL_OBJECT_IMAGE:
148                 gl_item_image_get_position_size (item, x, y, w, h);
149                 break;
150         case GL_LABEL_OBJECT_BARCODE:
151                 gl_item_barcode_get_position_size (item, x, y, w, h);
152                 break;
153         default:
154                 WARN ("Invalid label object type.");    /* Should not happen! */
155                 break;
156         }
157
158 }
159
160 /*****************************************************************************/
161 /* Get position and size of object.                                          */
162 /*****************************************************************************/
163 void
164 gl_item_set_position_size (GnomeCanvasItem * item,
165                            gdouble x,
166                            gdouble y,
167                            gdouble w,
168                            gdouble h)
169 {
170         glLabelObject *object;
171
172         g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
173
174         object = gtk_object_get_data (GTK_OBJECT (item), "label_object");
175
176         switch (object->type) {
177         case GL_LABEL_OBJECT_TEXT:
178                 gl_item_text_set_position_size (item, x, y, w, h);
179                 break;
180         case GL_LABEL_OBJECT_BOX:
181                 gl_item_box_set_position_size (item, x, y, w, h);
182                 break;
183         case GL_LABEL_OBJECT_LINE:
184                 gl_item_line_set_position_size (item, x, y, w, h);
185                 break;
186         case GL_LABEL_OBJECT_ELLIPSE:
187                 gl_item_ellipse_set_position_size (item, x, y, w, h);
188                 break;
189         case GL_LABEL_OBJECT_IMAGE:
190                 gl_item_image_set_position_size (item, x, y, w, h);
191                 break;
192         case GL_LABEL_OBJECT_BARCODE:
193                 gl_item_barcode_set_position_size (item, x, y, w, h);
194                 break;
195         default:
196                 WARN ("Invalid label object type.");    /* Should not happen! */
197                 break;
198         }
199
200 }
201
202 /*****************************************************************************/
203 /* Get object associated with canvas item.                                   */
204 /*****************************************************************************/
205 glLabelObject *
206 gl_item_get_object (GnomeCanvasItem * item)
207 {
208         g_return_val_if_fail (GNOME_IS_CANVAS_ITEM (item), NULL);
209
210         return gtk_object_get_data (GTK_OBJECT (item), "label_object");
211 }
212
213 /*****************************************************************************/
214 /* Get display associated with canvas item.                                  */
215 /*****************************************************************************/
216 glDisplay *
217 gl_item_get_display (GnomeCanvasItem * item)
218 {
219         g_return_val_if_fail (GNOME_IS_CANVAS_ITEM (item), NULL);
220
221         return gtk_object_get_data (GTK_OBJECT (item), "display");
222 }
223
224 /*****************************************************************************/
225 /* Get menu associated with canvas item.                                     */
226 /*****************************************************************************/
227 GtkWidget *
228 gl_item_get_menu (GnomeCanvasItem * item)
229 {
230         g_return_val_if_fail (GNOME_IS_CANVAS_ITEM (item), NULL);
231
232         return gtk_object_get_data (GTK_OBJECT (item), "object_menu");
233 }
234
235 /*****************************************************************************/
236 /* Turn on item highlight.                                                   */
237 /*****************************************************************************/
238 void
239 gl_item_highlight (GnomeCanvasItem * item)
240 {
241         glLabelObject *object;
242
243         g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
244
245         object = gtk_object_get_data (GTK_OBJECT (item), "label_object");
246
247         switch (object->type) {
248         case GL_LABEL_OBJECT_TEXT:
249                 gl_item_text_highlight (item);
250                 break;
251         case GL_LABEL_OBJECT_BOX:
252                 gl_item_box_highlight (item);
253                 break;
254         case GL_LABEL_OBJECT_LINE:
255                 gl_item_line_highlight (item);
256                 break;
257         case GL_LABEL_OBJECT_ELLIPSE:
258                 gl_item_ellipse_highlight (item);
259                 break;
260         case GL_LABEL_OBJECT_IMAGE:
261                 gl_item_image_highlight (item);
262                 break;
263         case GL_LABEL_OBJECT_BARCODE:
264                 gl_item_barcode_highlight (item);
265                 break;
266         default:
267                 WARN ("Invalid label object type.");    /* Should not happen! */
268                 break;
269         }
270
271 }
272
273 /*****************************************************************************/
274 /* Turn off item highlight.                                                  */
275 /*****************************************************************************/
276 void
277 gl_item_unhighlight (GnomeCanvasItem * item)
278 {
279         GnomeCanvasItem *sel_box;
280
281         g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
282
283         if (item != NULL) {
284
285                 sel_box = gtk_object_get_data (GTK_OBJECT (item), "highlight");
286                 gnome_canvas_item_hide (sel_box);
287
288         }
289 }
290
291 /*****************************************************************************/
292 /* Get item bounds using appropriate custom function.                        */
293 /*****************************************************************************/
294 void
295 gl_item_get_bounds (GnomeCanvasItem * item,
296                     gdouble * x1,
297                     gdouble * y1,
298                     gdouble * x2,
299                     gdouble * y2)
300 {
301         glLabelObject *object;
302
303         g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
304
305         object = gtk_object_get_data (GTK_OBJECT (item), "label_object");
306
307         switch (object->type) {
308         case GL_LABEL_OBJECT_TEXT:
309                 gl_item_text_get_bounds (item, x1, y1, x2, y2);
310                 break;
311         case GL_LABEL_OBJECT_BOX:
312                 gl_item_box_get_bounds (item, x1, y1, x2, y2);
313                 break;
314         case GL_LABEL_OBJECT_LINE:
315                 gl_item_line_get_bounds (item, x1, y1, x2, y2);
316                 break;
317         case GL_LABEL_OBJECT_ELLIPSE:
318                 gl_item_ellipse_get_bounds (item, x1, y1, x2, y2);
319                 break;
320         case GL_LABEL_OBJECT_IMAGE:
321                 gl_item_image_get_bounds (item, x1, y1, x2, y2);
322                 break;
323         case GL_LABEL_OBJECT_BARCODE:
324                 gl_item_barcode_get_bounds (item, x1, y1, x2, y2);
325                 break;
326         default:
327                 WARN ("Invalid label object type.");    /* Should not happen! */
328                 break;
329         }
330
331 }
332
333 /*****************************************************************************/
334 /* launch apropriate edit dialog for item/object                             */
335 /*****************************************************************************/
336 void
337 gl_item_edit_dialog (GnomeCanvasItem * item)
338 {
339         glLabelObject *object;
340         glDisplay *display;
341
342         g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
343
344         object = gtk_object_get_data (GTK_OBJECT (item), "label_object");
345         display = gtk_object_get_data (GTK_OBJECT (item), "display");
346
347         switch (object->type) {
348         case GL_LABEL_OBJECT_TEXT:
349                 gl_item_text_edit_dialog (item);
350                 break;
351         case GL_LABEL_OBJECT_BOX:
352                 gl_item_box_edit_dialog (item);
353                 break;
354         case GL_LABEL_OBJECT_LINE:
355                 gl_item_line_edit_dialog (item);
356                 break;
357         case GL_LABEL_OBJECT_ELLIPSE:
358                 gl_item_ellipse_edit_dialog (item);
359                 break;
360         case GL_LABEL_OBJECT_IMAGE:
361                 gl_item_image_edit_dialog (item);
362                 break;
363         case GL_LABEL_OBJECT_BARCODE:
364                 gl_item_barcode_edit_dialog (item);
365                 break;
366         default:
367                 WARN ("Invalid label object type.");    /* Should not happen! */
368                 break;
369         }
370
371         /* Update highlight of item */
372         gl_item_highlight (item);
373 }
374
375 /*****************************************************************************/
376 /* Return apropos item create mode cursor for given object type.             */
377 /*****************************************************************************/
378 GdkCursor *
379 gl_item_get_create_cursor (glLabelObjectType type)
380 {
381         switch (type) {
382
383         case GL_LABEL_OBJECT_TEXT:
384                 return gl_item_text_get_create_cursor ();
385
386         case GL_LABEL_OBJECT_BOX:
387                 return gl_item_box_get_create_cursor ();
388
389         case GL_LABEL_OBJECT_LINE:
390                 return gl_item_line_get_create_cursor ();
391
392         case GL_LABEL_OBJECT_ELLIPSE:
393                 return gl_item_ellipse_get_create_cursor ();
394
395         case GL_LABEL_OBJECT_IMAGE:
396                 return gl_item_image_get_create_cursor ();
397
398         case GL_LABEL_OBJECT_BARCODE:
399                 return gl_item_barcode_get_create_cursor ();
400
401         default:
402                 WARN ("Invalid label object type.");    /* Should not happen! */
403                 return NULL;
404
405         }
406
407 }
408
409 /*****************************************************************************/
410 /* Item/object creation canvas event handler.                                */
411 /*****************************************************************************/
412 gint
413 gl_item_create_event_handler (GnomeCanvas * canvas,
414                               GdkEvent * event,
415                               glDisplay * display)
416 {
417         switch (display->create_type) {
418
419         case GL_LABEL_OBJECT_TEXT:
420                 return gl_item_text_create_event_handler (canvas, event,
421                                                           display);
422
423         case GL_LABEL_OBJECT_BOX:
424                 return gl_item_box_create_event_handler (canvas, event,
425                                                          display);
426
427         case GL_LABEL_OBJECT_LINE:
428                 return gl_item_line_create_event_handler (canvas, event,
429                                                           display);
430
431         case GL_LABEL_OBJECT_ELLIPSE:
432                 return gl_item_ellipse_create_event_handler (canvas, event,
433                                                              display);
434
435         case GL_LABEL_OBJECT_IMAGE:
436                 return gl_item_image_create_event_handler (canvas, event,
437                                                            display);
438
439         case GL_LABEL_OBJECT_BARCODE:
440                 return gl_item_barcode_create_event_handler (canvas, event,
441                                                              display);
442
443         default:
444                 WARN ("Invalid label object type.");    /* Should not happen! */
445                 return FALSE;
446
447         }
448
449 }