source: trunk/third/libgnomeui/glade/glade-gnome.c @ 20840

Revision 20840, 29.2 KB checked in by ghudson, 20 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r20839, which included commits to RCS files with non-trunk default branches.
Line 
1/* -*- Mode: C; c-basic-offset: 4 -*-
2 * libglade - a library for building interfaces from XML files at runtime
3 * Copyright (C) 1998-2001  James Henstridge <james@daa.com.au>
4 *
5 * glade-gnome.c: support for libgnomeui widgets in libglade.
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
11 *
12 * This library 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 GNU
15 * Library General Public License for more details.
16 *
17 * You should have received a copy of the GNU Library General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA  02111-1307, USA.
21 */
22
23/* this file is only built if GNOME support is enabled */
24
25#ifdef HAVE_CONFIG_H
26#include "config.h"
27#endif
28
29#include <stdlib.h>
30#include <string.h>
31#include <glade/glade-init.h>
32#include <glade/glade-build.h>
33#include <libgnomeui/libgnomeui.h>
34
35#include <libbonoboui.h>
36
37/* following function is not public, so we define the prototype here ... */
38void    bonobo_dock_item_set_behavior   (BonoboDockItem         *dock_item,
39                                         BonoboDockItemBehavior  behavior);
40
41
42#define INT(s)   (strtol ((s), NULL, 0))
43#define BOOL(s)  (g_ascii_tolower (*(s)) == 't' || g_ascii_tolower (*(s)) == 'y' || INT (s))
44#define FLOAT(s) (g_strtod ((s), NULL))
45
46typedef struct {
47    const char *extension;
48    GnomeUIInfo data;
49} gnomeuiinfo_map_t;
50
51static GnomeUIInfo tmptree[] = {
52    GNOMEUIINFO_END
53};
54
55static const gnomeuiinfo_map_t gnome_uiinfo_mapping[] = {
56    { "ABOUT_ITEM", GNOMEUIINFO_MENU_ABOUT_ITEM(NULL, NULL) },
57    { "CLEAR_ITEM", GNOMEUIINFO_MENU_CLEAR_ITEM(NULL, NULL) },
58    { "CLOSE_ITEM", GNOMEUIINFO_MENU_CLOSE_ITEM(NULL, NULL) },
59    { "CLOSE_WINDOW_ITEM", GNOMEUIINFO_MENU_CLOSE_WINDOW_ITEM(NULL,NULL) },
60    { "COPY_ITEM", GNOMEUIINFO_MENU_COPY_ITEM(NULL, NULL) },
61    { "CUT_ITEM", GNOMEUIINFO_MENU_CUT_ITEM(NULL, NULL) },
62    { "EDIT_TREE", GNOMEUIINFO_MENU_EDIT_TREE(tmptree) },
63    { "END_GAME_ITEM", GNOMEUIINFO_MENU_END_GAME_ITEM(NULL, NULL) },
64    { "EXIT_ITEM", GNOMEUIINFO_MENU_EXIT_ITEM(NULL, NULL) },
65    { "FILES_TREE", GNOMEUIINFO_MENU_FILES_TREE(tmptree) },
66    { "FILE_TREE", GNOMEUIINFO_MENU_FILE_TREE(tmptree) },
67    { "FIND_AGAIN_ITEM", GNOMEUIINFO_MENU_FIND_AGAIN_ITEM(NULL, NULL) },
68    { "FIND_ITEM", GNOMEUIINFO_MENU_FIND_ITEM(NULL, NULL) },
69    { "GAME_TREE", GNOMEUIINFO_MENU_GAME_TREE(tmptree) },
70    { "HELP_TREE", GNOMEUIINFO_MENU_HELP_TREE(tmptree) },
71    { "HINT_ITEM", GNOMEUIINFO_MENU_HINT_ITEM(NULL, NULL) },
72    { "NEW_GAME_ITEM", GNOMEUIINFO_MENU_NEW_GAME_ITEM(NULL, NULL) },
73    { "NEW_ITEM", GNOMEUIINFO_MENU_NEW_ITEM(NULL, NULL, NULL, NULL) },
74    { "NEW_SUBTREE", GNOMEUIINFO_MENU_NEW_SUBTREE(tmptree) },
75    { "NEW_WINDOW_ITEM", GNOMEUIINFO_MENU_NEW_WINDOW_ITEM(NULL, NULL) },
76    { "OPEN_ITEM", GNOMEUIINFO_MENU_OPEN_ITEM(NULL, NULL) },
77    { "PASTE_ITEM", GNOMEUIINFO_MENU_PASTE_ITEM(NULL, NULL) },
78    { "PAUSE_GAME_ITEM", GNOMEUIINFO_MENU_PAUSE_GAME_ITEM(NULL, NULL) },
79    { "PREFERENCES_ITEM", GNOMEUIINFO_MENU_PREFERENCES_ITEM(NULL, NULL) },
80    { "PRINT_ITEM", GNOMEUIINFO_MENU_PRINT_ITEM(NULL, NULL) },
81    { "PRINT_SETUP_ITEM", GNOMEUIINFO_MENU_PRINT_SETUP_ITEM(NULL, NULL) },
82    { "PROPERTIES_ITEM", GNOMEUIINFO_MENU_PROPERTIES_ITEM(NULL, NULL) },
83    { "REDO_ITEM", GNOMEUIINFO_MENU_REDO_ITEM(NULL, NULL) },
84    { "REDO_MOVE_ITEM", GNOMEUIINFO_MENU_REDO_MOVE_ITEM(NULL, NULL) },
85    { "REPLACE_ITEM", GNOMEUIINFO_MENU_REPLACE_ITEM(NULL, NULL) },
86    { "RESTART_GAME_ITEM", GNOMEUIINFO_MENU_RESTART_GAME_ITEM(NULL,NULL) },
87    { "REVERT_ITEM", GNOMEUIINFO_MENU_REVERT_ITEM(NULL, NULL) },
88    { "SAVE_AS_ITEM", GNOMEUIINFO_MENU_SAVE_AS_ITEM(NULL, NULL) },
89    { "SAVE_ITEM", GNOMEUIINFO_MENU_SAVE_ITEM(NULL, NULL) },
90    { "SCORES_ITEM", GNOMEUIINFO_MENU_SCORES_ITEM(NULL, NULL) },
91    { "SELECT_ALL_ITEM", GNOMEUIINFO_MENU_SELECT_ALL_ITEM(NULL, NULL) },
92    { "SETTINGS_TREE", GNOMEUIINFO_MENU_SETTINGS_TREE(tmptree) },
93    { "UNDO_ITEM", GNOMEUIINFO_MENU_UNDO_ITEM(NULL, NULL) },
94    { "UNDO_MOVE_ITEM", GNOMEUIINFO_MENU_UNDO_MOVE_ITEM(NULL, NULL) },
95    { "VIEW_TREE", GNOMEUIINFO_MENU_VIEW_TREE(tmptree) },
96    { "WINDOWS_TREE", GNOMEUIINFO_MENU_WINDOWS_TREE(tmptree) },
97};
98
99static int
100stock_compare (const void *a, const void *b)
101{
102    const gnomeuiinfo_map_t *ga = a;
103    const gnomeuiinfo_map_t *gb = b;
104
105    return strcmp (ga->extension, gb->extension);
106}
107
108static gboolean
109get_stock_uiinfo (const char *stock_name, GnomeUIInfo *info)
110{
111    const int len = strlen ("GNOMEUIINFO_MENU_");
112    gnomeuiinfo_map_t *v;
113    gnomeuiinfo_map_t base;
114
115    /* If an error happens, return this */
116    if (!strncmp (stock_name, "GNOMEUIINFO_MENU_", len)) {
117        base.extension = stock_name + len;
118        v = bsearch (
119            &base,
120            gnome_uiinfo_mapping,
121            sizeof(gnome_uiinfo_mapping) /
122            sizeof(gnomeuiinfo_map_t),
123            sizeof (gnome_uiinfo_mapping [0]),
124            stock_compare);
125        if (v) {
126            *info = v->data;
127            return TRUE;
128        } else
129            return FALSE;
130    }
131    return FALSE;
132}
133
134static void
135menushell_build_children (GladeXML *xml, GtkWidget *w,
136                          GladeWidgetInfo *info)
137{
138    int i, j;
139    GnomeUIInfo infos[2] = {
140        { GNOME_APP_UI_ITEM },
141        GNOMEUIINFO_END
142    };
143
144    for (i = 0; i < info->n_children; i++) {
145        GladeChildInfo *cinfo = &info->children[i];
146        GladeWidgetInfo *cwinfo = cinfo->child;
147        GtkWidget *child;
148        gchar *stock_name = NULL;
149       
150        for (j = 0; j < cwinfo->n_properties; j++) {
151            if (!strcmp (cwinfo->properties[j].name, "stock_item")) {
152                stock_name = cwinfo->properties[j].value;
153                break;
154            }
155        }
156        if (!stock_name) {
157            /* this is a normal menu item */
158            child = glade_xml_build_widget (xml, cwinfo);
159            gtk_menu_shell_append (GTK_MENU_SHELL (w), child);
160            continue;
161        }
162        /* load the template GnomeUIInfo for this item */
163        if (!get_stock_uiinfo (stock_name, &infos[0])) {
164            /* failure ... */
165            if (!strncmp (stock_name, "GNOMEUIINFO_", 12))
166                stock_name += 12;
167            child = gtk_menu_item_new_with_label (stock_name);
168            glade_xml_set_common_params (xml, child, cwinfo);
169            gtk_menu_shell_append (GTK_MENU_SHELL(w), child);
170            continue;
171        }
172        /* we now have the template for this item.  Now fill it in */
173        for (j = 0; j < cwinfo->n_properties; j++) {
174            const char *name  = cwinfo->properties[j].name;
175            const char *value = cwinfo->properties[j].value;
176            if (!strcmp (name, "label"))
177                infos[0].label = _(value);
178            else if (!strcmp (name, "tooltip"))
179                infos[0].hint = _(value);
180        }
181        gnome_app_fill_menu (GTK_MENU_SHELL(w), infos,
182                             glade_xml_ensure_accel(xml), TRUE,
183                             i);
184        child = infos[0].widget;
185        gtk_menu_item_remove_submenu(GTK_MENU_ITEM(child));
186        glade_xml_set_common_params(xml, child, cwinfo);
187    }
188
189#if 0
190    if (uline)
191        glade_xml_pop_uline_accel(xml);
192#endif
193#if 0
194    if (strcmp(info->classname, "GtkMenuBar") != 0 &&
195        gnome_preferences_get_menus_have_tearoff()) {
196        GtkWidget *tearoff = gtk_tearoff_menu_item_new();
197       
198        gtk_menu_prepend(GTK_MENU(w), tearoff);
199        gtk_widget_show(tearoff);
200    }
201#endif
202}
203
204static void
205gnome_add_dock_item (GladeXML *xml,
206                     GtkWidget *parent,
207                     GladeWidgetInfo *info,
208                     GladeChildInfo *childinfo)
209{
210        BonoboDockPlacement placement;
211        guint band, offset;
212        int position;
213        BonoboDockItemBehavior behavior;
214        int i;
215        GtkWidget *child;
216        GtkWidget *toplevel;
217
218        band = offset = position = 0;
219        placement = BONOBO_DOCK_TOP;
220        behavior  = BONOBO_DOCK_ITEM_BEH_NORMAL;
221
222        for (i = 0; i < childinfo->n_properties; i++) {
223                const char *name  = childinfo->properties[i].name;
224                const char *value = childinfo->properties[i].value;
225
226                if (!strcmp (name, "placement"))
227                        placement = glade_enum_from_string (
228                                BONOBO_TYPE_DOCK_PLACEMENT,
229                                value);
230                else if (!strcmp (name, "band"))
231                        band = strtoul (value, NULL, 10);
232                else if (!strcmp (name, "position"))
233                        position = strtol (value, NULL, 10);
234                else if (!strcmp (name, "offset"))
235                        offset = strtoul (value, NULL, 10);
236                else if (!strcmp (name, "behavior"))
237                        behavior = glade_flags_from_string (
238                                BONOBO_TYPE_DOCK_ITEM_BEHAVIOR,
239                                value);
240        }
241
242        child = glade_xml_build_widget (xml, childinfo->child);
243
244        toplevel = gtk_widget_get_ancestor (parent, GNOME_TYPE_APP);
245
246        bonobo_dock_item_set_behavior (BONOBO_DOCK_ITEM (child), behavior);
247
248        if (toplevel != NULL) {
249            gnome_app_add_dock_item (
250                GNOME_APP (toplevel),
251                BONOBO_DOCK_ITEM (child),
252                placement,
253                band,
254                position,
255                offset);
256        } else {
257            bonobo_dock_add_item (BONOBO_DOCK (parent),
258                                  BONOBO_DOCK_ITEM (child),
259                                  placement, band, position, offset,
260                                  FALSE);
261        }
262}
263                               
264
265static void
266gnome_dock_build_children (GladeXML *xml, GtkWidget *w, GladeWidgetInfo *info)
267{
268        int i;
269        GtkWidget *child;
270        GtkWidget *toplevel;
271        GladeChildInfo *childinfo;
272
273        toplevel = gtk_widget_get_ancestor (w, GNOME_TYPE_APP);
274
275        for (i = 0; i < info->n_children; i++) {
276                childinfo = &info->children[i];
277
278                if (!strcmp (childinfo->child->classname, "BonoboDockItem")) {
279                        gnome_add_dock_item (xml, w, info, childinfo);
280                        continue;
281                }
282               
283                if (bonobo_dock_get_client_area (BONOBO_DOCK (w)))
284                        g_warning ("Multiple client areas for BonoboDock found.");
285               
286                child = glade_xml_build_widget (xml, childinfo->child);
287               
288                if (toplevel != NULL)
289                    gnome_app_set_contents (GNOME_APP (toplevel), child);
290                else
291                    bonobo_dock_set_client_area (BONOBO_DOCK (w), child);
292        }
293}
294
295static void
296dialog_build_children(GladeXML *self, GtkWidget *w,
297                      GladeWidgetInfo *info)
298
299{
300    GnomeDialog *dialog = GNOME_DIALOG (w);
301    GtkWidget *aa;
302    GList *children, *list;
303    char *label;
304
305    glade_standard_build_children (self, w, info);
306
307    aa = dialog->action_area;
308    if (!aa)
309        return;
310
311    children = gtk_container_get_children (GTK_CONTAINER (aa));
312    for (list = children; list; list = list->next) {
313        gtk_widget_ref (GTK_WIDGET (list->data));
314        gtk_container_remove (GTK_CONTAINER (aa), GTK_WIDGET (list->data));
315    }
316
317    for (list = children; list; list = list->next) {
318        g_object_get (G_OBJECT (list->data), "label", &label, NULL);
319        if (label) {
320            gnome_dialog_append_button (dialog, label);
321            g_free (label);
322        }
323    }
324
325    g_list_foreach (children, (GFunc)gtk_widget_unref, NULL);
326    g_list_free (children);
327}
328
329static void
330app_build_children (GladeXML *xml, GtkWidget *parent,
331                    GladeWidgetInfo *info)
332{
333    int i;
334
335    for (i = 0; i < info->n_children; i++) {
336        GladeChildInfo *cinfo;
337        GtkWidget *child;
338
339        cinfo = &info->children[i];
340
341        if (cinfo->internal_child) {
342            /* not quite proper handling of appbar, but ... */
343            if (!strcmp (cinfo->internal_child, "appbar")) {
344                child = glade_xml_build_widget (xml, cinfo->child);
345                gnome_app_set_statusbar (GNOME_APP (parent), child);
346            } else {
347                glade_xml_handle_internal_child (xml, parent, cinfo);
348            }
349        } else {
350            child = glade_xml_build_widget (xml, cinfo->child);
351
352#if 0
353            g_object_ref (G_OBJECT (child));
354            gtk_widget_freeze_child_notify (child);
355            for (j = 0; j < info->children[i].n_properties; j++)
356                glade_xml_set_packing_property (
357                        xml, GNOME_APP (parent)->vbox, child,
358                        cinfo->properties[j].name,
359                        cinfo->properties[j].value);
360            gtk_widget_thaw_child_notify(child);
361            g_object_unref(G_OBJECT(child));
362#endif
363        }
364    }
365}
366
367static GtkWidget *
368app_build (GladeXML *xml, GType widget_type,
369           GladeWidgetInfo *info)
370{
371    GtkWidget *app;
372    char *s;
373
374    app = glade_standard_build_widget (xml, widget_type, info);
375
376    g_object_get (G_OBJECT (gnome_program_get ()),
377                  GNOME_PARAM_APP_ID, &s,
378                  NULL);
379
380    g_object_set (G_OBJECT (app), "app_id", s, NULL);
381
382    g_free (s);
383
384    return app;
385}
386
387static GtkWidget *
388dialog_new (GladeXML *xml, GType widget_type,
389            GladeWidgetInfo *info)
390{
391    GtkWidget *dialog;
392    const char *buttons[] = { NULL };
393
394    dialog = glade_standard_build_widget (xml, widget_type, info);
395
396    gnome_dialog_constructv (GNOME_DIALOG (dialog), NULL, buttons);
397
398    return dialog;
399}
400
401/* GnomeDruidPageEdge really sucks. */
402#if 0
403#define DRUID_SET_STRING(pos, POS, var)                                   \
404static void                                                               \
405druid_page_##pos##_set_##var (GladeXML *xml, GtkWidget *w,                  \
406                            const char *name, const char *value)          \
407{                                                                         \
408    gnome_druid_page_##pos##_set_##var (GNOME_DRUID_PAGE_##POS (w), value); \
409}
410
411#define DRUID_SET_COLOR(pos, POS, var)                                            \
412static void                                                                       \
413druid_page_##pos##_set_##var##_color (GladeXML *xml, GtkWidget *w,                          \
414                            const char *name, const char *value)                  \
415{                                                                                 \
416    GdkColor colour = { 0 };                                                      \
417    if (gdk_color_parse(value, &colour) &&                                        \
418        gdk_colormap_alloc_color (gtk_widget_get_default_colormap(),              \
419                                  &colour, FALSE, TRUE)) {                        \
420    } else {                                                                      \
421        g_warning ("could not parse colour name `%s'", value);                    \
422        return;                                                                   \
423    }                                                                             \
424    gnome_druid_page_##pos##_set_##var##_color (GNOME_DRUID_PAGE_##POS (w), &colour); \
425}
426
427
428DRUID_SET_STRING (edge, EDGE, title)
429DRUID_SET_STRING (edge, EDGE, text)
430DRUID_SET_COLOR (edge, EDGE, title)
431DRUID_SET_COLOR (edge, EDGE, text)
432DRUID_SET_COLOR (edge, EDGE, bg)
433DRUID_SET_COLOR (edge, EDGE, logo_bg)
434DRUID_SET_COLOR (edge, EDGE, textbox)
435#endif
436
437/* this is a huge hack */
438static GtkWidget *
439druid_page_edge_new (GladeXML *xml, GType widget_type,
440                     GladeWidgetInfo *info)
441{
442    GtkWidget *druid;
443    GnomeEdgePosition position = GNOME_EDGE_OTHER;
444    int i;
445
446    const char *title, *text;
447    const char *title_color, *text_color;
448    const char *bg_color, *logo_bg_color, *textbox_color;
449    char *filename;
450    GdkPixbuf *logo, *watermark, *top_watermark;
451
452    title = text = title_color = text_color = bg_color = logo_bg_color = textbox_color = NULL;
453    logo = watermark = top_watermark = NULL;
454
455    for (i = 0; i < info->n_properties; i++) {
456        const char *name  = info->properties[i].name;
457        const char *value = info->properties[i].value; 
458
459        if (!strcmp (name, "position"))
460            position = glade_enum_from_string (
461                GNOME_TYPE_EDGE_POSITION, value);
462        else if (!strcmp (name, "textbox_color"))
463            textbox_color = value;
464        else if (!strcmp (name, "logo_background_color"))
465            logo_bg_color = value;
466        else if (!strcmp (name, "background_color"))
467            bg_color = value;
468        else if (!strcmp (name, "text_color"))
469            text_color = value;
470        else if (!strcmp (name, "title_color"))
471            title_color = value;
472        else if (!strcmp (name, "text"))
473            text = value;
474        else if (!strcmp (name, "title"))
475            title = value;
476        else if (!strcmp (name, "logo_image")) {
477            if (logo)
478                g_object_unref (G_OBJECT (logo));
479            filename = glade_xml_relative_file (xml, value);
480            logo = gdk_pixbuf_new_from_file (filename, NULL);
481            g_free (filename);
482        } else if (!strcmp (name, "watermark_image")) {
483            if (watermark)
484                g_object_unref (G_OBJECT (watermark));
485            filename = glade_xml_relative_file (xml, value);
486            watermark = gdk_pixbuf_new_from_file (filename, NULL);
487            g_free (filename);
488        }
489
490    }
491
492    druid = gnome_druid_page_edge_new_with_vals (
493        position, TRUE, title, text,
494        logo, watermark, top_watermark);
495
496   
497
498    if (logo)
499        g_object_unref (G_OBJECT (logo));
500    if (watermark)
501        g_object_unref (G_OBJECT (watermark));
502    if (top_watermark)
503        g_object_unref (G_OBJECT (top_watermark));
504
505    return druid;
506}
507
508static GtkWidget *
509message_box_new (GladeXML *xml, GType widget_type,
510                 GladeWidgetInfo *info)
511{
512    GtkWidget *dialog;
513    const char *buttons[] = { NULL };
514    const char *type = "generic", *message = NULL;
515    int i;
516
517    for (i = 0; i < info->n_properties; i++) {
518        const char *name  = info->properties[i].name;
519        const char *value = info->properties[i].value; 
520
521        if (!strcmp (name, "message"))
522            message = value;
523        if (!strcmp (name, "message_box_type"))
524            type = value;
525    }
526
527    dialog = glade_standard_build_widget (xml, widget_type, info);
528
529    gnome_message_box_construct (GNOME_MESSAGE_BOX (dialog), message, type, buttons);
530
531    return dialog;
532}
533
534static GtkWidget *
535date_edit_new (GladeXML *xml, GType widget_type,
536               GladeWidgetInfo *info)
537{
538    GtkWidget *de;
539
540    de = glade_standard_build_widget (xml, widget_type, info);
541
542    g_object_set (G_OBJECT (de), "time", time (NULL), NULL);
543
544    return de;
545}
546
547static GtkWidget *
548icon_list_new (GladeXML *xml, GType widget_type,
549               GladeWidgetInfo *info)
550{
551    GtkWidget *gil;
552    int flags = 0;
553    int icon_width = 0;
554    int i;
555
556    for (i = 0; i < info->n_properties; i++) {
557        const char *name  = info->properties[i].name;
558        const char *value = info->properties[i].value;
559
560        if (!strcmp (name, "text_editable")) {
561            if (BOOL (value))
562                flags |= GNOME_ICON_LIST_IS_EDITABLE;
563        } else if (!strcmp (name, "text_static")) {
564            if (BOOL (value))
565                flags |= GNOME_ICON_LIST_STATIC_TEXT;
566        } else if (!strcmp (name, "icon_width")) {
567            icon_width = INT (value);
568        }
569    }
570
571    gil = glade_standard_build_widget (xml, widget_type, info);
572
573    gnome_icon_list_construct (GNOME_ICON_LIST (gil),
574                               icon_width, NULL, flags);
575
576    return gil;
577}
578
579static GtkWidget *
580druidpagestandard_find_internal_child(GladeXML *xml, GtkWidget *parent,
581                                      const gchar *childname)
582{
583    if (!strcmp(childname, "vbox"))
584        return GNOME_DRUID_PAGE_STANDARD(parent)->vbox;
585    return NULL;
586}
587
588static GtkWidget *
589dialog_find_internal_child(GladeXML *xml, GtkWidget *parent,
590                           const gchar *childname)
591{
592    if (!strcmp(childname, "vbox"))
593        return GNOME_DIALOG(parent)->vbox;
594    else if (!strcmp (childname, "action_area"))
595        return GNOME_DIALOG (parent)->action_area;
596
597    return NULL;
598}
599
600static GtkWidget *
601entry_find_internal_child(GladeXML *xml, GtkWidget *parent,
602                          const gchar *childname)
603{
604    if (!strcmp (childname, "entry"))
605        return gnome_entry_gtk_entry (GNOME_ENTRY (parent));
606
607    return NULL;
608}
609
610static GtkWidget *
611file_entry_find_internal_child(GladeXML *xml, GtkWidget *parent,
612                              const gchar *childname)
613{
614    if (!strcmp (childname, "entry"))
615        return gnome_file_entry_gtk_entry (GNOME_FILE_ENTRY (parent));
616
617    return NULL;
618}
619
620static GtkWidget *
621propertybox_find_internal_child(GladeXML *xml, GtkWidget *parent,
622                                const gchar *childname)
623{
624    if (!strcmp(childname, "vbox"))
625        return GNOME_DIALOG(parent)->vbox;
626    else if (!strcmp(childname, "action_area"))
627        return GNOME_DIALOG(parent)->action_area;
628    else if (!strcmp(childname, "notebook"))
629        return GNOME_PROPERTY_BOX(parent)->notebook;
630    else if (!strcmp(childname, "ok_button"))
631        return GNOME_PROPERTY_BOX(parent)->ok_button;
632    else if (!strcmp(childname, "apply_button"))
633        return GNOME_PROPERTY_BOX(parent)->apply_button;
634    else if (!strcmp(childname, "cancel_button"))
635        return GNOME_PROPERTY_BOX(parent)->cancel_button;
636    else if (!strcmp(childname, "help_button"))
637        return GNOME_PROPERTY_BOX(parent)->help_button;
638    return NULL;
639}
640
641static GtkWidget *
642app_find_internal_child (GladeXML *xml, GtkWidget *parent,
643                         const char *childname)
644{
645    if (!strcmp (childname, "dock"))
646        return GNOME_APP (parent)->dock;
647#if 0
648    else if (!strcmp (childname, "appbar"))
649        return GNOME_APP (parent)->statusbar;
650#endif
651
652    return NULL;
653}
654
655static void
656app_enable_layout_config (GladeXML *xml, GtkWidget *w,
657                          const char *name, const char *value)
658{
659    gnome_app_enable_layout_config (GNOME_APP (w), BOOL (value));
660}
661
662static void
663pixmap_entry_set_preview (GladeXML *xml, GtkWidget *w,
664                          const char *name, const char *value)
665{
666    gnome_pixmap_entry_set_preview (GNOME_PIXMAP_ENTRY (w), BOOL (value));
667}
668
669static void
670icon_list_set_selection_mode (GladeXML *xml, GtkWidget *w,
671                              const char *name, const char *value)
672{
673    gnome_icon_list_set_selection_mode (
674        GNOME_ICON_LIST (w),
675        glade_enum_from_string (GTK_TYPE_SELECTION_MODE,
676                                value));
677}
678
679static void
680entry_set_max_saved (GladeXML *xml, GtkWidget *w,
681                     const char *name, const char *value)
682{
683    gnome_entry_set_max_saved (GNOME_ENTRY (w), INT (value));
684}
685
686static void
687file_entry_set_max_saved (GladeXML *xml, GtkWidget *w,
688                          const char *name, const char *value)
689{
690    entry_set_max_saved (xml,
691                         gnome_file_entry_gnome_entry (GNOME_FILE_ENTRY (w)),
692                         name, value);
693}
694
695static void
696file_entry_set_use_filechooser (GladeXML *xml, GtkWidget *w,
697                          const char *name, const char *value)
698{
699    g_object_set (G_OBJECT (w), "use_filechooser", BOOL (value), NULL);
700}
701
702static void
703icon_entry_set_max_saved (GladeXML *xml, GtkWidget *w,
704                          const char *name, const char *value)
705{
706    gnome_icon_entry_set_max_saved (GNOME_ICON_ENTRY (w), INT (value));
707}
708
709static void
710icon_list_set_row_spacing (GladeXML *xml, GtkWidget *w,
711                           const char *name, const char *value)
712{
713    gnome_icon_list_set_row_spacing (GNOME_ICON_LIST (w), INT (value));
714}
715
716static void
717icon_list_set_col_spacing (GladeXML *xml, GtkWidget *w,
718                           const char *name, const char *value)
719{
720    gnome_icon_list_set_col_spacing (GNOME_ICON_LIST (w), INT (value));
721}
722
723static void
724icon_list_set_text_spacing (GladeXML *xml, GtkWidget *w,
725                            const char *name, const char *value)
726{
727    gnome_icon_list_set_text_spacing (GNOME_ICON_LIST (w), INT (value));
728}
729
730static void
731custom_noop (GladeXML *xml, GtkWidget *w,
732             const char *name, const char *value)
733{
734    ;
735}
736
737static void
738dialog_set_auto_close (GladeXML *xml, GtkWidget *w,
739                       const char *name, const char *value)
740{
741    gnome_dialog_set_close (GNOME_DIALOG (w), BOOL (value));
742}
743
744static void
745dialog_set_hide_on_close (GladeXML *xml, GtkWidget *w,
746                          const char *name, const char *value)
747{
748    gnome_dialog_close_hides (GNOME_DIALOG (w), BOOL (value));
749}
750
751static void
752about_set_authors (GladeXML *xml, GtkWidget *w,
753                   const char *name, const char *value)
754{
755    char **authors;
756    GValueArray *authors_array;
757    int i;
758
759    authors = g_strsplit (value, "\n", 0);
760    authors_array = g_value_array_new (0);
761       
762    for (i = 0; authors[i] != NULL; i++) {
763        GValue value = { 0 };
764                g_value_init (&value, G_TYPE_STRING);
765        g_value_set_static_string (&value, authors[i]);
766        authors_array = g_value_array_append (authors_array, &value);
767    }
768
769    g_object_set (G_OBJECT (w), "authors", authors_array, NULL);
770
771    g_value_array_free (authors_array);
772
773    g_strfreev (authors);
774}
775
776static void
777about_set_translator_credits (GladeXML *xml, GtkWidget *w,
778                              const char *name, const char *value)
779{
780    /* only set this if the translator actually translated the string. */
781    if (strcmp(value, "translator_credits") != 0) {
782        g_object_set (G_OBJECT (w), "translator_credits", value, NULL);
783    }
784}
785
786static void
787about_set_documentors (GladeXML *xml, GtkWidget *w,
788                       const char *name, const char *value)
789{
790    char **documentors;
791    GValueArray *documentors_array;
792    int i;
793
794    documentors = g_strsplit (value, "\n", 0);
795    documentors_array = g_value_array_new (0);
796       
797    for (i = 0; documentors[i] != NULL; i++) {
798        GValue value = { 0 };
799                g_value_init (&value, G_TYPE_STRING);
800        g_value_set_static_string (&value, documentors[i]);
801        documentors_array = g_value_array_append (documentors_array, &value);
802    }
803
804    g_object_set (G_OBJECT (w), "documenters", documentors_array, NULL);
805
806    g_value_array_free (documentors_array);
807
808    g_strfreev (documentors);
809}
810
811static void
812pixmap_set_filename (GladeXML *xml, GtkWidget *w,
813                     const char *name, const char *value)
814{
815    char *filename;
816
817    filename = glade_xml_relative_file (xml, value);
818    gnome_pixmap_load_file (GNOME_PIXMAP (w), filename);
819    g_free (filename);
820}
821
822/* this macro puts a version check function into the module */
823GLADE_MODULE_CHECK_INIT
824
825void
826glade_module_register_widgets (void)
827{
828    glade_require ("bonobo");
829
830    glade_register_custom_prop (GNOME_TYPE_APP, "enable_layout_config", app_enable_layout_config);
831    glade_register_custom_prop (GNOME_TYPE_PIXMAP_ENTRY, "preview", pixmap_entry_set_preview);
832    glade_register_custom_prop (GNOME_TYPE_ICON_LIST, "selection_mode", icon_list_set_selection_mode);
833    glade_register_custom_prop (GNOME_TYPE_ICON_LIST, "icon_width", custom_noop);
834    glade_register_custom_prop (GNOME_TYPE_ICON_LIST, "row_spacing", icon_list_set_row_spacing);
835    glade_register_custom_prop (GNOME_TYPE_ICON_LIST, "column_spacing", icon_list_set_col_spacing);
836    glade_register_custom_prop (GNOME_TYPE_ICON_LIST, "text_spacing", icon_list_set_text_spacing);
837    glade_register_custom_prop (GNOME_TYPE_ICON_LIST, "text_editable", custom_noop);
838    glade_register_custom_prop (GNOME_TYPE_ICON_LIST, "text_static", custom_noop);
839    glade_register_custom_prop (GNOME_TYPE_DIALOG, "auto_close", dialog_set_auto_close);
840    glade_register_custom_prop (GNOME_TYPE_DIALOG, "hide_on_close", dialog_set_hide_on_close);
841    glade_register_custom_prop (GNOME_TYPE_MESSAGE_BOX, "message", custom_noop);
842    glade_register_custom_prop (GNOME_TYPE_MESSAGE_BOX, "message_box_type", custom_noop);
843    glade_register_custom_prop (GNOME_TYPE_ABOUT, "authors", about_set_authors);
844    glade_register_custom_prop (GNOME_TYPE_ABOUT, "translator_credits", about_set_translator_credits);
845    glade_register_custom_prop (GNOME_TYPE_ABOUT, "documenters", about_set_documentors);
846    glade_register_custom_prop (GNOME_TYPE_DRUID_PAGE_EDGE, "title", custom_noop);
847    glade_register_custom_prop (GNOME_TYPE_DRUID_PAGE_EDGE, "text", custom_noop);
848    glade_register_custom_prop (GNOME_TYPE_DRUID_PAGE_EDGE, "title_color", custom_noop);
849    glade_register_custom_prop (GNOME_TYPE_DRUID_PAGE_EDGE, "text_color", custom_noop);
850    glade_register_custom_prop (GNOME_TYPE_DRUID_PAGE_EDGE, "background_color", custom_noop);
851    glade_register_custom_prop (GNOME_TYPE_DRUID_PAGE_EDGE, "logo_background_color", custom_noop);
852    glade_register_custom_prop (GNOME_TYPE_DRUID_PAGE_EDGE, "textbox_color", custom_noop);
853    glade_register_custom_prop (GNOME_TYPE_DRUID_PAGE_EDGE, "position", custom_noop);
854    glade_register_custom_prop (GTK_TYPE_IMAGE_MENU_ITEM, "stock_item", custom_noop);
855    glade_register_custom_prop (GTK_TYPE_MENU_ITEM, "stock_item", custom_noop);
856    glade_register_custom_prop (GNOME_TYPE_PIXMAP, "filename", pixmap_set_filename);
857    glade_register_custom_prop (GNOME_TYPE_ENTRY, "max_saved", entry_set_max_saved);
858    glade_register_custom_prop (GNOME_TYPE_FILE_ENTRY, "max_saved", file_entry_set_max_saved);
859    glade_register_custom_prop (GNOME_TYPE_FILE_ENTRY, "use_filechooser", file_entry_set_use_filechooser);
860    glade_register_custom_prop (GNOME_TYPE_ICON_ENTRY, "max_saved", icon_entry_set_max_saved);
861
862    glade_register_widget (GNOME_TYPE_ABOUT, NULL, NULL, NULL);
863    glade_register_widget (GNOME_TYPE_APP, app_build, app_build_children,
864                           app_find_internal_child);
865    glade_register_widget (GNOME_TYPE_APPBAR, glade_standard_build_widget,
866                           NULL, NULL);
867    glade_register_widget (GNOME_TYPE_COLOR_PICKER,glade_standard_build_widget,
868                           NULL, NULL);
869    glade_register_widget (GNOME_TYPE_DATE_EDIT, date_edit_new,
870                           NULL, NULL);
871    glade_register_widget (GNOME_TYPE_DIALOG, dialog_new,
872                           dialog_build_children, dialog_find_internal_child);
873    glade_register_widget (GNOME_TYPE_DRUID, glade_standard_build_widget,
874                           glade_standard_build_children, NULL);
875    glade_register_widget (GNOME_TYPE_DRUID_PAGE, glade_standard_build_widget,
876                           glade_standard_build_children, NULL);
877    glade_register_widget (GNOME_TYPE_DRUID_PAGE_EDGE, druid_page_edge_new,
878                           NULL, NULL);
879    glade_register_widget (GNOME_TYPE_DRUID_PAGE_STANDARD, glade_standard_build_widget,
880                           glade_standard_build_children, druidpagestandard_find_internal_child);
881    glade_register_widget (GNOME_TYPE_ENTRY, glade_standard_build_widget,
882                           glade_standard_build_children, entry_find_internal_child);
883    glade_register_widget (GNOME_TYPE_FILE_ENTRY, glade_standard_build_widget,
884                           glade_standard_build_children, file_entry_find_internal_child);
885    glade_register_widget (GNOME_TYPE_HREF, glade_standard_build_widget,
886                           NULL, NULL);
887    glade_register_widget (GNOME_TYPE_ICON_ENTRY, glade_standard_build_widget,
888                           NULL, NULL);
889    glade_register_widget (GNOME_TYPE_ICON_LIST, icon_list_new,
890                           NULL, NULL);
891    glade_register_widget (GNOME_TYPE_ICON_SELECTION, glade_standard_build_widget,
892                           NULL, NULL);
893    glade_register_widget (GNOME_TYPE_MESSAGE_BOX, message_box_new,
894                           glade_standard_build_children, dialog_find_internal_child);
895    glade_register_widget (GNOME_TYPE_PIXMAP_ENTRY, glade_standard_build_widget,
896                           NULL, NULL);
897    glade_register_widget (GNOME_TYPE_PROPERTY_BOX, glade_standard_build_widget,
898                           glade_standard_build_children, propertybox_find_internal_child);
899    glade_register_widget (GNOME_TYPE_SCORES, glade_standard_build_widget,
900                           NULL, NULL);
901    glade_register_widget (GNOME_TYPE_PIXMAP, glade_standard_build_widget, NULL, NULL);
902    glade_register_widget (GNOME_TYPE_FONT_PICKER, NULL, NULL, NULL);
903
904    /* things we need to override */
905    glade_register_widget (BONOBO_TYPE_DOCK, NULL, gnome_dock_build_children, NULL);
906    glade_register_widget (GTK_TYPE_MENU_BAR, NULL, menushell_build_children, NULL);
907    glade_register_widget (GTK_TYPE_MENU, NULL, menushell_build_children, NULL);
908   
909    glade_provide ("gnome");
910}
Note: See TracBrowser for help on using the repository browser.