/* * e-ui-manager.c * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with the program; if not, see * */ /** * SECTION: e-ui-manager * @short_description: construct menus and toolbars from a UI definition * @include: e-util/e-ui-manager.h * * This is a #GtkUIManager with support for Evolution's "express" mode, * which influences the parsing of UI definitions. **/ #include "e-ui-manager.h" #include "e-util-private.h" #include #define E_UI_MANAGER_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE \ ((obj), E_TYPE_UI_MANAGER, EUIManagerPrivate)) /* * --- NOTE TO SELF --- * * While creating this class I was tempted to add an "id" property which * EPluginUI could extract from a given EUIManager instead of having the * public EPluginUI functions take a separate "id" argument. Seemed like * a nice cleanup until I remembered that an EUIManager instance can have * multiple IDs ("aliases"), as in the case of EShellWindow's UI manager. * So the UI Manager ID and the instance still need to be kept separate. * * Mentioning it here in case I forget why I didn't go through with it. */ struct _EUIManagerPrivate { guint express_mode : 1; }; enum { PROP_0, PROP_EXPRESS_MODE }; static gpointer parent_class; static void ui_manager_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { switch (property_id) { case PROP_EXPRESS_MODE: e_ui_manager_set_express_mode ( E_UI_MANAGER (object), g_value_get_boolean (value)); return; } G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } static void ui_manager_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { switch (property_id) { case PROP_EXPRESS_MODE: g_value_set_boolean ( value, e_ui_manager_get_express_mode ( E_UI_MANAGER (object))); return; } G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } static gchar * ui_manager_filter_ui (EUIManager *ui_manager, const gchar *ui_definition) { gchar **lines; gchar *filtered; gboolean express_mode; gboolean in_conditional = FALSE; gboolean include = TRUE; gint ii; express_mode = e_ui_manager_get_express_mode (ui_manager); /* * Very simple line based pre-processing based on comments: * \n ... \n\n */ lines = g_strsplit (ui_definition, "\n", -1); for (ii = 0; lines[ii] != NULL; ii++) { gchar *cp; if ((cp = strstr (lines[ii], "