]> git.sur5r.net Git - glabels/blob - glabels2/src/view-line.c
View_highlight is now a full-fledged object that tracks its corresponding label objec...
[glabels] / glabels2 / src / view-line.c
1 /*
2  *  (GLABELS) Label and Business Card Creation program for GNOME
3  *
4  *  view_line.c:  GLabels label line 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-line.h"
26
27 #include "view-highlight.h"
28
29 #include "wdgt-line.h"
30 #include "wdgt-vector.h"
31 #include "wdgt-position.h"
32 #include "color.h"
33 #include "prefs.h"
34
35 #include "pixmaps/cursor_line.xbm"
36 #include "pixmaps/cursor_line_mask.xbm"
37
38 #include "debug.h"
39
40 /*========================================================*/
41 /* Private macros and constants.                          */
42 /*========================================================*/
43
44 /*========================================================*/
45 /* Private types.                                         */
46 /*========================================================*/
47
48 struct _glViewLinePrivate {
49         GnomeCanvasItem       *item;
50
51         /* Property dialog Page 0 widgets */
52         GtkWidget             *line;
53
54         /* Property dialog Page 1 widgets */
55         GtkWidget             *position;
56         GtkWidget             *vector;
57 };
58
59 /*========================================================*/
60 /* Private globals.                                       */
61 /*========================================================*/
62
63 static glViewObjectClass *parent_class = NULL;
64
65
66 /*========================================================*/
67 /* Private function prototypes.                           */
68 /*========================================================*/
69
70 static void      gl_view_line_class_init      (glViewLineClass *klass);
71 static void      gl_view_line_instance_init   (glViewLine     *view_line);
72 static void      gl_view_line_finalize        (GObject        *object);
73
74 static void      update_view_line_cb          (glLabelObject  *object,
75                                                glViewLine     *view_line);
76
77 static GtkWidget *construct_properties_dialog (glViewLine     *view_line);
78
79 static void      response_cb                  (GtkDialog      *dialog,
80                                                gint            response,
81                                                glViewLine     *view_line);
82
83 static void      line_changed_cb              (glWdgtLine     *line,
84                                                glViewLine     *view_line);
85
86 static void      position_changed_cb          (glWdgtPosition *position,
87                                                glViewLine     *view_line);
88
89 static void      vector_changed_cb            (glWdgtVector   *vector,
90                                                glViewLine     *view_line);
91
92 static void      update_dialog_cb             (glLabelObject  *object,
93                                                glViewLine     *view_line);
94
95 static void      update_dialog_from_move_cb   (glLabelObject  *object,
96                                                gdouble         dx,
97                                                gdouble         dy,
98                                                glViewLine     *view_line);
99
100 \f
101 /*****************************************************************************/
102 /* Boilerplate object stuff.                                                 */
103 /*****************************************************************************/
104 GType
105 gl_view_line_get_type (void)
106 {
107         static GType type = 0;
108
109         if (!type) {
110                 GTypeInfo info = {
111                         sizeof (glViewLineClass),
112                         NULL,
113                         NULL,
114                         (GClassInitFunc) gl_view_line_class_init,
115                         NULL,
116                         NULL,
117                         sizeof (glViewLine),
118                         0,
119                         (GInstanceInitFunc) gl_view_line_instance_init,
120                 };
121
122                 type = g_type_register_static (GL_TYPE_VIEW_OBJECT,
123                                                "glViewLine", &info, 0);
124         }
125
126         return type;
127 }
128
129 static void
130 gl_view_line_class_init (glViewLineClass *klass)
131 {
132         GObjectClass *object_class = (GObjectClass *) klass;
133
134         gl_debug (DEBUG_VIEW, "START");
135
136         parent_class = g_type_class_peek_parent (klass);
137
138         object_class->finalize = gl_view_line_finalize;
139
140         gl_debug (DEBUG_VIEW, "END");
141 }
142
143 static void
144 gl_view_line_instance_init (glViewLine *view_line)
145 {
146         gl_debug (DEBUG_VIEW, "START");
147
148         view_line->private = g_new0 (glViewLinePrivate, 1);
149
150         gl_debug (DEBUG_VIEW, "END");
151 }
152
153 static void
154 gl_view_line_finalize (GObject *object)
155 {
156         glLabel       *parent;
157
158         gl_debug (DEBUG_VIEW, "START");
159
160         g_return_if_fail (object && GL_IS_VIEW_LINE (object));
161
162         G_OBJECT_CLASS (parent_class)->finalize (object);
163
164         gl_debug (DEBUG_VIEW, "END");
165 }
166
167 /*****************************************************************************/
168 /* NEW line object view.                                                  */
169 /*****************************************************************************/
170 glViewObject *
171 gl_view_line_new (glLabelLine *object,
172                   glView     *view)
173 {
174         glViewLine         *view_line;
175         gdouble            line_width;
176         guint              line_color;
177         gdouble            w, h;
178         GtkMenu            *menu;
179         GnomeCanvasPoints  *points;
180
181         gl_debug (DEBUG_VIEW, "START");
182         g_return_if_fail (object && GL_IS_LABEL_LINE (object));
183         g_return_if_fail (view && GL_IS_VIEW (view));
184         
185         view_line = g_object_new (gl_view_line_get_type(), NULL);
186
187         gl_view_object_set_view (GL_VIEW_OBJECT(view_line), view);
188         gl_view_object_set_object (GL_VIEW_OBJECT(view_line),
189                                    GL_LABEL_OBJECT(object),
190                                    GL_VIEW_HIGHLIGHT_LINE_RESIZABLE);
191
192         /* Query properties of object. */
193         gl_label_object_get_size (GL_LABEL_OBJECT(object), &w, &h);
194         line_width = gl_label_line_get_line_width(object);
195         line_color = gl_label_line_get_line_color(object);
196
197         /* Create analogous canvas item. */
198         points = gnome_canvas_points_new (2);
199         points->coords[0] = 0.0;
200         points->coords[1] = 0.0;
201         points->coords[2] = w;
202         points->coords[3] = h;
203         view_line->private->item =
204                 gl_view_object_item_new (GL_VIEW_OBJECT(view_line),
205                                          gnome_canvas_line_get_type (),
206                                          "points", points,
207                                          "width_units", line_width,
208                                          "fill_color_rgba", line_color,
209                                          NULL);
210         gnome_canvas_points_free (points);
211
212         g_signal_connect (G_OBJECT (object), "changed",
213                           G_CALLBACK (update_view_line_cb), view_line);
214
215         /* Create a dialog for controlling/viewing object properties. */
216         gl_view_object_set_dlg_constructor (GL_VIEW_OBJECT(view_line),
217                                             GL_VIEW_OBJECT_DLG_CONSTRUCTOR(construct_properties_dialog));
218
219         gl_debug (DEBUG_VIEW, "END");
220
221         return GL_VIEW_OBJECT (view_line);
222 }
223
224 /*---------------------------------------------------------------------------*/
225 /* PRIVATE. label object "changed" callback.                                 */
226 /*---------------------------------------------------------------------------*/
227 static void
228 update_view_line_cb (glLabelObject *object,
229                      glViewLine     *view_line)
230 {
231         gdouble            line_width;
232         guint              line_color;
233         gdouble            w, h;
234         GnomeCanvasPoints  *points;
235
236         gl_debug (DEBUG_VIEW, "START");
237
238         /* Query properties of object. */
239         gl_label_object_get_size (GL_LABEL_OBJECT(object), &w, &h);
240         line_width = gl_label_line_get_line_width(GL_LABEL_LINE(object));
241         line_color = gl_label_line_get_line_color(GL_LABEL_LINE(object));
242
243         /* Adjust appearance of analogous canvas item. */
244         points = gnome_canvas_points_new (2);
245         points->coords[0] = 0.0;
246         points->coords[1] = 0.0;
247         points->coords[2] = w;
248         points->coords[3] = h;
249         gnome_canvas_item_set (view_line->private->item,
250                                "points", points,
251                                "width_units", line_width,
252                                "fill_color_rgba", line_color,
253                                NULL);
254         gnome_canvas_points_free (points);
255
256         gl_debug (DEBUG_VIEW, "END");
257 }
258
259 /*****************************************************************************/
260 /* Create a properties dialog for a line object.                          */
261 /*****************************************************************************/
262 static GtkWidget *
263 construct_properties_dialog (glViewLine *view_line)
264 {
265         GtkWidget          *dialog, *wsection;
266         glLabelObject      *object;
267         gdouble            line_width;
268         guint              line_color;
269         gdouble            x, y, w, h, label_width, label_height;
270         GtkSizeGroup       *label_size_group;
271         GtkWidget          *window;
272
273         gl_debug (DEBUG_VIEW, "START");
274
275         /* retrieve object and query parameters */
276         object = gl_view_object_get_object (GL_VIEW_OBJECT(view_line));
277         gl_label_object_get_position (GL_LABEL_OBJECT(object), &x, &y);
278         gl_label_object_get_size (GL_LABEL_OBJECT(object), &w, &h);
279         line_width = gl_label_line_get_line_width(GL_LABEL_LINE(object));
280         line_color = gl_label_line_get_line_color(GL_LABEL_LINE(object));
281         gl_label_get_size (GL_LABEL(object->parent),
282                            &label_width, &label_height);
283
284         /*-----------------------------------------------------------------*/
285         /* Build dialog with notebook.                                     */
286         /*-----------------------------------------------------------------*/
287         window = gtk_widget_get_toplevel (
288                 GTK_WIDGET(gl_view_object_get_view(GL_VIEW_OBJECT(view_line))));
289         dialog = gl_hig_dialog_new_with_buttons ( _("Edit line object properties"),
290                                                   GTK_WINDOW (window),
291                                                   GTK_DIALOG_DESTROY_WITH_PARENT,
292                                                   GTK_STOCK_CLOSE,
293                                                            GTK_RESPONSE_CLOSE,
294                                                   NULL );
295         gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
296         g_signal_connect (G_OBJECT (dialog), "response",
297                           G_CALLBACK (response_cb), view_line);
298
299         label_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
300
301         /*---------------------------*/
302         /* Line section              */
303         /*---------------------------*/
304         wsection = gl_hig_category_new (_("Line"));
305         gl_hig_dialog_add_widget (GL_HIG_DIALOG(dialog), wsection);
306         view_line->private->line = gl_wdgt_line_new ();
307         gl_wdgt_line_set_label_size_group (GL_WDGT_LINE(view_line->private->line),
308                                            label_size_group);
309         gl_wdgt_line_set_params (GL_WDGT_LINE (view_line->private->line),
310                                  line_width,
311                                  line_color);
312         gl_hig_category_add_widget (GL_HIG_CATEGORY(wsection),
313                                     view_line->private->line);
314         g_signal_connect (G_OBJECT (view_line->private->line), "changed",
315                           G_CALLBACK(line_changed_cb), view_line);
316
317         /*---------------------------*/
318         /* Position section          */
319         /*---------------------------*/
320         wsection = gl_hig_category_new (_("Position"));
321         gl_hig_dialog_add_widget (GL_HIG_DIALOG(dialog), wsection);
322         view_line->private->position = gl_wdgt_position_new ();
323         gl_wdgt_position_set_label_size_group (GL_WDGT_POSITION(view_line->private->position),
324                                                label_size_group);
325         gl_wdgt_position_set_params (GL_WDGT_POSITION (view_line->private->position),
326                                      x, y,
327                                      label_width, label_height);
328         gl_hig_category_add_widget (GL_HIG_CATEGORY(wsection),
329                                     view_line->private->position);
330         g_signal_connect (G_OBJECT (view_line->private->position),
331                           "changed",
332                           G_CALLBACK(position_changed_cb), view_line);
333
334
335         /*---------------------------*/
336         /* Size section              */
337         /*---------------------------*/
338         wsection = gl_hig_category_new (_("Size"));
339         gl_hig_dialog_add_widget (GL_HIG_DIALOG(dialog), wsection);
340         view_line->private->vector = gl_wdgt_vector_new ();
341         gl_wdgt_vector_set_label_size_group (GL_WDGT_VECTOR(view_line->private->vector),
342                                              label_size_group);
343         gl_wdgt_vector_set_params (GL_WDGT_VECTOR (view_line->private->vector),
344                                    w, h,
345                                    label_width, label_height);
346         gl_hig_category_add_widget (GL_HIG_CATEGORY(wsection),
347                                     view_line->private->vector);
348         g_signal_connect (G_OBJECT (view_line->private->vector), "changed",
349                           G_CALLBACK(vector_changed_cb), view_line);
350
351
352         /*----------------------------*/
353         /* Track object changes.      */
354         /*----------------------------*/
355         g_signal_connect (G_OBJECT (object), "changed",
356                           G_CALLBACK (update_dialog_cb), view_line);
357         g_signal_connect (G_OBJECT (object), "moved",
358                           G_CALLBACK (update_dialog_from_move_cb), view_line);
359
360         gl_debug (DEBUG_VIEW, "END");
361
362         return dialog;
363 }
364
365 /*---------------------------------------------------------------------------*/
366 /* PRIVATE.  "Response" callback.                                            */
367 /*---------------------------------------------------------------------------*/
368 static void
369 response_cb (GtkDialog     *dialog,
370              gint          response,
371              glViewLine    *view_line)
372 {
373         gl_debug (DEBUG_VIEW, "START");
374
375         g_return_if_fail(dialog != NULL);
376         g_return_if_fail(GTK_IS_DIALOG(dialog));
377
378         switch(response) {
379         case GTK_RESPONSE_CLOSE:
380                 gtk_widget_hide (GTK_WIDGET(dialog));
381                 break;
382         case GTK_RESPONSE_DELETE_EVENT:
383                 break;
384         default:
385                 g_print ("response = %d", response);
386                 g_assert_not_reached();
387         }
388
389         gl_debug (DEBUG_VIEW, "END");
390 }
391
392 /*---------------------------------------------------------------------------*/
393 /* PRIVATE.  line properties "changed" callback.                             */
394 /*---------------------------------------------------------------------------*/
395 static void
396 line_changed_cb (glWdgtLine     *line,
397                  glViewLine     *view_line)
398 {
399         glLabelObject      *object;
400         gdouble            line_width;
401         guint              line_color;
402
403         gl_debug (DEBUG_VIEW, "START");
404
405         object = gl_view_object_get_object (GL_VIEW_OBJECT(view_line));
406
407         gl_wdgt_line_get_params (GL_WDGT_LINE (line),
408                                  &line_width,
409                                  &line_color);
410
411         g_signal_handlers_block_by_func (G_OBJECT(object),
412                                          update_dialog_cb, view_line);
413         gl_label_line_set_line_width(GL_LABEL_LINE(object), line_width);
414         gl_label_line_set_line_color(GL_LABEL_LINE(object), line_color);
415         g_signal_handlers_unblock_by_func (G_OBJECT(object),
416                                            update_dialog_cb, view_line);
417
418         gl_debug (DEBUG_VIEW, "END");
419 }
420
421 /*---------------------------------------------------------------------------*/
422 /* PRIVATE.  position "changed" callback.                                    */
423 /*---------------------------------------------------------------------------*/
424 static void
425 position_changed_cb (glWdgtPosition     *position,
426                      glViewLine         *view_line)
427 {
428         glLabelObject      *object;
429         gdouble            x, y;
430
431         gl_debug (DEBUG_VIEW, "START");
432
433         gl_wdgt_position_get_position (GL_WDGT_POSITION (position), &x, &y);
434
435         object = gl_view_object_get_object (GL_VIEW_OBJECT(view_line));
436
437         g_signal_handlers_block_by_func (G_OBJECT(object),
438                                          update_dialog_cb, view_line);
439         gl_label_object_set_position (GL_LABEL_OBJECT(object), x, y);
440         g_signal_handlers_unblock_by_func (G_OBJECT(object),
441                                            update_dialog_cb, view_line);
442
443         gl_debug (DEBUG_VIEW, "END");
444 }
445
446 /*---------------------------------------------------------------------------*/
447 /* PRIVATE.  vector "changed" callback.                                      */
448 /*---------------------------------------------------------------------------*/
449 static void
450 vector_changed_cb (glWdgtVector     *vector,
451                    glViewLine     *view_line)
452 {
453         glLabelObject *object;
454         gdouble       w, h;
455         gboolean      keep_aspect_ratio_flag;
456
457         gl_debug (DEBUG_VIEW, "START");
458
459         gl_wdgt_vector_get_params (GL_WDGT_VECTOR (vector), &w, &h);
460
461         object = gl_view_object_get_object (GL_VIEW_OBJECT(view_line));
462
463         g_signal_handlers_block_by_func (G_OBJECT(object),
464                                          update_dialog_cb, view_line);
465         gl_label_object_set_size (GL_LABEL_OBJECT(object), w, h);
466         g_signal_handlers_unblock_by_func (G_OBJECT(object),
467                                            update_dialog_cb, view_line);
468
469         gl_debug (DEBUG_VIEW, "END");
470 }
471
472 /*---------------------------------------------------------------------------*/
473 /* PRIVATE. label object "changed" callback.                                 */
474 /*---------------------------------------------------------------------------*/
475 static void
476 update_dialog_cb (glLabelObject     *object,
477                   glViewLine        *view_line)
478 {
479         gdouble            line_width;
480         guint              line_color;
481         gdouble            x, y, w, h, label_width, label_height;
482
483         gl_debug (DEBUG_VIEW, "START");
484
485         /* Query properties of object. */
486         gl_label_object_get_position (GL_LABEL_OBJECT(object), &x, &y);
487         gl_label_object_get_size (GL_LABEL_OBJECT(object), &w, &h);
488         line_width = gl_label_line_get_line_width(GL_LABEL_LINE(object));
489         line_color = gl_label_line_get_line_color(GL_LABEL_LINE(object));
490         gl_label_get_size (GL_LABEL(object->parent),
491                            &label_width, &label_height);
492
493         /* Block widget handlers to prevent recursion */
494         g_signal_handlers_block_by_func (G_OBJECT(view_line->private->line),
495                                          line_changed_cb, view_line);
496         g_signal_handlers_block_by_func (G_OBJECT(view_line->private->position),
497                                          position_changed_cb, view_line);
498         g_signal_handlers_block_by_func (G_OBJECT(view_line->private->vector),
499                                          vector_changed_cb, view_line);
500
501         /* Update widgets in property dialog */
502         gl_wdgt_line_set_params (GL_WDGT_LINE (view_line->private->line),
503                                  line_width,
504                                  line_color);
505         gl_wdgt_position_set_position (GL_WDGT_POSITION(view_line->private->position),
506                                        x, y);
507         gl_wdgt_vector_set_params (GL_WDGT_VECTOR(view_line->private->vector),
508                                    w, h, label_width, label_height);
509
510         /* Unblock widget handlers */
511         g_signal_handlers_unblock_by_func (G_OBJECT(view_line->private->line),
512                                            line_changed_cb, view_line);
513         g_signal_handlers_unblock_by_func (G_OBJECT(view_line->private->position),
514                                            position_changed_cb, view_line);
515         g_signal_handlers_unblock_by_func (G_OBJECT(view_line->private->vector),
516                                            vector_changed_cb, view_line);
517
518
519         gl_debug (DEBUG_VIEW, "END");
520 }
521
522 /*---------------------------------------------------------------------------*/
523 /* PRIVATE. label object "moved" callback.                                   */
524 /*---------------------------------------------------------------------------*/
525 static void
526 update_dialog_from_move_cb (glLabelObject *object,
527                             gdouble        dx,
528                             gdouble        dy,
529                             glViewLine    *view_line)
530 {
531         gdouble            x, y;
532
533         gl_debug (DEBUG_VIEW, "START");
534
535         /* Query properties of object. */
536         gl_label_object_get_position (GL_LABEL_OBJECT(object), &x, &y);
537
538         /* Block widget handlers to prevent recursion */
539         g_signal_handlers_block_by_func (G_OBJECT(view_line->private->position),
540                                          position_changed_cb, view_line);
541
542         /* Update widgets in property dialog */
543         gl_wdgt_position_set_position (GL_WDGT_POSITION(view_line->private->position),
544                                        x, y);
545
546         /* Unblock widget handlers */
547         g_signal_handlers_unblock_by_func (G_OBJECT(view_line->private->position),
548                                            position_changed_cb, view_line);
549
550         gl_debug (DEBUG_VIEW, "END");
551 }
552
553 /*****************************************************************************/
554 /* Return apropos cursor for create object mode.                             */
555 /*****************************************************************************/
556 GdkCursor *
557 gl_view_line_get_create_cursor (void)
558 {
559         static GdkCursor *cursor = NULL;
560         GdkPixmap        *pixmap_data, *pixmap_mask;
561         GdkColor         fg = { 0, 0, 0, 0 };
562         GdkColor         bg = { 0, 65535, 65535, 65535 };
563
564         gl_debug (DEBUG_VIEW, "START");
565
566         if (!cursor) {
567                 pixmap_data = gdk_bitmap_create_from_data (NULL,
568                                                            cursor_line_bits,
569                                                            cursor_line_width,
570                                                            cursor_line_height);
571                 pixmap_mask = gdk_bitmap_create_from_data (NULL,
572                                                            cursor_line_mask_bits,
573                                                            cursor_line_mask_width,
574                                                            cursor_line_mask_height);
575                 cursor =
576                     gdk_cursor_new_from_pixmap (pixmap_data, pixmap_mask, &fg,
577                                                 &bg, cursor_line_x_hot,
578                                                 cursor_line_y_hot);
579         }
580
581         gl_debug (DEBUG_VIEW, "END");
582
583         return cursor;
584 }
585
586 /*****************************************************************************/
587 /* Canvas event handler for creating line objects.                            */
588 /*****************************************************************************/
589 int
590 gl_view_line_create_event_handler (GnomeCanvas *canvas,
591                                    GdkEvent    *event,
592                                    glView      *view)
593 {
594         static gdouble      x0, y0;
595         static gboolean     dragging = FALSE;
596         static glViewObject *view_line;
597         static GObject      *object;
598         gdouble             x, y, w, h;
599
600         gl_debug (DEBUG_VIEW, "");
601
602         switch (event->type) {
603
604         case GDK_BUTTON_PRESS:
605                 switch (event->button.button) {
606                 case 1:
607                         dragging = TRUE;
608                         gdk_pointer_grab (GTK_WIDGET (view->canvas)->window,
609                                           FALSE,
610                                           GDK_POINTER_MOTION_MASK |
611                                           GDK_BUTTON_RELEASE_MASK |
612                                           GDK_BUTTON_PRESS_MASK,
613                                           NULL, NULL, event->button.time);
614                         gnome_canvas_window_to_world (canvas,
615                                                       event->button.x,
616                                                       event->button.y, &x, &y);
617                         object = gl_label_line_new (view->label);
618                         gl_label_object_set_position (GL_LABEL_OBJECT(object),
619                                                       x, y);
620                         gl_label_object_set_size (GL_LABEL_OBJECT(object),
621                                                   0.0, 0.0);
622                         gl_label_line_set_line_width (GL_LABEL_LINE(object),
623                                                       gl_prefs->default_line_width);
624                         gl_label_line_set_line_color (GL_LABEL_LINE(object),
625                                                      gl_color_set_opacity (gl_prefs->default_line_color, 0.5));
626                         view_line = gl_view_line_new (GL_LABEL_LINE(object),
627                                                       view);
628                         x0 = x;
629                         y0 = y;
630                         return TRUE;
631
632                 default:
633                         return FALSE;
634                 }
635
636         case GDK_BUTTON_RELEASE:
637                 switch (event->button.button) {
638                 case 1:
639                         dragging = FALSE;
640                         gdk_pointer_ungrab (event->button.time);
641                         gnome_canvas_window_to_world (canvas,
642                                                       event->button.x,
643                                                       event->button.y, &x, &y);
644                         if ((x0 == x) && (y0 == y)) {
645                                 x = x0 + 36.0;
646                                 y = y0 + 36.0;
647                         }
648                         w = x - x0;
649                         h = y - y0;
650                         gl_label_object_set_size (GL_LABEL_OBJECT(object),
651                                                   w, h);
652                         gl_label_line_set_line_color (GL_LABEL_LINE(object),
653                                                      gl_prefs->default_line_color);
654                         gl_view_unselect_all (view);
655                         gl_view_object_select (GL_VIEW_OBJECT(view_line));
656                         gl_view_arrow_mode (view);
657                         return TRUE;
658
659                 default:
660                         return FALSE;
661                 }
662
663         case GDK_MOTION_NOTIFY:
664                 if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) {
665                         gnome_canvas_window_to_world (canvas,
666                                                       event->motion.x,
667                                                       event->motion.y, &x, &y);
668                         w = x - x0;
669                         h = y - y0;
670                         gl_label_object_set_size (GL_LABEL_OBJECT(object),
671                                                   w, h);
672                         return TRUE;
673                 } else {
674                         return FALSE;
675                 }
676
677         default:
678                 return FALSE;
679         }
680
681 }