Blame plugins/gtk+/glade-attributes.c

Packit 1e8aac
/*
Packit 1e8aac
 * glade-attributes.c - Editing support for pango attributes
Packit 1e8aac
 *
Packit 1e8aac
 * Copyright (C) 2008 Tristan Van Berkom
Packit 1e8aac
 *
Packit 1e8aac
 * Author(s):
Packit 1e8aac
 *      Tristan Van Berkom <tvb@gnome.org>
Packit 1e8aac
 *
Packit 1e8aac
 * This library is free software; you can redistribute it and/or modify it
Packit 1e8aac
 * under the terms of the GNU Lesser General Public License as
Packit 1e8aac
 * published by the Free Software Foundation; either version 2.1 of
Packit 1e8aac
 * the License, or (at your option) any later version.
Packit 1e8aac
 *
Packit 1e8aac
 * This library is distributed in the hope that it will be useful, but
Packit 1e8aac
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 1e8aac
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 1e8aac
 * Lesser General Public License for more details.
Packit 1e8aac
 *
Packit 1e8aac
 * You should have received a copy of the GNU Lesser General Public 
Packit 1e8aac
 * License along with this program; if not, write to the Free Software
Packit 1e8aac
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Packit 1e8aac
 */
Packit 1e8aac
Packit 1e8aac
#include <config.h>
Packit 1e8aac
Packit 1e8aac
#include <string.h>
Packit 1e8aac
#include <stdlib.h>
Packit 1e8aac
#include <gtk/gtk.h>
Packit 1e8aac
#include <gladeui/glade.h>
Packit 1e8aac
#include <glib/gi18n-lib.h>
Packit 1e8aac
Packit 1e8aac
#include "glade-attributes.h"
Packit 1e8aac
Packit 1e8aac
#define GLADE_RESPONSE_CLEAR 42
Packit 1e8aac
Packit 1e8aac
static GList *
Packit 1e8aac
glade_attr_list_copy (GList *attrs)
Packit 1e8aac
{
Packit 1e8aac
  GList *ret = NULL, *list;
Packit 1e8aac
  GladeAttribute *attr, *dup_attr;
Packit 1e8aac
Packit 1e8aac
  for (list = attrs; list; list = list->next)
Packit 1e8aac
    {
Packit 1e8aac
      attr = list->data;
Packit 1e8aac
Packit 1e8aac
      dup_attr = g_new0 (GladeAttribute, 1);
Packit 1e8aac
      dup_attr->type = attr->type;
Packit 1e8aac
      dup_attr->start = attr->start;
Packit 1e8aac
      dup_attr->end = attr->end;
Packit 1e8aac
      g_value_init (&(dup_attr->value), G_VALUE_TYPE (&(attr->value)));
Packit 1e8aac
      g_value_copy (&(attr->value), &(dup_attr->value));
Packit 1e8aac
Packit 1e8aac
      ret = g_list_prepend (ret, dup_attr);
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  return g_list_reverse (ret);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_attr_list_free (GList *attrs)
Packit 1e8aac
{
Packit 1e8aac
  GList *list;
Packit 1e8aac
  GladeAttribute *attr;
Packit 1e8aac
Packit 1e8aac
  for (list = attrs; list; list = list->next)
Packit 1e8aac
    {
Packit 1e8aac
      attr = list->data;
Packit 1e8aac
Packit 1e8aac
      g_value_unset (&(attr->value));
Packit 1e8aac
      g_free (attr);
Packit 1e8aac
    }
Packit 1e8aac
  g_list_free (attrs);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
GType
Packit 1e8aac
glade_attr_glist_get_type (void)
Packit 1e8aac
{
Packit 1e8aac
  static GType type_id = 0;
Packit 1e8aac
Packit 1e8aac
  if (!type_id)
Packit 1e8aac
    type_id = g_boxed_type_register_static
Packit 1e8aac
        ("GladeAttrGList",
Packit 1e8aac
         (GBoxedCopyFunc) glade_attr_list_copy,
Packit 1e8aac
         (GBoxedFreeFunc) glade_attr_list_free);
Packit 1e8aac
  return type_id;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/**************************************************************
Packit 1e8aac
 *              GladeEditorProperty stuff here
Packit 1e8aac
 **************************************************************/
Packit 1e8aac
typedef struct
Packit 1e8aac
{
Packit 1e8aac
  GladeEditorProperty parent_instance;
Packit 1e8aac
Packit 1e8aac
  GtkTreeModel *model;
Packit 1e8aac
Packit 1e8aac
} GladeEPropAttrs;
Packit 1e8aac
Packit 1e8aac
GLADE_MAKE_EPROP (GladeEPropAttrs, glade_eprop_attrs)
Packit 1e8aac
#define GLADE_EPROP_ATTRS(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EPROP_ATTRS, GladeEPropAttrs))
Packit 1e8aac
#define GLADE_EPROP_ATTRS_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EPROP_ATTRS, GladeEPropAttrsClass))
Packit 1e8aac
#define GLADE_IS_EPROP_ATTRS(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EPROP_ATTRS))
Packit 1e8aac
#define GLADE_IS_EPROP_ATTRS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GLADE_TYPE_EPROP_ATTRS))
Packit 1e8aac
#define GLADE_EPROP_ATTRS_GET_CLASS(o)    (G_TYPE_INSTANCE_GET_CLASS ((o), GLADE_EPROP_ATTRS, GladeEPropAttrsClass))
Packit 1e8aac
enum
Packit 1e8aac
{
Packit 1e8aac
Packit 1e8aac
  /* Main Data */
Packit 1e8aac
  COLUMN_NAME,             /* The title string for PangoAttrType */
Packit 1e8aac
  COLUMN_NAME_WEIGHT,      /* For bold names */
Packit 1e8aac
  COLUMN_TYPE,             /* The PangoAttrType */
Packit 1e8aac
  COLUMN_EDIT_TYPE,        /* The AttrEditType (below) */
Packit 1e8aac
  COLUMN_VALUE,            /* The value */
Packit 1e8aac
  COLUMN_START,            /* attribute start value */
Packit 1e8aac
  COLUMN_END,              /* attribute end value */
Packit 1e8aac
Packit 1e8aac
  /* Editor renderer related */
Packit 1e8aac
  COLUMN_TOGGLE_ACTIVE,    /* whether the toggle renderer is being used */
Packit 1e8aac
  COLUMN_TOGGLE_DOWN,      /* whether the toggle should be displayed in "downstate" */
Packit 1e8aac
Packit 1e8aac
  COLUMN_BUTTON_ACTIVE,    /* whether the GladeCellRendererButton is to be used (to launch dialogs) */
Packit 1e8aac
  COLUMN_TEXT,             /* text attribute value for all text derived renderers */
Packit 1e8aac
  COLUMN_TEXT_STYLE,       /* whether to make italic */
Packit 1e8aac
  COLUMN_TEXT_FG,          /* forground colour of the text */
Packit 1e8aac
  
Packit 1e8aac
  COLUMN_COMBO_ACTIVE,     /* whether the combobox renderer is being used */
Packit 1e8aac
  COLUMN_COMBO_MODEL,      /* the model for the dropdown list */
Packit 1e8aac
  
Packit 1e8aac
  COLUMN_SPIN_ACTIVE,      /* whether the spin renderer is being used */
Packit 1e8aac
  COLUMN_SPIN_DIGITS,      /* How many decimal points to show (used to edit float values) */
Packit 1e8aac
Packit 1e8aac
  NUM_COLUMNS
Packit 1e8aac
};
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
typedef enum
Packit 1e8aac
{
Packit 1e8aac
  EDIT_TOGGLE = 0,
Packit 1e8aac
  EDIT_COMBO,
Packit 1e8aac
  EDIT_SPIN,
Packit 1e8aac
  EDIT_COLOR,
Packit 1e8aac
  EDIT_FONT,
Packit 1e8aac
  EDIT_INVALID
Packit 1e8aac
} AttrEditType;
Packit 1e8aac
Packit 1e8aac
#define ACTIVATE_COLUMN_FROM_TYPE(type)                 \
Packit 1e8aac
	((type) == EDIT_TOGGLE ? COLUMN_TOGGLE_ACTIVE : \
Packit 1e8aac
	 (type) == EDIT_SPIN ? COLUMN_SPIN_ACTIVE :     \
Packit 1e8aac
	 (type) == EDIT_COMBO ? COLUMN_COMBO_ACTIVE: COLUMN_BUTTON_ACTIVE)
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
static GtkListStore *
Packit 1e8aac
get_enum_model_for_combo (PangoAttrType type)
Packit 1e8aac
{
Packit 1e8aac
  static GtkListStore *style_store = NULL,
Packit 1e8aac
      *weight_store = NULL, *variant_store = NULL,
Packit 1e8aac
      *stretch_store = NULL, *gravity_store = NULL,
Packit 1e8aac
      *gravity_hint_store = NULL, *default_store = NULL;
Packit 1e8aac
Packit 1e8aac
  switch (type)
Packit 1e8aac
    {
Packit 1e8aac
      case PANGO_ATTR_STYLE:
Packit 1e8aac
        if (!style_store)
Packit 1e8aac
          style_store =
Packit 1e8aac
              glade_utils_liststore_from_enum_type (PANGO_TYPE_STYLE, TRUE);
Packit 1e8aac
        return style_store;
Packit 1e8aac
Packit 1e8aac
      case PANGO_ATTR_WEIGHT:
Packit 1e8aac
        if (!weight_store)
Packit 1e8aac
          weight_store =
Packit 1e8aac
              glade_utils_liststore_from_enum_type (PANGO_TYPE_WEIGHT, TRUE);
Packit 1e8aac
        return weight_store;
Packit 1e8aac
Packit 1e8aac
      case PANGO_ATTR_VARIANT:
Packit 1e8aac
        if (!variant_store)
Packit 1e8aac
          variant_store =
Packit 1e8aac
              glade_utils_liststore_from_enum_type (PANGO_TYPE_VARIANT, TRUE);
Packit 1e8aac
        return variant_store;
Packit 1e8aac
Packit 1e8aac
      case PANGO_ATTR_STRETCH:
Packit 1e8aac
        if (!stretch_store)
Packit 1e8aac
          stretch_store =
Packit 1e8aac
              glade_utils_liststore_from_enum_type (PANGO_TYPE_STRETCH, TRUE);
Packit 1e8aac
        return stretch_store;
Packit 1e8aac
Packit 1e8aac
      case PANGO_ATTR_GRAVITY:
Packit 1e8aac
        if (!gravity_store)
Packit 1e8aac
          gravity_store =
Packit 1e8aac
              glade_utils_liststore_from_enum_type (PANGO_TYPE_GRAVITY, TRUE);
Packit 1e8aac
        return gravity_store;
Packit 1e8aac
Packit 1e8aac
      case PANGO_ATTR_GRAVITY_HINT:
Packit 1e8aac
        if (!gravity_hint_store)
Packit 1e8aac
          gravity_hint_store =
Packit 1e8aac
              glade_utils_liststore_from_enum_type (PANGO_TYPE_GRAVITY_HINT,
Packit 1e8aac
                                                    TRUE);
Packit 1e8aac
        return gravity_hint_store;
Packit 1e8aac
Packit 1e8aac
      default:
Packit 1e8aac
        if (!default_store)
Packit 1e8aac
          default_store = gtk_list_store_new (1, G_TYPE_STRING);
Packit 1e8aac
        return default_store;
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gboolean
Packit 1e8aac
append_empty_row (GtkListStore *store, PangoAttrType type)
Packit 1e8aac
{
Packit 1e8aac
  const gchar *name = NULL;
Packit 1e8aac
  guint spin_digits = 0;
Packit 1e8aac
  GtkListStore *model = get_enum_model_for_combo (type);
Packit 1e8aac
  GtkTreeIter iter;
Packit 1e8aac
  AttrEditType edit_type = EDIT_INVALID;
Packit 1e8aac
Packit 1e8aac
  switch (type)
Packit 1e8aac
    {
Packit 1e8aac
        /* PangoAttrLanguage */
Packit 1e8aac
      case PANGO_ATTR_LANGUAGE:
Packit 1e8aac
Packit 1e8aac
        break;
Packit 1e8aac
        /* PangoAttrInt */
Packit 1e8aac
      case PANGO_ATTR_STYLE:
Packit 1e8aac
        edit_type = EDIT_COMBO;
Packit 1e8aac
        name = C_ ("textattr", "Style");
Packit 1e8aac
        break;
Packit 1e8aac
      case PANGO_ATTR_WEIGHT:
Packit 1e8aac
        edit_type = EDIT_COMBO;
Packit 1e8aac
        name = C_ ("textattr", "Weight");
Packit 1e8aac
        break;
Packit 1e8aac
      case PANGO_ATTR_VARIANT:
Packit 1e8aac
        edit_type = EDIT_COMBO;
Packit 1e8aac
        name = C_ ("textattr", "Variant");
Packit 1e8aac
        break;
Packit 1e8aac
      case PANGO_ATTR_STRETCH:
Packit 1e8aac
        edit_type = EDIT_COMBO;
Packit 1e8aac
        name = C_ ("textattr", "Stretch");
Packit 1e8aac
        break;
Packit 1e8aac
      case PANGO_ATTR_UNDERLINE:
Packit 1e8aac
        edit_type = EDIT_TOGGLE;
Packit 1e8aac
        name = C_ ("textattr", "Underline");
Packit 1e8aac
        break;
Packit 1e8aac
      case PANGO_ATTR_STRIKETHROUGH:
Packit 1e8aac
        edit_type = EDIT_TOGGLE;
Packit 1e8aac
        name = C_ ("textattr", "Strikethrough");
Packit 1e8aac
        break;
Packit 1e8aac
      case PANGO_ATTR_GRAVITY:
Packit 1e8aac
        edit_type = EDIT_COMBO;
Packit 1e8aac
        name = C_ ("textattr", "Gravity");
Packit 1e8aac
        break;
Packit 1e8aac
      case PANGO_ATTR_GRAVITY_HINT:
Packit 1e8aac
        edit_type = EDIT_COMBO;
Packit 1e8aac
        name = C_ ("textattr", "Gravity Hint");
Packit 1e8aac
        break;
Packit 1e8aac
Packit 1e8aac
        /* PangoAttrString */
Packit 1e8aac
      case PANGO_ATTR_FAMILY:
Packit 1e8aac
        /* Use a simple editable text renderer ? */
Packit 1e8aac
        break;
Packit 1e8aac
Packit 1e8aac
        /* PangoAttrSize */
Packit 1e8aac
      case PANGO_ATTR_SIZE:
Packit 1e8aac
        edit_type = EDIT_SPIN;
Packit 1e8aac
        name = C_ ("textattr", "Size");
Packit 1e8aac
        break;
Packit 1e8aac
      case PANGO_ATTR_ABSOLUTE_SIZE:
Packit 1e8aac
        edit_type = EDIT_SPIN;
Packit 1e8aac
        name = C_ ("textattr", "Absolute Size");
Packit 1e8aac
        break;
Packit 1e8aac
Packit 1e8aac
        /* PangoAttrColor */
Packit 1e8aac
        /* Colours need editors... */
Packit 1e8aac
      case PANGO_ATTR_FOREGROUND:
Packit 1e8aac
        edit_type = EDIT_COLOR;
Packit 1e8aac
        name = C_ ("textattr", "Foreground Color");
Packit 1e8aac
        break;
Packit 1e8aac
      case PANGO_ATTR_BACKGROUND:
Packit 1e8aac
        edit_type = EDIT_COLOR;
Packit 1e8aac
        name = C_ ("textattr", "Background Color");
Packit 1e8aac
        break;
Packit 1e8aac
      case PANGO_ATTR_UNDERLINE_COLOR:
Packit 1e8aac
        edit_type = EDIT_COLOR;
Packit 1e8aac
        name = C_ ("textattr", "Underline Color");
Packit 1e8aac
        break;
Packit 1e8aac
      case PANGO_ATTR_STRIKETHROUGH_COLOR:
Packit 1e8aac
        edit_type = EDIT_COLOR;
Packit 1e8aac
        name = C_ ("textattr", "Strikethrough Color");
Packit 1e8aac
        break;
Packit 1e8aac
Packit 1e8aac
        /* PangoAttrShape */
Packit 1e8aac
      case PANGO_ATTR_SHAPE:
Packit 1e8aac
        /* Unsupported for now */
Packit 1e8aac
        break;
Packit 1e8aac
        /* PangoAttrFloat */
Packit 1e8aac
      case PANGO_ATTR_SCALE:
Packit 1e8aac
        edit_type = EDIT_SPIN;
Packit 1e8aac
        name = C_ ("textattr", "Scale");
Packit 1e8aac
        spin_digits = 3;
Packit 1e8aac
        break;
Packit 1e8aac
Packit 1e8aac
      case PANGO_ATTR_FONT_DESC:
Packit 1e8aac
        edit_type = EDIT_FONT;
Packit 1e8aac
        name = C_ ("textattr", "Font Description");
Packit 1e8aac
	break;
Packit 1e8aac
Packit 1e8aac
      case PANGO_ATTR_INVALID:
Packit 1e8aac
      case PANGO_ATTR_LETTER_SPACING:
Packit 1e8aac
      case PANGO_ATTR_RISE:
Packit 1e8aac
      case PANGO_ATTR_FALLBACK:
Packit 1e8aac
      default:
Packit 1e8aac
        break;
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  if (name)
Packit 1e8aac
    {
Packit 1e8aac
      gtk_list_store_append (store, &iter);
Packit 1e8aac
Packit 1e8aac
      gtk_list_store_set (store, &iter,
Packit 1e8aac
                          COLUMN_TOGGLE_ACTIVE, FALSE,
Packit 1e8aac
                          COLUMN_SPIN_ACTIVE, FALSE,
Packit 1e8aac
                          COLUMN_COMBO_ACTIVE, FALSE,
Packit 1e8aac
                          COLUMN_BUTTON_ACTIVE, FALSE, -1);
Packit 1e8aac
Packit 1e8aac
      gtk_list_store_set (store, &iter,
Packit 1e8aac
                          COLUMN_NAME, name,
Packit 1e8aac
                          COLUMN_TYPE, type,
Packit 1e8aac
                          COLUMN_EDIT_TYPE, edit_type,
Packit 1e8aac
                          COLUMN_NAME_WEIGHT, PANGO_WEIGHT_NORMAL,
Packit 1e8aac
                          COLUMN_TEXT, _("<Enter Value>"),
Packit 1e8aac
                          COLUMN_TEXT_STYLE, PANGO_STYLE_ITALIC,
Packit 1e8aac
                          COLUMN_TEXT_FG, "Grey",
Packit 1e8aac
                          COLUMN_COMBO_MODEL, model,
Packit 1e8aac
                          COLUMN_SPIN_DIGITS, spin_digits,
Packit 1e8aac
                          ACTIVATE_COLUMN_FROM_TYPE (edit_type), TRUE, -1);
Packit 1e8aac
      return TRUE;
Packit 1e8aac
    }
Packit 1e8aac
  return FALSE;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gboolean
Packit 1e8aac
is_empty_row (GtkTreeModel *model, GtkTreeIter *iter)
Packit 1e8aac
{
Packit 1e8aac
Packit 1e8aac
  PangoAttrType attr_type;
Packit 1e8aac
  AttrEditType edit_type;
Packit 1e8aac
  gboolean bval;
Packit 1e8aac
  gchar *strval = NULL;
Packit 1e8aac
  gboolean empty_row = FALSE;
Packit 1e8aac
Packit 1e8aac
  /* First get the basic values */
Packit 1e8aac
  gtk_tree_model_get (model, iter,
Packit 1e8aac
                      COLUMN_TYPE, &attr_type,
Packit 1e8aac
                      COLUMN_EDIT_TYPE, &edit_type,
Packit 1e8aac
                      COLUMN_TOGGLE_DOWN, &bval, COLUMN_TEXT, &strval, -1);
Packit 1e8aac
Packit 1e8aac
  /* Ignore all other types */
Packit 1e8aac
  switch (edit_type)
Packit 1e8aac
    {
Packit 1e8aac
      case EDIT_TOGGLE:
Packit 1e8aac
        if (!bval)
Packit 1e8aac
          empty_row = TRUE;
Packit 1e8aac
        break;
Packit 1e8aac
      case EDIT_COMBO:
Packit 1e8aac
        if (!strval || !strcmp (strval, _("Unset")) ||
Packit 1e8aac
            !strcmp (strval, _("<Enter Value>")))
Packit 1e8aac
          empty_row = TRUE;
Packit 1e8aac
        break;
Packit 1e8aac
      case EDIT_SPIN:
Packit 1e8aac
        /* XXX Interesting... can we get the defaults ? what can we do to let the user
Packit 1e8aac
         * unset the value ?? 
Packit 1e8aac
         */
Packit 1e8aac
        if (!strval || !strcmp (strval, "0") ||
Packit 1e8aac
            !strcmp (strval, _("<Enter Value>")))
Packit 1e8aac
          empty_row = TRUE;
Packit 1e8aac
        break;
Packit 1e8aac
      case EDIT_COLOR:
Packit 1e8aac
      case EDIT_FONT:
Packit 1e8aac
        if (!strval || strval[0] == '\0' ||
Packit 1e8aac
            !strcmp (strval, _("<Enter Value>")))
Packit 1e8aac
          empty_row = TRUE;
Packit 1e8aac
        break;
Packit 1e8aac
      case EDIT_INVALID:
Packit 1e8aac
      default:
Packit 1e8aac
        break;
Packit 1e8aac
    }
Packit 1e8aac
  g_free (strval);
Packit 1e8aac
Packit 1e8aac
  return empty_row;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static GType
Packit 1e8aac
type_from_attr_type (PangoAttrType type)
Packit 1e8aac
{
Packit 1e8aac
  GType gtype = 0;
Packit 1e8aac
Packit 1e8aac
  switch (type)
Packit 1e8aac
    {
Packit 1e8aac
      case PANGO_ATTR_LANGUAGE:
Packit 1e8aac
      case PANGO_ATTR_FAMILY:
Packit 1e8aac
      case PANGO_ATTR_FONT_DESC:
Packit 1e8aac
        return G_TYPE_STRING;
Packit 1e8aac
Packit 1e8aac
      case PANGO_ATTR_STYLE:
Packit 1e8aac
        return PANGO_TYPE_STYLE;
Packit 1e8aac
      case PANGO_ATTR_WEIGHT:
Packit 1e8aac
        return PANGO_TYPE_WEIGHT;
Packit 1e8aac
      case PANGO_ATTR_VARIANT:
Packit 1e8aac
        return PANGO_TYPE_VARIANT;
Packit 1e8aac
      case PANGO_ATTR_STRETCH:
Packit 1e8aac
        return PANGO_TYPE_STRETCH;
Packit 1e8aac
      case PANGO_ATTR_GRAVITY:
Packit 1e8aac
        return PANGO_TYPE_GRAVITY;
Packit 1e8aac
      case PANGO_ATTR_GRAVITY_HINT:
Packit 1e8aac
        return PANGO_TYPE_GRAVITY_HINT;
Packit 1e8aac
Packit 1e8aac
      case PANGO_ATTR_UNDERLINE:
Packit 1e8aac
      case PANGO_ATTR_STRIKETHROUGH:
Packit 1e8aac
        return G_TYPE_BOOLEAN;
Packit 1e8aac
Packit 1e8aac
      case PANGO_ATTR_SIZE:
Packit 1e8aac
      case PANGO_ATTR_ABSOLUTE_SIZE:
Packit 1e8aac
        return G_TYPE_INT;
Packit 1e8aac
Packit 1e8aac
      case PANGO_ATTR_SCALE:
Packit 1e8aac
        return G_TYPE_DOUBLE;
Packit 1e8aac
Packit 1e8aac
        /* PangoAttrColor */
Packit 1e8aac
      case PANGO_ATTR_FOREGROUND:
Packit 1e8aac
      case PANGO_ATTR_BACKGROUND:
Packit 1e8aac
      case PANGO_ATTR_UNDERLINE_COLOR:
Packit 1e8aac
      case PANGO_ATTR_STRIKETHROUGH_COLOR:
Packit 1e8aac
        /* boxed colours */
Packit 1e8aac
        return GDK_TYPE_COLOR;
Packit 1e8aac
Packit 1e8aac
        /* PangoAttrShape */
Packit 1e8aac
      case PANGO_ATTR_SHAPE:
Packit 1e8aac
        /* Unsupported for now */
Packit 1e8aac
        break;
Packit 1e8aac
Packit 1e8aac
      case PANGO_ATTR_INVALID:
Packit 1e8aac
      case PANGO_ATTR_LETTER_SPACING:
Packit 1e8aac
      case PANGO_ATTR_RISE:
Packit 1e8aac
      case PANGO_ATTR_FALLBACK:
Packit 1e8aac
      default:
Packit 1e8aac
        break;
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  return gtype;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
gchar *
Packit 1e8aac
glade_gtk_string_from_attr (GladeAttribute *gattr)
Packit 1e8aac
{
Packit 1e8aac
  gchar *ret = NULL;
Packit 1e8aac
  gint ival;
Packit 1e8aac
  gdouble fval;
Packit 1e8aac
  GdkColor *color;
Packit 1e8aac
Packit 1e8aac
  switch (gattr->type)
Packit 1e8aac
    {
Packit 1e8aac
      case PANGO_ATTR_LANGUAGE:
Packit 1e8aac
      case PANGO_ATTR_FAMILY:
Packit 1e8aac
      case PANGO_ATTR_FONT_DESC:
Packit 1e8aac
        ret = g_value_dup_string (&(gattr->value));
Packit 1e8aac
        break;
Packit 1e8aac
Packit 1e8aac
      case PANGO_ATTR_STYLE:
Packit 1e8aac
      case PANGO_ATTR_WEIGHT:
Packit 1e8aac
      case PANGO_ATTR_VARIANT:
Packit 1e8aac
      case PANGO_ATTR_STRETCH:
Packit 1e8aac
      case PANGO_ATTR_GRAVITY:
Packit 1e8aac
      case PANGO_ATTR_GRAVITY_HINT:
Packit 1e8aac
Packit 1e8aac
        /* Enums ... */
Packit 1e8aac
        ival = g_value_get_enum (&(gattr->value));
Packit 1e8aac
        ret =
Packit 1e8aac
            glade_utils_enum_string_from_value (G_VALUE_TYPE (&(gattr->value)),
Packit 1e8aac
                                                ival);
Packit 1e8aac
        break;
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
      case PANGO_ATTR_UNDERLINE:
Packit 1e8aac
      case PANGO_ATTR_STRIKETHROUGH:
Packit 1e8aac
        /* Booleans */
Packit 1e8aac
        if (g_value_get_boolean (&(gattr->value)))
Packit 1e8aac
          ret = g_strdup_printf ("True");
Packit 1e8aac
        else
Packit 1e8aac
          ret = g_strdup_printf ("False");
Packit 1e8aac
        break;
Packit 1e8aac
Packit 1e8aac
        /* PangoAttrSize */
Packit 1e8aac
      case PANGO_ATTR_SIZE:
Packit 1e8aac
      case PANGO_ATTR_ABSOLUTE_SIZE:
Packit 1e8aac
        /* ints */
Packit 1e8aac
        ival = g_value_get_int (&(gattr->value));
Packit 1e8aac
        ret = g_strdup_printf ("%d", ival);
Packit 1e8aac
        break;
Packit 1e8aac
Packit 1e8aac
        /* PangoAttrFloat */
Packit 1e8aac
      case PANGO_ATTR_SCALE: {
Packit 1e8aac
        /* doubles */
Packit 1e8aac
        gchar buf[G_ASCII_DTOSTR_BUF_SIZE];
Packit 1e8aac
Packit 1e8aac
        fval = g_value_get_double (&(gattr->value));
Packit 1e8aac
        ret = g_strdup (g_ascii_dtostr (buf, sizeof (buf), fval));
Packit 1e8aac
        break;
Packit 1e8aac
      }
Packit 1e8aac
        /* PangoAttrColor */
Packit 1e8aac
      case PANGO_ATTR_FOREGROUND:
Packit 1e8aac
      case PANGO_ATTR_BACKGROUND:
Packit 1e8aac
      case PANGO_ATTR_UNDERLINE_COLOR:
Packit 1e8aac
      case PANGO_ATTR_STRIKETHROUGH_COLOR:
Packit 1e8aac
        /* boxed colours */
Packit 1e8aac
        color = g_value_get_boxed (&(gattr->value));
Packit 1e8aac
        ret = gdk_color_to_string (color);
Packit 1e8aac
        break;
Packit 1e8aac
Packit 1e8aac
        /* PangoAttrShape */
Packit 1e8aac
      case PANGO_ATTR_SHAPE:
Packit 1e8aac
        /* Unsupported for now */
Packit 1e8aac
        break;
Packit 1e8aac
Packit 1e8aac
      case PANGO_ATTR_INVALID:
Packit 1e8aac
      case PANGO_ATTR_LETTER_SPACING:
Packit 1e8aac
      case PANGO_ATTR_RISE:
Packit 1e8aac
      case PANGO_ATTR_FALLBACK:
Packit 1e8aac
      default:
Packit 1e8aac
        break;
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  return ret;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
GladeAttribute *
Packit 1e8aac
glade_gtk_attribute_from_string (PangoAttrType type, const gchar *strval)
Packit 1e8aac
{
Packit 1e8aac
  GladeAttribute *gattr;
Packit 1e8aac
  GdkColor color;
Packit 1e8aac
Packit 1e8aac
  gattr = g_new0 (GladeAttribute, 1);
Packit 1e8aac
  gattr->type = type;
Packit 1e8aac
  gattr->start = 0;
Packit 1e8aac
  gattr->end = G_MAXUINT;
Packit 1e8aac
Packit 1e8aac
  switch (type)
Packit 1e8aac
    {
Packit 1e8aac
      case PANGO_ATTR_LANGUAGE:
Packit 1e8aac
      case PANGO_ATTR_FAMILY:
Packit 1e8aac
      case PANGO_ATTR_FONT_DESC:
Packit 1e8aac
        g_value_init (&(gattr->value), G_TYPE_STRING);
Packit 1e8aac
        g_value_set_string (&(gattr->value), strval);
Packit 1e8aac
        break;
Packit 1e8aac
Packit 1e8aac
      case PANGO_ATTR_STYLE:
Packit 1e8aac
      case PANGO_ATTR_WEIGHT:
Packit 1e8aac
      case PANGO_ATTR_VARIANT:
Packit 1e8aac
      case PANGO_ATTR_STRETCH:
Packit 1e8aac
      case PANGO_ATTR_GRAVITY:
Packit 1e8aac
      case PANGO_ATTR_GRAVITY_HINT:
Packit 1e8aac
Packit 1e8aac
        /* Enums ... */
Packit 1e8aac
        g_value_init (&(gattr->value), type_from_attr_type (type));
Packit 1e8aac
        g_value_set_enum (&(gattr->value),
Packit 1e8aac
                          glade_utils_enum_value_from_string (type_from_attr_type (type), strval));
Packit 1e8aac
        break;
Packit 1e8aac
Packit 1e8aac
      case PANGO_ATTR_UNDERLINE:
Packit 1e8aac
      case PANGO_ATTR_STRIKETHROUGH:
Packit 1e8aac
        /* Booleans */
Packit 1e8aac
        g_value_init (&(gattr->value), G_TYPE_BOOLEAN);
Packit 1e8aac
        g_value_set_boolean (&(gattr->value), TRUE);
Packit 1e8aac
        break;
Packit 1e8aac
Packit 1e8aac
        /* PangoAttrSize */
Packit 1e8aac
      case PANGO_ATTR_SIZE:
Packit 1e8aac
      case PANGO_ATTR_ABSOLUTE_SIZE:
Packit 1e8aac
        /* ints */
Packit 1e8aac
        g_value_init (&(gattr->value), G_TYPE_INT);
Packit 1e8aac
        g_value_set_int (&(gattr->value), strtol (strval, NULL, 10));
Packit 1e8aac
        break;
Packit 1e8aac
Packit 1e8aac
        /* PangoAttrFloat */
Packit 1e8aac
      case PANGO_ATTR_SCALE:
Packit 1e8aac
        /* doubles */
Packit 1e8aac
        g_value_init (&(gattr->value), G_TYPE_DOUBLE);
Packit 1e8aac
        g_value_set_double (&(gattr->value), g_ascii_strtod (strval, NULL));
Packit 1e8aac
        break;
Packit 1e8aac
Packit 1e8aac
        /* PangoAttrColor */
Packit 1e8aac
      case PANGO_ATTR_FOREGROUND:
Packit 1e8aac
      case PANGO_ATTR_BACKGROUND:
Packit 1e8aac
      case PANGO_ATTR_UNDERLINE_COLOR:
Packit 1e8aac
      case PANGO_ATTR_STRIKETHROUGH_COLOR:
Packit 1e8aac
        /* boxed colours */
Packit 1e8aac
        if (gdk_color_parse (strval, &color))
Packit 1e8aac
          {
Packit 1e8aac
            g_value_init (&(gattr->value), GDK_TYPE_COLOR);
Packit 1e8aac
            g_value_set_boxed (&(gattr->value), &color;;
Packit 1e8aac
          }
Packit 1e8aac
        else
Packit 1e8aac
          g_critical ("Unable to parse color attribute '%s'", strval);
Packit 1e8aac
Packit 1e8aac
        break;
Packit 1e8aac
Packit 1e8aac
        /* PangoAttrShape */
Packit 1e8aac
      case PANGO_ATTR_SHAPE:
Packit 1e8aac
        /* Unsupported for now */
Packit 1e8aac
        break;
Packit 1e8aac
Packit 1e8aac
      case PANGO_ATTR_INVALID:
Packit 1e8aac
      case PANGO_ATTR_LETTER_SPACING:
Packit 1e8aac
      case PANGO_ATTR_RISE:
Packit 1e8aac
      case PANGO_ATTR_FALLBACK:
Packit 1e8aac
      default:
Packit 1e8aac
        break;
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  return gattr;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
sync_object (GladeEPropAttrs *eprop_attrs, gboolean use_command)
Packit 1e8aac
{
Packit 1e8aac
  GList *attributes = NULL;
Packit 1e8aac
  GladeAttribute *gattr;
Packit 1e8aac
  GtkTreeIter iter;
Packit 1e8aac
  PangoAttrType type;
Packit 1e8aac
  AttrEditType edit_type;
Packit 1e8aac
  gchar *strval = NULL;
Packit 1e8aac
  gboolean valid;
Packit 1e8aac
Packit 1e8aac
  valid = gtk_tree_model_iter_children (eprop_attrs->model, &iter, NULL);
Packit 1e8aac
Packit 1e8aac
  while (valid)
Packit 1e8aac
    {
Packit 1e8aac
      if (!is_empty_row (eprop_attrs->model, &iter))
Packit 1e8aac
        {
Packit 1e8aac
          gtk_tree_model_get (eprop_attrs->model, &iter,
Packit 1e8aac
                              COLUMN_TYPE, &type,
Packit 1e8aac
                              COLUMN_EDIT_TYPE, &edit_type,
Packit 1e8aac
                              COLUMN_TEXT, &strval, -1);
Packit 1e8aac
Packit 1e8aac
          gattr =
Packit 1e8aac
              glade_gtk_attribute_from_string (type,
Packit 1e8aac
                                               (edit_type ==
Packit 1e8aac
                                                EDIT_TOGGLE) ? "" : strval);
Packit 1e8aac
          strval = (g_free (strval), NULL);
Packit 1e8aac
Packit 1e8aac
          attributes = g_list_prepend (attributes, gattr);
Packit 1e8aac
Packit 1e8aac
        }
Packit 1e8aac
      valid = gtk_tree_model_iter_next (eprop_attrs->model, &iter);
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  if (use_command)
Packit 1e8aac
    {
Packit 1e8aac
      GValue value = { 0, };
Packit 1e8aac
Packit 1e8aac
      g_value_init (&value, GLADE_TYPE_ATTR_GLIST);
Packit 1e8aac
      g_value_take_boxed (&value, g_list_reverse (attributes));
Packit 1e8aac
      glade_editor_property_commit (GLADE_EDITOR_PROPERTY (eprop_attrs),
Packit 1e8aac
                                    &value);
Packit 1e8aac
      g_value_unset (&value);
Packit 1e8aac
    }
Packit 1e8aac
  else
Packit 1e8aac
    {
Packit 1e8aac
      GladeProperty *property = 
Packit 1e8aac
	glade_editor_property_get_property (GLADE_EDITOR_PROPERTY (eprop_attrs));
Packit 1e8aac
Packit 1e8aac
      glade_property_set (property, g_list_reverse (attributes));
Packit 1e8aac
      glade_attr_list_free (attributes);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
static GtkTreeIter *
Packit 1e8aac
get_row_by_type (GtkTreeModel *model, PangoAttrType type)
Packit 1e8aac
{
Packit 1e8aac
  GtkTreeIter iter, *ret_iter = NULL;
Packit 1e8aac
  gboolean valid;
Packit 1e8aac
  PangoAttrType iter_type;
Packit 1e8aac
Packit 1e8aac
  valid = gtk_tree_model_iter_children (model, &iter, NULL);
Packit 1e8aac
Packit 1e8aac
  while (valid)
Packit 1e8aac
    {
Packit 1e8aac
      gtk_tree_model_get (model, &iter, COLUMN_TYPE, &iter_type, -1);
Packit 1e8aac
Packit 1e8aac
      if (iter_type == type)
Packit 1e8aac
        {
Packit 1e8aac
          ret_iter = gtk_tree_iter_copy (&iter);
Packit 1e8aac
          break;
Packit 1e8aac
        }
Packit 1e8aac
      valid = gtk_tree_model_iter_next (model, &iter);
Packit 1e8aac
    }
Packit 1e8aac
  return ret_iter;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
value_icon_activate (GtkCellRendererToggle *cell_renderer,
Packit 1e8aac
                     gchar *path,
Packit 1e8aac
                     GladeEPropAttrs *eprop_attrs)
Packit 1e8aac
{
Packit 1e8aac
  GtkWidget *dialog;
Packit 1e8aac
  GtkTreeIter iter;
Packit 1e8aac
  PangoAttrType type;
Packit 1e8aac
  AttrEditType edit_type;
Packit 1e8aac
  GdkRGBA color = {0,};
Packit 1e8aac
  gchar *text = NULL, *new_text;
Packit 1e8aac
Packit 1e8aac
  /* Find type etc */
Packit 1e8aac
  if (!gtk_tree_model_get_iter_from_string (eprop_attrs->model, &iter, path))
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  gtk_tree_model_get (eprop_attrs->model, &iter,
Packit 1e8aac
                      COLUMN_TEXT, &text,
Packit 1e8aac
                      COLUMN_TYPE, &type, 
Packit 1e8aac
		      COLUMN_EDIT_TYPE, &edit_type, -1);
Packit 1e8aac
Packit 1e8aac
  /* Launch dialog etc. */
Packit 1e8aac
  switch (edit_type)
Packit 1e8aac
    {
Packit 1e8aac
      case EDIT_COLOR:
Packit 1e8aac
        dialog = gtk_color_chooser_dialog_new (_("Select a color"),
Packit 1e8aac
                                               GTK_WINDOW (glade_app_get_window ()));
Packit 1e8aac
        /* Get response etc... */
Packit 1e8aac
        if (text && gdk_rgba_parse (&color, text))
Packit 1e8aac
          gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (dialog), &color;;
Packit 1e8aac
Packit 1e8aac
        if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK)
Packit 1e8aac
          {
Packit 1e8aac
            gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (dialog), &color;;
Packit 1e8aac
            /* Use GdkColor string format */
Packit 1e8aac
            if (((guint8)(color.red * 0xFF)) * 0x101 == (guint16)(color.red * 0xFFFF) &&
Packit 1e8aac
                ((guint8)(color.green * 0xFF)) * 0x101 == (guint16)(color.green * 0xFFFF) &&
Packit 1e8aac
                ((guint8)(color.blue * 0xFF)) * 0x101 == (guint16)(color.blue * 0xFFFF))
Packit 1e8aac
              new_text = g_strdup_printf ("#%02X%02X%02X",
Packit 1e8aac
                                          (guint8)(color.red * 0xFF),
Packit 1e8aac
                                          (guint8)(color.green * 0xFF),
Packit 1e8aac
                                          (guint8)(color.blue * 0xFF));
Packit 1e8aac
            else
Packit 1e8aac
              new_text = g_strdup_printf ("#%04X%04X%04X",
Packit 1e8aac
                                          (guint16)(color.red * 0xFFFF),
Packit 1e8aac
                                          (guint16)(color.green * 0xFFFF),
Packit 1e8aac
                                          (guint16)(color.blue * 0xFFFF));
Packit 1e8aac
Packit 1e8aac
            gtk_list_store_set (GTK_LIST_STORE (eprop_attrs->model), &iter,
Packit 1e8aac
                                COLUMN_TEXT, new_text,
Packit 1e8aac
                                COLUMN_NAME_WEIGHT, PANGO_WEIGHT_BOLD,
Packit 1e8aac
                                COLUMN_TEXT_STYLE, PANGO_STYLE_NORMAL,
Packit 1e8aac
                                COLUMN_TEXT_FG, "Black", -1);
Packit 1e8aac
            g_free (new_text);
Packit 1e8aac
          }
Packit 1e8aac
Packit 1e8aac
        gtk_widget_destroy (dialog);
Packit 1e8aac
        break;
Packit 1e8aac
Packit 1e8aac
      case EDIT_FONT:
Packit 1e8aac
        dialog = gtk_font_chooser_dialog_new (_("Select a font"),
Packit 1e8aac
                                              GTK_WINDOW (glade_app_get_window ()));
Packit 1e8aac
Packit 1e8aac
        /* Get response etc... */
Packit 1e8aac
        if (text)
Packit 1e8aac
          gtk_font_chooser_set_font (GTK_FONT_CHOOSER (dialog), text);
Packit 1e8aac
Packit 1e8aac
        if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK)
Packit 1e8aac
          {
Packit 1e8aac
            new_text = gtk_font_chooser_get_font (GTK_FONT_CHOOSER (dialog));
Packit 1e8aac
Packit 1e8aac
            gtk_list_store_set (GTK_LIST_STORE (eprop_attrs->model), &iter,
Packit 1e8aac
                                COLUMN_TEXT, new_text,
Packit 1e8aac
                                COLUMN_NAME_WEIGHT, PANGO_WEIGHT_BOLD,
Packit 1e8aac
                                COLUMN_TEXT_STYLE, PANGO_STYLE_NORMAL,
Packit 1e8aac
                                COLUMN_TEXT_FG, "Black", -1);
Packit 1e8aac
            g_free (new_text);
Packit 1e8aac
Packit 1e8aac
          }
Packit 1e8aac
        gtk_widget_destroy (dialog);
Packit 1e8aac
        break;
Packit 1e8aac
Packit 1e8aac
      default:
Packit 1e8aac
        break;
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  sync_object (eprop_attrs, FALSE);
Packit 1e8aac
Packit 1e8aac
  g_free (text);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
value_toggled (GtkCellRendererToggle *cell_renderer,
Packit 1e8aac
               gchar *path,
Packit 1e8aac
               GladeEPropAttrs *eprop_attrs)
Packit 1e8aac
{
Packit 1e8aac
  gboolean active;
Packit 1e8aac
  GtkTreeIter iter;
Packit 1e8aac
  PangoAttrType type;
Packit 1e8aac
Packit 1e8aac
  if (!gtk_tree_model_get_iter_from_string (eprop_attrs->model, &iter, path))
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  gtk_tree_model_get (eprop_attrs->model, &iter,
Packit 1e8aac
                      COLUMN_TOGGLE_DOWN, &active, COLUMN_TYPE, &type, -1);
Packit 1e8aac
Packit 1e8aac
  gtk_list_store_set (GTK_LIST_STORE (eprop_attrs->model), &iter,
Packit 1e8aac
                      COLUMN_NAME_WEIGHT, PANGO_WEIGHT_BOLD,
Packit 1e8aac
                      COLUMN_TOGGLE_DOWN, !active, -1);
Packit 1e8aac
Packit 1e8aac
  sync_object (eprop_attrs, FALSE);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
value_combo_spin_edited (GtkCellRendererText *cell,
Packit 1e8aac
                         const gchar *path,
Packit 1e8aac
                         const gchar *new_text,
Packit 1e8aac
                         GladeEPropAttrs *eprop_attrs)
Packit 1e8aac
{
Packit 1e8aac
  GtkTreeIter iter;
Packit 1e8aac
  PangoAttrType type;
Packit 1e8aac
Packit 1e8aac
  if (!gtk_tree_model_get_iter_from_string (eprop_attrs->model, &iter, path))
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  gtk_tree_model_get (eprop_attrs->model, &iter, COLUMN_TYPE, &type, -1);
Packit 1e8aac
Packit 1e8aac
  /* Reset the column */
Packit 1e8aac
  if (new_text && (*new_text == '\0' || strcmp (new_text, _("None")) == 0))
Packit 1e8aac
    {
Packit 1e8aac
      gtk_list_store_set (GTK_LIST_STORE (eprop_attrs->model), &iter,
Packit 1e8aac
                          COLUMN_TEXT, _("<Enter Value>"),
Packit 1e8aac
                          COLUMN_NAME_WEIGHT, PANGO_WEIGHT_NORMAL,
Packit 1e8aac
                          COLUMN_TEXT_STYLE, PANGO_STYLE_ITALIC,
Packit 1e8aac
                          COLUMN_TEXT_FG, "Grey", -1);
Packit 1e8aac
    }
Packit 1e8aac
  else
Packit 1e8aac
    gtk_list_store_set (GTK_LIST_STORE (eprop_attrs->model), &iter,
Packit 1e8aac
                        COLUMN_TEXT, new_text,
Packit 1e8aac
                        COLUMN_NAME_WEIGHT, PANGO_WEIGHT_BOLD,
Packit 1e8aac
                        COLUMN_TEXT_STYLE, PANGO_STYLE_NORMAL,
Packit 1e8aac
                        COLUMN_TEXT_FG, "Black", -1);
Packit 1e8aac
Packit 1e8aac
  sync_object (eprop_attrs, FALSE);
Packit 1e8aac
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
value_combo_spin_editing_started (GtkCellRenderer *cell,
Packit 1e8aac
                                  GtkCellEditable *editable,
Packit 1e8aac
                                  const gchar     *path)
Packit 1e8aac
{
Packit 1e8aac
  if (GTK_IS_SPIN_BUTTON (editable))
Packit 1e8aac
    gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (editable), TRUE);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static GtkWidget *
Packit 1e8aac
glade_eprop_attrs_view (GladeEditorProperty *eprop)
Packit 1e8aac
{
Packit 1e8aac
  GladeEPropAttrs *eprop_attrs = GLADE_EPROP_ATTRS (eprop);
Packit 1e8aac
  GtkWidget *view_widget;
Packit 1e8aac
  GtkCellRenderer *renderer;
Packit 1e8aac
  GtkTreeViewColumn *column;
Packit 1e8aac
  GtkAdjustment *adjustment;
Packit 1e8aac
Packit 1e8aac
  eprop_attrs->model = (GtkTreeModel *) 
Packit 1e8aac
    gtk_list_store_new (NUM_COLUMNS,
Packit 1e8aac
			/* Main Data */
Packit 1e8aac
			G_TYPE_STRING,      // COLUMN_NAME
Packit 1e8aac
			G_TYPE_INT, // COLUMN_NAME_WEIGHT
Packit 1e8aac
			G_TYPE_INT, // COLUMN_TYPE
Packit 1e8aac
			G_TYPE_INT, // COLUMN_EDIT_TYPE
Packit 1e8aac
			G_TYPE_POINTER,     // COLUMN_VALUE
Packit 1e8aac
			G_TYPE_UINT,        // COLUMN_START
Packit 1e8aac
			G_TYPE_UINT,        // COLUMN_END
Packit 1e8aac
			/* Editor renderer related */
Packit 1e8aac
			G_TYPE_BOOLEAN,     // COLUMN_TOGGLE_ACTIVE
Packit 1e8aac
			G_TYPE_BOOLEAN,     // COLUMN_TOGGLE_DOWN
Packit 1e8aac
			G_TYPE_BOOLEAN,     // COLUMN_BUTTON_ACTIVE
Packit 1e8aac
			G_TYPE_STRING,      // COLUMN_TEXT
Packit 1e8aac
			G_TYPE_INT, // COLUMN_TEXT_STYLE
Packit 1e8aac
			G_TYPE_STRING,      // COLUMN_TEXT_FG
Packit 1e8aac
			G_TYPE_BOOLEAN,     // COLUMN_COMBO_ACTIVE
Packit 1e8aac
			GTK_TYPE_LIST_STORE,        // COLUMN_COMBO_MODEL
Packit 1e8aac
			G_TYPE_BOOLEAN,     // COLUMN_SPIN_ACTIVE
Packit 1e8aac
			G_TYPE_UINT);       // COLUMN_SPIN_DIGITS
Packit 1e8aac
  
Packit 1e8aac
  view_widget = gtk_tree_view_new_with_model (eprop_attrs->model);
Packit 1e8aac
  gtk_tree_view_set_show_expanders (GTK_TREE_VIEW (view_widget), FALSE);
Packit 1e8aac
  gtk_tree_view_set_enable_search (GTK_TREE_VIEW (view_widget), FALSE);
Packit 1e8aac
Packit 1e8aac
  /********************* attribute name column *********************/
Packit 1e8aac
  renderer = gtk_cell_renderer_text_new ();
Packit 1e8aac
  g_object_set (G_OBJECT (renderer), "editable", FALSE, NULL);
Packit 1e8aac
  column = gtk_tree_view_column_new_with_attributes
Packit 1e8aac
      (_("Attribute"), renderer,
Packit 1e8aac
       "text", COLUMN_NAME, "weight", COLUMN_NAME_WEIGHT, NULL);
Packit 1e8aac
Packit 1e8aac
  gtk_tree_view_column_set_expand (GTK_TREE_VIEW_COLUMN (column), TRUE);
Packit 1e8aac
  gtk_tree_view_append_column (GTK_TREE_VIEW (view_widget), column);
Packit 1e8aac
Packit 1e8aac
  /********************* attribute value column *********************/
Packit 1e8aac
  column = gtk_tree_view_column_new ();
Packit 1e8aac
  gtk_tree_view_column_set_title (column, _("Value"));
Packit 1e8aac
Packit 1e8aac
  /* Toggle renderer */
Packit 1e8aac
  renderer = gtk_cell_renderer_toggle_new ();
Packit 1e8aac
  gtk_tree_view_column_pack_start (column, renderer, FALSE);
Packit 1e8aac
  gtk_tree_view_column_set_attributes (column, renderer,
Packit 1e8aac
                                       "activatable", COLUMN_TOGGLE_ACTIVE,
Packit 1e8aac
                                       "visible", COLUMN_TOGGLE_ACTIVE,
Packit 1e8aac
                                       "active", COLUMN_TOGGLE_DOWN, NULL);
Packit 1e8aac
  g_signal_connect (G_OBJECT (renderer), "toggled",
Packit 1e8aac
                    G_CALLBACK (value_toggled), eprop);
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
  /* Text renderer */
Packit 1e8aac
  renderer = gtk_cell_renderer_text_new ();
Packit 1e8aac
  g_object_set (G_OBJECT (renderer), "editable", FALSE, NULL);
Packit 1e8aac
  gtk_tree_view_column_pack_start (column, renderer, FALSE);
Packit 1e8aac
  gtk_tree_view_column_set_attributes (column, renderer,
Packit 1e8aac
                                       "editable", COLUMN_BUTTON_ACTIVE,
Packit 1e8aac
                                       "visible", COLUMN_BUTTON_ACTIVE,
Packit 1e8aac
                                       "text", COLUMN_TEXT,
Packit 1e8aac
                                       "style", COLUMN_TEXT_STYLE,
Packit 1e8aac
                                       "foreground", COLUMN_TEXT_FG, NULL);
Packit 1e8aac
Packit 1e8aac
  /* Icon renderer */
Packit 1e8aac
  renderer = glade_cell_renderer_icon_new ();
Packit 1e8aac
  g_object_set (G_OBJECT (renderer), "icon-name", "gtk-edit", NULL);
Packit 1e8aac
  gtk_tree_view_column_pack_start (column, renderer, FALSE);
Packit 1e8aac
  gtk_tree_view_column_set_attributes (column, renderer,
Packit 1e8aac
                                       "activatable", COLUMN_BUTTON_ACTIVE,
Packit 1e8aac
                                       "visible", COLUMN_BUTTON_ACTIVE, NULL);
Packit 1e8aac
Packit 1e8aac
  g_signal_connect (G_OBJECT (renderer), "activate",
Packit 1e8aac
                    G_CALLBACK (value_icon_activate), eprop);
Packit 1e8aac
Packit 1e8aac
  /* Combo renderer */
Packit 1e8aac
  renderer = gtk_cell_renderer_combo_new ();
Packit 1e8aac
  g_object_set (G_OBJECT (renderer), "text-column", 0, "has-entry", FALSE,
Packit 1e8aac
                NULL);
Packit 1e8aac
  gtk_tree_view_column_pack_start (column, renderer, TRUE);
Packit 1e8aac
  gtk_tree_view_column_set_attributes (column, renderer,
Packit 1e8aac
                                       "editable", COLUMN_COMBO_ACTIVE,
Packit 1e8aac
                                       "visible", COLUMN_COMBO_ACTIVE,
Packit 1e8aac
                                       "model", COLUMN_COMBO_MODEL,
Packit 1e8aac
                                       "text", COLUMN_TEXT,
Packit 1e8aac
                                       "style", COLUMN_TEXT_STYLE,
Packit 1e8aac
                                       "foreground", COLUMN_TEXT_FG, NULL);
Packit 1e8aac
  g_signal_connect (G_OBJECT (renderer), "edited",
Packit 1e8aac
                    G_CALLBACK (value_combo_spin_edited), eprop);
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
  /* Spin renderer */
Packit 1e8aac
  renderer = gtk_cell_renderer_spin_new ();
Packit 1e8aac
  adjustment =
Packit 1e8aac
      (GtkAdjustment *) gtk_adjustment_new (0, -G_MAXDOUBLE, G_MAXDOUBLE, 100,
Packit 1e8aac
                                            100, 100);
Packit 1e8aac
  g_object_set (G_OBJECT (renderer), "adjustment", adjustment, NULL);
Packit 1e8aac
  gtk_tree_view_column_pack_start (column, renderer, TRUE);
Packit 1e8aac
  gtk_tree_view_column_set_attributes (column, renderer,
Packit 1e8aac
                                       "visible", COLUMN_SPIN_ACTIVE,
Packit 1e8aac
                                       "editable", COLUMN_SPIN_ACTIVE,
Packit 1e8aac
                                       "text", COLUMN_TEXT,
Packit 1e8aac
                                       "style", COLUMN_TEXT_STYLE,
Packit 1e8aac
                                       "foreground", COLUMN_TEXT_FG,
Packit 1e8aac
                                       "digits", COLUMN_SPIN_DIGITS, NULL);
Packit 1e8aac
  g_signal_connect (G_OBJECT (renderer), "edited",
Packit 1e8aac
                    G_CALLBACK (value_combo_spin_edited), eprop);
Packit 1e8aac
  g_signal_connect (G_OBJECT (renderer), "editing-started",
Packit 1e8aac
                    G_CALLBACK (value_combo_spin_editing_started), NULL);
Packit 1e8aac
Packit 1e8aac
  gtk_tree_view_column_set_expand (GTK_TREE_VIEW_COLUMN (column), TRUE);
Packit 1e8aac
  gtk_tree_view_append_column (GTK_TREE_VIEW (view_widget), column);
Packit 1e8aac
Packit 1e8aac
  return view_widget;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_eprop_attrs_populate_view (GladeEditorProperty *eprop, GtkTreeView *view)
Packit 1e8aac
{
Packit 1e8aac
  GList *attributes, *list;
Packit 1e8aac
  GtkListStore *model = (GtkListStore *) gtk_tree_view_get_model (view);
Packit 1e8aac
  GtkTreeIter *iter;
Packit 1e8aac
  GladeAttribute *gattr;
Packit 1e8aac
  GladeProperty *property;
Packit 1e8aac
  gchar *text;
Packit 1e8aac
Packit 1e8aac
  property   = glade_editor_property_get_property (eprop);
Packit 1e8aac
  attributes = g_value_get_boxed (glade_property_inline_value (property));
Packit 1e8aac
Packit 1e8aac
  append_empty_row (model, PANGO_ATTR_FONT_DESC);
Packit 1e8aac
  append_empty_row (model, PANGO_ATTR_STYLE);
Packit 1e8aac
  append_empty_row (model, PANGO_ATTR_WEIGHT);
Packit 1e8aac
  append_empty_row (model, PANGO_ATTR_VARIANT);
Packit 1e8aac
  append_empty_row (model, PANGO_ATTR_LANGUAGE);
Packit 1e8aac
  append_empty_row (model, PANGO_ATTR_STRETCH);
Packit 1e8aac
  append_empty_row (model, PANGO_ATTR_SCALE);
Packit 1e8aac
  append_empty_row (model, PANGO_ATTR_UNDERLINE);
Packit 1e8aac
  append_empty_row (model, PANGO_ATTR_STRIKETHROUGH);
Packit 1e8aac
  append_empty_row (model, PANGO_ATTR_FOREGROUND);
Packit 1e8aac
  append_empty_row (model, PANGO_ATTR_BACKGROUND);
Packit 1e8aac
  append_empty_row (model, PANGO_ATTR_UNDERLINE_COLOR);
Packit 1e8aac
  append_empty_row (model, PANGO_ATTR_STRIKETHROUGH_COLOR);
Packit 1e8aac
  append_empty_row (model, PANGO_ATTR_GRAVITY);
Packit 1e8aac
  append_empty_row (model, PANGO_ATTR_GRAVITY_HINT);
Packit 1e8aac
  append_empty_row (model, PANGO_ATTR_SIZE);
Packit 1e8aac
  append_empty_row (model, PANGO_ATTR_ABSOLUTE_SIZE);
Packit 1e8aac
  append_empty_row (model, PANGO_ATTR_SHAPE);
Packit 1e8aac
Packit 1e8aac
  /* XXX Populate here ...
Packit 1e8aac
   */
Packit 1e8aac
  for (list = attributes; list; list = list->next)
Packit 1e8aac
    {
Packit 1e8aac
      gattr = list->data;
Packit 1e8aac
Packit 1e8aac
      if ((iter = get_row_by_type (GTK_TREE_MODEL (model), gattr->type)))
Packit 1e8aac
        {
Packit 1e8aac
          text = glade_gtk_string_from_attr (gattr);
Packit 1e8aac
Packit 1e8aac
          gtk_list_store_set (GTK_LIST_STORE (model), iter,
Packit 1e8aac
                              COLUMN_NAME_WEIGHT, PANGO_WEIGHT_BOLD,
Packit 1e8aac
                              COLUMN_TEXT, text,
Packit 1e8aac
                              COLUMN_TEXT_STYLE, PANGO_STYLE_NORMAL,
Packit 1e8aac
                              COLUMN_TEXT_FG, "Black", -1);
Packit 1e8aac
Packit 1e8aac
          if (gattr->type == PANGO_ATTR_UNDERLINE ||
Packit 1e8aac
              gattr->type == PANGO_ATTR_STRIKETHROUGH)
Packit 1e8aac
            gtk_list_store_set (GTK_LIST_STORE (model), iter,
Packit 1e8aac
                                COLUMN_TOGGLE_DOWN,
Packit 1e8aac
                                g_value_get_boolean (&(gattr->value)), -1);
Packit 1e8aac
Packit 1e8aac
          g_free (text);
Packit 1e8aac
          gtk_tree_iter_free (iter);
Packit 1e8aac
        }
Packit 1e8aac
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_eprop_attrs_show_dialog (GtkWidget *dialog_button,
Packit 1e8aac
                               GladeEditorProperty *eprop)
Packit 1e8aac
{
Packit 1e8aac
  GladeEPropAttrs *eprop_attrs = GLADE_EPROP_ATTRS (eprop);
Packit 1e8aac
  GtkWidget *dialog, *parent, *vbox, *sw, *tree_view;
Packit 1e8aac
  GladeProperty *property;
Packit 1e8aac
  GList *old_attributes;
Packit 1e8aac
  gint res;
Packit 1e8aac
Packit 1e8aac
  property = glade_editor_property_get_property (eprop);
Packit 1e8aac
  parent   = gtk_widget_get_toplevel (GTK_WIDGET (eprop));
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
  /* Keep a copy for commit time... */
Packit 1e8aac
  old_attributes = g_value_dup_boxed (glade_property_inline_value (property));
Packit 1e8aac
Packit 1e8aac
  dialog = gtk_dialog_new_with_buttons (_("Setup Text Attributes"),
Packit 1e8aac
                                        GTK_WINDOW (parent),
Packit 1e8aac
                                        GTK_DIALOG_MODAL |
Packit 1e8aac
                                        GTK_DIALOG_DESTROY_WITH_PARENT,
Packit 1e8aac
                                        _("C_lear"), GLADE_RESPONSE_CLEAR,
Packit 1e8aac
                                        _("_Cancel"), GTK_RESPONSE_CANCEL,
Packit 1e8aac
                                        _("_OK"), GTK_RESPONSE_OK, NULL);
Packit 1e8aac
Packit 1e8aac
  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
Packit 1e8aac
  gtk_widget_show (vbox);
Packit 1e8aac
Packit 1e8aac
  gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
Packit 1e8aac
Packit 1e8aac
  gtk_box_pack_start (GTK_BOX
Packit 1e8aac
                      (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), vbox,
Packit 1e8aac
                      TRUE, TRUE, 0);
Packit 1e8aac
Packit 1e8aac
  sw = gtk_scrolled_window_new (NULL, NULL);
Packit 1e8aac
  gtk_widget_show (sw);
Packit 1e8aac
  gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
Packit 1e8aac
  gtk_widget_set_size_request (sw, 400, 200);
Packit 1e8aac
  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
Packit 1e8aac
                                  GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
Packit 1e8aac
  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN);
Packit 1e8aac
Packit 1e8aac
  tree_view = glade_eprop_attrs_view (eprop);
Packit 1e8aac
  glade_eprop_attrs_populate_view (eprop, GTK_TREE_VIEW (tree_view));
Packit 1e8aac
Packit 1e8aac
  gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view));
Packit 1e8aac
Packit 1e8aac
  gtk_widget_show (tree_view);
Packit 1e8aac
  gtk_container_add (GTK_CONTAINER (sw), tree_view);
Packit 1e8aac
Packit 1e8aac
  /* Run the dialog */
Packit 1e8aac
  res = gtk_dialog_run (GTK_DIALOG (dialog));
Packit 1e8aac
  if (res == GTK_RESPONSE_OK)
Packit 1e8aac
    {
Packit 1e8aac
      /* Update from old attributes so that there a property change 
Packit 1e8aac
       * sitting on the undo stack.
Packit 1e8aac
       */
Packit 1e8aac
      glade_property_set (property, old_attributes);
Packit 1e8aac
      sync_object (eprop_attrs, TRUE);
Packit 1e8aac
    }
Packit 1e8aac
  else if (res == GLADE_RESPONSE_CLEAR)
Packit 1e8aac
    {
Packit 1e8aac
      GValue value = { 0, };
Packit 1e8aac
      g_value_init (&value, GLADE_TYPE_ATTR_GLIST);
Packit 1e8aac
      g_value_set_boxed (&value, NULL);
Packit 1e8aac
      glade_editor_property_commit (eprop, &value);
Packit 1e8aac
      g_value_unset (&value);
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  /* Clean up ...
Packit 1e8aac
   */
Packit 1e8aac
  gtk_widget_destroy (dialog);
Packit 1e8aac
Packit 1e8aac
  g_object_unref (G_OBJECT (eprop_attrs->model));
Packit 1e8aac
  eprop_attrs->model = NULL;
Packit 1e8aac
Packit 1e8aac
  glade_attr_list_free (old_attributes);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_eprop_attrs_finalize (GObject *object)
Packit 1e8aac
{
Packit 1e8aac
  /* Chain up */
Packit 1e8aac
  GObjectClass *parent_class =
Packit 1e8aac
      g_type_class_peek_parent (G_OBJECT_GET_CLASS (object));
Packit 1e8aac
Packit 1e8aac
  G_OBJECT_CLASS (parent_class)->finalize (object);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_eprop_attrs_load (GladeEditorProperty *eprop, GladeProperty *property)
Packit 1e8aac
{
Packit 1e8aac
  GladeEditorPropertyClass *parent_class =
Packit 1e8aac
      g_type_class_peek_parent (G_OBJECT_GET_CLASS (eprop));
Packit 1e8aac
Packit 1e8aac
  /* No displayable attributes in eprop, just a button. */
Packit 1e8aac
  parent_class->load (eprop, property);
Packit 1e8aac
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static GtkWidget *
Packit 1e8aac
glade_eprop_attrs_create_input (GladeEditorProperty *eprop)
Packit 1e8aac
{
Packit 1e8aac
  GtkWidget *hbox;
Packit 1e8aac
  GtkWidget *button;
Packit 1e8aac
Packit 1e8aac
  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
Packit 1e8aac
Packit 1e8aac
  button = gtk_button_new_with_label (_("Edit Attributes"));
Packit 1e8aac
  gtk_widget_set_hexpand (button, TRUE);
Packit 1e8aac
  gtk_widget_show (button);
Packit 1e8aac
  gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
Packit 1e8aac
Packit 1e8aac
  g_signal_connect (G_OBJECT (button), "clicked",
Packit 1e8aac
                    G_CALLBACK (glade_eprop_attrs_show_dialog), eprop);
Packit 1e8aac
Packit 1e8aac
  return hbox;
Packit 1e8aac
}