]> git.sur5r.net Git - glabels/blob - glabels2/src/wdgt-media-select.c
Always set default entry when loading new strings in the template_combo.
[glabels] / glabels2 / src / wdgt-media-select.c
1 /*
2  *  (GLABELS) Label and Business Card Creation program for GNOME
3  *
4  *  wdgt_media_select.c:  media selection widget module
5  *
6  *  Copyright (C) 2001-2002  Jim Evins <evins@snaught.com>.
7  *
8  *  This program is free software; you can redistribute it and/or modify
9  *  it under the terms of the GNU General Public License as published by
10  *  the Free Software Foundation; either version 2 of the License, or
11  *  (at your option) any later version.
12  *
13  *  This program is distributed in the hope that it will be useful,
14  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *  GNU General Public License for more details.
17  *
18  *  You should have received a copy of the GNU General Public License
19  *  along with this program; if not, write to the Free Software
20  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
21  */
22
23 #include <config.h>
24
25 #include "wdgt-media-select.h"
26 #include "hig.h"
27 #include "template.h"
28 #include "wdgt-mini-preview.h"
29 #include "prefs.h"
30 #include "util.h"
31 #include "marshal.h"
32
33 #include "debug.h"
34
35 #define WDGT_MINI_PREVIEW_WIDTH  160
36 #define WDGT_MINI_PREVIEW_HEIGHT 200
37
38 /*===========================================*/
39 /* Private types                             */
40 /*===========================================*/
41
42 enum {
43         CHANGED,
44         LAST_SIGNAL
45 };
46
47 typedef void (*glWdgtMediaSelectSignal) (GObject * object, gpointer data);
48
49 /*===========================================*/
50 /* Private globals                           */
51 /*===========================================*/
52
53 static GObjectClass *parent_class;
54
55 static gint wdgt_media_select_signals[LAST_SIGNAL] = { 0 };
56
57 /*===========================================*/
58 /* Local function prototypes                 */
59 /*===========================================*/
60
61 static void gl_wdgt_media_select_class_init    (glWdgtMediaSelectClass * class);
62 static void gl_wdgt_media_select_instance_init (glWdgtMediaSelect * media_select);
63 static void gl_wdgt_media_select_finalize      (GObject * object);
64
65 static void gl_wdgt_media_select_construct     (glWdgtMediaSelect * media_select);
66
67 static void page_size_entry_changed_cb         (GtkEntry * entry,
68                                                 gpointer user_data);
69 static void template_entry_changed_cb          (GtkEntry * entry,
70                                                 gpointer user_data);
71
72 static void details_update                     (glWdgtMediaSelect * media_select,
73                                                 gchar * name);
74 \f
75 /****************************************************************************/
76 /* Boilerplate Object stuff.                                                */
77 /****************************************************************************/
78 guint
79 gl_wdgt_media_select_get_type (void)
80 {
81         static guint wdgt_media_select_type = 0;
82
83         if (!wdgt_media_select_type) {
84                 GTypeInfo wdgt_media_select_info = {
85                         sizeof (glWdgtMediaSelectClass),
86                         NULL,
87                         NULL,
88                         (GClassInitFunc) gl_wdgt_media_select_class_init,
89                         NULL,
90                         NULL,
91                         sizeof (glWdgtMediaSelect),
92                         0,
93                         (GInstanceInitFunc) gl_wdgt_media_select_instance_init,
94                 };
95
96                 wdgt_media_select_type =
97                         g_type_register_static (gl_hig_vbox_get_type (),
98                                                 "glWdgtMediaSelect",
99                                                 &wdgt_media_select_info, 0);
100         }
101
102         return wdgt_media_select_type;
103 }
104
105 static void
106 gl_wdgt_media_select_class_init (glWdgtMediaSelectClass * class)
107 {
108         GObjectClass *object_class;
109
110         gl_debug (DEBUG_MEDIA_SELECT, "START");
111
112         object_class = (GObjectClass *) class;
113
114         parent_class = g_type_class_peek_parent (class);
115
116         object_class->finalize = gl_wdgt_media_select_finalize;
117
118         wdgt_media_select_signals[CHANGED] =
119             g_signal_new ("changed",
120                           G_OBJECT_CLASS_TYPE(object_class),
121                           G_SIGNAL_RUN_LAST,
122                           G_STRUCT_OFFSET (glWdgtMediaSelectClass, changed),
123                           NULL, NULL,
124                           gl_marshal_VOID__VOID,
125                           G_TYPE_NONE, 0);
126
127         gl_debug (DEBUG_MEDIA_SELECT, "END");
128 }
129
130 static void
131 gl_wdgt_media_select_instance_init (glWdgtMediaSelect * media_select)
132 {
133         gl_debug (DEBUG_MEDIA_SELECT, "START");
134
135         media_select->page_size_entry = NULL;
136         media_select->template_entry = NULL;
137
138         media_select->mini_preview = NULL;
139
140         media_select->desc_label = NULL;
141         media_select->sheet_size_label = NULL;
142         media_select->number_label = NULL;
143         media_select->label_size_label = NULL;
144
145         gl_debug (DEBUG_MEDIA_SELECT, "END");
146 }
147
148 static void
149 gl_wdgt_media_select_finalize (GObject * object)
150 {
151         glWdgtMediaSelect *media_select;
152         glWdgtMediaSelectClass *class;
153
154         gl_debug (DEBUG_MEDIA_SELECT, "START");
155
156         g_return_if_fail (object != NULL);
157         g_return_if_fail (GL_IS_WDGT_MEDIA_SELECT (object));
158
159         media_select = GL_WDGT_MEDIA_SELECT (object);
160
161         G_OBJECT_CLASS (parent_class)->finalize (object);
162
163         gl_debug (DEBUG_MEDIA_SELECT, "END");
164 }
165
166 GtkWidget *
167 gl_wdgt_media_select_new (void)
168 {
169         glWdgtMediaSelect *media_select;
170
171         gl_debug (DEBUG_MEDIA_SELECT, "START");
172
173         media_select = g_object_new (gl_wdgt_media_select_get_type (), NULL);
174
175         gl_wdgt_media_select_construct (media_select);
176
177         gl_debug (DEBUG_MEDIA_SELECT, "END");
178
179         return GTK_WIDGET (media_select);
180 }
181
182 /*--------------------------------------------------------------------------*/
183 /* PRIVATE.  Construct composite widget.                                    */
184 /*--------------------------------------------------------------------------*/
185 static void
186 gl_wdgt_media_select_construct (glWdgtMediaSelect * media_select)
187 {
188         GtkWidget *whbox, *wvbox, *wcombo, *wvbox1, *whbox1, *wlabel;
189         GtkSizeGroup *label_size_group;
190         gchar *name;
191         GList *template_names, *page_sizes = NULL;
192         const gchar *page_size;
193
194         gl_debug (DEBUG_MEDIA_SELECT, "START");
195
196         page_size = gl_prefs_get_page_size ();
197
198         wvbox = GTK_WIDGET (media_select);
199
200         whbox = gl_hig_hbox_new ();
201         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), whbox);
202
203         /* Page size selection control */
204         gl_debug (DEBUG_MEDIA_SELECT, "Creating page size combo...");
205         wcombo = gtk_combo_new ();
206         page_sizes = gl_template_get_page_size_list ();
207         gtk_combo_set_popdown_strings (GTK_COMBO (wcombo), page_sizes);
208         gl_template_free_page_size_list (&page_sizes);
209         media_select->page_size_entry = GTK_COMBO (wcombo)->entry;
210         gtk_entry_set_editable (GTK_ENTRY (media_select->page_size_entry),
211                                 FALSE);
212         gtk_combo_set_value_in_list (GTK_COMBO(wcombo), TRUE, FALSE);
213         gtk_widget_set_size_request (media_select->page_size_entry, 100, -1);
214         gtk_entry_set_text (GTK_ENTRY (media_select->page_size_entry),
215                             page_size);
216         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox), wcombo);
217
218         /* Actual selection control */
219         gl_debug (DEBUG_MEDIA_SELECT, "Creating template combo...");
220         gl_debug (DEBUG_MEDIA_SELECT, "page_size = %s", page_size);
221         template_names = gl_template_get_name_list (page_size);
222         media_select->template_combo = gtk_combo_new ();
223         gtk_combo_set_popdown_strings (GTK_COMBO (media_select->template_combo),
224                                        template_names);
225         media_select->template_entry =
226             GTK_COMBO (media_select->template_combo)->entry;
227         gtk_entry_set_editable (GTK_ENTRY (media_select->template_entry),
228                                 FALSE);
229         gtk_combo_set_value_in_list (GTK_COMBO(media_select->template_combo),
230                                      TRUE, FALSE);
231         gtk_widget_set_size_request (media_select->template_entry, 400, -1);
232         gtk_entry_set_text (GTK_ENTRY (media_select->template_entry),
233                             template_names->data);
234         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox),
235                                 media_select->template_combo);
236         gl_template_free_name_list (&template_names);
237
238         whbox = gl_hig_hbox_new ();
239         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox), whbox);
240
241         /* mini_preview canvas */
242         gl_debug (DEBUG_MEDIA_SELECT, "Creating mini preview...");
243         media_select->mini_preview = gl_wdgt_mini_preview_new ( WDGT_MINI_PREVIEW_HEIGHT,
244                                                            WDGT_MINI_PREVIEW_WIDTH);
245         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox),
246                                 media_select->mini_preview);
247
248         /* ---- Information area ---- */
249         wvbox1 = gl_hig_vbox_new (GL_HIG_VBOX_INNER);
250         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox), wvbox1);
251         label_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
252
253         /* blank line */
254         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox1), gtk_label_new (""));
255
256         /* Description line */
257         whbox1 = gl_hig_hbox_new ();
258         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox1), whbox1);
259         wlabel = gtk_label_new (_("Description:"));
260         gtk_size_group_add_widget (label_size_group, wlabel);
261         gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.0);
262         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1), wlabel);
263         media_select->desc_label = gtk_label_new ("");
264         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1), media_select->desc_label);
265
266         /* Page size line */
267         whbox1 = gl_hig_hbox_new ();
268         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox1), whbox1);
269         wlabel = gtk_label_new (_("Page size:"));
270         gtk_size_group_add_widget (label_size_group, wlabel);
271         gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.0);
272         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1), wlabel);
273         media_select->sheet_size_label = gtk_label_new ("");
274         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1),
275                                 media_select->sheet_size_label);
276
277         /* Label size line */
278         whbox1 = gl_hig_hbox_new ();
279         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox1), whbox1);
280         wlabel = gtk_label_new (_("Label size:"));
281         gtk_size_group_add_widget (label_size_group, wlabel);
282         gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.0);
283         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1), wlabel);
284         media_select->label_size_label = gtk_label_new ("");
285         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1),
286                                 media_select->label_size_label);
287
288         /* Layout line */
289         whbox1 = gl_hig_hbox_new ();
290         gl_hig_vbox_add_widget (GL_HIG_VBOX(wvbox1), whbox1);
291         wlabel = gtk_label_new (_("Layout:"));
292         gtk_size_group_add_widget (label_size_group, wlabel);
293         gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.0);
294         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1), wlabel);
295         media_select->number_label = gtk_label_new ("");
296         gl_hig_hbox_add_widget (GL_HIG_HBOX(whbox1),
297                                 media_select->number_label);
298
299         /* Update mini_preview and details from default template */
300         
301         gl_debug (DEBUG_MEDIA_SELECT, "template_entry = %p",
302                   media_select->template_entry);
303         name =
304             gtk_editable_get_chars (GTK_EDITABLE (media_select->template_entry),
305                                     0, -1);
306         gl_debug (DEBUG_MEDIA_SELECT, "name = \"%s\"", name);
307         gl_wdgt_mini_preview_set_label (GL_WDGT_MINI_PREVIEW (media_select->mini_preview),
308                                    name);
309         details_update (media_select, name);
310         g_free (name);
311
312         /* Connect signals to controls */
313         g_signal_connect (G_OBJECT (media_select->page_size_entry), "changed",
314                           G_CALLBACK (page_size_entry_changed_cb),
315                           media_select);
316         g_signal_connect (G_OBJECT (media_select->template_entry), "changed",
317                           G_CALLBACK (template_entry_changed_cb),
318                           media_select);
319
320         gl_debug (DEBUG_MEDIA_SELECT, "END");
321 }
322
323 /*--------------------------------------------------------------------------*/
324 /* PRIVATE.  modify widget due to change in selection                       */
325 /*--------------------------------------------------------------------------*/
326 static void
327 page_size_entry_changed_cb (GtkEntry * entry,
328                             gpointer user_data)
329 {
330         glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
331         gchar *page_size;
332         GList *template_names;
333
334         gl_debug (DEBUG_MEDIA_SELECT, "START");
335
336
337         /* Update template selections for new page size */
338         page_size = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
339         if ( strlen(page_size) ) {
340                 gl_debug (DEBUG_MEDIA_SELECT, "page_size = \"%s\"", page_size);
341                 template_names = gl_template_get_name_list (page_size);
342                 gtk_combo_set_popdown_strings (GTK_COMBO (media_select->template_combo),
343                                                template_names);
344                 gtk_entry_set_text (GTK_ENTRY (media_select->template_entry),
345                                     template_names->data);
346                 gl_template_free_name_list (&template_names);
347         }
348         g_free (page_size);
349
350         gl_debug (DEBUG_MEDIA_SELECT, "END");
351 }
352
353 /*--------------------------------------------------------------------------*/
354 /* PRIVATE.  modify widget due to change in selection                       */
355 /*--------------------------------------------------------------------------*/
356 static void
357 template_entry_changed_cb (GtkEntry * entry,
358                            gpointer user_data)
359 {
360         glWdgtMediaSelect *media_select = GL_WDGT_MEDIA_SELECT (user_data);
361         gchar *name;
362
363         gl_debug (DEBUG_MEDIA_SELECT, "START");
364
365         /* Update mini_preview canvas & details with template */
366         gl_debug (DEBUG_MEDIA_SELECT, "template_entry = %p", entry);
367         name = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
368         if ( strlen(name) ) {
369                 gl_debug (DEBUG_MEDIA_SELECT, "name = \"%s\"", name);
370                 gl_wdgt_mini_preview_set_label (GL_WDGT_MINI_PREVIEW (media_select->mini_preview),
371                                            name);
372                 gl_debug (DEBUG_MEDIA_SELECT, "m1");
373                 details_update (media_select, name);
374                 gl_debug (DEBUG_MEDIA_SELECT, "m2");
375
376                 /* Emit our "changed" signal */
377                 g_signal_emit (G_OBJECT (user_data),
378                                wdgt_media_select_signals[CHANGED], 0);
379         }
380         g_free (name);
381
382         gl_debug (DEBUG_MEDIA_SELECT, "END");
383 }
384
385 /*--------------------------------------------------------------------------*/
386 /* PRIVATE. update "details" widgets from new template.               */
387 /*--------------------------------------------------------------------------*/
388 static void
389 details_update (glWdgtMediaSelect * media_select,
390                 gchar * name)
391 {
392         glTemplate *template;
393         gchar *text;
394         glPrefsUnits units;
395         const gchar *units_string;
396         gdouble units_per_point;
397
398         gl_debug (DEBUG_MEDIA_SELECT, "START");
399
400         units = gl_prefs_get_units ();
401         units_string = gl_prefs_get_units_string ();
402         units_per_point = gl_prefs_get_units_per_point ();
403
404         /* Fetch template */
405         template = gl_template_from_name (name);
406
407         gtk_label_set_text (GTK_LABEL (media_select->desc_label),
408                             template->description);
409
410         gtk_label_set_text (GTK_LABEL (media_select->sheet_size_label),
411                             template->page_size);
412
413         text = gl_template_get_layout_desc (template);
414         gtk_label_set_text (GTK_LABEL (media_select->number_label), text);
415         g_free (text);
416
417         text = gl_template_get_label_size_desc (template);
418         gtk_label_set_text (GTK_LABEL (media_select->label_size_label), text);
419         g_free (text);
420
421         gl_template_free( &template );
422
423         gl_debug (DEBUG_MEDIA_SELECT, "END");
424 }
425
426 /****************************************************************************/
427 /* query selected label template name.                                      */
428 /****************************************************************************/
429 gchar *
430 gl_wdgt_media_select_get_name (glWdgtMediaSelect * media_select)
431 {
432         gl_debug (DEBUG_MEDIA_SELECT, "");
433         return
434             gtk_editable_get_chars (GTK_EDITABLE (media_select->template_entry),
435                                     0, -1);
436 }
437
438 /****************************************************************************/
439 /* set selected label template name.                                        */
440 /****************************************************************************/
441 void
442 gl_wdgt_media_select_set_name (glWdgtMediaSelect * media_select,
443                                gchar * name)
444 {
445         gint pos;
446
447         gl_debug (DEBUG_MEDIA_SELECT, "START");
448
449         g_signal_handlers_block_by_func (G_OBJECT(media_select->template_entry),
450                                         G_CALLBACK(template_entry_changed_cb),
451                                         media_select);
452         gtk_editable_delete_text (GTK_EDITABLE (media_select->template_entry),
453                                   0, -1);
454         g_signal_handlers_unblock_by_func (G_OBJECT(media_select->template_entry),
455                                            G_CALLBACK(template_entry_changed_cb),
456                                            media_select);
457
458         pos = 0;
459         gtk_editable_insert_text (GTK_EDITABLE (media_select->template_entry),
460                                   name, strlen (name), &pos);
461
462         gl_debug (DEBUG_MEDIA_SELECT, "END");
463 }
464
465 /****************************************************************************/
466 /* query selected label template page size.                                 */
467 /****************************************************************************/
468 gchar *
469 gl_wdgt_media_select_get_page_size (glWdgtMediaSelect * media_select)
470 {
471         gl_debug (DEBUG_MEDIA_SELECT, "");
472
473         return
474             gtk_editable_get_chars (GTK_EDITABLE
475                                     (media_select->page_size_entry), 0, -1);
476 }
477
478 /****************************************************************************/
479 /* set selected label template page size.                                   */
480 /****************************************************************************/
481 void
482 gl_wdgt_media_select_set_page_size (glWdgtMediaSelect * media_select,
483                                     gchar * page_size)
484 {
485         gint pos;
486
487         gl_debug (DEBUG_MEDIA_SELECT, "START");
488
489         g_signal_handlers_block_by_func (G_OBJECT(media_select->page_size_entry),
490                                         G_CALLBACK(page_size_entry_changed_cb),
491                                         media_select);
492         gtk_editable_delete_text (GTK_EDITABLE (media_select->page_size_entry),
493                                   0, -1);
494         g_signal_handlers_unblock_by_func (G_OBJECT(media_select->page_size_entry),
495                                           G_CALLBACK(page_size_entry_changed_cb),
496                                           media_select);
497
498         pos = 0;
499         gtk_editable_insert_text (GTK_EDITABLE (media_select->page_size_entry),
500                                   page_size, strlen (page_size), &pos);
501
502         gl_debug (DEBUG_MEDIA_SELECT, "END");
503 }