aboutsummaryrefslogtreecommitdiffstats
path: root/lib/egg/egg-markup.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/egg/egg-markup.c')
-rw-r--r--lib/egg/egg-markup.c438
1 files changed, 0 insertions, 438 deletions
diff --git a/lib/egg/egg-markup.c b/lib/egg/egg-markup.c
deleted file mode 100644
index feae85a00..000000000
--- a/lib/egg/egg-markup.c
+++ /dev/null
@@ -1,438 +0,0 @@
-#include <string.h>
-#include "egg-markup.h"
-#include "eggtoolbar.h"
-
-#ifndef _
-# define _(String) (String)
-# define N_(String) (String)
-#endif
-
-typedef enum {
- STATE_START,
- STATE_ROOT,
- STATE_MENU,
- STATE_TOOLBAR,
- STATE_POPUPS,
- STATE_ITEM,
- STATE_END
-} ParseState;
-
-typedef struct _ParseContext ParseContext;
-struct _ParseContext
-{
- /* parser state information */
- ParseState state;
- ParseState prev_state;
-
- /* function to call when we finish off a toplevel widget */
- EggWidgetFunc widget_func;
- gpointer user_data;
-
- /* GdkAccelGroup to use for menus */
- GtkAccelGroup *accel_group;
-
- /* info about the widget we are constructing at the moment */
- GtkWidget *top;
- gchar *type;
- gchar *name;
-
- /* the current container we are working on */
- GtkWidget *current;
-
- /* the ActionGroup used to create menu items */
- EggActionGroup *action_group;
-};
-
-static void
-start_element_handler (GMarkupParseContext *context,
- const gchar *element_name,
- const gchar **attribute_names,
- const gchar **attribute_values,
- gpointer user_data,
- GError **error)
-{
- ParseContext *ctx = user_data;
- gboolean raise_error = TRUE;
- gchar *error_attr = NULL;
-
- switch (element_name[0])
- {
- case 'R':
- if (ctx->state == STATE_START && !strcmp(element_name, "Root"))
- {
- ctx->state = STATE_ROOT;
- raise_error = FALSE;
- }
- break;
- case 'm':
- if (ctx->state == STATE_ROOT && !strcmp(element_name, "menu"))
- {
- ctx->state = STATE_MENU;
-
- ctx->top = ctx->current = gtk_menu_bar_new();
- ctx->type = "menu";
- ctx->name = NULL;
-
- raise_error = FALSE;
- }
- else if (ctx->state == STATE_MENU && !strcmp(element_name, "menuitem"))
- {
- gint i;
- const gchar *action_name = NULL;
- EggAction *action = NULL;
-
- ctx->state = STATE_ITEM;
-
- for (i = 0; attribute_names[i] != NULL; i++)
- {
- if (!strcmp(attribute_names[i], "verb"))
- {
- action_name = attribute_values[i];
- action = egg_action_group_get_action(ctx->action_group,
- action_name);
- }
- }
-
- if (action)
- {
- GtkWidget *widget = egg_action_create_menu_item(action);
-
- gtk_container_add(GTK_CONTAINER(ctx->current), widget);
- gtk_widget_show(widget);
- }
- else
- {
- g_warning("could not find action '%s'",
- action_name ? action_name : "(null)");
- }
-
- raise_error = FALSE;
- }
- break;
- case 'd':
- if (ctx->state == STATE_ROOT && !strcmp(element_name, "dockitem"))
- {
- gint i;
-
- ctx->state = STATE_TOOLBAR;
-
- ctx->top = ctx->current = egg_toolbar_new();
- ctx->type = "toolbar";
- for (i = 0; attribute_names[i] != NULL; i++)
- {
- if (!strcmp(attribute_names[i], "name"))
- ctx->name = g_strdup(attribute_values[i]);
- }
-
- raise_error = FALSE;
- }
- break;
- case 'p':
- if (ctx->state == STATE_ROOT && !strcmp(element_name, "popups"))
- {
- ctx->state = STATE_POPUPS;
- raise_error = FALSE;
- }
- else if (ctx->state == STATE_POPUPS &&!strcmp(element_name, "popup"))
- {
- gint i;
-
- ctx->state = STATE_MENU;
-
- ctx->top = ctx->current = gtk_menu_new();
- gtk_menu_set_accel_group(GTK_MENU(ctx->current), ctx->accel_group);
- ctx->type = "popup";
- for (i = 0; attribute_names[i] != NULL; i++)
- {
- if (!strcmp(attribute_names[i], "name"))
- {
- ctx->name = g_strdup(attribute_values[i]);
- gtk_menu_set_title(GTK_MENU(ctx->current), ctx->name);
- }
- else if (!strcmp(attribute_names[i], "tearoff"))
- {
- GtkWidget *tearoff = gtk_tearoff_menu_item_new();
-
- gtk_container_add(GTK_CONTAINER(ctx->current), tearoff);
- gtk_widget_show(tearoff);
- }
- }
-
- raise_error = FALSE;
- }
- break;
- case 's':
- if (ctx->state == STATE_MENU && !strcmp(element_name, "submenu"))
- {
- gint i;
- const gchar *label = NULL;
- gboolean tearoff = FALSE;
- GtkWidget *widget;
-
- ctx->state = STATE_MENU;
- for (i = 0; attribute_names[i] != NULL; i++)
- {
- if (!strcmp(attribute_names[i], "label"))
- label = g_strdup(attribute_values[i]);
- else if (!strcmp(attribute_names[i], "tearoff"))
- tearoff = TRUE;
- }
- widget = gtk_menu_item_new_with_label(label);
- gtk_label_set_use_underline(GTK_LABEL(GTK_BIN(widget)->child), TRUE);
- gtk_container_add(GTK_CONTAINER(ctx->current), widget);
- gtk_widget_show(widget);
-
- ctx->current = gtk_menu_new();
- gtk_menu_set_accel_group(GTK_MENU(ctx->current), ctx->accel_group);
- gtk_menu_set_title(GTK_MENU(ctx->current), label);
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(widget), ctx->current);
-
- if (tearoff)
- {
- GtkWidget *tearoff = gtk_tearoff_menu_item_new();
-
- gtk_container_add(GTK_CONTAINER(ctx->current), tearoff);
- gtk_widget_show(tearoff);
- }
-
- raise_error = FALSE;
- }
- else if ((ctx->state == STATE_MENU || ctx->state == STATE_TOOLBAR) &&
- !strcmp(element_name, "separator"))
- {
- ctx->state = STATE_ITEM;
-
- if (GTK_IS_MENU_SHELL(ctx->current))
- {
- GtkWidget *widget = gtk_separator_menu_item_new();
- gtk_container_add(GTK_CONTAINER(ctx->current), widget);
- gtk_widget_show(widget);
- }
- else /* toolbar */
- {
- EggToolItem *item = egg_tool_item_new ();
- egg_toolbar_insert_tool_item (EGG_TOOLBAR(ctx->current), item, -1);
- gtk_widget_show (GTK_WIDGET (item));
- }
-
- raise_error = FALSE;
- }
- break;
- case 't':
- if (ctx->state == STATE_TOOLBAR && !strcmp(element_name, "toolitem"))
- {
- gint i;
- const gchar *action_name = NULL;
- EggAction *action = NULL;
-
- ctx->state = STATE_ITEM;
-
- for (i = 0; attribute_names[i] != NULL; i++)
- {
- if (!strcmp(attribute_names[i], "verb"))
- {
- action_name = attribute_values[i];
- action = egg_action_group_get_action(ctx->action_group,
- action_name);
- }
- }
-
- if (action)
- {
- GtkWidget *widget = egg_action_create_tool_item (action);
-
- gtk_container_add (GTK_CONTAINER (ctx->current), widget);
- }
- else
- {
- g_warning("could not find action '%s'",
- action_name ? action_name : "(null)");
- }
-
- raise_error = FALSE;
- }
- break;
- };
-
- if (raise_error)
- {
- gint line_number, char_number;
-
- g_markup_parse_context_get_position (context,
- &line_number, &char_number);
-
- if (error_attr)
- g_set_error (error,
- G_MARKUP_ERROR,
- G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE,
- _("Unknown attribute '%s' on line %d char %d"),
- error_attr,
- line_number, char_number);
- else
- g_set_error (error,
- G_MARKUP_ERROR,
- G_MARKUP_ERROR_UNKNOWN_ELEMENT,
- _("Unknown tag '%s' on line %d char %d"),
- element_name,
- line_number, char_number);
- }
-}
-
-static void
-end_element_handler (GMarkupParseContext *context,
- const gchar *element_name,
- gpointer user_data,
- GError **error)
-{
- ParseContext *ctx = user_data;
- GtkWidget *widget;
-
- switch (ctx->state)
- {
- case STATE_START:
- g_warning("shouldn't get any end tags at this point");
- /* should do a GError here */
- break;
- case STATE_ROOT:
- ctx->state = STATE_END;
- break;
- case STATE_MENU:
- widget = GTK_IS_MENU(ctx->current) ?
- gtk_menu_get_attach_widget(GTK_MENU(ctx->current)) : NULL;
- if (widget) /* not back to the toplevel ... */
- {
- ctx->current = widget->parent;
- ctx->state = STATE_MENU;
- }
- else
- {
- if (GTK_IS_MENU(ctx->current)) /* must be a popup */
- ctx->state = STATE_POPUPS;
- else
- ctx->state = STATE_ROOT;
-
- /* notify */
- (* ctx->widget_func)(ctx->top, ctx->type, ctx->name, ctx->user_data);
- ctx->top = NULL;
- ctx->type = NULL;
- g_free(ctx->name);
- ctx->name = NULL;
- ctx->current = NULL;
- }
- break;
- case STATE_TOOLBAR:
- ctx->state = STATE_ROOT;
-
- /* notify */
- (* ctx->widget_func)(ctx->top, ctx->type, ctx->name, ctx->user_data);
- ctx->top = NULL;
- ctx->type = NULL;
- g_free(ctx->name);
- ctx->name = NULL;
- ctx->current = NULL;
- break;
- case STATE_POPUPS:
- ctx->state = STATE_ROOT;
- break;
- case STATE_ITEM:
- if (GTK_IS_MENU_SHELL(ctx->current))
- ctx->state = STATE_MENU;
- else
- ctx->state = STATE_TOOLBAR;
- break;
- case STATE_END:
- g_warning("shouldn't get any end tags at this point");
- /* should do a GError here */
- break;
- }
-}
-
-static void
-cleanup (GMarkupParseContext *context,
- GError *error,
- gpointer user_data)
-{
- ParseContext *ctx = user_data;
-
- gtk_widget_destroy(ctx->top);
- ctx->top = NULL;
- ctx->type = NULL;
- g_free(ctx->name);
- ctx->name = NULL;
- ctx->current = NULL;
-}
-
-
-static GMarkupParser ui_parser = {
- start_element_handler,
- end_element_handler,
- NULL,
- NULL,
- cleanup
-};
-
-
-gboolean
-egg_create_from_string (EggActionGroup *action_group,
- EggWidgetFunc widget_func, gpointer user_data,
- GtkAccelGroup *accel_group,
- const gchar *buffer, guint length,
- GError **error)
-{
- ParseContext ctx = { 0 };
- GMarkupParseContext *context;
- gboolean res = TRUE;
-
- g_return_val_if_fail(EGG_IS_ACTION_GROUP(action_group), FALSE);
- g_return_val_if_fail(widget_func != NULL, FALSE);
- g_return_val_if_fail(GTK_IS_ACCEL_GROUP(accel_group), FALSE);
- g_return_val_if_fail(buffer != NULL, FALSE);
-
- ctx.state = STATE_START;
- ctx.widget_func = widget_func;
- ctx.user_data = user_data;
- ctx.accel_group = accel_group;
- ctx.top = NULL;
- ctx.type = NULL;
- ctx.name = NULL;
- ctx.current = NULL;
- ctx.action_group = action_group;
-
- context = g_markup_parse_context_new(&ui_parser, 0, &ctx, NULL);
- if (length < 0)
- length = strlen(buffer);
-
- if (g_markup_parse_context_parse(context, buffer, length, error))
- {
- if (!g_markup_parse_context_end_parse(context, error))
- res = FALSE;
- }
- else
- res = FALSE;
-
- g_markup_parse_context_free (context);
-
- return res;
-}
-
-gboolean
-egg_create_from_file (EggActionGroup *action_group,
- EggWidgetFunc widget_func,
- gpointer user_data,
- GtkAccelGroup *accel_group,
- const gchar *filename,
- GError **error)
-{
- gchar *buffer;
- gint length;
- gboolean res;
-
- if (!g_file_get_contents (filename, &buffer, &length, error))
- return FALSE;
-
- res = egg_create_from_string(action_group, widget_func, user_data,
- accel_group, buffer, length, error);
- g_free(buffer);
-
- return res;
-}