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