|
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 |
}
|