]> git.sur5r.net Git - glabels/blob - glabels2/src/wdgt-media-select.c
2006-09-12 Jim Evins <evins@snaught.com>
[glabels] / glabels2 / src / wdgt-media-select.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
2
3 /*
4  *  (GLABELS) Label and Business Card Creation program for GNOME
5  *
6  *  wdgt_media_select.c:  media selection widget module
7  *
8  *  Copyright (C) 2001-2006  Jim Evins <evins@snaught.com>.
9  *
10  *  This program is free software; you can redistribute it and/or modify
11  *  it under the terms of the GNU General Public License as published by
12  *  the Free Software Foundation; either version 2 of the License, or
13  *  (at your option) any later version.
14  *
15  *  This program is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU General Public License for more details.
19  *
20  *  You should have received a copy of the GNU General Public License
21  *  along with this program; if not, write to the Free Software
22  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
23  */
24
25 #include <config.h>
26
27 #include "wdgt-media-select.h"
28
29 #include <glib/gi18n.h>
30 #include <glade/glade-xml.h>
31 #include <gtk/gtkcombobox.h>
32 #include <gtk/gtktreeview.h>
33 #include <gtk/gtktreeselection.h>
34 #include <gtk/gtkliststore.h>
35 #include <gtk/gtkcellrenderertext.h>
36 #include <gtk/gtkcellrendererpixbuf.h>
37 #include <gtk/gtkstock.h>
38 #include <string.h>
39
40 #include "mini-preview-pixbuf.h"
41 #include "prefs.h"
42 #include "util.h"
43 #include "color.h"
44 #include "marshal.h"
45 #include <libglabels/paper.h>
46 #include <libglabels/category.h>
47 #include <libglabels/template.h>
48
49 #include "debug.h"
50
51 /*===========================================*/
52 /* Private types                             */
53 /*===========================================*/
54
55 enum {
56         NAME_COLUMN,
57         PREVIEW_COLUMN,
58         PREVIEW_COLUMN_STOCK,
59         PREVIEW_COLUMN_STOCK_SIZE,
60         DESCRIPTION_COLUMN,
61         N_COLUMNS
62 };
63
64 struct _glWdgtMediaSelectPrivate {
65
66         GladeXML     *gui;
67
68         GtkWidget    *page_size_combo;
69         GtkWidget    *category_combo;
70
71         GtkWidget    *template_treeview;
72         GtkListStore *template_store;
73 };
74
75 enum {
76         CHANGED,
77         LAST_SIGNAL
78 };
79
80 typedef void (*glWdgtMediaSelectSignal) (GObject * object, gpointer data);
81
82 /*===========================================*/
83 /* Private globals                           */
84 /*===========================================*/
85
86 static GObjectClass *parent_class;
87
88 static gint wdgt_media_select_signals[LAST_SIGNAL] = { 0 };
89
90 /*===========================================*/
91 /* Local function prototypes                 */
92 /*===========================================*/
93
94 static void gl_wdgt_media_select_class_init    (glWdgtMediaSelectClass *class);
95 static void gl_wdgt_media_select_instance_init (glWdgtMediaSelect      *media_select);
96 static void gl_wdgt_media_select_finalize      (GObject                *object);
97
98 static void gl_wdgt_media_select_construct     (glWdgtMediaSelect      *media_select);
99
100 static void filter_changed_cb                  (GtkComboBox            *combo,
101                                                 gpointer                user_data);
102 static void template_selection_changed_cb      (GtkTreeSelection       *selection,
103                                                 gpointer                user_data);
104
105 static void details_update                     (glWdgtMediaSelect      *media_select,
106                                                 gchar                  *name);
107
108 static gchar *get_layout_desc                  (const glTemplate       *template);
109 static gchar *get_label_size_desc              (const glTemplate       *template);
110 static void   load_list                        (GtkListStore           *store,
111                                                 GtkTreeSelection       *selection,
112                                                 GList                  *list);
113 \f
114 /****************************************************************************/
115 /* Boilerplate Object stuff.                                                */
116 /****************************************************************************/
117 GType
118 gl_wdgt_media_select_get_type (void)
119 {
120         static GType type = 0;
121
122         if (!type) {
123                 static const GTypeInfo info = {
124                         sizeof (glWdgtMediaSelectClass),
125                         NULL,
126                         NULL,
127                         (GClassInitFunc) gl_wdgt_media_select_class_init,
128                         NULL,
129                         NULL,
130                         sizeof (glWdgtMediaSelect),
131                         0,
132                         (GInstanceInitFunc) gl_wdgt_media_select_instance_init,
133                         NULL
134                 };
135
136                 type = g_type_register_static (GTK_TYPE_VBOX,
137                                                "glWdgtMediaSelect", &info, 0);
138         }
139
140         return type;
141 }
142
143 static void
144 gl_wdgt_media_select_class_init (glWdgtMediaSelectClass *class)
145 {
146         GObjectClass *object_class;
147
148         gl_debug (DEBUG_MEDIA_SELECT, "START");
149
150         object_class = (GObjectClass *) class;
151
152         parent_class = g_type_class_peek_parent (class);
153
154         object_class->finalize = gl_wdgt_media_select_finalize;
155
156         wdgt_media_select_signals[CHANGED] =
157             g_signal_new ("changed",
158                           G_OBJECT_CLASS_TYPE(object_class),
159                           G_SIGNAL_RUN_LAST,
160                           G_STRUCT_OFFSET (glWdgtMediaSelectClass, changed),
161                           NULL, NULL,
162                           gl_marshal_VOID__VOID,
163                           G_TYPE_NONE, 0);
164
165         gl_debug (DEBUG_MEDIA_SELECT, "END");
166 }
167
168 static void
169 gl_wdgt_media_select_instance_init (glWdgtMediaSelect *media_select)
170 {
171         gl_debug (DEBUG_MEDIA_SELECT, "START");
172
173         media_select->priv = g_new0 (glWdgtMediaSelectPrivate, 1);
174
175         media_select->priv->gui = glade_xml_new (GLABELS_GLADE_DIR "wdgt-media-select.glade",
176                                            "wdgt_media_select_hbox",
177                                            NULL);
178
179         if (!media_select->priv->gui) {
180                 g_critical ("Could not open wdgt-media-select.glade. gLabels may not be installed correctly!");
181                 return;
182         }
183
184         gl_debug (DEBUG_MEDIA_SELECT, "END");
185 }
186
187 static void
188 gl_wdgt_media_select_finalize (GObject *object)
189 {
190         glWdgtMediaSelect *media_select;
191         glWdgtMediaSelectClass *class;
192
193         gl_debug (DEBUG_MEDIA_SELECT, "START");
194
195         g_return_if_fail (object != NULL);
196         g_return_if_fail (GL_IS_WDGT_MEDIA_SELECT (object));
197
198         media_select = GL_WDGT_MEDIA_SELECT (object);
199
200         G_OBJECT_CLASS (parent_class)->finalize (object);
201
202         g_free (media_select->priv);
203
204         gl_debug (DEBUG_MEDIA_SELECT, "END");
205 }
206
207 GtkWidget *
208 gl_wdgt_media_select_new (void)
209 {
210         glWdgtMediaSelect *media_select;
211
212         gl_debug (DEBUG_MEDIA_SELECT, "START");
213
214         media_select = g_object_new (gl_wdgt_media_select_get_type (), NULL);
215
216         gl_wdgt_media_select_construct (media_select);
217
218         gl_debug (DEBUG_MEDIA_SELECT, "END");
219
220         return GTK_WIDGET (media_select);
221 }
222
223 /*--------------------------------------------------------------------------*/
224 /* PRIVATE.  Construct composite widget.                                    */
225 /*--------------------------------------------------------------------------*/
226 static void
227 gl_wdgt_media_select_construct (glWdgtMediaSelect *media_select)
228 {
229         GtkWidget         *hbox;
230         GtkWidget         *preview_vbox;
231         GList             *page_sizes = NULL;
232         GList             *categories = NULL;
233         GList             *template_names = NULL;
234         const gchar       *page_size_id;
235         gchar             *page_size_name;
236         gchar             *name;
237         GtkCellRenderer   *renderer;
238         GtkTreeViewColumn *column;
239         GtkTreeSelection  *selection;
240         GtkTreeIter        iter;
241         GtkTreeModel      *model;        
242
243         gl_debug (DEBUG_MEDIA_SELECT, "START");
244
245         g_return_if_fail (GL_IS_WDGT_MEDIA_SELECT (media_select));
246         g_return_if_fail (media_select->priv != NULL);
247
248         hbox = glade_xml_get_widget (media_select->priv->gui,
249                                      "wdgt_media_select_hbox");
250         gtk_container_add (GTK_CONTAINER (media_select), hbox);
251
252         media_select->priv->page_size_combo =
253                 glade_xml_get_widget (media_select->priv->gui, "page_size_combo");
254         media_select->priv->category_combo =
255                 glade_xml_get_widget (media_select->priv->gui, "category_combo");
256         media_select->priv->template_treeview =
257                 glade_xml_get_widget (media_select->priv->gui, "template_treeview");
258
259         page_size_id = gl_prefs_get_page_size ();
260         page_size_name = gl_paper_lookup_name_from_id (page_size_id);
261
262         /* Page size selection control */
263         gl_util_combo_box_add_text_model (GTK_COMBO_BOX (media_select->priv->page_size_combo));
264         page_sizes = gl_paper_get_name_list ();
265         page_sizes = g_list_prepend (page_sizes, g_strdup (_("Any")));
266         gl_util_combo_box_set_strings (GTK_COMBO_BOX (media_select->priv->page_size_combo), page_sizes);
267         gl_paper_free_name_list (page_sizes);
268         gl_util_combo_box_set_active_text (GTK_COMBO_BOX (media_select->priv->page_size_combo),
269                                            page_size_name);
270
271         /* Category selection control */
272         gl_util_combo_box_add_text_model (GTK_COMBO_BOX (media_select->priv->category_combo));
273         categories = gl_category_get_name_list ();
274         categories = g_list_prepend (categories, g_strdup (_("Any")));
275         gl_util_combo_box_set_strings (GTK_COMBO_BOX (media_select->priv->category_combo), categories);
276         gl_util_combo_box_set_active_text (GTK_COMBO_BOX (media_select->priv->category_combo),
277                                            _("Any"));
278         gl_category_free_name_list (categories);
279
280         /* Actual selection control */
281         media_select->priv->template_store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING);
282         gtk_tree_view_set_model (GTK_TREE_VIEW (media_select->priv->template_treeview),
283                                  GTK_TREE_MODEL (media_select->priv->template_store));
284         renderer = gtk_cell_renderer_pixbuf_new ();
285         column = gtk_tree_view_column_new_with_attributes ("", renderer,
286                                                            "pixbuf", PREVIEW_COLUMN,
287                                                            "stock-id", PREVIEW_COLUMN_STOCK,
288                                                            "stock-size", PREVIEW_COLUMN_STOCK_SIZE,
289                                                            NULL);
290         gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
291         gtk_tree_view_append_column (GTK_TREE_VIEW (media_select->priv->template_treeview), column);
292         renderer = gtk_cell_renderer_text_new ();
293         column = gtk_tree_view_column_new_with_attributes ("", renderer,
294                                                            "markup", DESCRIPTION_COLUMN,
295                                                            NULL);
296         gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
297         gtk_tree_view_append_column (GTK_TREE_VIEW (media_select->priv->template_treeview), column);
298         selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->template_treeview));
299         template_names = gl_template_get_name_list (page_size_id, NULL);
300         load_list (media_select->priv->template_store, selection, template_names);
301         gl_template_free_name_list (template_names);
302
303         /* Connect signals to controls */
304         g_signal_connect (G_OBJECT (media_select->priv->page_size_combo), "changed",
305                           G_CALLBACK (filter_changed_cb),
306                           media_select);
307         g_signal_connect (G_OBJECT (media_select->priv->category_combo), "changed",
308                           G_CALLBACK (filter_changed_cb),
309                           media_select);
310         g_signal_connect (G_OBJECT (selection), "changed",
311                           G_CALLBACK (template_selection_changed_cb),
312                           media_select);
313
314         g_free (page_size_name);
315
316         gl_debug (DEBUG_MEDIA_SELECT, "END");
317 }
318
319 /*--------------------------------------------------------------------------*/
320 /* PRIVATE.  modify widget due to change in selection                       */
321 /*--------------------------------------------------------------------------*/
322 static void
323 filter_changed_cb (GtkComboBox *combo,
324                    gpointer     user_data)
325 {
326         glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
327         gchar             *page_size_name, *page_size_id;
328         gchar             *category_name, *category_id;
329         GList             *template_names;
330         GtkTreeSelection  *selection;
331         GtkTreeIter        iter;
332         GtkTreeModel      *model;
333
334         gl_debug (DEBUG_MEDIA_SELECT, "START");
335
336
337         /* Update template selections for new page size */
338         page_size_name = gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->page_size_combo));
339         category_name = gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->category_combo));
340         if ( page_size_name && strlen(page_size_name) &&
341              category_name && strlen(category_name) )
342         {
343                 gl_debug (DEBUG_MEDIA_SELECT, "page_size_name = \"%s\"", page_size_name);
344                 gl_debug (DEBUG_MEDIA_SELECT, "category_name = \"%s\"", category_name);
345                 page_size_id = gl_paper_lookup_id_from_name (page_size_name);
346                 category_id = gl_category_lookup_id_from_name (category_name);
347                 gl_debug (DEBUG_MEDIA_SELECT, "page_size_id = \"%s\"", page_size_id);
348                 gl_debug (DEBUG_MEDIA_SELECT, "category_id = \"%s\"", category_id);
349                 template_names = gl_template_get_name_list (page_size_id, category_id);
350                 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->template_treeview));
351                 g_signal_handlers_block_by_func (G_OBJECT (selection),
352                                                  template_selection_changed_cb,
353                                                  media_select);
354                 load_list (media_select->priv->template_store, selection, template_names);
355                 g_signal_handlers_unblock_by_func (G_OBJECT (selection),
356                                                    template_selection_changed_cb,
357                                                    media_select);
358                 gl_template_free_name_list (template_names);
359                 g_free (page_size_id);
360
361                 /* Emit our "changed" signal */
362                 g_signal_emit (G_OBJECT (user_data),
363                                wdgt_media_select_signals[CHANGED], 0);
364         }
365         g_free (page_size_name);
366
367         gl_debug (DEBUG_MEDIA_SELECT, "END");
368 }
369
370 /*--------------------------------------------------------------------------*/
371 /* PRIVATE.  modify widget due to change in selection                       */
372 /*--------------------------------------------------------------------------*/
373 static void
374 template_selection_changed_cb (GtkTreeSelection       *selection,
375                                gpointer                user_data)
376 {
377         glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
378
379         gl_debug (DEBUG_MEDIA_SELECT, "START");
380
381         /* Emit our "changed" signal */
382         g_signal_emit (G_OBJECT (user_data),
383                        wdgt_media_select_signals[CHANGED], 0);
384
385         gl_debug (DEBUG_MEDIA_SELECT, "END");
386 }
387
388 /****************************************************************************/
389 /* query selected label template name.                                      */
390 /****************************************************************************/
391 gchar *
392 gl_wdgt_media_select_get_name (glWdgtMediaSelect *media_select)
393 {
394         GtkTreeSelection  *selection;
395         GtkTreeIter        iter;
396         GtkTreeModel      *model;        
397         gchar             *name;
398
399         gl_debug (DEBUG_MEDIA_SELECT, "START");
400         selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->template_treeview));
401         if (gtk_tree_selection_get_mode (selection) == GTK_SELECTION_NONE)
402         {
403                 name = NULL;
404         }
405         else
406         {
407                 gtk_tree_selection_get_selected (selection, &model, &iter);
408                 gtk_tree_model_get (model, &iter, NAME_COLUMN, &name, -1);
409         }
410
411         gl_debug (DEBUG_MEDIA_SELECT, "END");
412         return name;
413 }
414
415 /****************************************************************************/
416 /* set selected label template name.                                        */
417 /****************************************************************************/
418 void
419 gl_wdgt_media_select_set_name (glWdgtMediaSelect *media_select,
420                                gchar             *name)
421 {
422         GtkTreeSelection  *selection;
423         GtkTreeModel      *model;
424         GtkTreeIter        iter;
425         GtkTreePath       *path;
426         gchar             *name_i;
427         gboolean           flag;
428
429         gl_debug (DEBUG_MEDIA_SELECT, "START");
430
431         selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->template_treeview));
432         g_return_if_fail (GTK_IS_TREE_SELECTION (selection));
433
434         model = GTK_TREE_MODEL (media_select->priv->template_store);
435
436         for ( flag = gtk_tree_model_get_iter_first (model, &iter);
437               flag;
438               flag = gtk_tree_model_iter_next(model, &iter) )
439         {
440                 gtk_tree_model_get (model, &iter, NAME_COLUMN, &name_i, -1); 
441                 if (strcasecmp(name, name_i) == 0)
442                 {
443                         gtk_tree_selection_select_iter (selection, &iter);
444                         path = gtk_tree_model_get_path (model, &iter);
445                         gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (media_select->priv->template_treeview),
446                                                       path,
447                                                       NULL,
448                                                       TRUE, 0.5, 0.0);
449                         gtk_tree_path_free (path);
450                         break;
451                 }
452         }
453
454         gl_debug (DEBUG_MEDIA_SELECT, "END");
455 }
456
457 /****************************************************************************/
458 /* query current filter parameters.                                         */
459 /****************************************************************************/
460 void
461 gl_wdgt_media_select_get_filter_parameters (glWdgtMediaSelect *media_select,
462                                             gchar            **page_size_id,
463                                             gchar            **category_id)
464 {
465         gchar *page_size_name, *category_name;
466
467         gl_debug (DEBUG_MEDIA_SELECT, "");
468
469         g_free (*page_size_id);
470         g_free (*category_id);
471
472         page_size_name =
473                 gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->page_size_combo));
474
475         *page_size_id = gl_paper_lookup_id_from_name (page_size_name);
476
477         category_name =
478                 gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->category_combo));
479
480         *category_id = gl_category_lookup_id_from_name (category_name);
481
482         g_free (page_size_name);
483         g_free (category_name);
484 }
485
486 /****************************************************************************/
487 /* set filter parameters.                                                   */
488 /****************************************************************************/
489 void
490 gl_wdgt_media_select_set_filter_parameters (glWdgtMediaSelect *media_select,
491                                             const gchar       *page_size_id,
492                                             const gchar       *category_id)
493 {
494         gchar *page_size_name;
495         gchar *category_name;
496
497         gl_debug (DEBUG_MEDIA_SELECT, "START");
498
499         page_size_name = gl_paper_lookup_name_from_id (page_size_id);
500         if (page_size_name == NULL)
501         {
502                 page_size_name = g_strdup (_("Any"));
503         }
504
505         gl_util_combo_box_set_active_text (GTK_COMBO_BOX (media_select->priv->page_size_combo),
506                                            page_size_name);
507
508         category_name = gl_category_lookup_name_from_id (category_id);
509         if (category_name == NULL)
510         {
511                 category_name = g_strdup (_("Any"));
512         }
513
514         gl_util_combo_box_set_active_text (GTK_COMBO_BOX (media_select->priv->category_combo),
515                                            category_name);
516         g_free (page_size_name);
517         g_free (category_name);
518
519         gl_debug (DEBUG_MEDIA_SELECT, "END");
520 }
521
522 /*--------------------------------------------------------------------------*/
523 /* PRIVATE.  Get a description of the layout and number of labels.          */
524 /*--------------------------------------------------------------------------*/
525 static gchar *
526 get_layout_desc (const glTemplate *template)
527 {
528         const glTemplateLabelType *label_type;
529         gint                       n_labels;
530         glTemplateLayout          *layout;
531         gchar                     *string;
532
533         label_type = gl_template_get_first_label_type (template);
534
535         n_labels = gl_template_get_n_labels (label_type);
536
537         string = g_strdup_printf (_("%d per sheet"), n_labels);
538
539         return string;
540 }
541
542 /*--------------------------------------------------------------------------*/
543 /* PRIVATE.  Get label size description.                                    */ 
544 /*--------------------------------------------------------------------------*/
545 static gchar *
546 get_label_size_desc (const glTemplate *template)
547 {
548         glUnitsType                units;
549         const gchar               *units_string;
550         gdouble                    units_per_point;
551         const glTemplateLabelType *label_type;
552         gchar                     *string = NULL;
553
554         units           = gl_prefs_get_units ();
555         units_string    = gl_prefs_get_units_string ();
556         units_per_point = gl_prefs_get_units_per_point ();
557
558         label_type = gl_template_get_first_label_type (template);
559
560         switch (label_type->shape) {
561         case GL_TEMPLATE_SHAPE_RECT:
562                 if ( units == GL_UNITS_INCH ) {
563                         gchar *xstr, *ystr;
564
565                         xstr = gl_util_fraction (label_type->size.rect.w*units_per_point);
566                         ystr = gl_util_fraction (label_type->size.rect.h*units_per_point);
567                         string = g_strdup_printf (_("%s x %s %s"),
568                                                   xstr, ystr, units_string);
569                         g_free (xstr);
570                         g_free (ystr);
571                 } else {
572                         string = g_strdup_printf (_("%.5g x %.5g %s"),
573                                                   label_type->size.rect.w*units_per_point,
574                                                   label_type->size.rect.h*units_per_point,
575                                                   units_string);
576                 }
577                 break;
578         case GL_TEMPLATE_SHAPE_ROUND:
579                 if ( units == GL_UNITS_INCH ) {
580                         gchar *dstr;
581
582                         dstr = gl_util_fraction (2.0*label_type->size.round.r*units_per_point);
583                         string = g_strdup_printf (_("%s %s diameter"),
584                                                   dstr, units_string);
585                         g_free (dstr);
586                 } else {
587                         string = g_strdup_printf (_("%.5g %s diameter"),
588                                                   2.0*label_type->size.round.r*units_per_point,
589                                                   units_string);
590                 }
591                 break;
592         case GL_TEMPLATE_SHAPE_CD:
593                 if ( units == GL_UNITS_INCH ) {
594                         gchar *dstr;
595
596                         dstr = gl_util_fraction (2.0*label_type->size.cd.r1*units_per_point);
597                         string = g_strdup_printf (_("%s %s diameter"),
598                                                   dstr, units_string);
599                         g_free (dstr);
600                 } else {
601                         string = g_strdup_printf (_("%.5g %s diameter"),
602                                                   2.0*label_type->size.cd.r1*units_per_point,
603                                                   units_string);
604                 }
605                 break;
606         default:
607                 break;
608         }
609
610         return string;
611 }
612
613 /*--------------------------------------------------------------------------*/
614 /* PRIVATE.  Load list store from template name list.                       */
615 /*--------------------------------------------------------------------------*/
616 static void
617 load_list (GtkListStore           *store,
618            GtkTreeSelection       *selection,
619            GList                  *list)
620 {
621         GList       *p;
622         GtkTreeIter  iter;
623         glTemplate  *template;
624         GdkPixbuf   *pixbuf;
625         gchar       *size;
626         gchar       *layout;
627         gchar       *description;
628
629         gl_debug (DEBUG_MEDIA_SELECT, "START");
630
631         gtk_list_store_clear (store);
632
633         if (list)
634         {
635
636                 for ( p=list; p!=NULL; p=p->next )
637                 {
638
639                         gl_debug (DEBUG_MEDIA_SELECT, "p->data = \"%s\"", p->data);
640
641                         template = gl_template_from_name (p->data);
642
643                         pixbuf = gl_mini_preview_pixbuf_new (template, 64, 64);
644
645                         size = get_label_size_desc (template);
646                         layout = get_layout_desc (template);
647                         description = g_strdup_printf ("<b>%s</b>\n%s\n%s",
648                                                        p->data,
649                                                        size,
650                                                        layout);
651                         g_free (size);
652                         g_free (layout);
653
654                         gl_template_free (template);
655
656                         gtk_list_store_append (store, &iter);
657                         gtk_list_store_set (store, &iter,
658                                             NAME_COLUMN, p->data,
659                                             PREVIEW_COLUMN, pixbuf,
660                                             DESCRIPTION_COLUMN, description,
661                                             -1);
662
663                         g_object_unref (G_OBJECT (pixbuf));
664                         g_free (description);
665                 }
666
667                 gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
668                 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter);
669                 gtk_tree_selection_select_iter (selection, &iter);
670
671         }
672         else
673         {
674                 gchar *text = g_strdup_printf ("<span weight=\"bold\" size=\"larger\">%s</span>\n%s",
675                                                _("No match."),
676                                                _("Try selecting a different page size or category."));
677                 gtk_list_store_append (store, &iter);
678                 gtk_list_store_set (store, &iter,
679                                     NAME_COLUMN, "empty",
680                                     PREVIEW_COLUMN_STOCK, GTK_STOCK_DIALOG_WARNING,
681                                     PREVIEW_COLUMN_STOCK_SIZE, GTK_ICON_SIZE_DIALOG,
682                                     DESCRIPTION_COLUMN, text,
683                                     -1);
684                 g_free (text);
685
686                 gtk_tree_selection_set_mode (selection, GTK_SELECTION_NONE);
687
688         }
689
690         gl_debug (DEBUG_MEDIA_SELECT, "END");
691 }
692