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