]> git.sur5r.net Git - glabels/blob - glabels2/src/wdgt-media-select.c
de9c5595a2d123df4202f7e4975f1ffa93bd5da4
[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 gint wdgt_media_select_signals[LAST_SIGNAL] = { 0 };
87
88 /*===========================================*/
89 /* Local function prototypes                 */
90 /*===========================================*/
91
92 static void gl_wdgt_media_select_finalize      (GObject                *object);
93
94 static void gl_wdgt_media_select_construct     (glWdgtMediaSelect      *media_select);
95
96 static void filter_changed_cb                  (GtkComboBox            *combo,
97                                                 gpointer                user_data);
98 static void template_selection_changed_cb      (GtkTreeSelection       *selection,
99                                                 gpointer                user_data);
100
101 static gchar *get_layout_desc                  (const glTemplate       *template);
102 static gchar *get_label_size_desc              (const glTemplate       *template);
103 static void   load_list                        (GtkListStore           *store,
104                                                 GtkTreeSelection       *selection,
105                                                 GList                  *list);
106 \f
107 /****************************************************************************/
108 /* Boilerplate Object stuff.                                                */
109 /****************************************************************************/
110 G_DEFINE_TYPE (glWdgtMediaSelect, gl_wdgt_media_select, GTK_TYPE_VBOX);
111
112
113 static void
114 gl_wdgt_media_select_class_init (glWdgtMediaSelectClass *class)
115 {
116         GObjectClass *object_class = G_OBJECT_CLASS (class);
117
118         gl_debug (DEBUG_MEDIA_SELECT, "START");
119
120         gl_wdgt_media_select_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_init (glWdgtMediaSelect *media_select)
138 {
139         gl_debug (DEBUG_MEDIA_SELECT, "START");
140
141         media_select->priv = g_new0 (glWdgtMediaSelectPrivate, 1);
142
143         media_select->priv->gui = glade_xml_new (GLABELS_GLADE_DIR "wdgt-media-select.glade",
144                                            "wdgt_media_select_hbox",
145                                            NULL);
146
147         if (!media_select->priv->gui) {
148                 g_critical ("Could not open wdgt-media-select.glade. gLabels may not be installed correctly!");
149                 return;
150         }
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 = GL_WDGT_MEDIA_SELECT (object);
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         g_free (media_select->priv);
166
167         G_OBJECT_CLASS (gl_wdgt_media_select_parent_class)->finalize (object);
168
169         gl_debug (DEBUG_MEDIA_SELECT, "END");
170 }
171
172 GtkWidget *
173 gl_wdgt_media_select_new (void)
174 {
175         glWdgtMediaSelect *media_select;
176
177         gl_debug (DEBUG_MEDIA_SELECT, "START");
178
179         media_select = g_object_new (gl_wdgt_media_select_get_type (), NULL);
180
181         gl_wdgt_media_select_construct (media_select);
182
183         gl_debug (DEBUG_MEDIA_SELECT, "END");
184
185         return GTK_WIDGET (media_select);
186 }
187
188 /*--------------------------------------------------------------------------*/
189 /* PRIVATE.  Construct composite widget.                                    */
190 /*--------------------------------------------------------------------------*/
191 static void
192 gl_wdgt_media_select_construct (glWdgtMediaSelect *media_select)
193 {
194         GtkWidget         *hbox;
195         GList             *page_sizes = NULL;
196         GList             *categories = NULL;
197         GList             *template_names = NULL;
198         const gchar       *page_size_id;
199         gchar             *page_size_name;
200         GtkCellRenderer   *renderer;
201         GtkTreeViewColumn *column;
202         GtkTreeSelection  *selection;
203
204         gl_debug (DEBUG_MEDIA_SELECT, "START");
205
206         g_return_if_fail (GL_IS_WDGT_MEDIA_SELECT (media_select));
207         g_return_if_fail (media_select->priv != NULL);
208
209         hbox = glade_xml_get_widget (media_select->priv->gui,
210                                      "wdgt_media_select_hbox");
211         gtk_container_add (GTK_CONTAINER (media_select), hbox);
212
213         media_select->priv->page_size_combo =
214                 glade_xml_get_widget (media_select->priv->gui, "page_size_combo");
215         media_select->priv->category_combo =
216                 glade_xml_get_widget (media_select->priv->gui, "category_combo");
217         media_select->priv->template_treeview =
218                 glade_xml_get_widget (media_select->priv->gui, "template_treeview");
219
220         page_size_id = gl_prefs_get_page_size ();
221         page_size_name = gl_paper_lookup_name_from_id (page_size_id);
222
223         /* Page size selection control */
224         gl_util_combo_box_add_text_model (GTK_COMBO_BOX (media_select->priv->page_size_combo));
225         page_sizes = gl_paper_get_name_list ();
226         page_sizes = g_list_prepend (page_sizes, g_strdup (_("Any")));
227         gl_util_combo_box_set_strings (GTK_COMBO_BOX (media_select->priv->page_size_combo), page_sizes);
228         gl_paper_free_name_list (page_sizes);
229         gl_util_combo_box_set_active_text (GTK_COMBO_BOX (media_select->priv->page_size_combo),
230                                            page_size_name);
231
232         /* Category selection control */
233         gl_util_combo_box_add_text_model (GTK_COMBO_BOX (media_select->priv->category_combo));
234         categories = gl_category_get_name_list ();
235         categories = g_list_prepend (categories, g_strdup (_("Any")));
236         gl_util_combo_box_set_strings (GTK_COMBO_BOX (media_select->priv->category_combo), categories);
237         gl_util_combo_box_set_active_text (GTK_COMBO_BOX (media_select->priv->category_combo),
238                                            _("Any"));
239         gl_category_free_name_list (categories);
240
241         /* Actual selection control */
242         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);
243         gtk_tree_view_set_model (GTK_TREE_VIEW (media_select->priv->template_treeview),
244                                  GTK_TREE_MODEL (media_select->priv->template_store));
245         renderer = gtk_cell_renderer_pixbuf_new ();
246         column = gtk_tree_view_column_new_with_attributes ("", renderer,
247                                                            "pixbuf", PREVIEW_COLUMN,
248                                                            "stock-id", PREVIEW_COLUMN_STOCK,
249                                                            "stock-size", PREVIEW_COLUMN_STOCK_SIZE,
250                                                            NULL);
251         gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
252         gtk_tree_view_append_column (GTK_TREE_VIEW (media_select->priv->template_treeview), column);
253         renderer = gtk_cell_renderer_text_new ();
254         column = gtk_tree_view_column_new_with_attributes ("", renderer,
255                                                            "markup", DESCRIPTION_COLUMN,
256                                                            NULL);
257         gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
258         gtk_tree_view_append_column (GTK_TREE_VIEW (media_select->priv->template_treeview), column);
259         selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->template_treeview));
260         template_names = gl_template_get_name_list (page_size_id, NULL);
261         load_list (media_select->priv->template_store, selection, template_names);
262         gl_template_free_name_list (template_names);
263
264         /* Connect signals to controls */
265         g_signal_connect (G_OBJECT (media_select->priv->page_size_combo), "changed",
266                           G_CALLBACK (filter_changed_cb),
267                           media_select);
268         g_signal_connect (G_OBJECT (media_select->priv->category_combo), "changed",
269                           G_CALLBACK (filter_changed_cb),
270                           media_select);
271         g_signal_connect (G_OBJECT (selection), "changed",
272                           G_CALLBACK (template_selection_changed_cb),
273                           media_select);
274
275         g_free (page_size_name);
276
277         gl_debug (DEBUG_MEDIA_SELECT, "END");
278 }
279
280 /*--------------------------------------------------------------------------*/
281 /* PRIVATE.  modify widget due to change in selection                       */
282 /*--------------------------------------------------------------------------*/
283 static void
284 filter_changed_cb (GtkComboBox *combo,
285                    gpointer     user_data)
286 {
287         glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
288         gchar             *page_size_name, *page_size_id;
289         gchar             *category_name, *category_id;
290         GList             *template_names;
291         GtkTreeSelection  *selection;
292
293         gl_debug (DEBUG_MEDIA_SELECT, "START");
294
295
296         /* Update template selections for new page size */
297         page_size_name = gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->page_size_combo));
298         category_name = gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->category_combo));
299         if ( page_size_name && strlen(page_size_name) &&
300              category_name && strlen(category_name) )
301         {
302                 gl_debug (DEBUG_MEDIA_SELECT, "page_size_name = \"%s\"", page_size_name);
303                 gl_debug (DEBUG_MEDIA_SELECT, "category_name = \"%s\"", category_name);
304                 page_size_id = gl_paper_lookup_id_from_name (page_size_name);
305                 category_id = gl_category_lookup_id_from_name (category_name);
306                 gl_debug (DEBUG_MEDIA_SELECT, "page_size_id = \"%s\"", page_size_id);
307                 gl_debug (DEBUG_MEDIA_SELECT, "category_id = \"%s\"", category_id);
308                 template_names = gl_template_get_name_list (page_size_id, category_id);
309                 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->template_treeview));
310                 g_signal_handlers_block_by_func (G_OBJECT (selection),
311                                                  template_selection_changed_cb,
312                                                  media_select);
313                 load_list (media_select->priv->template_store, selection, template_names);
314                 g_signal_handlers_unblock_by_func (G_OBJECT (selection),
315                                                    template_selection_changed_cb,
316                                                    media_select);
317                 gl_template_free_name_list (template_names);
318                 g_free (page_size_id);
319
320                 /* Emit our "changed" signal */
321                 g_signal_emit (G_OBJECT (user_data),
322                                wdgt_media_select_signals[CHANGED], 0);
323         }
324         g_free (page_size_name);
325
326         gl_debug (DEBUG_MEDIA_SELECT, "END");
327 }
328
329 /*--------------------------------------------------------------------------*/
330 /* PRIVATE.  modify widget due to change in selection                       */
331 /*--------------------------------------------------------------------------*/
332 static void
333 template_selection_changed_cb (GtkTreeSelection       *selection,
334                                gpointer                user_data)
335 {
336         gl_debug (DEBUG_MEDIA_SELECT, "START");
337
338         /* Emit our "changed" signal */
339         g_signal_emit (G_OBJECT (user_data),
340                        wdgt_media_select_signals[CHANGED], 0);
341
342         gl_debug (DEBUG_MEDIA_SELECT, "END");
343 }
344
345 /****************************************************************************/
346 /* query selected label template name.                                      */
347 /****************************************************************************/
348 gchar *
349 gl_wdgt_media_select_get_name (glWdgtMediaSelect *media_select)
350 {
351         GtkTreeSelection  *selection;
352         GtkTreeIter        iter;
353         GtkTreeModel      *model;        
354         gchar             *name;
355
356         gl_debug (DEBUG_MEDIA_SELECT, "START");
357         selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->template_treeview));
358         if (gtk_tree_selection_get_mode (selection) == GTK_SELECTION_NONE)
359         {
360                 name = NULL;
361         }
362         else
363         {
364                 gtk_tree_selection_get_selected (selection, &model, &iter);
365                 gtk_tree_model_get (model, &iter, NAME_COLUMN, &name, -1);
366         }
367
368         gl_debug (DEBUG_MEDIA_SELECT, "END");
369         return name;
370 }
371
372 /****************************************************************************/
373 /* set selected label template name.                                        */
374 /****************************************************************************/
375 void
376 gl_wdgt_media_select_set_name (glWdgtMediaSelect *media_select,
377                                gchar             *name)
378 {
379         GtkTreeSelection  *selection;
380         GtkTreeModel      *model;
381         GtkTreeIter        iter;
382         GtkTreePath       *path;
383         gchar             *name_i;
384         gboolean           flag;
385
386         gl_debug (DEBUG_MEDIA_SELECT, "START");
387
388         selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->template_treeview));
389         g_return_if_fail (GTK_IS_TREE_SELECTION (selection));
390
391         model = GTK_TREE_MODEL (media_select->priv->template_store);
392
393         for ( flag = gtk_tree_model_get_iter_first (model, &iter);
394               flag;
395               flag = gtk_tree_model_iter_next(model, &iter) )
396         {
397                 gtk_tree_model_get (model, &iter, NAME_COLUMN, &name_i, -1); 
398                 if (strcasecmp(name, name_i) == 0)
399                 {
400                         gtk_tree_selection_select_iter (selection, &iter);
401                         path = gtk_tree_model_get_path (model, &iter);
402                         gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (media_select->priv->template_treeview),
403                                                       path,
404                                                       NULL,
405                                                       TRUE, 0.5, 0.0);
406                         gtk_tree_path_free (path);
407                         break;
408                 }
409         }
410
411         gl_debug (DEBUG_MEDIA_SELECT, "END");
412 }
413
414 /****************************************************************************/
415 /* query current filter parameters.                                         */
416 /****************************************************************************/
417 void
418 gl_wdgt_media_select_get_filter_parameters (glWdgtMediaSelect *media_select,
419                                             gchar            **page_size_id,
420                                             gchar            **category_id)
421 {
422         gchar *page_size_name, *category_name;
423
424         gl_debug (DEBUG_MEDIA_SELECT, "");
425
426         g_free (*page_size_id);
427         g_free (*category_id);
428
429         page_size_name =
430                 gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->page_size_combo));
431
432         *page_size_id = gl_paper_lookup_id_from_name (page_size_name);
433
434         category_name =
435                 gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->category_combo));
436
437         *category_id = gl_category_lookup_id_from_name (category_name);
438
439         g_free (page_size_name);
440         g_free (category_name);
441 }
442
443 /****************************************************************************/
444 /* set filter parameters.                                                   */
445 /****************************************************************************/
446 void
447 gl_wdgt_media_select_set_filter_parameters (glWdgtMediaSelect *media_select,
448                                             const gchar       *page_size_id,
449                                             const gchar       *category_id)
450 {
451         gchar *page_size_name;
452         gchar *category_name;
453
454         gl_debug (DEBUG_MEDIA_SELECT, "START");
455
456         page_size_name = gl_paper_lookup_name_from_id (page_size_id);
457         if (page_size_name == NULL)
458         {
459                 page_size_name = g_strdup (_("Any"));
460         }
461
462         gl_util_combo_box_set_active_text (GTK_COMBO_BOX (media_select->priv->page_size_combo),
463                                            page_size_name);
464
465         category_name = gl_category_lookup_name_from_id (category_id);
466         if (category_name == NULL)
467         {
468                 category_name = g_strdup (_("Any"));
469         }
470
471         gl_util_combo_box_set_active_text (GTK_COMBO_BOX (media_select->priv->category_combo),
472                                            category_name);
473         g_free (page_size_name);
474         g_free (category_name);
475
476         gl_debug (DEBUG_MEDIA_SELECT, "END");
477 }
478
479 /*--------------------------------------------------------------------------*/
480 /* PRIVATE.  Get a description of the layout and number of labels.          */
481 /*--------------------------------------------------------------------------*/
482 static gchar *
483 get_layout_desc (const glTemplate *template)
484 {
485         const glTemplateLabelType *label_type;
486         gint                       n_labels;
487         gchar                     *string;
488
489         label_type = gl_template_get_first_label_type (template);
490
491         n_labels = gl_template_get_n_labels (label_type);
492
493         string = g_strdup_printf (_("%d per sheet"), n_labels);
494
495         return string;
496 }
497
498 /*--------------------------------------------------------------------------*/
499 /* PRIVATE.  Get label size description.                                    */ 
500 /*--------------------------------------------------------------------------*/
501 static gchar *
502 get_label_size_desc (const glTemplate *template)
503 {
504         glUnitsType                units;
505         const gchar               *units_string;
506         gdouble                    units_per_point;
507         const glTemplateLabelType *label_type;
508         gchar                     *string = NULL;
509
510         units           = gl_prefs_get_units ();
511         units_string    = gl_prefs_get_units_string ();
512         units_per_point = gl_prefs_get_units_per_point ();
513
514         label_type = gl_template_get_first_label_type (template);
515
516         switch (label_type->shape) {
517         case GL_TEMPLATE_SHAPE_RECT:
518                 if ( units == GL_UNITS_INCH ) {
519                         gchar *xstr, *ystr;
520
521                         xstr = gl_util_fraction (label_type->size.rect.w*units_per_point);
522                         ystr = gl_util_fraction (label_type->size.rect.h*units_per_point);
523                         string = g_strdup_printf (_("%s x %s %s"),
524                                                   xstr, ystr, units_string);
525                         g_free (xstr);
526                         g_free (ystr);
527                 } else {
528                         string = g_strdup_printf (_("%.5g x %.5g %s"),
529                                                   label_type->size.rect.w*units_per_point,
530                                                   label_type->size.rect.h*units_per_point,
531                                                   units_string);
532                 }
533                 break;
534         case GL_TEMPLATE_SHAPE_ROUND:
535                 if ( units == GL_UNITS_INCH ) {
536                         gchar *dstr;
537
538                         dstr = gl_util_fraction (2.0*label_type->size.round.r*units_per_point);
539                         string = g_strdup_printf (_("%s %s diameter"),
540                                                   dstr, units_string);
541                         g_free (dstr);
542                 } else {
543                         string = g_strdup_printf (_("%.5g %s diameter"),
544                                                   2.0*label_type->size.round.r*units_per_point,
545                                                   units_string);
546                 }
547                 break;
548         case GL_TEMPLATE_SHAPE_CD:
549                 if ( units == GL_UNITS_INCH ) {
550                         gchar *dstr;
551
552                         dstr = gl_util_fraction (2.0*label_type->size.cd.r1*units_per_point);
553                         string = g_strdup_printf (_("%s %s diameter"),
554                                                   dstr, units_string);
555                         g_free (dstr);
556                 } else {
557                         string = g_strdup_printf (_("%.5g %s diameter"),
558                                                   2.0*label_type->size.cd.r1*units_per_point,
559                                                   units_string);
560                 }
561                 break;
562         default:
563                 break;
564         }
565
566         return string;
567 }
568
569 /*--------------------------------------------------------------------------*/
570 /* PRIVATE.  Load list store from template name list.                       */
571 /*--------------------------------------------------------------------------*/
572 static void
573 load_list (GtkListStore           *store,
574            GtkTreeSelection       *selection,
575            GList                  *list)
576 {
577         GList       *p;
578         GtkTreeIter  iter;
579         glTemplate  *template;
580         GdkPixbuf   *pixbuf;
581         gchar       *size;
582         gchar       *layout;
583         gchar       *description;
584
585         gl_debug (DEBUG_MEDIA_SELECT, "START");
586
587         gtk_list_store_clear (store);
588
589         if (list)
590         {
591
592                 for ( p=list; p!=NULL; p=p->next )
593                 {
594
595                         gl_debug (DEBUG_MEDIA_SELECT, "p->data = \"%s\"", p->data);
596
597                         template = gl_template_from_name (p->data);
598
599                         pixbuf = gl_mini_preview_pixbuf_new (template, 64, 64);
600
601                         size = get_label_size_desc (template);
602                         layout = get_layout_desc (template);
603                         description = g_strdup_printf ("<b>%s</b>\n%s\n%s",
604                                                        (gchar *)p->data,
605                                                        size,
606                                                        layout);
607                         g_free (size);
608                         g_free (layout);
609
610                         gl_template_free (template);
611
612                         gtk_list_store_append (store, &iter);
613                         gtk_list_store_set (store, &iter,
614                                             NAME_COLUMN, p->data,
615                                             PREVIEW_COLUMN, pixbuf,
616                                             DESCRIPTION_COLUMN, description,
617                                             -1);
618
619                         g_object_unref (G_OBJECT (pixbuf));
620                         g_free (description);
621                 }
622
623                 gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
624                 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter);
625                 gtk_tree_selection_select_iter (selection, &iter);
626
627         }
628         else
629         {
630                 gchar *text = g_strdup_printf ("<span weight=\"bold\" size=\"larger\">%s</span>\n%s",
631                                                _("No match."),
632                                                _("Try selecting a different page size or category."));
633                 gtk_list_store_append (store, &iter);
634                 gtk_list_store_set (store, &iter,
635                                     NAME_COLUMN, "empty",
636                                     PREVIEW_COLUMN_STOCK, GTK_STOCK_DIALOG_WARNING,
637                                     PREVIEW_COLUMN_STOCK_SIZE, GTK_ICON_SIZE_DIALOG,
638                                     DESCRIPTION_COLUMN, text,
639                                     -1);
640                 g_free (text);
641
642                 gtk_tree_selection_set_mode (selection, GTK_SELECTION_NONE);
643
644         }
645
646         gl_debug (DEBUG_MEDIA_SELECT, "END");
647 }
648