]> git.sur5r.net Git - glabels/blob - glabels2/src/view-image.c
Initial revision
[glabels] / glabels2 / src / view-image.c
1 /*
2  *  (GLABELS) Label and Business Card Creation program for GNOME
3  *
4  *  view_image.c:  GLabels label image object widget
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 <glib.h>
24
25 #include "view-image.h"
26
27 #include "view-highlight.h"
28
29 #include "glabels.h"
30 #include "wdgt-line.h"
31 #include "wdgt-fill.h"
32 #include "wdgt-size.h"
33 #include "wdgt-position.h"
34
35 #include "pixmaps/cursor_image.xbm"
36 #include "pixmaps/cursor_image_mask.xbm"
37
38 #include "debug.h"
39
40 /*========================================================*/
41 /* Private macros and constants.                          */
42 /*========================================================*/
43
44 #define DELTA 0.01
45
46 /*========================================================*/
47 /* Private types.                                         */
48 /*========================================================*/
49
50 struct _glViewImagePrivate {
51         GnomeCanvasItem *item;
52
53         /* Page 0 widgets */
54         GtkWidget       *pixmap_entry;
55
56         /* Page 1 widgets */
57         GtkWidget       *position;
58         GtkWidget       *size;
59 };
60
61 /*========================================================*/
62 /* Private globals.                                       */
63 /*========================================================*/
64
65 static glViewObjectClass *parent_class = NULL;
66
67 /* Save state of image file entry */
68 static gchar *image_path = NULL;
69
70
71 /*========================================================*/
72 /* Private function prototypes.                           */
73 /*========================================================*/
74
75 static void      gl_view_image_class_init    (glViewImageClass *klass);
76 static void      gl_view_image_instance_init (glViewImage *view_image);
77 static void      gl_view_image_finalize      (GObject *object);
78
79 static void      update_view_image_cb        (glLabelObject *object,
80                                                 glViewImage *view_image);
81
82 static GtkWidget *construct_properties_dialog  (glViewImage *view_image);
83
84 static void      response_cb                   (GtkDialog *dialog,
85                                                 gint response,
86                                                 glViewImage *view_image);
87
88 static void      file_changed_cb               (GtkEntry *pixmap_entry,
89                                                 glViewImage *view_image);
90
91 static void      position_changed_cb           (glWdgtPosition *position,
92                                                 glViewImage *view_image);
93
94 static void      size_changed_cb               (glWdgtSize *size,
95                                                 glViewImage *view_image);
96
97 static void      size_reset_cb                 (GtkButton   *button,
98                                                 glViewImage *view_image);
99
100 static void      update_dialog_cb              (glLabelObject *object,
101                                                 glViewImage *view_image);
102
103 \f
104 /*****************************************************************************/
105 /* Boilerplate object stuff.                                                 */
106 /*****************************************************************************/
107 GType
108 gl_view_image_get_type (void)
109 {
110         static GType type = 0;
111
112         if (!type) {
113                 GTypeInfo info = {
114                         sizeof (glViewImageClass),
115                         NULL,
116                         NULL,
117                         (GClassInitFunc) gl_view_image_class_init,
118                         NULL,
119                         NULL,
120                         sizeof (glViewImage),
121                         0,
122                         (GInstanceInitFunc) gl_view_image_instance_init,
123                 };
124
125                 type = g_type_register_static (GL_TYPE_VIEW_OBJECT,
126                                                "glViewImage", &info, 0);
127         }
128
129         return type;
130 }
131
132 static void
133 gl_view_image_class_init (glViewImageClass *klass)
134 {
135         GObjectClass *object_class = (GObjectClass *) klass;
136
137         gl_debug (DEBUG_VIEW, "START");
138
139         parent_class = g_type_class_peek_parent (klass);
140
141         object_class->finalize = gl_view_image_finalize;
142
143         gl_debug (DEBUG_VIEW, "END");
144 }
145
146 static void
147 gl_view_image_instance_init (glViewImage *view_image)
148 {
149         gl_debug (DEBUG_VIEW, "START");
150
151         view_image->private = g_new0 (glViewImagePrivate, 1);
152
153         gl_debug (DEBUG_VIEW, "END");
154 }
155
156 static void
157 gl_view_image_finalize (GObject *object)
158 {
159         glLabel       *parent;
160
161         gl_debug (DEBUG_VIEW, "START");
162
163         g_return_if_fail (object && GL_IS_VIEW_IMAGE (object));
164
165         G_OBJECT_CLASS (parent_class)->finalize (object);
166
167         gl_debug (DEBUG_VIEW, "END");
168 }
169
170 /*****************************************************************************/
171 /* NEW image object view.                                                  */
172 /*****************************************************************************/
173 glViewObject *
174 gl_view_image_new (glLabelImage *object,
175                    glView       *view)
176 {
177         glViewImage        *view_image;
178         GnomeCanvasItem    *group;
179         const GdkPixbuf    *pixbuf;
180         gdouble            w, h;
181         GtkMenu            *menu;
182         GtkWidget          *dialog;
183
184         gl_debug (DEBUG_VIEW, "START");
185         g_return_if_fail (object && GL_IS_LABEL_IMAGE (object));
186         g_return_if_fail (view && GL_IS_VIEW (view));
187         
188         view_image = g_object_new (gl_view_image_get_type(), NULL);
189
190         gl_view_object_set_view (GL_VIEW_OBJECT(view_image), view);
191         gl_view_object_set_object (GL_VIEW_OBJECT(view_image),
192                                    GL_LABEL_OBJECT(object),
193                                    GL_VIEW_HIGHLIGHT_BOX_RESIZABLE);
194
195         /* Query properties of object. */
196         gl_label_object_get_size (GL_LABEL_OBJECT(object), &w, &h);
197         pixbuf = gl_label_image_get_pixbuf(object);
198
199         /* Create analogous canvas item. */
200         group = gl_view_object_get_group (GL_VIEW_OBJECT(view_image));
201         view_image->private->item =
202                 gnome_canvas_item_new (GNOME_CANVAS_GROUP(group),
203                                        gnome_canvas_pixbuf_get_type (),
204                                        "x", 0.0,
205                                        "y", 0.0,
206                                        "width_set", TRUE,
207                                        "height_set", TRUE,
208                                        "width", w,
209                                        "height", h,
210                                        "pixbuf", pixbuf,
211                                        NULL);
212
213         g_signal_connect (G_OBJECT (object), "changed",
214                           G_CALLBACK (update_view_image_cb), view_image);
215
216         /* Create a dialog for controlling/viewing object properties. */
217         dialog = construct_properties_dialog (view_image);
218         gl_view_object_set_dialog     (GL_VIEW_OBJECT(view_image), dialog);
219
220         gl_debug (DEBUG_VIEW, "END");
221
222         return GL_VIEW_OBJECT (view_image);
223 }
224
225 /*---------------------------------------------------------------------------*/
226 /* PRIVATE. label object "changed" callback.                                 */
227 /*---------------------------------------------------------------------------*/
228 static void
229 update_view_image_cb (glLabelObject *object,
230                       glViewImage   *view_image)
231 {
232         const GdkPixbuf    *pixbuf;
233         gdouble            w, h;
234
235         gl_debug (DEBUG_VIEW, "START");
236
237         /* Query properties of object. */
238         gl_label_object_get_size (GL_LABEL_OBJECT(object), &w, &h);
239         pixbuf = gl_label_image_get_pixbuf (GL_LABEL_IMAGE(object));
240
241         /* Adjust appearance of analogous canvas item. */
242         gnome_canvas_item_set (view_image->private->item,
243                                "width_set", TRUE,
244                                "height_set", TRUE,
245                                "width", w,
246                                "height", h,
247                                "pixbuf", pixbuf,
248                                NULL);
249
250         /* Adjust highlight */
251         gl_view_object_update_highlight (GL_VIEW_OBJECT(view_image));
252
253         gl_debug (DEBUG_VIEW, "END");
254 }
255
256 /*****************************************************************************/
257 /* Create a properties dialog for a image object.                          */
258 /*****************************************************************************/
259 static GtkWidget *
260 construct_properties_dialog (glViewImage *view_image)
261 {
262         GtkWidget          *dialog, *notebook, *wvbox, *wbutton;
263         BonoboWindow       *win = glabels_get_active_window ();
264         glLabelObject      *object;
265         gdouble            x, y, w, h, label_width, label_height;
266         gchar              *filename;
267
268         gl_debug (DEBUG_VIEW, "START");
269
270         /* retrieve object and query parameters */
271         object = gl_view_object_get_object (GL_VIEW_OBJECT(view_image));
272         gl_label_object_get_position (GL_LABEL_OBJECT(object), &x, &y);
273         gl_label_object_get_size (GL_LABEL_OBJECT(object), &w, &h);
274         filename = gl_label_image_get_filename (GL_LABEL_IMAGE(object));
275         gl_label_get_size (GL_LABEL(object->parent),
276                            &label_width, &label_height);
277
278         /*-----------------------------------------------------------------*/
279         /* Build dialog with notebook.                                     */
280         /*-----------------------------------------------------------------*/
281         dialog = gtk_dialog_new_with_buttons ( _("Edit image object properties"),
282                                                GTK_WINDOW (win),
283                                                GTK_DIALOG_DESTROY_WITH_PARENT,
284                                                GTK_STOCK_CLOSE,
285                                                            GTK_RESPONSE_CLOSE,
286                                                NULL );
287         g_signal_connect (G_OBJECT (dialog), "response",
288                           G_CALLBACK (response_cb), view_image);
289
290         notebook = gtk_notebook_new ();
291         gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
292                             notebook, TRUE, TRUE, 0);
293
294         /*---------------------------*/
295         /* Image Notebook Tab        */
296         /*---------------------------*/
297         wvbox = gtk_vbox_new (FALSE, GNOME_PAD);
298         gtk_container_set_border_width (GTK_CONTAINER (wvbox), 10);
299         gtk_notebook_append_page (GTK_NOTEBOOK (notebook), wvbox,
300                                   gtk_label_new (_("Image")));
301
302         /* image entry */
303         view_image->private->pixmap_entry =
304                 gnome_pixmap_entry_new ("image", "Load image", TRUE);
305         gnome_pixmap_entry_set_preview_size (GNOME_PIXMAP_ENTRY
306                                              (view_image->private->pixmap_entry),
307                                              128, 128);
308
309         /* Set default path for image entry */
310         if (filename != NULL) {
311                 /* Set default path to the directory containing image. */
312                 if (image_path != NULL)
313                         g_free (image_path);
314                 image_path = g_path_get_dirname (filename);
315                 if (image_path != NULL) {
316                         image_path = g_strconcat (image_path, "/", NULL);
317                 }
318         } else if (image_path == NULL) {
319                 /* First time, set it to our CWD. */
320                 image_path = g_get_current_dir ();
321         }
322
323         gtk_box_pack_start (GTK_BOX (wvbox), view_image->private->pixmap_entry,
324                             FALSE, FALSE, 0);
325         g_signal_connect ( G_OBJECT(gnome_file_entry_gtk_entry
326                                     (GNOME_FILE_ENTRY (view_image->private->pixmap_entry))),
327                            "changed", G_CALLBACK (file_changed_cb),
328                            view_image);
329
330
331         /*----------------------------*/
332         /* Position/Size Notebook Tab */
333         /*----------------------------*/
334         wvbox = gtk_vbox_new (FALSE, GNOME_PAD);
335         gtk_container_set_border_width (GTK_CONTAINER (wvbox), 10);
336         gtk_notebook_append_page (GTK_NOTEBOOK (notebook), wvbox,
337                                   gtk_label_new (_("Position/Size")));
338
339         /* ------ Position Frame ------ */
340         view_image->private->position = gl_wdgt_position_new (_("Position"));
341         gl_wdgt_position_set_params (GL_WDGT_POSITION (view_image->private->position),
342                                      x, y,
343                                      label_width, label_height);
344         gtk_box_pack_start (GTK_BOX (wvbox),
345                                 view_image->private->position,
346                             FALSE, FALSE, 0);
347         g_signal_connect (G_OBJECT (view_image->private->position),
348                           "changed",
349                           G_CALLBACK(position_changed_cb), view_image);
350
351
352         /* ------ Size Frame ------ */
353         view_image->private->size = gl_wdgt_size_new (_("Size"));
354         gl_wdgt_size_set_params (GL_WDGT_SIZE (view_image->private->size),
355                                  w, h,
356                                  TRUE,
357                                  label_width, label_height);
358         gtk_box_pack_start (GTK_BOX (wvbox), view_image->private->size,
359                                 FALSE, FALSE, 0);
360         g_signal_connect (G_OBJECT (view_image->private->size), "changed",
361                           G_CALLBACK(size_changed_cb), view_image);
362
363         /* ------ Size Reset Button ------ */
364         wbutton = gtk_button_new_with_label (_("Reset image size"));
365         gtk_box_pack_start (GTK_BOX (wvbox), wbutton, FALSE, FALSE, 0);
366         g_signal_connect (G_OBJECT (wbutton), "clicked",
367                           G_CALLBACK (size_reset_cb), view_image);
368
369
370         /*----------------------------*/
371         /* Track object changes.      */
372         /*----------------------------*/
373         g_signal_connect (G_OBJECT (object), "changed",
374                           G_CALLBACK (update_dialog_cb), view_image);
375
376         gl_debug (DEBUG_VIEW, "END");
377
378         return dialog;
379 }
380
381 /*---------------------------------------------------------------------------*/
382 /* PRIVATE.  "Response" callback.                                            */
383 /*---------------------------------------------------------------------------*/
384 static void
385 response_cb (GtkDialog     *dialog,
386              gint          response,
387              glViewImage   *view_image)
388 {
389         gl_debug (DEBUG_VIEW, "START");
390
391         g_return_if_fail(dialog != NULL);
392         g_return_if_fail(GTK_IS_DIALOG(dialog));
393
394         switch(response) {
395         case GTK_RESPONSE_CLOSE:
396                 gtk_widget_hide (GTK_WIDGET(dialog));
397                 break;
398         default:
399                 g_assert_not_reached();
400         }
401
402         gl_debug (DEBUG_VIEW, "END");
403 }
404
405 /*---------------------------------------------------------------------------*/
406 /* PRIVATE.  file "changed" callback.                                        */
407 /*---------------------------------------------------------------------------*/
408 static void
409 file_changed_cb (GtkEntry          *pixmap_entry,
410                  glViewImage       *view_image)
411 {
412         glLabelObject    *object;
413         gchar            *filename;
414
415         gl_debug (DEBUG_VIEW, "START");
416
417         object = gl_view_object_get_object (GL_VIEW_OBJECT(view_image));
418
419         filename = gnome_pixmap_entry_get_filename (GNOME_PIXMAP_ENTRY(view_image->private->pixmap_entry));
420         gl_debug (DEBUG_VIEW, "filename = %s", filename);
421
422         g_signal_handlers_block_by_func (G_OBJECT(object),
423                                          update_dialog_cb, view_image);
424         gl_label_image_set_filename(GL_LABEL_IMAGE(object), filename);
425         g_signal_handlers_unblock_by_func (G_OBJECT(object),
426                                            update_dialog_cb, view_image);
427
428         g_free (filename);
429
430         gl_debug (DEBUG_VIEW, "END");
431 }
432
433 /*---------------------------------------------------------------------------*/
434 /* PRIVATE.  position "changed" callback.                                    */
435 /*---------------------------------------------------------------------------*/
436 static void
437 position_changed_cb (glWdgtPosition     *position,
438                      glViewImage      *view_image)
439 {
440         glLabelObject      *object;
441         gdouble            x, y;
442
443         gl_debug (DEBUG_VIEW, "START");
444
445         gl_wdgt_position_get_position (GL_WDGT_POSITION (position), &x, &y);
446
447         object = gl_view_object_get_object (GL_VIEW_OBJECT(view_image));
448
449         g_signal_handlers_block_by_func (G_OBJECT(object),
450                                          update_dialog_cb, view_image);
451         gl_label_object_set_position (GL_LABEL_OBJECT(object), x, y);
452         g_signal_handlers_unblock_by_func (G_OBJECT(object),
453                                            update_dialog_cb, view_image);
454
455         gl_debug (DEBUG_VIEW, "END");
456 }
457
458 /*---------------------------------------------------------------------------*/
459 /* PRIVATE.  size "changed" callback.                                        */
460 /*---------------------------------------------------------------------------*/
461 static void
462 size_changed_cb (glWdgtSize     *size,
463                  glViewImage  *view_image)
464 {
465         glLabelObject *object;
466         gdouble       w, h;
467         gboolean      keep_aspect_ratio_flag;
468
469         gl_debug (DEBUG_VIEW, "START");
470
471         gl_wdgt_size_get_size (GL_WDGT_SIZE (size),
472                                &w, &h, &keep_aspect_ratio_flag);
473
474         object = gl_view_object_get_object (GL_VIEW_OBJECT(view_image));
475
476         g_signal_handlers_block_by_func (G_OBJECT(object),
477                                          update_dialog_cb, view_image);
478         gl_label_object_set_size (GL_LABEL_OBJECT(object), w, h);
479         g_signal_handlers_unblock_by_func (G_OBJECT(object),
480                                            update_dialog_cb, view_image);
481
482         gl_debug (DEBUG_VIEW, "END");
483 }
484
485 /*---------------------------------------------------------------------------*/
486 /* PRIVATE.  size "changed" callback.                                        */
487 /*---------------------------------------------------------------------------*/
488 static void
489 size_reset_cb (GtkButton    *button,
490                glViewImage  *view_image)
491 {
492         glLabelObject   *object;
493         gdouble         image_w, image_h;
494         const GdkPixbuf *pixbuf;
495
496         gl_debug (DEBUG_VIEW, "START");
497
498         object = gl_view_object_get_object (GL_VIEW_OBJECT(view_image));
499         pixbuf = gl_label_image_get_pixbuf (GL_LABEL_IMAGE(object));
500
501         image_w = gdk_pixbuf_get_width (pixbuf);
502         image_h = gdk_pixbuf_get_height (pixbuf);
503
504         gl_label_object_set_size (GL_LABEL_OBJECT(object), image_w, image_h);
505
506         gl_debug (DEBUG_VIEW, "END");
507 }
508
509 /*---------------------------------------------------------------------------*/
510 /* PRIVATE. label object "changed" callback.                                 */
511 /*---------------------------------------------------------------------------*/
512 static void
513 update_dialog_cb (glLabelObject     *object,
514                   glViewImage     *view_image)
515 {
516         gchar              *filename;
517         gdouble            x, y, w, h;
518
519         gl_debug (DEBUG_VIEW, "START");
520
521         /* Query properties of object. */
522         gl_label_object_get_position (GL_LABEL_OBJECT(object), &x, &y);
523         gl_label_object_get_size (GL_LABEL_OBJECT(object), &w, &h);
524         filename = gl_label_image_get_filename (GL_LABEL_IMAGE(object));
525
526         /* Block widget handlers to prevent recursion */
527         g_signal_handlers_block_by_func (G_OBJECT(view_image->private->pixmap_entry),
528                                          file_changed_cb, view_image);
529         g_signal_handlers_block_by_func (G_OBJECT(view_image->private->position),
530                                          position_changed_cb, view_image);
531         g_signal_handlers_block_by_func (G_OBJECT(view_image->private->size),
532                                          size_changed_cb, view_image);
533
534         /* Update widgets in property dialog */
535
536         if ( filename != NULL ) {
537                 gnome_file_entry_set_filename (GNOME_FILE_ENTRY (view_image->private->pixmap_entry),
538                                                filename);
539         }
540         gl_wdgt_position_set_position (GL_WDGT_POSITION(view_image->private->position),
541                                        x, y);
542         gl_wdgt_size_set_size (GL_WDGT_SIZE(view_image->private->size), w, h);
543
544         /* Unblock widget handlers */
545         g_signal_handlers_unblock_by_func (G_OBJECT(view_image->private->pixmap_entry),
546                                            file_changed_cb, view_image);
547         g_signal_handlers_unblock_by_func (G_OBJECT(view_image->private->position),
548                                            position_changed_cb, view_image);
549         g_signal_handlers_unblock_by_func (G_OBJECT(view_image->private->size),
550                                            size_changed_cb, view_image);
551
552         g_free (filename);
553
554         gl_debug (DEBUG_VIEW, "END");
555 }
556
557 /*****************************************************************************/
558 /* Return apropos cursor for create object mode.                             */
559 /*****************************************************************************/
560 GdkCursor *
561 gl_view_image_get_create_cursor (void)
562 {
563         static GdkCursor *cursor = NULL;
564         GdkPixmap        *pixmap_data, *pixmap_mask;
565         GdkColor         fg = { 0, 0, 0, 0 };
566         GdkColor         bg = { 0, 65535, 65535, 65535 };
567
568         gl_debug (DEBUG_VIEW, "START");
569
570         if (!cursor) {
571                 pixmap_data = gdk_bitmap_create_from_data (NULL,
572                                                            cursor_image_bits,
573                                                            cursor_image_width,
574                                                            cursor_image_height);
575                 pixmap_mask = gdk_bitmap_create_from_data (NULL,
576                                                            cursor_image_mask_bits,
577                                                            cursor_image_mask_width,
578                                                            cursor_image_mask_height);
579                 cursor =
580                     gdk_cursor_new_from_pixmap (pixmap_data, pixmap_mask, &fg,
581                                                 &bg, cursor_image_x_hot,
582                                                 cursor_image_y_hot);
583         }
584
585         gl_debug (DEBUG_VIEW, "END");
586
587         return cursor;
588 }
589
590 /*****************************************************************************/
591 /* Canvas event handler for creating image objects.                            */
592 /*****************************************************************************/
593 int
594 gl_view_image_create_event_handler (GnomeCanvas *canvas,
595                                       GdkEvent    *event,
596                                       glView      *view)
597 {
598         static gdouble      x0, y0;
599         static gboolean     dragging = FALSE;
600         static glViewObject *view_image;
601         static GObject      *object;
602         gdouble             line_width;
603         guint               line_color, fill_color;
604         gdouble             x, y, w, h;
605
606         gl_debug (DEBUG_VIEW, "");
607
608         switch (event->type) {
609
610         case GDK_BUTTON_PRESS:
611                 switch (event->button.button) {
612                 case 1:
613                         dragging = TRUE;
614                         gdk_pointer_grab (GTK_WIDGET (view->canvas)->window,
615                                           FALSE,
616                                           GDK_POINTER_MOTION_MASK |
617                                           GDK_BUTTON_RELEASE_MASK |
618                                           GDK_BUTTON_PRESS_MASK,
619                                           NULL, NULL, event->button.time);
620                         gnome_canvas_window_to_world (canvas,
621                                                       event->button.x,
622                                                       event->button.y, &x, &y);
623                         object = gl_label_image_new (view->label);
624                         gl_label_object_set_position (GL_LABEL_OBJECT(object),
625                                                      x, y);
626                         gl_label_object_set_size (GL_LABEL_OBJECT(object),
627                                                   0.0, 0.0);
628                         view_image = gl_view_image_new (GL_LABEL_IMAGE(object),
629                                                     view);
630                         x0 = x;
631                         y0 = y;
632                         return TRUE;
633
634                 default:
635                         return FALSE;
636                 }
637
638         case GDK_BUTTON_RELEASE:
639                 switch (event->button.button) {
640                 case 1:
641                         dragging = FALSE;
642                         gdk_pointer_ungrab (event->button.time);
643                         gnome_canvas_window_to_world (canvas,
644                                                       event->button.x,
645                                                       event->button.y, &x, &y);
646                         if ((x0 == x) && (y0 == y)) {
647                                 x = x0 + 36.0;
648                                 y = y0 + 36.0;
649                         }
650                         gl_label_object_set_position (GL_LABEL_OBJECT(object),
651                                                      MIN (x, x0), MIN (y, y0));
652                         w = MAX (x, x0) - MIN (x, x0);
653                         h = MAX (y, y0) - MIN (y, y0);
654                         gl_label_object_set_size (GL_LABEL_OBJECT(object),
655                                                   w, h);
656                         gl_view_unselect_all (view);
657                         gl_view_object_select (GL_VIEW_OBJECT(view_image));
658                         gl_view_arrow_mode (view);
659                         return TRUE;
660
661                 default:
662                         return FALSE;
663                 }
664
665         case GDK_MOTION_NOTIFY:
666                 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
667                         gnome_canvas_window_to_world (canvas,
668                                                       event->button.x,
669                                                       event->button.y, &x, &y);
670                         gl_label_object_set_position (GL_LABEL_OBJECT(object),
671                                                      MIN (x, x0), MIN (y, y0));
672                         w = MAX (x, x0) - MIN (x, x0);
673                         h = MAX (y, y0) - MIN (y, y0);
674                         gl_label_object_set_size (GL_LABEL_OBJECT(object),
675                                                   w, h);
676                         return TRUE;
677                 } else {
678                         return FALSE;
679                 }
680
681         default:
682                 return FALSE;
683         }
684
685 }