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