]> git.sur5r.net Git - glabels/blob - src/wdgt-media-select.c
Imported Upstream version 2.2.8
[glabels] / 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/gtknotebook.h>
32 #include <gtk/gtkcombobox.h>
33 #include <gtk/gtktreeview.h>
34 #include <gtk/gtktreeselection.h>
35 #include <gtk/gtkliststore.h>
36 #include <gtk/gtkcellrenderertext.h>
37 #include <gtk/gtkcellrendererpixbuf.h>
38 #include <gtk/gtkstock.h>
39 #include <string.h>
40
41 #include "mini-preview-pixbuf-cache.h"
42 #include "prefs.h"
43 #include "util.h"
44 #include "color.h"
45 #include "marshal.h"
46 #include <libglabels/db.h>
47
48 #include "debug.h"
49
50 /*===========================================*/
51 /* Private types                             */
52 /*===========================================*/
53
54 enum {
55         NAME_COLUMN,
56         PREVIEW_COLUMN,
57         PREVIEW_COLUMN_STOCK,
58         PREVIEW_COLUMN_STOCK_SIZE,
59         DESCRIPTION_COLUMN,
60         N_COLUMNS
61 };
62
63 struct _glWdgtMediaSelectPrivate {
64
65         GtkWidget    *notebook;
66         guint         current_page_num;
67
68         gint          recent_page_num;
69         GtkWidget    *recent_tab_vbox;
70         GtkWidget    *recent_treeview;
71         GtkListStore *recent_store;
72
73         gint          search_all_page_num;
74         GtkWidget    *search_all_tab_vbox;
75         GtkWidget    *brand_combo;
76         GtkWidget    *page_size_combo;
77         GtkWidget    *category_combo;
78         GtkWidget    *search_all_treeview;
79         GtkListStore *search_all_store;
80
81         /* Prevent recursion */
82         gboolean    stop_signals;
83 };
84
85 enum {
86         CHANGED,
87         LAST_SIGNAL
88 };
89
90 typedef void (*glWdgtMediaSelectSignal) (GObject * object, gpointer data);
91
92 /*===========================================*/
93 /* Private globals                           */
94 /*===========================================*/
95
96 static gint wdgt_media_select_signals[LAST_SIGNAL] = { 0 };
97
98 /*===========================================*/
99 /* Local function prototypes                 */
100 /*===========================================*/
101
102 static void gl_wdgt_media_select_finalize      (GObject                *object);
103
104 static void gl_wdgt_media_select_construct     (glWdgtMediaSelect      *media_select);
105
106 static void filter_changed_cb                  (GtkComboBox            *combo,
107                                                 gpointer                user_data);
108 static void selection_changed_cb               (GtkTreeSelection       *selection,
109                                                 gpointer                user_data);
110 static void page_changed_cb                    (GtkNotebook            *notebook,
111                                                 GtkNotebookPage        *page,
112                                                 guint                   page_num,
113                                                 gpointer                user_data);
114
115 static gchar *get_layout_desc                  (const lglTemplate      *template);
116 static gchar *get_label_size_desc              (const lglTemplate      *template);
117 static void   load_recent_list                 (GtkListStore           *store,
118                                                 GtkTreeSelection       *selection,
119                                                 GSList                 *list);
120 static void   load_search_all_list             (GtkListStore           *store,
121                                                 GtkTreeSelection       *selection,
122                                                 GList                  *list);
123 \f
124 /****************************************************************************/
125 /* Boilerplate Object stuff.                                                */
126 /****************************************************************************/
127 G_DEFINE_TYPE (glWdgtMediaSelect, gl_wdgt_media_select, GTK_TYPE_VBOX);
128
129
130 static void
131 gl_wdgt_media_select_class_init (glWdgtMediaSelectClass *class)
132 {
133         GObjectClass *object_class = G_OBJECT_CLASS (class);
134
135         gl_debug (DEBUG_MEDIA_SELECT, "START");
136
137         gl_wdgt_media_select_parent_class = g_type_class_peek_parent (class);
138
139         object_class->finalize = gl_wdgt_media_select_finalize;
140
141         wdgt_media_select_signals[CHANGED] =
142             g_signal_new ("changed",
143                           G_OBJECT_CLASS_TYPE(object_class),
144                           G_SIGNAL_RUN_LAST,
145                           G_STRUCT_OFFSET (glWdgtMediaSelectClass, changed),
146                           NULL, NULL,
147                           gl_marshal_VOID__VOID,
148                           G_TYPE_NONE, 0);
149
150         gl_debug (DEBUG_MEDIA_SELECT, "END");
151 }
152
153 static void
154 gl_wdgt_media_select_init (glWdgtMediaSelect *media_select)
155 {
156         gl_debug (DEBUG_MEDIA_SELECT, "START");
157
158         media_select->priv = g_new0 (glWdgtMediaSelectPrivate, 1);
159
160         gl_debug (DEBUG_MEDIA_SELECT, "END");
161 }
162
163 static void
164 gl_wdgt_media_select_finalize (GObject *object)
165 {
166         glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (object);
167
168         gl_debug (DEBUG_MEDIA_SELECT, "START");
169
170         g_return_if_fail (object != NULL);
171         g_return_if_fail (GL_IS_WDGT_MEDIA_SELECT (object));
172
173         g_object_unref (media_select->priv->recent_store);
174         g_object_unref (media_select->priv->search_all_store);
175         g_free (media_select->priv);
176
177         G_OBJECT_CLASS (gl_wdgt_media_select_parent_class)->finalize (object);
178
179         gl_debug (DEBUG_MEDIA_SELECT, "END");
180 }
181
182 GtkWidget *
183 gl_wdgt_media_select_new (void)
184 {
185         glWdgtMediaSelect *media_select;
186
187         gl_debug (DEBUG_MEDIA_SELECT, "START");
188
189         media_select = g_object_new (gl_wdgt_media_select_get_type (), NULL);
190
191         gl_wdgt_media_select_construct (media_select);
192
193         gl_debug (DEBUG_MEDIA_SELECT, "END");
194
195         return GTK_WIDGET (media_select);
196 }
197
198 /*--------------------------------------------------------------------------*/
199 /* PRIVATE.  Construct composite widget.                                    */
200 /*--------------------------------------------------------------------------*/
201 static void
202 gl_wdgt_media_select_construct (glWdgtMediaSelect *media_select)
203 {
204         GladeXML          *gui;
205         GtkWidget         *hbox;
206         GList             *brands = NULL;
207         GList             *page_sizes = NULL;
208         GList             *categories = NULL;
209         GList             *search_all_names = NULL;
210         const gchar       *page_size_id;
211         gchar             *page_size_name;
212         GtkCellRenderer   *renderer;
213         GtkTreeViewColumn *column;
214         GtkTreeSelection  *recent_selection;
215         GtkTreeSelection  *search_all_selection;
216
217         gl_debug (DEBUG_MEDIA_SELECT, "START");
218
219         g_return_if_fail (GL_IS_WDGT_MEDIA_SELECT (media_select));
220         g_return_if_fail (media_select->priv != NULL);
221
222         gui = glade_xml_new (GLABELS_GLADE_DIR "wdgt-media-select.glade",
223                              "wdgt_media_select_hbox", NULL);
224
225         if (!gui) {
226                 g_critical ("Could not open wdgt-media-select.glade. gLabels may not be installed correctly!");
227                 return;
228         }
229
230         hbox = glade_xml_get_widget (gui, "wdgt_media_select_hbox");
231         gtk_container_add (GTK_CONTAINER (media_select), hbox);
232
233         media_select->priv->notebook =
234                 glade_xml_get_widget (gui, "notebook");
235
236         media_select->priv->recent_tab_vbox =
237                 glade_xml_get_widget (gui, "recent_tab_vbox");
238         media_select->priv->recent_treeview =
239                 glade_xml_get_widget (gui, "recent_treeview");
240
241         media_select->priv->search_all_tab_vbox =
242                 glade_xml_get_widget (gui, "search_all_tab_vbox");
243         media_select->priv->brand_combo =
244                 glade_xml_get_widget (gui, "brand_combo");
245         media_select->priv->page_size_combo =
246                 glade_xml_get_widget (gui, "page_size_combo");
247         media_select->priv->category_combo =
248                 glade_xml_get_widget (gui, "category_combo");
249         media_select->priv->search_all_treeview =
250                 glade_xml_get_widget (gui, "search_all_treeview");
251
252         g_object_unref (gui);
253
254         media_select->priv->recent_page_num =
255                 gtk_notebook_page_num (GTK_NOTEBOOK (media_select->priv->notebook),
256                                        media_select->priv->recent_tab_vbox);
257         media_select->priv->search_all_page_num =
258                 gtk_notebook_page_num (GTK_NOTEBOOK (media_select->priv->notebook),
259                                        media_select->priv->search_all_tab_vbox);
260
261         /* Recent templates treeview */
262         media_select->priv->recent_store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING);
263         gtk_tree_view_set_model (GTK_TREE_VIEW (media_select->priv->recent_treeview),
264                                  GTK_TREE_MODEL (media_select->priv->recent_store));
265         renderer = gtk_cell_renderer_pixbuf_new ();
266         column = gtk_tree_view_column_new_with_attributes ("", renderer,
267                                                            "pixbuf", PREVIEW_COLUMN,
268                                                            "stock-id", PREVIEW_COLUMN_STOCK,
269                                                            "stock-size", PREVIEW_COLUMN_STOCK_SIZE,
270                                                            NULL);
271         gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
272         gtk_tree_view_append_column (GTK_TREE_VIEW (media_select->priv->recent_treeview), column);
273         renderer = gtk_cell_renderer_text_new ();
274         column = gtk_tree_view_column_new_with_attributes ("", renderer,
275                                                            "markup", DESCRIPTION_COLUMN,
276                                                            NULL);
277         gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
278         gtk_tree_view_append_column (GTK_TREE_VIEW (media_select->priv->recent_treeview), column);
279         recent_selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->recent_treeview));
280         load_recent_list (media_select->priv->recent_store, recent_selection, gl_prefs->recent_templates);
281
282         page_size_id = gl_prefs_get_page_size ();
283         page_size_name = lgl_db_lookup_paper_name_from_id (page_size_id);
284
285         /* Brand selection control */
286         gl_util_combo_box_add_text_model (GTK_COMBO_BOX (media_select->priv->brand_combo));
287         brands = lgl_db_get_brand_list (NULL, NULL);
288         brands = g_list_prepend (brands, g_strdup (_("Any")));
289         gl_util_combo_box_set_strings (GTK_COMBO_BOX (media_select->priv->brand_combo), brands);
290         lgl_db_free_brand_list (brands);
291         gl_util_combo_box_set_active_text (GTK_COMBO_BOX (media_select->priv->brand_combo),
292                                            _("Any"));
293
294         /* Page size selection control */
295         gl_util_combo_box_add_text_model (GTK_COMBO_BOX (media_select->priv->page_size_combo));
296         page_sizes = lgl_db_get_paper_name_list ();
297         page_sizes = g_list_prepend (page_sizes, g_strdup (_("Any")));
298         gl_util_combo_box_set_strings (GTK_COMBO_BOX (media_select->priv->page_size_combo), page_sizes);
299         lgl_db_free_paper_name_list (page_sizes);
300         gl_util_combo_box_set_active_text (GTK_COMBO_BOX (media_select->priv->page_size_combo),
301                                            page_size_name);
302
303         /* Category selection control */
304         gl_util_combo_box_add_text_model (GTK_COMBO_BOX (media_select->priv->category_combo));
305         categories = lgl_db_get_category_name_list ();
306         categories = g_list_prepend (categories, g_strdup (_("Any")));
307         gl_util_combo_box_set_strings (GTK_COMBO_BOX (media_select->priv->category_combo), categories);
308         gl_util_combo_box_set_active_text (GTK_COMBO_BOX (media_select->priv->category_combo),
309                                            _("Any"));
310         lgl_db_free_category_name_list (categories);
311
312         /* Search all treeview */
313         media_select->priv->search_all_store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING);
314         gtk_tree_view_set_model (GTK_TREE_VIEW (media_select->priv->search_all_treeview),
315                                  GTK_TREE_MODEL (media_select->priv->search_all_store));
316         renderer = gtk_cell_renderer_pixbuf_new ();
317         column = gtk_tree_view_column_new_with_attributes ("", renderer,
318                                                            "pixbuf", PREVIEW_COLUMN,
319                                                            "stock-id", PREVIEW_COLUMN_STOCK,
320                                                            "stock-size", PREVIEW_COLUMN_STOCK_SIZE,
321                                                            NULL);
322         gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
323         gtk_tree_view_append_column (GTK_TREE_VIEW (media_select->priv->search_all_treeview), column);
324         renderer = gtk_cell_renderer_text_new ();
325         column = gtk_tree_view_column_new_with_attributes ("", renderer,
326                                                            "markup", DESCRIPTION_COLUMN,
327                                                            NULL);
328         gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
329         gtk_tree_view_append_column (GTK_TREE_VIEW (media_select->priv->search_all_treeview), column);
330         search_all_selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->search_all_treeview));
331         search_all_names = lgl_db_get_template_name_list_all (NULL, page_size_id, NULL);
332         load_search_all_list (media_select->priv->search_all_store, search_all_selection, search_all_names);
333         lgl_db_free_template_name_list (search_all_names);
334
335         /* Connect signals to controls */
336         g_signal_connect (G_OBJECT (media_select->priv->brand_combo), "changed",
337                           G_CALLBACK (filter_changed_cb),
338                           media_select);
339         g_signal_connect (G_OBJECT (media_select->priv->page_size_combo), "changed",
340                           G_CALLBACK (filter_changed_cb),
341                           media_select);
342         g_signal_connect (G_OBJECT (media_select->priv->category_combo), "changed",
343                           G_CALLBACK (filter_changed_cb),
344                           media_select);
345         g_signal_connect (G_OBJECT (recent_selection), "changed",
346                           G_CALLBACK (selection_changed_cb),
347                           media_select);
348         g_signal_connect (G_OBJECT (search_all_selection), "changed",
349                           G_CALLBACK (selection_changed_cb),
350                           media_select);
351         g_signal_connect (G_OBJECT (media_select->priv->notebook), "switch-page",
352                           G_CALLBACK (page_changed_cb),
353                           media_select);
354
355         g_free (page_size_name);
356
357         gtk_widget_show_all (GTK_WIDGET (media_select));
358         if ( gl_prefs->recent_templates )
359         {
360                 gtk_notebook_set_current_page (GTK_NOTEBOOK (media_select->priv->notebook),
361                                                media_select->priv->recent_page_num);
362         }
363         else
364         {
365                 gtk_notebook_set_current_page (GTK_NOTEBOOK (media_select->priv->notebook),
366                                                media_select->priv->search_all_page_num);
367         }
368
369         gl_debug (DEBUG_MEDIA_SELECT, "END");
370 }
371
372 /*--------------------------------------------------------------------------*/
373 /* PRIVATE.  modify widget due to change in selection                       */
374 /*--------------------------------------------------------------------------*/
375 static void
376 filter_changed_cb (GtkComboBox *combo,
377                    gpointer     user_data)
378 {
379         glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
380         gchar             *brand;
381         gchar             *page_size_name, *page_size_id;
382         gchar             *category_name, *category_id;
383         GList             *search_all_names;
384         GtkTreeSelection  *selection;
385
386         gl_debug (DEBUG_MEDIA_SELECT, "START");
387
388
389         media_select->priv->stop_signals = TRUE;
390
391         /* Update template selections for new filter settings */
392         brand = gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->brand_combo));
393         page_size_name = gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->page_size_combo));
394         category_name = gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->category_combo));
395         if ( brand && strlen(brand) &&
396              page_size_name && strlen(page_size_name) &&
397              category_name && strlen(category_name) )
398         {
399                 gl_debug (DEBUG_MEDIA_SELECT, "brand = \"%s\"", brand);
400                 gl_debug (DEBUG_MEDIA_SELECT, "page_size_name = \"%s\"", page_size_name);
401                 gl_debug (DEBUG_MEDIA_SELECT, "category_name = \"%s\"", category_name);
402                 if (!g_utf8_collate (brand, _("Any")))
403                 {
404                         g_free (brand);
405                         brand = NULL;
406                 }
407                 page_size_id = lgl_db_lookup_paper_id_from_name (page_size_name);
408                 category_id = lgl_db_lookup_category_id_from_name (category_name);
409                 gl_debug (DEBUG_MEDIA_SELECT, "page_size_id = \"%s\"", page_size_id);
410                 gl_debug (DEBUG_MEDIA_SELECT, "category_id = \"%s\"", category_id);
411                 search_all_names = lgl_db_get_template_name_list_all (brand, page_size_id, category_id);
412                 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->search_all_treeview));
413                 load_search_all_list (media_select->priv->search_all_store, selection, search_all_names);
414                 lgl_db_free_template_name_list (search_all_names);
415                 g_free (page_size_id);
416                 g_free (category_id);
417
418                 /* Emit our "changed" signal */
419                 g_signal_emit (G_OBJECT (user_data),
420                                wdgt_media_select_signals[CHANGED], 0);
421         }
422         g_free (brand);
423         g_free (page_size_name);
424         g_free (category_name);
425
426
427         media_select->priv->stop_signals = FALSE;
428
429         gl_debug (DEBUG_MEDIA_SELECT, "END");
430 }
431
432 /*--------------------------------------------------------------------------*/
433 /* PRIVATE.  modify widget due to change in selection                       */
434 /*--------------------------------------------------------------------------*/
435 static void
436 selection_changed_cb (GtkTreeSelection       *selection,
437                       gpointer                user_data)
438 {
439         glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
440
441         if (media_select->priv->stop_signals) return;
442
443         gl_debug (DEBUG_MEDIA_SELECT, "START");
444
445         /* Emit our "changed" signal */
446         g_signal_emit (G_OBJECT (user_data),
447                        wdgt_media_select_signals[CHANGED], 0);
448
449         gl_debug (DEBUG_MEDIA_SELECT, "END");
450 }
451
452 /*--------------------------------------------------------------------------*/
453 /* PRIVATE.  modify widget due to change in selection                       */
454 /*--------------------------------------------------------------------------*/
455 static void
456 page_changed_cb (GtkNotebook            *notebook,
457                  GtkNotebookPage        *page,
458                  guint                   page_num,
459                  gpointer                user_data)
460 {
461         glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
462
463         if (media_select->priv->stop_signals) return;
464
465         gl_debug (DEBUG_MEDIA_SELECT, "START");
466
467         /*
468          * Store new current page, because this signal is emitted before the actual page change.
469          */
470         media_select->priv->current_page_num = page_num;
471
472         /* Emit our "changed" signal */
473         g_signal_emit (G_OBJECT (user_data),
474                        wdgt_media_select_signals[CHANGED], 0);
475
476         gl_debug (DEBUG_MEDIA_SELECT, "END");
477 }
478
479 /****************************************************************************/
480 /* query selected label template name.                                      */
481 /****************************************************************************/
482 gchar *
483 gl_wdgt_media_select_get_name (glWdgtMediaSelect *media_select)
484 {
485         gint               page_num;
486         GtkTreeSelection  *selection;
487         GtkTreeIter        iter;
488         GtkTreeModel      *model;        
489         gchar             *name;
490
491         gl_debug (DEBUG_MEDIA_SELECT, "START");
492
493         page_num = media_select->priv->current_page_num;
494         if (page_num == media_select->priv->recent_page_num)
495         {
496                 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->recent_treeview));
497         }
498         else if (page_num == media_select->priv->search_all_page_num)
499         {
500                 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->search_all_treeview));
501         }
502         else
503         {
504                 g_print ("notebook page = %d\n", page_num);
505                 g_assert_not_reached ();
506         }
507
508         if (gtk_tree_selection_get_mode (selection) == GTK_SELECTION_NONE)
509         {
510                 name = NULL;
511         }
512         else
513         {
514                 gtk_tree_selection_get_selected (selection, &model, &iter);
515                 gtk_tree_model_get (model, &iter, NAME_COLUMN, &name, -1);
516         }
517
518         gl_debug (DEBUG_MEDIA_SELECT, "END");
519         return name;
520 }
521
522 /****************************************************************************/
523 /* set selected label template name.                                        */
524 /****************************************************************************/
525 void
526 gl_wdgt_media_select_set_name (glWdgtMediaSelect *media_select,
527                                gchar             *name)
528 {
529         GtkTreeSelection  *selection;
530         GtkTreeModel      *model;
531         GtkTreeIter        iter;
532         GtkTreePath       *path;
533         gchar             *name_i;
534         gboolean           flag;
535
536         gl_debug (DEBUG_MEDIA_SELECT, "START");
537
538         selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (media_select->priv->search_all_treeview));
539         g_return_if_fail (GTK_IS_TREE_SELECTION (selection));
540
541         model = GTK_TREE_MODEL (media_select->priv->search_all_store);
542
543         for ( flag = gtk_tree_model_get_iter_first (model, &iter);
544               flag;
545               flag = gtk_tree_model_iter_next(model, &iter) )
546         {
547                 gtk_tree_model_get (model, &iter, NAME_COLUMN, &name_i, -1); 
548                 if (strcasecmp(name, name_i) == 0)
549                 {
550                         gtk_tree_selection_select_iter (selection, &iter);
551                         path = gtk_tree_model_get_path (model, &iter);
552                         gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (media_select->priv->search_all_treeview),
553                                                       path,
554                                                       NULL,
555                                                       TRUE, 0.5, 0.0);
556                         gtk_tree_path_free (path);
557                         break;
558                 }
559         }
560
561         gl_debug (DEBUG_MEDIA_SELECT, "END");
562 }
563
564 /****************************************************************************/
565 /* query current filter parameters.                                         */
566 /****************************************************************************/
567 void
568 gl_wdgt_media_select_get_filter_parameters (glWdgtMediaSelect *media_select,
569                                             gchar            **page_size_id,
570                                             gchar            **category_id)
571 {
572         gchar *page_size_name, *category_name;
573
574         gl_debug (DEBUG_MEDIA_SELECT, "");
575
576         g_free (*page_size_id);
577         g_free (*category_id);
578
579         page_size_name =
580                 gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->page_size_combo));
581
582         *page_size_id = lgl_db_lookup_paper_id_from_name (page_size_name);
583
584         category_name =
585                 gtk_combo_box_get_active_text (GTK_COMBO_BOX (media_select->priv->category_combo));
586
587         *category_id = lgl_db_lookup_category_id_from_name (category_name);
588
589         g_free (page_size_name);
590         g_free (category_name);
591 }
592
593 /****************************************************************************/
594 /* set filter parameters.                                                   */
595 /****************************************************************************/
596 void
597 gl_wdgt_media_select_set_filter_parameters (glWdgtMediaSelect *media_select,
598                                             const gchar       *page_size_id,
599                                             const gchar       *category_id)
600 {
601         gchar *page_size_name;
602         gchar *category_name;
603
604         gl_debug (DEBUG_MEDIA_SELECT, "START");
605
606         page_size_name = lgl_db_lookup_paper_name_from_id (page_size_id);
607         if (page_size_name == NULL)
608         {
609                 page_size_name = g_strdup (_("Any"));
610         }
611
612         gl_util_combo_box_set_active_text (GTK_COMBO_BOX (media_select->priv->page_size_combo),
613                                            page_size_name);
614
615         category_name = lgl_db_lookup_category_name_from_id (category_id);
616         if (category_name == NULL)
617         {
618                 category_name = g_strdup (_("Any"));
619         }
620
621         gl_util_combo_box_set_active_text (GTK_COMBO_BOX (media_select->priv->category_combo),
622                                            category_name);
623         g_free (page_size_name);
624         g_free (category_name);
625
626         gl_debug (DEBUG_MEDIA_SELECT, "END");
627 }
628
629 /*--------------------------------------------------------------------------*/
630 /* PRIVATE.  Get a description of the layout and number of labels.          */
631 /*--------------------------------------------------------------------------*/
632 static gchar *
633 get_layout_desc (const lglTemplate *template)
634 {
635         const lglTemplateFrame *frame;
636         gint                    n_labels;
637         gchar                  *string;
638
639         frame = (lglTemplateFrame *)template->frames->data;
640
641         n_labels = lgl_template_frame_get_n_labels (frame);
642
643         string = g_strdup_printf (_("%d per sheet"), n_labels);
644
645         return string;
646 }
647
648 /*--------------------------------------------------------------------------*/
649 /* PRIVATE.  Get label size description.                                    */ 
650 /*--------------------------------------------------------------------------*/
651 static gchar *
652 get_label_size_desc (const lglTemplate *template)
653 {
654         lglUnitsType               units;
655         const gchar               *units_string;
656         gdouble                    units_per_point;
657         const lglTemplateFrame    *frame;
658         gchar                     *string = NULL;
659
660         units           = gl_prefs_get_units ();
661         units_string    = gl_prefs_get_units_string ();
662         units_per_point = gl_prefs_get_units_per_point ();
663
664         frame = (lglTemplateFrame *)template->frames->data;
665
666         switch (frame->shape) {
667         case LGL_TEMPLATE_FRAME_SHAPE_RECT:
668                 if ( units == LGL_UNITS_INCH ) {
669                         gchar *xstr, *ystr;
670
671                         xstr = gl_util_fraction (frame->rect.w*units_per_point);
672                         ystr = gl_util_fraction (frame->rect.h*units_per_point);
673                         string = g_strdup_printf (_("%s x %s %s"),
674                                                   xstr, ystr, units_string);
675                         g_free (xstr);
676                         g_free (ystr);
677                 } else {
678                         string = g_strdup_printf (_("%.5g x %.5g %s"),
679                                                   frame->rect.w*units_per_point,
680                                                   frame->rect.h*units_per_point,
681                                                   units_string);
682                 }
683                 break;
684         case LGL_TEMPLATE_FRAME_SHAPE_ROUND:
685                 if ( units == LGL_UNITS_INCH ) {
686                         gchar *dstr;
687
688                         dstr = gl_util_fraction (2.0*frame->round.r*units_per_point);
689                         string = g_strdup_printf (_("%s %s diameter"),
690                                                   dstr, units_string);
691                         g_free (dstr);
692                 } else {
693                         string = g_strdup_printf (_("%.5g %s diameter"),
694                                                   2.0*frame->round.r*units_per_point,
695                                                   units_string);
696                 }
697                 break;
698         case LGL_TEMPLATE_FRAME_SHAPE_CD:
699                 if ( units == LGL_UNITS_INCH ) {
700                         gchar *dstr;
701
702                         dstr = gl_util_fraction (2.0*frame->cd.r1*units_per_point);
703                         string = g_strdup_printf (_("%s %s diameter"),
704                                                   dstr, units_string);
705                         g_free (dstr);
706                 } else {
707                         string = g_strdup_printf (_("%.5g %s diameter"),
708                                                   2.0*frame->cd.r1*units_per_point,
709                                                   units_string);
710                 }
711                 break;
712         default:
713                 break;
714         }
715
716         return string;
717 }
718
719 /*--------------------------------------------------------------------------*/
720 /* PRIVATE.  Load list store from template name list.                       */
721 /*--------------------------------------------------------------------------*/
722 static void
723 load_recent_list (GtkListStore           *store,
724                   GtkTreeSelection       *selection,
725                   GSList                  *list)
726 {
727         GSList      *p;
728         GtkTreeIter  iter;
729         lglTemplate *template;
730         GdkPixbuf   *pixbuf;
731         gchar       *size;
732         gchar       *layout;
733         gchar       *description;
734
735         gl_debug (DEBUG_MEDIA_SELECT, "START");
736
737         gtk_list_store_clear (store);
738
739         if (list)
740         {
741
742                 for ( p=list; p!=NULL; p=p->next )
743                 {
744
745                         gl_debug (DEBUG_MEDIA_SELECT, "p->data = \"%s\"", p->data);
746
747                         template = lgl_db_lookup_template_from_name (p->data);
748                         pixbuf = gl_mini_preview_pixbuf_cache_get_pixbuf (p->data);
749
750                         size = get_label_size_desc (template);
751                         layout = get_layout_desc (template);
752                         description = g_strdup_printf ("<b>%s: %s</b>\n%s\n%s",
753                                                        (gchar *)p->data,
754                                                        template->description,
755                                                        size,
756                                                        layout);
757                         g_free (size);
758                         g_free (layout);
759
760                         lgl_template_free (template);
761
762                         gtk_list_store_append (store, &iter);
763                         gtk_list_store_set (store, &iter,
764                                             NAME_COLUMN, p->data,
765                                             PREVIEW_COLUMN, pixbuf,
766                                             DESCRIPTION_COLUMN, description,
767                                             -1);
768
769                         g_object_unref (G_OBJECT (pixbuf));
770                         g_free (description);
771                 }
772
773                 gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
774                 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter);
775                 gtk_tree_selection_select_iter (selection, &iter);
776
777         }
778         else
779         {
780                 gchar *text = g_strdup_printf ("<span weight=\"bold\" size=\"larger\">%s</span>\n%s",
781                                                _("No recent templates found."),
782                                                _("Try selecting a template from the \"Search all templates\" page."));
783                 gtk_list_store_append (store, &iter);
784                 gtk_list_store_set (store, &iter,
785                                     NAME_COLUMN, "empty",
786                                     PREVIEW_COLUMN_STOCK, GTK_STOCK_DIALOG_WARNING,
787                                     PREVIEW_COLUMN_STOCK_SIZE, GTK_ICON_SIZE_DIALOG,
788                                     DESCRIPTION_COLUMN, text,
789                                     -1);
790                 g_free (text);
791
792                 gtk_tree_selection_set_mode (selection, GTK_SELECTION_NONE);
793
794         }
795
796         gl_debug (DEBUG_MEDIA_SELECT, "END");
797 }
798
799 /*--------------------------------------------------------------------------*/
800 /* PRIVATE.  Load list store from template name list.                       */
801 /*--------------------------------------------------------------------------*/
802 static void
803 load_search_all_list (GtkListStore           *store,
804                       GtkTreeSelection       *selection,
805                       GList                  *list)
806 {
807         GList       *p;
808         GtkTreeIter  iter;
809         lglTemplate *template;
810         GdkPixbuf   *pixbuf;
811         gchar       *size;
812         gchar       *layout;
813         gchar       *description;
814
815         gl_debug (DEBUG_MEDIA_SELECT, "START");
816
817         gtk_list_store_clear (store);
818
819         if (list)
820         {
821
822                 for ( p=list; p!=NULL; p=p->next )
823                 {
824
825                         gl_debug (DEBUG_MEDIA_SELECT, "p->data = \"%s\"", p->data);
826
827                         template = lgl_db_lookup_template_from_name (p->data);
828                         pixbuf = gl_mini_preview_pixbuf_cache_get_pixbuf (p->data);
829
830                         size = get_label_size_desc (template);
831                         layout = get_layout_desc (template);
832                         description = g_strdup_printf ("<b>%s: %s</b>\n%s\n%s",
833                                                        (gchar *)p->data,
834                                                        template->description,
835                                                        size,
836                                                        layout);
837                         g_free (size);
838                         g_free (layout);
839
840                         lgl_template_free (template);
841
842                         gtk_list_store_append (store, &iter);
843                         gtk_list_store_set (store, &iter,
844                                             NAME_COLUMN, p->data,
845                                             PREVIEW_COLUMN, pixbuf,
846                                             DESCRIPTION_COLUMN, description,
847                                             -1);
848
849                         g_object_unref (G_OBJECT (pixbuf));
850                         g_free (description);
851                 }
852
853                 gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
854                 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter);
855                 gtk_tree_selection_select_iter (selection, &iter);
856
857         }
858         else
859         {
860                 gchar *text = g_strdup_printf ("<span weight=\"bold\" size=\"larger\">%s</span>\n%s",
861                                                _("No match."),
862                                                _("Try selecting a different brand, page size or category."));
863                 gtk_list_store_append (store, &iter);
864                 gtk_list_store_set (store, &iter,
865                                     NAME_COLUMN, "empty",
866                                     PREVIEW_COLUMN_STOCK, GTK_STOCK_DIALOG_WARNING,
867                                     PREVIEW_COLUMN_STOCK_SIZE, GTK_ICON_SIZE_DIALOG,
868                                     DESCRIPTION_COLUMN, text,
869                                     -1);
870                 g_free (text);
871
872                 gtk_tree_selection_set_mode (selection, GTK_SELECTION_NONE);
873
874         }
875
876         gl_debug (DEBUG_MEDIA_SELECT, "END");
877 }
878