]> git.sur5r.net Git - glabels/blob - glabels2/src/wdgt-media-select.c
2005-03-22 Jim Evins <evins@snaught.com>
[glabels] / glabels2 / src / wdgt-media-select.c
1 /*
2  *  (GLABELS) Label and Business Card Creation program for GNOME
3  *
4  *  wdgt_media_select.c:  media selection widget 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 <glib/gi18n.h>
26
27 #include "wdgt-media-select.h"
28 #include "hig.h"
29 #include "wdgt-mini-preview.h"
30 #include "prefs.h"
31 #include "util.h"
32 #include "marshal.h"
33 #include <libglabels/paper.h>
34 #include <libglabels/template.h>
35
36 #include "debug.h"
37
38 #define WDGT_MINI_PREVIEW_WIDTH  160
39 #define WDGT_MINI_PREVIEW_HEIGHT 200
40
41 /*===========================================*/
42 /* Private types                             */
43 /*===========================================*/
44
45 enum {
46         CHANGED,
47         LAST_SIGNAL
48 };
49
50 typedef void (*glWdgtMediaSelectSignal) (GObject * object, gpointer data);
51
52 /*===========================================*/
53 /* Private globals                           */
54 /*===========================================*/
55
56 static GObjectClass *parent_class;
57
58 static gint wdgt_media_select_signals[LAST_SIGNAL] = { 0 };
59
60 /*===========================================*/
61 /* Local function prototypes                 */
62 /*===========================================*/
63
64 static void gl_wdgt_media_select_class_init    (glWdgtMediaSelectClass *class);
65 static void gl_wdgt_media_select_instance_init (glWdgtMediaSelect      *media_select);
66 static void gl_wdgt_media_select_finalize      (GObject                *object);
67
68 static void gl_wdgt_media_select_construct     (glWdgtMediaSelect      *media_select);
69
70 static void page_size_entry_changed_cb         (GtkEntry               *entry,
71                                                 gpointer                user_data);
72 static void template_entry_changed_cb          (GtkEntry               *entry,
73                                                 gpointer                user_data);
74 static void prefs_changed_cb                   (glPrefsModel           *gl_prefs,
75                                                 gpointer                user_data);
76
77 static void details_update                     (glWdgtMediaSelect      *media_select,
78                                                 gchar                  *name);
79
80 static gchar *get_layout_desc                  (const glTemplate       *template);
81 static gchar *get_label_size_desc              (const glTemplate       *template);
82 \f
83 /****************************************************************************/
84 /* Boilerplate Object stuff.                                                */
85 /****************************************************************************/
86 GType
87 gl_wdgt_media_select_get_type (void)
88 {
89         static GType type = 0;
90
91         if (!type) {
92                 static const GTypeInfo info = {
93                         sizeof (glWdgtMediaSelectClass),
94                         NULL,
95                         NULL,
96                         (GClassInitFunc) gl_wdgt_media_select_class_init,
97                         NULL,
98                         NULL,
99                         sizeof (glWdgtMediaSelect),
100                         0,
101                         (GInstanceInitFunc) gl_wdgt_media_select_instance_init,
102                         NULL
103                 };
104
105                 type = g_type_register_static (GL_TYPE_HIG_VBOX,
106                                                "glWdgtMediaSelect", &info, 0);
107         }
108
109         return type;
110 }
111
112 static void
113 gl_wdgt_media_select_class_init (glWdgtMediaSelectClass *class)
114 {
115         GObjectClass *object_class;
116
117         gl_debug (DEBUG_MEDIA_SELECT, "START");
118
119         object_class = (GObjectClass *) class;
120
121         parent_class = g_type_class_peek_parent (class);
122
123         object_class->finalize = gl_wdgt_media_select_finalize;
124
125         wdgt_media_select_signals[CHANGED] =
126             g_signal_new ("changed",
127                           G_OBJECT_CLASS_TYPE(object_class),
128                           G_SIGNAL_RUN_LAST,
129                           G_STRUCT_OFFSET (glWdgtMediaSelectClass, changed),
130                           NULL, NULL,
131                           gl_marshal_VOID__VOID,
132                           G_TYPE_NONE, 0);
133
134         gl_debug (DEBUG_MEDIA_SELECT, "END");
135 }
136
137 static void
138 gl_wdgt_media_select_instance_init (glWdgtMediaSelect *media_select)
139 {
140         gl_debug (DEBUG_MEDIA_SELECT, "START");
141
142         media_select->page_size_entry = NULL;
143         media_select->template_entry = NULL;
144
145         media_select->mini_preview = NULL;
146
147         media_select->desc_label = NULL;
148         media_select->sheet_size_label = NULL;
149         media_select->number_label = NULL;
150         media_select->label_size_label = NULL;
151
152         gl_debug (DEBUG_MEDIA_SELECT, "END");
153 }
154
155 static void
156 gl_wdgt_media_select_finalize (GObject *object)
157 {
158         glWdgtMediaSelect *media_select;
159         glWdgtMediaSelectClass *class;
160
161         gl_debug (DEBUG_MEDIA_SELECT, "START");
162
163         g_return_if_fail (object != NULL);
164         g_return_if_fail (GL_IS_WDGT_MEDIA_SELECT (object));
165
166         media_select = GL_WDGT_MEDIA_SELECT (object);
167
168         g_signal_handlers_disconnect_by_func (G_OBJECT(gl_prefs),
169                                               prefs_changed_cb, media_select);
170
171         G_OBJECT_CLASS (parent_class)->finalize (object);
172
173         gl_debug (DEBUG_MEDIA_SELECT, "END");
174 }
175
176 GtkWidget *
177 gl_wdgt_media_select_new (void)
178 {
179         glWdgtMediaSelect *media_select;
180
181         gl_debug (DEBUG_MEDIA_SELECT, "START");
182
183         media_select = g_object_new (gl_wdgt_media_select_get_type (), NULL);
184
185         gl_wdgt_media_select_construct (media_select);
186
187         gl_debug (DEBUG_MEDIA_SELECT, "END");
188
189         return GTK_WIDGET (media_select);
190 }
191
192 /*--------------------------------------------------------------------------*/
193 /* PRIVATE.  Construct composite widget.                                    */
194 /*--------------------------------------------------------------------------*/
195 static void
196 gl_wdgt_media_select_construct (glWdgtMediaSelect *media_select)
197 {
198         GtkWidget    *whbox, *wvbox, *wcombo, *wvbox1, *whbox1, *wlabel;
199         GtkSizeGroup *label_size_group;
200         gchar        *name;
201         GList        *template_names, *page_sizes = NULL;
202         const gchar  *page_size_id;
203         gchar        *page_size_name;
204
205         gl_debug (DEBUG_MEDIA_SELECT, "START");
206
207         page_size_id = gl_prefs_get_page_size ();
208         page_size_name = gl_paper_lookup_name_from_id (page_size_id);
209
210         wvbox = GTK_WIDGET (media_select);
211
212         whbox = gl_hig_hbox_new ();
213         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), whbox);
214
215         /* Page size selection control */
216         gl_debug (DEBUG_MEDIA_SELECT, "Creating page size combo...");
217         wcombo = gtk_combo_new ();
218         page_sizes = gl_paper_get_name_list ();
219         gtk_combo_set_popdown_strings (GTK_COMBO (wcombo), page_sizes);
220         gl_paper_free_name_list (page_sizes);
221         media_select->page_size_entry = GTK_COMBO (wcombo)->entry;
222         gtk_entry_set_editable (GTK_ENTRY (media_select->page_size_entry),
223                                 FALSE);
224         gtk_combo_set_value_in_list (GTK_COMBO(wcombo), TRUE, FALSE);
225         gtk_widget_set_size_request (media_select->page_size_entry, 100, -1);
226         gtk_entry_set_text (GTK_ENTRY (media_select->page_size_entry),
227                             page_size_name);
228         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox), wcombo);
229
230         /* Actual selection control */
231         gl_debug (DEBUG_MEDIA_SELECT, "Creating template combo...");
232         gl_debug (DEBUG_MEDIA_SELECT, "page_size_name = %s", page_size_name);
233         template_names = gl_template_get_name_list (page_size_id);
234         media_select->template_combo = gtk_combo_new ();
235         gtk_combo_set_popdown_strings (GTK_COMBO (media_select->template_combo),
236                                        template_names);
237         media_select->template_entry =
238             GTK_COMBO (media_select->template_combo)->entry;
239         gtk_entry_set_editable (GTK_ENTRY (media_select->template_entry),
240                                 FALSE);
241         gtk_combo_set_value_in_list (GTK_COMBO(media_select->template_combo),
242                                      TRUE, FALSE);
243         gtk_widget_set_size_request (media_select->template_entry, 400, -1);
244         gtk_entry_set_text (GTK_ENTRY (media_select->template_entry),
245                             template_names->data);
246         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox),
247                                 media_select->template_combo);
248         gl_template_free_name_list (template_names);
249
250         whbox = gl_hig_hbox_new ();
251         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), whbox);
252
253         /* mini_preview canvas */
254         gl_debug (DEBUG_MEDIA_SELECT, "Creating mini preview...");
255         media_select->mini_preview = gl_wdgt_mini_preview_new ( WDGT_MINI_PREVIEW_HEIGHT,
256                                                            WDGT_MINI_PREVIEW_WIDTH);
257         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox),
258                                 media_select->mini_preview);
259
260         /* ---- Information area ---- */
261         wvbox1 = gl_hig_vbox_new (GL_HIG_VBOX_INNER);
262         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox), wvbox1);
263         label_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
264
265         /* blank line */
266         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox1), gtk_label_new (""));
267
268         /* Description line */
269         whbox1 = gl_hig_hbox_new ();
270         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox1), whbox1);
271         wlabel = gtk_label_new (_("Description:"));
272         gtk_size_group_add_widget (label_size_group, wlabel);
273         gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.0);
274         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1), wlabel);
275         media_select->desc_label = gtk_label_new ("");
276         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1), media_select->desc_label);
277
278         /* Page size line */
279         whbox1 = gl_hig_hbox_new ();
280         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox1), whbox1);
281         wlabel = gtk_label_new (_("Page size:"));
282         gtk_size_group_add_widget (label_size_group, wlabel);
283         gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.0);
284         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1), wlabel);
285         media_select->sheet_size_label = gtk_label_new ("");
286         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1),
287                                 media_select->sheet_size_label);
288
289         /* Label size line */
290         whbox1 = gl_hig_hbox_new ();
291         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox1), whbox1);
292         wlabel = gtk_label_new (_("Label size:"));
293         gtk_size_group_add_widget (label_size_group, wlabel);
294         gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.0);
295         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1), wlabel);
296         media_select->label_size_label = gtk_label_new ("");
297         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1),
298                                 media_select->label_size_label);
299
300         /* Layout line */
301         whbox1 = gl_hig_hbox_new ();
302         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox1), whbox1);
303         wlabel = gtk_label_new (_("Layout:"));
304         gtk_size_group_add_widget (label_size_group, wlabel);
305         gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.0);
306         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1), wlabel);
307         media_select->number_label = gtk_label_new ("");
308         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1),
309                                 media_select->number_label);
310
311         /* Update mini_preview and details from default template */
312         
313         gl_debug (DEBUG_MEDIA_SELECT, "template_entry = %p",
314                   media_select->template_entry);
315         name =
316             gtk_editable_get_chars (GTK_EDITABLE (media_select->template_entry),
317                                     0, -1);
318         gl_debug (DEBUG_MEDIA_SELECT, "name = \"%s\"", name);
319         gl_wdgt_mini_preview_set_label_by_name (GL_WDGT_MINI_PREVIEW (media_select->mini_preview),
320                                                 name);
321         details_update (media_select, name);
322         g_free (name);
323
324         /* Connect signals to controls */
325         g_signal_connect (G_OBJECT (media_select->page_size_entry), "changed",
326                           G_CALLBACK (page_size_entry_changed_cb),
327                           media_select);
328         g_signal_connect (G_OBJECT (media_select->template_entry), "changed",
329                           G_CALLBACK (template_entry_changed_cb),
330                           media_select);
331         g_signal_connect (G_OBJECT (gl_prefs), "changed",
332                           G_CALLBACK (prefs_changed_cb),
333                           media_select);
334
335         g_free (page_size_name);
336
337         gl_debug (DEBUG_MEDIA_SELECT, "END");
338 }
339
340 /*--------------------------------------------------------------------------*/
341 /* PRIVATE.  modify widget due to change in selection                       */
342 /*--------------------------------------------------------------------------*/
343 static void
344 page_size_entry_changed_cb (GtkEntry *entry,
345                             gpointer  user_data)
346 {
347         glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
348         gchar             *page_size_name, *page_size_id;
349         GList             *template_names;
350
351         gl_debug (DEBUG_MEDIA_SELECT, "START");
352
353
354         /* Update template selections for new page size */
355         page_size_name = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
356         if ( strlen(page_size_name) ) {
357                 gl_debug (DEBUG_MEDIA_SELECT, "page_size_name = \"%s\"", page_size_name);
358                 page_size_id = gl_paper_lookup_id_from_name (page_size_name);
359                 template_names = gl_template_get_name_list (page_size_id);
360                 if (template_names == NULL) {
361                         template_names = g_list_append (template_names, g_strdup(""));
362                 }
363                 gtk_combo_set_popdown_strings (GTK_COMBO (media_select->template_combo),
364                                                template_names);
365                 gtk_entry_set_text (GTK_ENTRY (media_select->template_entry),
366                                     template_names->data);
367                 gl_template_free_name_list (template_names);
368                 g_free (page_size_id);
369         }
370         g_free (page_size_name);
371
372         gl_debug (DEBUG_MEDIA_SELECT, "END");
373 }
374
375 /*--------------------------------------------------------------------------*/
376 /* PRIVATE.  modify widget due to change in selection                       */
377 /*--------------------------------------------------------------------------*/
378 static void
379 template_entry_changed_cb (GtkEntry *entry,
380                            gpointer  user_data)
381 {
382         glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
383         gchar *name;
384
385         gl_debug (DEBUG_MEDIA_SELECT, "START");
386
387         /* Update mini_preview canvas & details with template */
388         gl_debug (DEBUG_MEDIA_SELECT, "template_entry = %p", entry);
389         name = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
390         if ( strlen(name) ) {
391                 gl_debug (DEBUG_MEDIA_SELECT, "name = \"%s\"", name);
392                 gl_wdgt_mini_preview_set_label_by_name (GL_WDGT_MINI_PREVIEW (media_select->mini_preview),
393                                                         name);
394                 gl_debug (DEBUG_MEDIA_SELECT, "m1");
395                 details_update (media_select, name);
396                 gl_debug (DEBUG_MEDIA_SELECT, "m2");
397
398                 /* Emit our "changed" signal */
399                 g_signal_emit (G_OBJECT (user_data),
400                                wdgt_media_select_signals[CHANGED], 0);
401         }
402         g_free (name);
403
404         gl_debug (DEBUG_MEDIA_SELECT, "END");
405 }
406
407 /*--------------------------------------------------------------------------*/
408 /* PRIVATE.  modify widget due to change in prefs                           */
409 /*--------------------------------------------------------------------------*/
410 static void
411 prefs_changed_cb (glPrefsModel *gl_prefs,
412                   gpointer      user_data)
413 {
414         glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
415         gchar *name;
416
417         gl_debug (DEBUG_MEDIA_SELECT, "START");
418
419         /* Update mini_preview canvas & details with template */
420         name = gtk_editable_get_chars (GTK_EDITABLE (media_select->template_entry), 0, -1);
421         if ( strlen(name) ) {
422                 gl_debug (DEBUG_MEDIA_SELECT, "name = \"%s\"", name);
423                 details_update (media_select, name);
424         }
425         g_free (name);
426
427         gl_debug (DEBUG_MEDIA_SELECT, "END");
428 }
429
430 /*--------------------------------------------------------------------------*/
431 /* PRIVATE. update "details" widgets from new template.               */
432 /*--------------------------------------------------------------------------*/
433 static void
434 details_update (glWdgtMediaSelect *media_select,
435                 gchar             *name)
436 {
437         glTemplate *template;
438         gchar *text;
439         glUnitsType units;
440         const gchar *units_string;
441         gdouble units_per_point;
442
443         gl_debug (DEBUG_MEDIA_SELECT, "START");
444
445         units = gl_prefs_get_units ();
446         units_string = gl_prefs_get_units_string ();
447         units_per_point = gl_prefs_get_units_per_point ();
448
449         /* Fetch template */
450         template = gl_template_from_name (name);
451
452         gtk_label_set_text (GTK_LABEL (media_select->desc_label),
453                             template->description);
454
455         gtk_label_set_text (GTK_LABEL (media_select->sheet_size_label),
456                             template->page_size);
457
458         text = get_layout_desc (template);
459         gtk_label_set_text (GTK_LABEL (media_select->number_label), text);
460         g_free (text);
461
462         text = get_label_size_desc (template);
463         gtk_label_set_text (GTK_LABEL (media_select->label_size_label), text);
464         g_free (text);
465
466         gl_template_free (template);
467
468         gl_debug (DEBUG_MEDIA_SELECT, "END");
469 }
470
471 /****************************************************************************/
472 /* query selected label template name.                                      */
473 /****************************************************************************/
474 gchar *
475 gl_wdgt_media_select_get_name (glWdgtMediaSelect *media_select)
476 {
477         gl_debug (DEBUG_MEDIA_SELECT, "");
478         return
479             gtk_editable_get_chars (GTK_EDITABLE (media_select->template_entry),
480                                     0, -1);
481 }
482
483 /****************************************************************************/
484 /* set selected label template name.                                        */
485 /****************************************************************************/
486 void
487 gl_wdgt_media_select_set_name (glWdgtMediaSelect *media_select,
488                                gchar             *name)
489 {
490         gint pos;
491
492         gl_debug (DEBUG_MEDIA_SELECT, "START");
493
494         g_signal_handlers_block_by_func (G_OBJECT(media_select->template_entry),
495                                         G_CALLBACK(template_entry_changed_cb),
496                                         media_select);
497         gtk_editable_delete_text (GTK_EDITABLE (media_select->template_entry),
498                                   0, -1);
499         g_signal_handlers_unblock_by_func (G_OBJECT(media_select->template_entry),
500                                            G_CALLBACK(template_entry_changed_cb),
501                                            media_select);
502
503         pos = 0;
504         gtk_editable_insert_text (GTK_EDITABLE (media_select->template_entry),
505                                   name, strlen (name), &pos);
506
507         gl_debug (DEBUG_MEDIA_SELECT, "END");
508 }
509
510 /****************************************************************************/
511 /* query selected label template page size.                                 */
512 /****************************************************************************/
513 gchar *
514 gl_wdgt_media_select_get_page_size (glWdgtMediaSelect *media_select)
515 {
516         gchar *page_size_name, *page_size_id;
517
518         gl_debug (DEBUG_MEDIA_SELECT, "");
519
520         page_size_name =
521             gtk_editable_get_chars (GTK_EDITABLE
522                                     (media_select->page_size_entry), 0, -1);
523
524         page_size_id = gl_paper_lookup_id_from_name (page_size_name);
525
526         g_free (page_size_name);
527
528         return page_size_id;
529 }
530
531 /****************************************************************************/
532 /* set selected label template page size.                                   */
533 /****************************************************************************/
534 void
535 gl_wdgt_media_select_set_page_size (glWdgtMediaSelect *media_select,
536                                     gchar             *page_size_id)
537 {
538         gint   pos;
539         gchar *page_size_name;
540
541         gl_debug (DEBUG_MEDIA_SELECT, "START");
542
543         page_size_name = gl_paper_lookup_name_from_id (page_size_id);
544
545         g_signal_handlers_block_by_func (G_OBJECT(media_select->page_size_entry),
546                                         G_CALLBACK(page_size_entry_changed_cb),
547                                         media_select);
548         gtk_editable_delete_text (GTK_EDITABLE (media_select->page_size_entry),
549                                   0, -1);
550         g_signal_handlers_unblock_by_func (G_OBJECT(media_select->page_size_entry),
551                                           G_CALLBACK(page_size_entry_changed_cb),
552                                           media_select);
553
554         pos = 0;
555         gtk_editable_insert_text (GTK_EDITABLE (media_select->page_size_entry),
556                                   page_size_name, strlen (page_size_name), &pos);
557
558         g_free (page_size_name);
559
560         gl_debug (DEBUG_MEDIA_SELECT, "END");
561 }
562
563 /*--------------------------------------------------------------------------*/
564 /* PRIVATE.  Get a description of the layout and number of labels.          */
565 /*--------------------------------------------------------------------------*/
566 static gchar *
567 get_layout_desc (const glTemplate *template)
568 {
569         const glTemplateLabelType *label_type;
570         gint                       n_labels;
571         glTemplateLayout          *layout;
572         gchar                     *string;
573
574         label_type = gl_template_get_first_label_type (template);
575
576         n_labels = gl_template_get_n_labels (label_type);
577
578         if ( label_type->layouts->next == NULL ) {
579                 layout = (glTemplateLayout *)label_type->layouts->data;
580                 string = g_strdup_printf (_("%d x %d  (%d per sheet)"),
581                                           layout->nx, layout->ny,
582                                           n_labels);
583         } else {
584                 string = g_strdup_printf (_("%d per sheet"),
585                                           n_labels);
586         }
587
588         return string;
589 }
590
591 /*--------------------------------------------------------------------------*/
592 /* PRIVATE.  Get label size description.                                    */ 
593 /*--------------------------------------------------------------------------*/
594 static gchar *
595 get_label_size_desc (const glTemplate *template)
596 {
597         glUnitsType                units;
598         const gchar               *units_string;
599         gdouble                    units_per_point;
600         const glTemplateLabelType *label_type;
601         gchar                     *string = NULL;
602
603         units           = gl_prefs_get_units ();
604         units_string    = gl_prefs_get_units_string ();
605         units_per_point = gl_prefs_get_units_per_point ();
606
607         label_type = gl_template_get_first_label_type (template);
608
609         switch (label_type->shape) {
610         case GL_TEMPLATE_SHAPE_RECT:
611                 if ( units == GL_UNITS_INCH ) {
612                         gchar *xstr, *ystr;
613
614                         xstr = gl_util_fraction (label_type->size.rect.w*units_per_point);
615                         ystr = gl_util_fraction (label_type->size.rect.h*units_per_point);
616                         string = g_strdup_printf (_("%s x %s %s"),
617                                                   xstr, ystr, units_string);
618                         g_free (xstr);
619                         g_free (ystr);
620                 } else {
621                         string = g_strdup_printf (_("%.5g x %.5g %s"),
622                                                   label_type->size.rect.w*units_per_point,
623                                                   label_type->size.rect.h*units_per_point,
624                                                   units_string);
625                 }
626                 break;
627         case GL_TEMPLATE_SHAPE_ROUND:
628                 if ( units == GL_UNITS_INCH ) {
629                         gchar *dstr;
630
631                         dstr = gl_util_fraction (2.0*label_type->size.round.r*units_per_point);
632                         string = g_strdup_printf (_("%s %s diameter"),
633                                                   dstr, units_string);
634                         g_free (dstr);
635                 } else {
636                         string = g_strdup_printf (_("%.5g %s diameter"),
637                                                   2.0*label_type->size.round.r*units_per_point,
638                                                   units_string);
639                 }
640                 break;
641         case GL_TEMPLATE_SHAPE_CD:
642                 if ( units == GL_UNITS_INCH ) {
643                         gchar *dstr;
644
645                         dstr = gl_util_fraction (2.0*label_type->size.cd.r1*units_per_point);
646                         string = g_strdup_printf (_("%s %s diameter"),
647                                                   dstr, units_string);
648                         g_free (dstr);
649                 } else {
650                         string = g_strdup_printf (_("%.5g %s diameter"),
651                                                   2.0*label_type->size.cd.r1*units_per_point,
652                                                   units_string);
653                 }
654                 break;
655         default:
656                 break;
657         }
658
659         return string;
660 }
661