Blame plugins/gtk+/glade-column-types.c

Packit 1e8aac
/*
Packit 1e8aac
 * Copyright (C) 2008 Juan Pablo Ugarte.
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
 * Authors:
Packit 1e8aac
 *   Juan Pablo Ugarte <juanpablougarte@gmail.com>
Packit 1e8aac
 *   Tristan Van Berkom <tvb@gnome.org>
Packit 1e8aac
 */
Packit 1e8aac
Packit 1e8aac
#include <config.h>
Packit 1e8aac
Packit 1e8aac
#include <gtk/gtk.h>
Packit 1e8aac
#include <gdk/gdkkeysyms.h>
Packit 1e8aac
#include <glib/gi18n-lib.h>
Packit 1e8aac
#include <string.h>
Packit 1e8aac
Packit 1e8aac
#include <gladeui/glade.h>
Packit 1e8aac
#include "glade-column-types.h"
Packit 1e8aac
#include "glade-model-data.h"
Packit 1e8aac
Packit 1e8aac
enum
Packit 1e8aac
{
Packit 1e8aac
  COLUMN_NAME,
Packit 1e8aac
  COLUMN_COLUMN_NAME,
Packit 1e8aac
  COLUMN_TYPE_EDITABLE,
Packit 1e8aac
  COLUMN_NAME_EDITABLE,
Packit 1e8aac
  COLUMN_TYPE_FOREGROUND,
Packit 1e8aac
  COLUMN_TYPE_STYLE,
Packit 1e8aac
  N_COLUMNS
Packit 1e8aac
};
Packit 1e8aac
Packit 1e8aac
static GtkTreeModel *types_model = NULL;
Packit 1e8aac
Packit 1e8aac
static gint
Packit 1e8aac
find_by_type_name (const gchar * a, const gchar * b)
Packit 1e8aac
{
Packit 1e8aac
  return strcmp (a, b);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
column_types_store_populate_enums_flags (GtkListStore * store, gboolean enums)
Packit 1e8aac
{
Packit 1e8aac
  GtkTreeIter iter;
Packit 1e8aac
  GList *types = NULL, *list;
Packit 1e8aac
  GList *adaptors = glade_widget_adaptor_list_adaptors ();
Packit 1e8aac
  const GList *l;
Packit 1e8aac
Packit 1e8aac
  for (list = adaptors; list; list = list->next)
Packit 1e8aac
    {
Packit 1e8aac
      GladeWidgetAdaptor *adaptor = list->data;
Packit 1e8aac
      GladePropertyClass *pclass;
Packit 1e8aac
      GParamSpec         *pspec;
Packit 1e8aac
Packit 1e8aac
      for (l = glade_widget_adaptor_get_properties (adaptor); l; l = l->next)
Packit 1e8aac
        {
Packit 1e8aac
          pclass = l->data;
Packit 1e8aac
	  pspec  = glade_property_class_get_pspec (pclass);
Packit 1e8aac
Packit 1e8aac
          /* special case out a few of these... */
Packit 1e8aac
          if (strcmp (g_type_name (pspec->value_type),
Packit 1e8aac
                      "GladeStock") == 0 ||
Packit 1e8aac
              strcmp (g_type_name (pspec->value_type),
Packit 1e8aac
                      "GladeStockImage") == 0 ||
Packit 1e8aac
              strcmp (g_type_name (pspec->value_type),
Packit 1e8aac
                      "GladeGtkImageType") == 0 ||
Packit 1e8aac
              strcmp (g_type_name (pspec->value_type),
Packit 1e8aac
                      "GladeGtkButtonType") == 0 ||
Packit 1e8aac
              strcmp (g_type_name (pspec->value_type),
Packit 1e8aac
                      "GladeGnomeDruidPagePosition") == 0 ||
Packit 1e8aac
              strcmp (g_type_name (pspec->value_type),
Packit 1e8aac
                      "GladeGnomeIconListSelectionMode") == 0 ||
Packit 1e8aac
              strcmp (g_type_name (pspec->value_type),
Packit 1e8aac
                      "GladeGnomeMessageBoxType") == 0)
Packit 1e8aac
            continue;
Packit 1e8aac
Packit 1e8aac
          if ((enums ? G_TYPE_IS_ENUM (pspec->value_type) :
Packit 1e8aac
               G_TYPE_IS_FLAGS (pspec->value_type)) &&
Packit 1e8aac
              !g_list_find_custom (types,
Packit 1e8aac
                                   g_type_name (pspec->value_type),
Packit 1e8aac
                                   (GCompareFunc) find_by_type_name))
Packit 1e8aac
            types =
Packit 1e8aac
                g_list_prepend (types,
Packit 1e8aac
                                g_strdup (g_type_name
Packit 1e8aac
                                          (pspec->value_type)));
Packit 1e8aac
Packit 1e8aac
        }
Packit 1e8aac
    }
Packit 1e8aac
  g_list_free (adaptors);
Packit 1e8aac
Packit 1e8aac
  types = g_list_sort (types, (GCompareFunc) find_by_type_name);
Packit 1e8aac
Packit 1e8aac
  for (l = types; l; l = l->next)
Packit 1e8aac
    {
Packit 1e8aac
      gchar *type_name = l->data;
Packit 1e8aac
Packit 1e8aac
      gtk_list_store_append (store, &iter);
Packit 1e8aac
      gtk_list_store_set (store, &iter, COLUMN_NAME, type_name, -1);
Packit 1e8aac
      g_free (type_name);
Packit 1e8aac
    }
Packit 1e8aac
  g_list_free (types);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
column_types_store_populate (GtkListStore * store)
Packit 1e8aac
{
Packit 1e8aac
  GtkTreeIter iter;
Packit 1e8aac
  gint i;
Packit 1e8aac
  GType types[] = {
Packit 1e8aac
    G_TYPE_CHAR,
Packit 1e8aac
    G_TYPE_UCHAR,
Packit 1e8aac
    G_TYPE_BOOLEAN,
Packit 1e8aac
    G_TYPE_INT,
Packit 1e8aac
    G_TYPE_UINT,
Packit 1e8aac
    G_TYPE_LONG,
Packit 1e8aac
    G_TYPE_ULONG,
Packit 1e8aac
    G_TYPE_INT64,
Packit 1e8aac
    G_TYPE_UINT64,
Packit 1e8aac
    G_TYPE_FLOAT,
Packit 1e8aac
    G_TYPE_DOUBLE,
Packit 1e8aac
    G_TYPE_STRING,
Packit 1e8aac
    G_TYPE_POINTER,
Packit 1e8aac
    G_TYPE_OBJECT,
Packit 1e8aac
    GDK_TYPE_PIXBUF
Packit 1e8aac
  };
Packit 1e8aac
Packit 1e8aac
  for (i = 0; i < sizeof (types) / sizeof (GType); i++)
Packit 1e8aac
    {
Packit 1e8aac
      gtk_list_store_append (store, &iter);
Packit 1e8aac
      gtk_list_store_set (store, &iter,
Packit 1e8aac
                          COLUMN_NAME, g_type_name (types[i]), -1);
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  column_types_store_populate_enums_flags (store, TRUE);
Packit 1e8aac
  column_types_store_populate_enums_flags (store, FALSE);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
GList *
Packit 1e8aac
glade_column_list_copy (GList * list)
Packit 1e8aac
{
Packit 1e8aac
  GList *l, *retval = NULL;
Packit 1e8aac
Packit 1e8aac
  for (l = list; l; l = g_list_next (l))
Packit 1e8aac
    {
Packit 1e8aac
      GladeColumnType *data = l->data;
Packit 1e8aac
      GladeColumnType *new_data =
Packit 1e8aac
          glade_column_type_new (data->type_name, data->column_name);
Packit 1e8aac
Packit 1e8aac
      retval = g_list_prepend (retval, new_data);
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  return g_list_reverse (retval);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
GladeColumnType *
Packit 1e8aac
glade_column_type_new (const gchar * type_name, const gchar * column_name)
Packit 1e8aac
{
Packit 1e8aac
  GladeColumnType *column = g_slice_new0 (GladeColumnType);
Packit 1e8aac
Packit 1e8aac
  column->type_name = g_strdup (type_name);
Packit 1e8aac
  column->column_name = g_strdup (column_name);
Packit 1e8aac
Packit 1e8aac
  return column;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_column_type_free (GladeColumnType * column)
Packit 1e8aac
{
Packit 1e8aac
  g_free (column->type_name);
Packit 1e8aac
  g_free (column->column_name);
Packit 1e8aac
  g_slice_free (GladeColumnType, column);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_column_list_free (GList * list)
Packit 1e8aac
{
Packit 1e8aac
  g_list_foreach (list, (GFunc) glade_column_type_free, NULL);
Packit 1e8aac
  g_list_free (list);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
GladeColumnType *
Packit 1e8aac
glade_column_list_find_column (GList * list, const gchar * column_name)
Packit 1e8aac
{
Packit 1e8aac
  GladeColumnType *column = NULL, *iter;
Packit 1e8aac
  GList *l;
Packit 1e8aac
Packit 1e8aac
  for (l = g_list_first (list); l; l = l->next)
Packit 1e8aac
    {
Packit 1e8aac
      iter = l->data;
Packit 1e8aac
      if (strcmp (column_name, iter->column_name) == 0)
Packit 1e8aac
        {
Packit 1e8aac
          column = iter;
Packit 1e8aac
          break;
Packit 1e8aac
        }
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  return column;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
GType
Packit 1e8aac
glade_column_type_list_get_type (void)
Packit 1e8aac
{
Packit 1e8aac
  static GType type_id = 0;
Packit 1e8aac
Packit 1e8aac
  if (!type_id)
Packit 1e8aac
    {
Packit 1e8aac
      type_id = g_boxed_type_register_static
Packit 1e8aac
          ("GladeColumnTypeList",
Packit 1e8aac
           (GBoxedCopyFunc) glade_column_list_copy,
Packit 1e8aac
           (GBoxedFreeFunc) glade_column_list_free);
Packit 1e8aac
    }
Packit 1e8aac
  return type_id;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/**************************** GladeEditorProperty *****************************/
Packit 1e8aac
typedef struct
Packit 1e8aac
{
Packit 1e8aac
  GladeEditorProperty parent_instance;
Packit 1e8aac
Packit 1e8aac
  GtkListStore *store;
Packit 1e8aac
  GtkTreeView *view;
Packit 1e8aac
  GtkTreeSelection *selection;
Packit 1e8aac
Packit 1e8aac
  GladeNameContext *context;
Packit 1e8aac
Packit 1e8aac
  gboolean adding_column;
Packit 1e8aac
  gboolean want_focus;
Packit 1e8aac
  gboolean setting_cursor;
Packit 1e8aac
Packit 1e8aac
  GtkTreeViewColumn *name_column;
Packit 1e8aac
  GtkTreeViewColumn *type_column;
Packit 1e8aac
} GladeEPropColumnTypes;
Packit 1e8aac
Packit 1e8aac
GLADE_MAKE_EPROP (GladeEPropColumnTypes, glade_eprop_column_types)
Packit 1e8aac
#define GLADE_EPROP_COLUMN_TYPES(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EPROP_COLUMN_TYPES, GladeEPropColumnTypes))
Packit 1e8aac
#define GLADE_EPROP_COLUMN_TYPES_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EPROP_COLUMN_TYPES, GladeEPropColumnTypesClass))
Packit 1e8aac
#define GLADE_IS_EPROP_COLUMN_TYPES(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EPROP_COLUMN_TYPES))
Packit 1e8aac
#define GLADE_IS_EPROP_COLUMN_TYPES_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GLADE_TYPE_EPROP_COLUMN_TYPES))
Packit 1e8aac
#define GLADE_EPROP_COLUMN_TYPES_GET_CLASS(o)    (G_TYPE_INSTANCE_GET_CLASS ((o), GLADE_EPROP_COLUMN_TYPES, GladeEPropColumnTypesClass))
Packit 1e8aac
     static void glade_eprop_column_types_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 gint
Packit 1e8aac
get_extra_column (GNode * data_tree, GList * columns)
Packit 1e8aac
{
Packit 1e8aac
  GladeModelData *data;
Packit 1e8aac
  GNode *iter;
Packit 1e8aac
  gint idx = -1;
Packit 1e8aac
Packit 1e8aac
  /* extra columns trail at the end so walk backwards... */
Packit 1e8aac
  for (iter = g_node_last_child (data_tree->children); iter; iter = iter->prev)
Packit 1e8aac
    {
Packit 1e8aac
      data = iter->data;
Packit 1e8aac
Packit 1e8aac
      if (!glade_column_list_find_column (columns, data->name))
Packit 1e8aac
        {
Packit 1e8aac
          idx = g_node_child_position (data_tree->children, iter);
Packit 1e8aac
          break;
Packit 1e8aac
        }
Packit 1e8aac
Packit 1e8aac
    }
Packit 1e8aac
  return idx;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
eprop_column_adjust_rows (GladeEditorProperty * eprop, GList * columns)
Packit 1e8aac
{
Packit 1e8aac
  GladeColumnType *column;
Packit 1e8aac
  GNode *data_tree = NULL;
Packit 1e8aac
  GladeProperty *property, *prop = glade_editor_property_get_property (eprop);  
Packit 1e8aac
  GladeWidget *widget = glade_property_get_widget (prop);
Packit 1e8aac
  GList *list;
Packit 1e8aac
  gint idx;
Packit 1e8aac
Packit 1e8aac
  property = glade_widget_get_property (widget, "data");
Packit 1e8aac
  glade_property_get (property, &data_tree);
Packit 1e8aac
  if (!data_tree)
Packit 1e8aac
    return;
Packit 1e8aac
  data_tree = glade_model_data_tree_copy (data_tree);
Packit 1e8aac
Packit 1e8aac
  /* Add mising columns and reorder... */
Packit 1e8aac
  for (list = g_list_last (columns); list; list = list->prev)
Packit 1e8aac
    {
Packit 1e8aac
      GType data_type;
Packit 1e8aac
Packit 1e8aac
      column = list->data;
Packit 1e8aac
Packit 1e8aac
      data_type = g_type_from_name (column->type_name);
Packit 1e8aac
Packit 1e8aac
      if ((idx =
Packit 1e8aac
           glade_model_data_column_index (data_tree, column->column_name)) < 0)
Packit 1e8aac
        {
Packit 1e8aac
          glade_model_data_insert_column (data_tree,
Packit 1e8aac
                                          data_type, column->column_name, 0);
Packit 1e8aac
Packit 1e8aac
        }
Packit 1e8aac
      else
Packit 1e8aac
        glade_model_data_reorder_column (data_tree, idx, 0);
Packit 1e8aac
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  /* Remove trailing obsolete */
Packit 1e8aac
  while ((idx = get_extra_column (data_tree, columns)) >= 0)
Packit 1e8aac
    glade_model_data_remove_column (data_tree, idx);
Packit 1e8aac
Packit 1e8aac
  glade_command_set_property (property, data_tree);
Packit 1e8aac
  glade_model_data_tree_free (data_tree);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
eprop_column_append (GladeEditorProperty *eprop,
Packit 1e8aac
                     const gchar         *type_name, 
Packit 1e8aac
		     const gchar         *column_name)
Packit 1e8aac
{
Packit 1e8aac
  GladeEPropColumnTypes *eprop_types = GLADE_EPROP_COLUMN_TYPES (eprop);
Packit 1e8aac
  GList *columns = NULL;
Packit 1e8aac
  GladeColumnType *data;
Packit 1e8aac
  GValue value = { 0, };
Packit 1e8aac
  GladeProperty *property;
Packit 1e8aac
Packit 1e8aac
  property = glade_editor_property_get_property (eprop);
Packit 1e8aac
Packit 1e8aac
  glade_property_get (property, &columns);
Packit 1e8aac
  if (columns)
Packit 1e8aac
    columns = glade_column_list_copy (columns);
Packit 1e8aac
Packit 1e8aac
  data = glade_column_type_new (type_name, column_name);
Packit 1e8aac
Packit 1e8aac
  columns = g_list_append (columns, data);
Packit 1e8aac
Packit 1e8aac
  eprop_types->adding_column = TRUE;
Packit 1e8aac
  glade_command_push_group (_("Setting columns on %s"),
Packit 1e8aac
                            glade_widget_get_name (glade_property_get_widget (property)));
Packit 1e8aac
Packit 1e8aac
  g_value_init (&value, GLADE_TYPE_COLUMN_TYPE_LIST);
Packit 1e8aac
  g_value_take_boxed (&value, columns);
Packit 1e8aac
  glade_editor_property_commit (eprop, &value);
Packit 1e8aac
Packit 1e8aac
  eprop_column_adjust_rows (eprop, columns);
Packit 1e8aac
  g_value_unset (&value);
Packit 1e8aac
Packit 1e8aac
  glade_command_pop_group ();
Packit 1e8aac
Packit 1e8aac
  eprop_types->adding_column = FALSE;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gboolean
Packit 1e8aac
eprop_treeview_key_press (GtkWidget           *treeview,
Packit 1e8aac
                          GdkEventKey         *event, 
Packit 1e8aac
			  GladeEditorProperty *eprop)
Packit 1e8aac
{
Packit 1e8aac
  /* Remove from list and commit value, dont touch the liststore except in load() */
Packit 1e8aac
  GladeEPropColumnTypes *eprop_types = GLADE_EPROP_COLUMN_TYPES (eprop);
Packit 1e8aac
  GtkTreeIter iter;
Packit 1e8aac
  GList *columns = NULL;
Packit 1e8aac
  GladeColumnType *column;
Packit 1e8aac
  GValue value = { 0, };
Packit 1e8aac
  gchar *column_name;
Packit 1e8aac
  GladeProperty *property;
Packit 1e8aac
Packit 1e8aac
  property = glade_editor_property_get_property (eprop);
Packit 1e8aac
Packit 1e8aac
  if (event->keyval == GDK_KEY_Delete &&
Packit 1e8aac
      gtk_tree_selection_get_selected (eprop_types->selection, NULL, &iter))
Packit 1e8aac
    {
Packit 1e8aac
      gtk_tree_model_get (GTK_TREE_MODEL (eprop_types->store), &iter,
Packit 1e8aac
                          COLUMN_COLUMN_NAME, &column_name, -1);
Packit 1e8aac
Packit 1e8aac
      /* Cant delete the symbolic "add new" row */
Packit 1e8aac
      if (!column_name)
Packit 1e8aac
        return TRUE;
Packit 1e8aac
Packit 1e8aac
      glade_property_get (property, &columns);
Packit 1e8aac
      if (columns)
Packit 1e8aac
        columns = glade_column_list_copy (columns);
Packit 1e8aac
      g_assert (columns);
Packit 1e8aac
Packit 1e8aac
      /* Find and remove the offending column... */
Packit 1e8aac
      column = glade_column_list_find_column (columns, column_name);
Packit 1e8aac
      g_assert (column);
Packit 1e8aac
      columns = g_list_remove (columns, column);
Packit 1e8aac
      glade_column_type_free (column);
Packit 1e8aac
Packit 1e8aac
      glade_command_push_group (_("Setting columns on %s"),
Packit 1e8aac
                                glade_widget_get_name (glade_property_get_widget (property)));
Packit 1e8aac
Packit 1e8aac
      eprop_types->want_focus = TRUE;
Packit 1e8aac
Packit 1e8aac
      g_value_init (&value, GLADE_TYPE_COLUMN_TYPE_LIST);
Packit 1e8aac
      g_value_take_boxed (&value, columns);
Packit 1e8aac
      glade_editor_property_commit (eprop, &value);
Packit 1e8aac
Packit 1e8aac
      eprop_column_adjust_rows (eprop, columns);
Packit 1e8aac
      g_value_unset (&value);
Packit 1e8aac
      glade_command_pop_group ();
Packit 1e8aac
Packit 1e8aac
      g_free (column_name);
Packit 1e8aac
Packit 1e8aac
      eprop_types->want_focus = FALSE;
Packit 1e8aac
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  return (event->keyval == GDK_KEY_Delete);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gboolean
Packit 1e8aac
columns_changed_idle (GladeEditorProperty * eprop)
Packit 1e8aac
{
Packit 1e8aac
  GladeEPropColumnTypes *eprop_types = GLADE_EPROP_COLUMN_TYPES (eprop);
Packit 1e8aac
  GladeColumnType *column;
Packit 1e8aac
  GValue value = { 0, };
Packit 1e8aac
  GList *new_list = NULL, *columns = NULL, *list;
Packit 1e8aac
  GtkTreeIter iter;
Packit 1e8aac
  gchar *column_name;
Packit 1e8aac
  GladeProperty *property;
Packit 1e8aac
Packit 1e8aac
  property = glade_editor_property_get_property (eprop);
Packit 1e8aac
Packit 1e8aac
  glade_property_get (property, &columns);
Packit 1e8aac
Packit 1e8aac
  /* This can happen when the user performs DnD and there
Packit 1e8aac
   * are no columns yet */
Packit 1e8aac
  if (!columns)
Packit 1e8aac
    return FALSE;
Packit 1e8aac
Packit 1e8aac
  columns = glade_column_list_copy (columns);
Packit 1e8aac
Packit 1e8aac
  if (gtk_tree_model_get_iter_first
Packit 1e8aac
      (GTK_TREE_MODEL (eprop_types->store), &iter))
Packit 1e8aac
    {
Packit 1e8aac
      do
Packit 1e8aac
        {
Packit 1e8aac
          column_name = NULL;
Packit 1e8aac
          gtk_tree_model_get (GTK_TREE_MODEL (eprop_types->store), &iter,
Packit 1e8aac
                              COLUMN_COLUMN_NAME, &column_name, -1);
Packit 1e8aac
          if (!column_name)
Packit 1e8aac
            continue;
Packit 1e8aac
Packit 1e8aac
          column = glade_column_list_find_column (columns, column_name);
Packit 1e8aac
          g_assert (column);
Packit 1e8aac
Packit 1e8aac
          new_list = g_list_prepend (new_list, column);
Packit 1e8aac
          g_free (column_name);
Packit 1e8aac
        }
Packit 1e8aac
      while (gtk_tree_model_iter_next
Packit 1e8aac
             (GTK_TREE_MODEL (eprop_types->store), &iter));
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  /* any missing columns to free ? */
Packit 1e8aac
  for (list = columns; list; list = list->next)
Packit 1e8aac
    {
Packit 1e8aac
      if (!g_list_find (new_list, list->data))
Packit 1e8aac
        glade_column_type_free ((GladeColumnType *) list->data);
Packit 1e8aac
    }
Packit 1e8aac
  g_list_free (columns);
Packit 1e8aac
Packit 1e8aac
  glade_command_push_group (_("Setting columns on %s"),
Packit 1e8aac
                            glade_widget_get_name (glade_property_get_widget (property)));
Packit 1e8aac
Packit 1e8aac
  g_value_init (&value, GLADE_TYPE_COLUMN_TYPE_LIST);
Packit 1e8aac
  g_value_take_boxed (&value, g_list_reverse (new_list));
Packit 1e8aac
  glade_editor_property_commit (eprop, &value);
Packit 1e8aac
Packit 1e8aac
  eprop_column_adjust_rows (eprop, new_list);
Packit 1e8aac
  g_value_unset (&value);
Packit 1e8aac
  glade_command_pop_group ();
Packit 1e8aac
Packit 1e8aac
  return FALSE;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
eprop_treeview_row_deleted (GtkTreeModel * tree_model,
Packit 1e8aac
                            GtkTreePath * path, GladeEditorProperty * eprop)
Packit 1e8aac
{
Packit 1e8aac
  if (glade_editor_property_loading (eprop))
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  g_idle_add ((GSourceFunc) columns_changed_idle, eprop);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
eprop_column_add_new (GladeEPropColumnTypes * eprop_types)
Packit 1e8aac
{
Packit 1e8aac
  gtk_list_store_insert_with_values (eprop_types->store, NULL, -1,
Packit 1e8aac
                                     COLUMN_NAME, _("< define a new column >"),
Packit 1e8aac
                                     COLUMN_TYPE_EDITABLE, TRUE,
Packit 1e8aac
                                     COLUMN_NAME_EDITABLE, FALSE,
Packit 1e8aac
                                     COLUMN_TYPE_FOREGROUND, "Gray",
Packit 1e8aac
                                     COLUMN_TYPE_STYLE, PANGO_STYLE_ITALIC, -1);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
eprop_column_load (GladeEPropColumnTypes * eprop_types,
Packit 1e8aac
                   const gchar * type_name, const gchar * column_name)
Packit 1e8aac
{
Packit 1e8aac
  gtk_list_store_insert_with_values (eprop_types->store, NULL, -1,
Packit 1e8aac
                                     COLUMN_NAME, type_name,
Packit 1e8aac
                                     COLUMN_COLUMN_NAME, column_name,
Packit 1e8aac
                                     COLUMN_TYPE_EDITABLE, FALSE,
Packit 1e8aac
                                     COLUMN_NAME_EDITABLE, TRUE,
Packit 1e8aac
                                     COLUMN_TYPE_FOREGROUND, "Black",
Packit 1e8aac
                                     COLUMN_TYPE_STYLE, PANGO_STYLE_NORMAL, -1);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
eprop_types_focus_cell (GladeEPropColumnTypes * eprop_types, gboolean use_path,
Packit 1e8aac
                        gboolean add_cell, gboolean edit_cell)
Packit 1e8aac
{
Packit 1e8aac
  /* Focus and edit the first column of a newly added row */
Packit 1e8aac
  if (eprop_types->store)
Packit 1e8aac
    {
Packit 1e8aac
      GtkTreePath *new_item_path;
Packit 1e8aac
      GtkTreeIter iter;
Packit 1e8aac
      gint n_children;
Packit 1e8aac
      gint needed_row;
Packit 1e8aac
Packit 1e8aac
      n_children =
Packit 1e8aac
          gtk_tree_model_iter_n_children (GTK_TREE_MODEL (eprop_types->store),
Packit 1e8aac
                                          NULL);
Packit 1e8aac
Packit 1e8aac
      needed_row = n_children - (add_cell ? 1 : 2);
Packit 1e8aac
Packit 1e8aac
      if (use_path)
Packit 1e8aac
        new_item_path = gtk_tree_path_new_from_string
Packit 1e8aac
            (g_object_get_data (G_OBJECT (eprop_types), "current-path-str"));
Packit 1e8aac
      else if (gtk_tree_model_iter_nth_child
Packit 1e8aac
               (GTK_TREE_MODEL (eprop_types->store), &iter, NULL, needed_row))
Packit 1e8aac
        new_item_path =
Packit 1e8aac
            gtk_tree_model_get_path (GTK_TREE_MODEL (eprop_types->store),
Packit 1e8aac
                                     &iter);
Packit 1e8aac
      else
Packit 1e8aac
        return;
Packit 1e8aac
Packit 1e8aac
      eprop_types->setting_cursor = TRUE;
Packit 1e8aac
Packit 1e8aac
      gtk_widget_grab_focus (GTK_WIDGET (eprop_types->view));
Packit 1e8aac
      gtk_tree_view_expand_to_path (eprop_types->view, new_item_path);
Packit 1e8aac
Packit 1e8aac
      gtk_tree_view_set_cursor (eprop_types->view, new_item_path,
Packit 1e8aac
                                add_cell ? eprop_types->
Packit 1e8aac
                                type_column : eprop_types->name_column,
Packit 1e8aac
                                edit_cell);
Packit 1e8aac
Packit 1e8aac
      eprop_types->setting_cursor = FALSE;
Packit 1e8aac
Packit 1e8aac
      gtk_tree_path_free (new_item_path);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gboolean
Packit 1e8aac
eprop_types_focus_new (GladeEPropColumnTypes * eprop_types)
Packit 1e8aac
{
Packit 1e8aac
  eprop_types_focus_cell (eprop_types, FALSE, TRUE, FALSE);
Packit 1e8aac
  return FALSE;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gboolean
Packit 1e8aac
eprop_types_focus_name (GladeEPropColumnTypes * eprop_types)
Packit 1e8aac
{
Packit 1e8aac
  eprop_types_focus_cell (eprop_types, FALSE, FALSE, TRUE);
Packit 1e8aac
  return FALSE;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gboolean
Packit 1e8aac
eprop_types_focus_name_no_edit (GladeEPropColumnTypes * eprop_types)
Packit 1e8aac
{
Packit 1e8aac
  eprop_types_focus_cell (eprop_types, TRUE, FALSE, FALSE);
Packit 1e8aac
  return FALSE;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_eprop_column_types_load (GladeEditorProperty * eprop,
Packit 1e8aac
                               GladeProperty * property)
Packit 1e8aac
{
Packit 1e8aac
  GladeEditorPropertyClass *parent_class =
Packit 1e8aac
      g_type_class_peek_parent (GLADE_EDITOR_PROPERTY_GET_CLASS (eprop));
Packit 1e8aac
  GladeEPropColumnTypes *eprop_types = GLADE_EPROP_COLUMN_TYPES (eprop);
Packit 1e8aac
  GList *l, *list = NULL;
Packit 1e8aac
Packit 1e8aac
  /* Chain up first */
Packit 1e8aac
  parent_class->load (eprop, property);
Packit 1e8aac
Packit 1e8aac
  if (eprop_types->context)
Packit 1e8aac
    glade_name_context_destroy (eprop_types->context);
Packit 1e8aac
  eprop_types->context = NULL;
Packit 1e8aac
Packit 1e8aac
  if (!property)
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  eprop_types->context = glade_name_context_new ();
Packit 1e8aac
Packit 1e8aac
  g_signal_handlers_block_by_func (G_OBJECT (eprop_types->store),
Packit 1e8aac
                                   eprop_treeview_row_deleted, eprop);
Packit 1e8aac
Packit 1e8aac
  /* Clear Store */
Packit 1e8aac
  gtk_list_store_clear (eprop_types->store);
Packit 1e8aac
Packit 1e8aac
  glade_property_get (property, &list);
Packit 1e8aac
Packit 1e8aac
  for (l = list; l; l = g_list_next (l))
Packit 1e8aac
    {
Packit 1e8aac
      GladeColumnType *data = l->data;
Packit 1e8aac
Packit 1e8aac
      eprop_column_load (eprop_types, data->type_name, data->column_name);
Packit 1e8aac
      glade_name_context_add_name (eprop_types->context, data->column_name);
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  eprop_column_add_new (eprop_types);
Packit 1e8aac
Packit 1e8aac
  if (eprop_types->adding_column && list)
Packit 1e8aac
    g_idle_add ((GSourceFunc) eprop_types_focus_name, eprop_types);
Packit 1e8aac
  else if (eprop_types->want_focus)
Packit 1e8aac
    g_idle_add ((GSourceFunc) eprop_types_focus_new, eprop_types);
Packit 1e8aac
Packit 1e8aac
  g_signal_handlers_unblock_by_func (G_OBJECT (eprop_types->store),
Packit 1e8aac
                                     eprop_treeview_row_deleted, eprop);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
column_name_edited (GtkCellRendererText * cell,
Packit 1e8aac
                    const gchar * path,
Packit 1e8aac
                    const gchar * new_column_name, GladeEditorProperty * eprop)
Packit 1e8aac
{
Packit 1e8aac
  GladeEPropColumnTypes *eprop_types = GLADE_EPROP_COLUMN_TYPES (eprop);
Packit 1e8aac
  GtkTreeIter iter;
Packit 1e8aac
  gchar *old_column_name = NULL, *column_name;
Packit 1e8aac
  GList *columns = NULL;
Packit 1e8aac
  GladeColumnType *column;
Packit 1e8aac
  GValue value = { 0, };
Packit 1e8aac
  GNode *data_tree = NULL;
Packit 1e8aac
  GladeProperty *property, *prop;
Packit 1e8aac
Packit 1e8aac
  prop = glade_editor_property_get_property (eprop);
Packit 1e8aac
Packit 1e8aac
  if (eprop_types->adding_column)
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  if (!gtk_tree_model_get_iter_from_string
Packit 1e8aac
      (GTK_TREE_MODEL (eprop_types->store), &iter, path))
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  gtk_tree_model_get (GTK_TREE_MODEL (eprop_types->store), &iter,
Packit 1e8aac
                      COLUMN_COLUMN_NAME, &old_column_name, -1);
Packit 1e8aac
Packit 1e8aac
  if (new_column_name && old_column_name &&
Packit 1e8aac
      strcmp (new_column_name, old_column_name) == 0)
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  /* Attempt to rename the column, and commit if successfull... */
Packit 1e8aac
  glade_property_get (prop, &columns);
Packit 1e8aac
  if (columns)
Packit 1e8aac
    columns = glade_column_list_copy (columns);
Packit 1e8aac
  g_assert (columns);
Packit 1e8aac
Packit 1e8aac
  column = glade_column_list_find_column (columns, old_column_name);
Packit 1e8aac
Packit 1e8aac
  /* Bookkeep the exclusive names... */
Packit 1e8aac
  if (!new_column_name || !new_column_name[0] ||
Packit 1e8aac
      glade_name_context_has_name (eprop_types->context, new_column_name))
Packit 1e8aac
    column_name = glade_name_context_new_name (eprop_types->context,
Packit 1e8aac
                                               new_column_name &&
Packit 1e8aac
                                               new_column_name[0] ?
Packit 1e8aac
                                               new_column_name : "column");
Packit 1e8aac
  else
Packit 1e8aac
    column_name = g_strdup (new_column_name);
Packit 1e8aac
Packit 1e8aac
  glade_name_context_add_name (eprop_types->context, column_name);
Packit 1e8aac
  glade_name_context_release_name (eprop_types->context, old_column_name);
Packit 1e8aac
Packit 1e8aac
  /* Set real column name */
Packit 1e8aac
  g_free (column->column_name);
Packit 1e8aac
  column->column_name = column_name;
Packit 1e8aac
Packit 1e8aac
  /* The "columns" copy of this string doesnt last long... */
Packit 1e8aac
  column_name = g_strdup (column_name);
Packit 1e8aac
Packit 1e8aac
  glade_command_push_group (_("Setting columns on %s"),
Packit 1e8aac
                            glade_widget_get_name (glade_property_get_widget (prop)));
Packit 1e8aac
Packit 1e8aac
  eprop_types->want_focus = TRUE;
Packit 1e8aac
Packit 1e8aac
  g_value_init (&value, GLADE_TYPE_COLUMN_TYPE_LIST);
Packit 1e8aac
  g_value_take_boxed (&value, columns);
Packit 1e8aac
  glade_editor_property_commit (eprop, &value);
Packit 1e8aac
  g_value_unset (&value);
Packit 1e8aac
Packit 1e8aac
  property = glade_widget_get_property (glade_property_get_widget (prop), "data");
Packit 1e8aac
  glade_property_get (property, &data_tree);
Packit 1e8aac
  if (data_tree)
Packit 1e8aac
    {
Packit 1e8aac
      data_tree = glade_model_data_tree_copy (data_tree);
Packit 1e8aac
      glade_model_data_column_rename (data_tree, old_column_name, column_name);
Packit 1e8aac
      glade_command_set_property (property, data_tree);
Packit 1e8aac
      glade_model_data_tree_free (data_tree);
Packit 1e8aac
    }
Packit 1e8aac
  glade_command_pop_group ();
Packit 1e8aac
Packit 1e8aac
  eprop_types->want_focus = FALSE;
Packit 1e8aac
Packit 1e8aac
  g_free (old_column_name);
Packit 1e8aac
  g_free (column_name);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
column_type_edited (GtkCellRendererText * cell,
Packit 1e8aac
                    const gchar * path,
Packit 1e8aac
                    const gchar * type_name, GladeEditorProperty * eprop)
Packit 1e8aac
{
Packit 1e8aac
  GladeEPropColumnTypes *eprop_types = GLADE_EPROP_COLUMN_TYPES (eprop);
Packit 1e8aac
  GtkTreeIter iter;
Packit 1e8aac
  GladeProperty *property;
Packit 1e8aac
  gchar *column_name;
Packit 1e8aac
Packit 1e8aac
  if (!gtk_tree_model_get_iter_from_string
Packit 1e8aac
      (GTK_TREE_MODEL (eprop_types->store), &iter, path))
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  property = glade_editor_property_get_property (eprop);
Packit 1e8aac
Packit 1e8aac
  if (type_name && type_name[0])
Packit 1e8aac
    {
Packit 1e8aac
      column_name =
Packit 1e8aac
          glade_name_context_new_name (eprop_types->context, type_name);
Packit 1e8aac
      eprop_column_append (eprop, type_name, column_name);
Packit 1e8aac
      g_free (column_name);
Packit 1e8aac
    }
Packit 1e8aac
  else
Packit 1e8aac
    {
Packit 1e8aac
      eprop_types->want_focus = TRUE;
Packit 1e8aac
      glade_editor_property_load (eprop, property);
Packit 1e8aac
      eprop_types->want_focus = FALSE;
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
types_combo_editing_started (GtkCellRenderer * renderer,
Packit 1e8aac
                             GtkCellEditable * editable,
Packit 1e8aac
                             gchar * path, GladeEditorProperty * eprop)
Packit 1e8aac
{
Packit 1e8aac
  GtkEntryCompletion *completion = gtk_entry_completion_new ();
Packit 1e8aac
Packit 1e8aac
  g_object_set_data_full (G_OBJECT (eprop), "current-path-str", g_strdup (path),
Packit 1e8aac
                          g_free);
Packit 1e8aac
Packit 1e8aac
  gtk_entry_completion_set_model (completion, types_model);
Packit 1e8aac
  gtk_entry_completion_set_text_column (completion, 0);
Packit 1e8aac
  gtk_entry_completion_set_inline_completion (completion, TRUE);
Packit 1e8aac
  gtk_entry_set_completion (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (editable))),
Packit 1e8aac
                            completion);
Packit 1e8aac
  g_object_unref (G_OBJECT (completion));
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
types_combo_editing_canceled (GtkCellRenderer * renderer,
Packit 1e8aac
                              GladeEditorProperty * eprop)
Packit 1e8aac
{
Packit 1e8aac
  g_idle_add ((GSourceFunc) eprop_types_focus_new, eprop);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
types_name_editing_started (GtkCellRenderer * renderer,
Packit 1e8aac
                            GtkCellEditable * editable,
Packit 1e8aac
                            gchar * path_str, GladeEditorProperty * eprop)
Packit 1e8aac
{
Packit 1e8aac
  g_object_set_data_full (G_OBJECT (eprop), "current-path-str",
Packit 1e8aac
                          g_strdup (path_str), g_free);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
types_name_editing_canceled (GtkCellRenderer * renderer,
Packit 1e8aac
                             GladeEditorProperty * eprop)
Packit 1e8aac
{
Packit 1e8aac
  GladeEPropColumnTypes *eprop_types = GLADE_EPROP_COLUMN_TYPES (eprop);
Packit 1e8aac
Packit 1e8aac
  if (eprop_types->adding_column || eprop_types->setting_cursor)
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  g_idle_add ((GSourceFunc) eprop_types_focus_name_no_edit, eprop);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static GtkWidget *
Packit 1e8aac
glade_eprop_column_types_create_input (GladeEditorProperty * eprop)
Packit 1e8aac
{
Packit 1e8aac
  GladeEPropColumnTypes *eprop_types = GLADE_EPROP_COLUMN_TYPES (eprop);
Packit 1e8aac
  GtkWidget *vbox, *swin, *label;
Packit 1e8aac
  GtkCellRenderer *cell;
Packit 1e8aac
  gchar *string;
Packit 1e8aac
Packit 1e8aac
  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
Packit 1e8aac
Packit 1e8aac
/* 	hbox = gtk_hbox_new (FALSE, 4); */
Packit 1e8aac
Packit 1e8aac
  if (!types_model)
Packit 1e8aac
    {
Packit 1e8aac
      /* We make sure to do this after all the adaptors are parsed 
Packit 1e8aac
       * because we load the enums/flags from the adaptors
Packit 1e8aac
       */
Packit 1e8aac
      types_model = (GtkTreeModel *) gtk_list_store_new (1, G_TYPE_STRING);
Packit 1e8aac
Packit 1e8aac
      column_types_store_populate (GTK_LIST_STORE (types_model));
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
  string = g_strdup_printf ("%s", _("Add and remove columns:"));
Packit 1e8aac
  label = gtk_label_new (string);
Packit 1e8aac
  g_free (string);
Packit 1e8aac
  gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
Packit 1e8aac
  gtk_widget_set_halign (label, GTK_ALIGN_START);
Packit 1e8aac
  gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
Packit 1e8aac
Packit 1e8aac
  swin = gtk_scrolled_window_new (NULL, NULL);
Packit 1e8aac
  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (swin),
Packit 1e8aac
                                       GTK_SHADOW_IN);
Packit 1e8aac
  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swin),
Packit 1e8aac
                                  GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
Packit 1e8aac
  gtk_box_pack_start (GTK_BOX (vbox), swin, TRUE, TRUE, 0);
Packit 1e8aac
Packit 1e8aac
  eprop_types->store = gtk_list_store_new (N_COLUMNS,
Packit 1e8aac
                                           G_TYPE_STRING,
Packit 1e8aac
                                           G_TYPE_STRING,
Packit 1e8aac
                                           G_TYPE_BOOLEAN,
Packit 1e8aac
                                           G_TYPE_BOOLEAN,
Packit 1e8aac
                                           G_TYPE_STRING, PANGO_TYPE_STYLE);
Packit 1e8aac
Packit 1e8aac
  g_signal_connect (eprop_types->store, "row-deleted",
Packit 1e8aac
                    G_CALLBACK (eprop_treeview_row_deleted), eprop);
Packit 1e8aac
Packit 1e8aac
  eprop_types->view =
Packit 1e8aac
      (GtkTreeView *)
Packit 1e8aac
      gtk_tree_view_new_with_model (GTK_TREE_MODEL (eprop_types->store));
Packit 1e8aac
  eprop_types->selection = gtk_tree_view_get_selection (eprop_types->view);
Packit 1e8aac
Packit 1e8aac
  gtk_tree_view_set_reorderable (eprop_types->view, TRUE);
Packit 1e8aac
  gtk_tree_view_set_enable_search (eprop_types->view, FALSE);
Packit 1e8aac
  //gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), FALSE);
Packit 1e8aac
Packit 1e8aac
  g_signal_connect (eprop_types->view, "key-press-event",
Packit 1e8aac
                    G_CALLBACK (eprop_treeview_key_press), eprop);
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
  /* type column */
Packit 1e8aac
  cell = gtk_cell_renderer_combo_new ();
Packit 1e8aac
  g_object_set (G_OBJECT (cell),
Packit 1e8aac
                "text-column", COLUMN_NAME, "model", types_model, NULL);
Packit 1e8aac
Packit 1e8aac
  g_signal_connect (G_OBJECT (cell), "editing-started",
Packit 1e8aac
                    G_CALLBACK (types_combo_editing_started), eprop);
Packit 1e8aac
Packit 1e8aac
  g_signal_connect (G_OBJECT (cell), "editing-canceled",
Packit 1e8aac
                    G_CALLBACK (types_combo_editing_canceled), eprop);
Packit 1e8aac
Packit 1e8aac
  g_signal_connect (G_OBJECT (cell), "edited",
Packit 1e8aac
                    G_CALLBACK (column_type_edited), eprop);
Packit 1e8aac
Packit 1e8aac
  eprop_types->type_column =
Packit 1e8aac
      gtk_tree_view_column_new_with_attributes (_("Column type"), cell,
Packit 1e8aac
                                                "foreground",
Packit 1e8aac
                                                COLUMN_TYPE_FOREGROUND, "style",
Packit 1e8aac
                                                COLUMN_TYPE_STYLE, "editable",
Packit 1e8aac
                                                COLUMN_TYPE_EDITABLE, "text",
Packit 1e8aac
                                                COLUMN_NAME, NULL);
Packit 1e8aac
Packit 1e8aac
  gtk_tree_view_column_set_expand (eprop_types->type_column, TRUE);
Packit 1e8aac
  gtk_tree_view_append_column (eprop_types->view, eprop_types->type_column);
Packit 1e8aac
Packit 1e8aac
  /* name column */
Packit 1e8aac
  cell = gtk_cell_renderer_text_new ();
Packit 1e8aac
  g_signal_connect (G_OBJECT (cell), "edited",
Packit 1e8aac
                    G_CALLBACK (column_name_edited), eprop);
Packit 1e8aac
Packit 1e8aac
  g_signal_connect (G_OBJECT (cell), "editing-started",
Packit 1e8aac
                    G_CALLBACK (types_name_editing_started), eprop);
Packit 1e8aac
Packit 1e8aac
  g_signal_connect (G_OBJECT (cell), "editing-canceled",
Packit 1e8aac
                    G_CALLBACK (types_name_editing_canceled), eprop);
Packit 1e8aac
Packit 1e8aac
  eprop_types->name_column =
Packit 1e8aac
      gtk_tree_view_column_new_with_attributes (_("Column name"), cell,
Packit 1e8aac
                                                "editable",
Packit 1e8aac
                                                COLUMN_NAME_EDITABLE, "text",
Packit 1e8aac
                                                COLUMN_COLUMN_NAME, NULL);
Packit 1e8aac
Packit 1e8aac
  gtk_tree_view_column_set_expand (eprop_types->name_column, TRUE);
Packit 1e8aac
Packit 1e8aac
  gtk_tree_view_append_column (eprop_types->view, eprop_types->name_column);
Packit 1e8aac
  gtk_container_add (GTK_CONTAINER (swin), GTK_WIDGET (eprop_types->view));
Packit 1e8aac
Packit 1e8aac
  g_object_set (G_OBJECT (vbox), "height-request", 200, NULL);
Packit 1e8aac
Packit 1e8aac
  gtk_widget_show_all (vbox);
Packit 1e8aac
  return vbox;
Packit 1e8aac
}