Plugin de glade mejorado.

Otros cambios.
This commit is contained in:
Alejandro T. Colombini Gómez 2014-02-11 13:16:39 +01:00
parent e5e83eaa91
commit ad032d2e74
60 changed files with 2501 additions and 1375 deletions

View File

@ -29,7 +29,7 @@
* updates its value according to the changes. * updates its value according to the changes.
* *
* #DbCalc has as built-in operations the sumatory and average that can be * #DbCalc has as built-in operations the sumatory and average that can be
* selected passing #DB_CALC_SUM OR #DB_CALC_AVG, respectively. * selected passing #DB_CALC_TYPE_SUM OR #DB_CALC_TYPE_AVG, respectively.
* *
* While creating a #DbCalc it's possible to specify either a single column * While creating a #DbCalc it's possible to specify either a single column
* number, to calculate using only this column and no additional operations, or * number, to calculate using only this column and no additional operations, or
@ -51,7 +51,7 @@ G_DEFINE_TYPE (DbCalc, db_calc, GVN_TYPE_PARAM);
* *
* Return value: a new #DbCalc * Return value: a new #DbCalc
**/ **/
DbCalc * db_calc_new (DbModel * model, DbCalcOperationType type, gint col) DbCalc * db_calc_new (DbModel * model, DbCalcType type, gint col)
{ {
g_return_val_if_fail (DB_IS_MODEL (model), NULL); g_return_val_if_fail (DB_IS_MODEL (model), NULL);
g_return_val_if_fail (0 <= col || col < db_model_get_ncols (model), NULL); g_return_val_if_fail (0 <= col || col < db_model_get_ncols (model), NULL);
@ -72,7 +72,7 @@ DbCalc * db_calc_new (DbModel * model, DbCalcOperationType type, gint col)
* *
* Return value: a new #DbCalc * Return value: a new #DbCalc
**/ **/
DbCalc * db_calc_new_with_func (DbModel * model, DbCalcOperationType type, DbCalcFunc func, gpointer data) DbCalc * db_calc_new_with_func (DbModel * model, DbCalcType type, DbCalcFunc func, gpointer data)
{ {
g_return_val_if_fail (DB_IS_MODEL (model), NULL); g_return_val_if_fail (DB_IS_MODEL (model), NULL);
g_return_val_if_fail (func, NULL); g_return_val_if_fail (func, NULL);
@ -119,7 +119,7 @@ static void db_calc_internal_func
static void db_calc_before_unset (DbModel * model, DbIter * iter, DbCalc * obj) static void db_calc_before_unset (DbModel * model, DbIter * iter, DbCalc * obj)
{ {
GValue value = {0}; GValue value = G_VALUE_INIT;
obj->func (obj, iter, &value, obj->data); obj->func (obj, iter, &value, obj->data);
@ -130,14 +130,14 @@ static void db_calc_before_unset (DbModel * model, DbIter * iter, DbCalc * obj)
current = db_calc_value_to_double (gvn_param_get_value (GVN_PARAM (obj))); current = db_calc_value_to_double (gvn_param_get_value (GVN_PARAM (obj)));
old = db_calc_value_to_double (&value); old = db_calc_value_to_double (&value);
if (obj->type == DB_CALC_AVG) if (obj->type == DB_CALC_TYPE_AVG)
{ {
if (obj->count != 1) if (obj->count != 1)
current = (current * (gdouble) obj->count - old) / (gdouble) (obj->count - 1); current = (current * (gdouble) obj->count - old) / (gdouble) (obj->count - 1);
else else
current = 0; current = 0;
} }
else if (obj->type == DB_CALC_SUM) else if (obj->type == DB_CALC_TYPE_SUM)
current -= old; current -= old;
obj->count--; obj->count--;
@ -158,7 +158,7 @@ static void db_calc_before_delete (DbModel * model, gint path, DbCalc * obj)
static void db_calc_after_set (DbModel * model, DbIter * iter, DbCalc * obj) static void db_calc_after_set (DbModel * model, DbIter * iter, DbCalc * obj)
{ {
GValue value = {0}; GValue value = G_VALUE_INIT;
obj->func (obj, iter, &value, obj->data); obj->func (obj, iter, &value, obj->data);
@ -169,9 +169,9 @@ static void db_calc_after_set (DbModel * model, DbIter * iter, DbCalc * obj)
current = db_calc_value_to_double (gvn_param_get_value (GVN_PARAM (obj))); current = db_calc_value_to_double (gvn_param_get_value (GVN_PARAM (obj)));
new = db_calc_value_to_double (&value); new = db_calc_value_to_double (&value);
if (obj->type == DB_CALC_AVG) if (obj->type == DB_CALC_TYPE_AVG)
current = (current * (gdouble) obj->count + new) / (gdouble) (obj->count + 1); current = (current * (gdouble) obj->count + new) / (gdouble) (obj->count + 1);
else if (obj->type == DB_CALC_SUM) else if (obj->type == DB_CALC_TYPE_SUM)
current += new; current += new;
obj->count++; obj->count++;
@ -187,7 +187,7 @@ static void db_calc_refresh (DbModel * model, DbModelStatus status, DbCalc * obj
{ {
DbIter iter; DbIter iter;
gdouble current = 0; gdouble current = 0;
GValue val = {0}; GValue val = G_VALUE_INIT;
if (status != DB_MODEL_STATUS_READY) return; if (status != DB_MODEL_STATUS_READY) return;
if (!db_model_get_iter_first (model, &iter)) return; if (!db_model_get_iter_first (model, &iter)) return;
@ -207,7 +207,7 @@ static void db_calc_refresh (DbModel * model, DbModelStatus status, DbCalc * obj
} }
while (db_model_iter_next (model, &iter)); while (db_model_iter_next (model, &iter));
if (obj->type == DB_CALC_AVG) if (obj->type == DB_CALC_TYPE_AVG)
current = (obj->count > 0) ? current / (gdouble) obj->count : 0; current = (obj->count > 0) ? current / (gdouble) obj->count : 0;
g_value_set_double (g_value_init (&val, G_TYPE_DOUBLE), current); g_value_set_double (g_value_init (&val, G_TYPE_DOUBLE), current);
@ -233,13 +233,13 @@ static void db_calc_set_property (DbCalc * obj, guint id,
{ {
case PROP_MODEL: case PROP_MODEL:
obj->model = g_value_dup_object (value); obj->model = g_value_dup_object (value);
if (obj->model)
g_object_connect (obj->model g_object_connect (obj->model
,"signal::line-updated", db_calc_before_unset, obj ,"signal::line-updated", db_calc_before_unset, obj
,"signal-after::line-updated", db_calc_after_set, obj ,"signal-after::line-updated", db_calc_after_set, obj
,"signal::line-deleted", db_calc_before_delete, obj ,"signal::line-deleted", db_calc_before_delete, obj
,"signal::status-changed", db_calc_refresh, obj ,"signal::status-changed", db_calc_refresh, obj
, NULL , NULL);
);
break; break;
case PROP_TYPE: case PROP_TYPE:
obj->type = g_value_get_int (value); obj->type = g_value_get_int (value);
@ -333,12 +333,11 @@ static void db_calc_class_init (DbCalcClass * k)
); );
g_object_class_install_property (klass, PROP_TYPE g_object_class_install_property (klass, PROP_TYPE
,g_param_spec_int ("type" ,g_param_spec_enum ("type"
,_("Operation type") ,_("Operation type")
,_("The type of the operation applied over the function") ,_("The type of the operation applied over the function")
,0 ,DB_TYPE_CALC_TYPE
,1 ,DB_CALC_TYPE_SUM
,0
,G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE) ,G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)
); );
@ -366,3 +365,23 @@ static void db_calc_class_init (DbCalcClass * k)
,G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE) ,G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)
); );
} }
GType db_calc_type_get_type ()
{
static GType type = 0;
if (type == 0)
{
static const GEnumValue values[] =
{
{DB_CALC_TYPE_SUM, "DB_CALC_TYPE_SUM", "sum"}
,{DB_CALC_TYPE_AVG, "DB_CALC_TYPE_AVG", "avg"}
,{0, NULL, NULL}
};
type = g_enum_register_static
(g_intern_static_string ("DbCalcType"), values);
}
return type;
}

View File

@ -33,6 +33,8 @@
#define DB_IS_CALC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DB_TYPE_CLASS)) #define DB_IS_CALC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DB_TYPE_CLASS))
#define DB_CALC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DB_TYPE_CALC, DbCalcClass)) #define DB_CALC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DB_TYPE_CALC, DbCalcClass))
#define DB_TYPE_CALC_TYPE (db_calc_type_get_type ())
typedef struct _DbCalc DbCalc; typedef struct _DbCalc DbCalc;
typedef struct _DbCalcClass DbCalcClass; typedef struct _DbCalcClass DbCalcClass;
@ -50,25 +52,25 @@ typedef struct _DbCalcClass DbCalcClass;
typedef void (*DbCalcFunc) (DbCalc * obj, DbIter * iter, GValue * out, gpointer user_data); typedef void (*DbCalcFunc) (DbCalc * obj, DbIter * iter, GValue * out, gpointer user_data);
/** /**
* DbCalcOperationType: * DbCalcType:
* @DB_CALC_SUM: sumatory of the values * @DB_CALC_TYPE_SUM: sumatory of the values
* @DB_CALC_AVG: average of the values * @DB_CALC_TYPE_AVG: average of the values
* *
* Defines which type of operation will be performed over the column values. * Defines which type of operation will be performed over the column values.
**/ **/
typedef enum typedef enum
{ {
DB_CALC_SUM, DB_CALC_TYPE_SUM,
DB_CALC_AVG DB_CALC_TYPE_AVG
} }
DbCalcOperationType; DbCalcType;
struct _DbCalc struct _DbCalc
{ {
GvnParam parent; GvnParam parent;
DbModel * model; DbModel * model;
DbCalcOperationType type; DbCalcType type;
DbCalcFunc func; DbCalcFunc func;
gpointer data; gpointer data;
guint col; guint col;
@ -82,11 +84,13 @@ struct _DbCalcClass
}; };
GType db_calc_get_type (); GType db_calc_get_type ();
GType db_calc_type_get_type ();
DbCalc * db_calc_new (DbModel * model DbCalc * db_calc_new (DbModel * model
,DbCalcOperationType type ,DbCalcType type
,gint col); ,gint col);
DbCalc * db_calc_new_with_func (DbModel * model DbCalc * db_calc_new_with_func (DbModel * model
,DbCalcOperationType type ,DbCalcType type
,DbCalcFunc func ,DbCalcFunc func
,gpointer data); ,gpointer data);

View File

@ -91,7 +91,7 @@ static gboolean db_conn_idle_error (IdleData * idle_data)
GError * error = idle_data->data; GError * error = idle_data->data;
g_signal_emit (idle_data->obj, signals[ERROR], 0, error); g_signal_emit (idle_data->obj, signals[ERROR], 0, error);
g_error_free (error); g_error_free (error);
return FALSE; return G_SOURCE_REMOVE;
} }
/* /*
@ -117,7 +117,7 @@ static gboolean db_conn_idle_status (IdleData * idle_data)
{ {
DbConnStatus status = GPOINTER_TO_INT (idle_data->data); DbConnStatus status = GPOINTER_TO_INT (idle_data->data);
g_signal_emit (idle_data->obj, signals[STATUS_CHANGED], 0, status); g_signal_emit (idle_data->obj, signals[STATUS_CHANGED], 0, status);
return FALSE; return G_SOURCE_REMOVE;
} }
/* /*

View File

@ -218,7 +218,7 @@ static gboolean db_file_loader_callback (File * file)
g_hash_table_remove (file->obj->priv->downloading, file); g_hash_table_remove (file->obj->priv->downloading, file);
return FALSE; return G_SOURCE_REMOVE;
} }
static gboolean db_file_loader_resolve_host (DbFileLoader * obj, static gboolean db_file_loader_resolve_host (DbFileLoader * obj,

View File

@ -220,7 +220,7 @@ DbColDef;
typedef struct typedef struct
{ {
gchar * dst; SqlField * dst;
GvnParam * param; GvnParam * param;
} }
DbParamDef; DbParamDef;
@ -1780,6 +1780,7 @@ void db_model_set_default_value_from_param (DbModel * obj,
const gchar * dst_field, GvnParam * param) const gchar * dst_field, GvnParam * param)
{ {
SqlExpr * value; SqlExpr * value;
SqlField * field;
SqlOperation * op; SqlOperation * op;
g_return_if_fail (DB_IS_MODEL (obj)); g_return_if_fail (DB_IS_MODEL (obj));
@ -1787,7 +1788,8 @@ void db_model_set_default_value_from_param (DbModel * obj,
g_return_if_fail (dst_field); g_return_if_fail (dst_field);
op = sql_operation_new (SQL_OPERATION_TYPE_EQUAL); op = sql_operation_new (SQL_OPERATION_TYPE_EQUAL);
sql_operation_add_expr (op, sql_field_new (dst_field, NULL, NULL)); field = sql_parser_parse_field (dst_field);
sql_operation_add_expr (op, SQL_EXPR (field));
value = sql_value_new (); value = sql_value_new ();
sql_value_set_param (SQL_VALUE (value), param); sql_value_set_param (SQL_VALUE (value), param);
@ -1796,7 +1798,7 @@ void db_model_set_default_value_from_param (DbModel * obj,
sql_string_add_expr (SQL_STRING (obj->priv->stmt), SQL_EXPR (op)); sql_string_add_expr (SQL_STRING (obj->priv->stmt), SQL_EXPR (op));
DbParamDef * def = g_new (DbParamDef, 1); DbParamDef * def = g_new (DbParamDef, 1);
def->dst = g_strdup (dst_field); def->dst = g_object_ref_sink (field);
def->param = g_object_ref_sink (param); def->param = g_object_ref_sink (param);
obj->priv->param_default = g_slist_prepend (obj->priv->param_default, def); obj->priv->param_default = g_slist_prepend (obj->priv->param_default, def);
@ -1930,7 +1932,7 @@ void db_model_set (DbModel * obj, DbIter * iter, ...)
{ {
gint column; gint column;
gpointer content; gpointer content;
GValue val = {0}; GValue val = G_VALUE_INIT;
va_list va; va_list va;
g_return_if_fail (DB_IS_MODEL (obj)); g_return_if_fail (DB_IS_MODEL (obj));
@ -2026,7 +2028,7 @@ gboolean db_model_set_value (DbModel * obj, DbIter * iter, gint col, const GValu
} }
else else
{ {
GValue new_value = {0}; GValue new_value = G_VALUE_INIT;
DbRow * row = iter->data; DbRow * row = iter->data;
DbOperation * operation = g_hash_table_lookup (priv->row_ops, row); DbOperation * operation = g_hash_table_lookup (priv->row_ops, row);
DbModelRowOp row_op = operation ? operation->type : 0; DbModelRowOp row_op = operation ? operation->type : 0;
@ -2136,7 +2138,7 @@ gboolean db_model_insert (DbModel * obj, DbIter * iter)
{ {
DbParamDef * param_def = p->data; DbParamDef * param_def = p->data;
if (!g_strcmp0 (param_def->dst, priv->column[i].name)) if (!g_strcmp0 (param_def->dst->name, priv->column[i].name))
{ {
def = gvn_param_get_value (param_def->param); def = gvn_param_get_value (param_def->param);
g_value_init (&row->value[i], G_VALUE_TYPE (def)); g_value_init (&row->value[i], G_VALUE_TYPE (def));
@ -2343,7 +2345,7 @@ void db_model_order_by (DbModel * obj, gint col, DbSortType order)
gboolean db_model_search (DbModel * obj, gint col, DbIter * iter, gpointer content) gboolean db_model_search (DbModel * obj, gint col, DbIter * iter, gpointer content)
{ {
gboolean ret; gboolean ret;
GValue value = {0}; GValue value = G_VALUE_INIT;
g_return_val_if_fail (DB_IS_MODEL (obj), FALSE); g_return_val_if_fail (DB_IS_MODEL (obj), FALSE);
g_return_val_if_fail (obj->priv->result g_return_val_if_fail (obj->priv->result
@ -2585,7 +2587,7 @@ void db_model_perform_operations (DbModel * obj, gboolean retry)
if (priv->column[i].info & DB_COLUMN_PRI_KEY) if (priv->column[i].info & DB_COLUMN_PRI_KEY)
{ {
gboolean unset = FALSE; gboolean unset = FALSE;
GValue value = {0}; GValue value = G_VALUE_INIT;
SqlExpr * eq_value; SqlExpr * eq_value;
equal_op = SQL_OPERATION equal_op = SQL_OPERATION
@ -2630,7 +2632,7 @@ void db_model_perform_operations (DbModel * obj, gboolean retry)
DbParamDef * param_def = sl->data; DbParamDef * param_def = sl->data;
for (m = insert->field; m; m = m->next) for (m = insert->field; m; m = m->next)
if (!g_strcmp0 (((SqlField*) m->data)->name, param_def->dst)) if (!g_strcmp0 (((SqlField*) m->data)->name, param_def->dst->name))
{ {
cont = TRUE; cont = TRUE;
break; break;
@ -2641,8 +2643,7 @@ void db_model_perform_operations (DbModel * obj, gboolean retry)
val = sql_value_new_with_value val = sql_value_new_with_value
(gvn_param_get_value (param_def->param)); (gvn_param_get_value (param_def->param));
sql_insert_add_field (insert, sql_insert_add_field (insert, param_def->dst);
SQL_FIELD (sql_field_new (param_def->dst, NULL, NULL)));
sql_insert_add_expr (insert, val); sql_insert_add_expr (insert, val);
} }
@ -2996,7 +2997,7 @@ gint db_model_get_path (DbModel * obj, DbIter * iter)
/** /**
* db_model_get_iter: * db_model_get_iter:
* @obj: a #DbModel * @obj: a #DbModel
* @iter: (out): an uninitialized #DbIter * @iter: (out): an unitialized #DbIter
* @path: the number of the row being accessed * @path: the number of the row being accessed
* *
* Sets @iter pointing to the row of @obj specified by @path. * Sets @iter pointing to the row of @obj specified by @path.
@ -3261,8 +3262,6 @@ static void db_model_init (DbModel *obj)
static void db_model_finalize (DbModel * obj) static void db_model_finalize (DbModel * obj)
{ {
GSList * n; GSList * n;
GObjectClass * parent;
parent = g_type_class_peek_parent (DB_MODEL_GET_CLASS (obj));
db_model_clear (obj); db_model_clear (obj);
@ -3292,14 +3291,15 @@ static void db_model_finalize (DbModel * obj)
for (n = obj->priv->param_default; n; n = n->next) for (n = obj->priv->param_default; n; n = n->next)
{ {
g_object_unref (((DbParamDef *) n->data)->param); DbParamDef * pd = n->data;
g_free (((DbParamDef *) n->data)->dst); g_object_unref (pd->param);
g_free (n->data); g_object_unref (pd->dst);
g_free (pd);
} }
g_slist_free (obj->priv->param_default); g_slist_free (obj->priv->param_default);
parent->finalize (G_OBJECT (obj)); G_OBJECT_CLASS (db_model_parent_class)->finalize (G_OBJECT (obj));
} }
static void db_model_class_init (DbModelClass *k) static void db_model_class_init (DbModelClass *k)

View File

@ -94,7 +94,7 @@ static void db_param_on_iterator_iter_changed (DbIterator * iterator, DbParam *
if (!value) if (!value)
{ {
GValue tmp_value = {0}; GValue tmp_value = G_VALUE_INIT;
g_value_init (&tmp_value, GVN_TYPE_NULL); g_value_init (&tmp_value, GVN_TYPE_NULL);
klass->put_value (GVN_PARAM (obj), &tmp_value); klass->put_value (GVN_PARAM (obj), &tmp_value);
g_value_unset (&tmp_value); g_value_unset (&tmp_value);

View File

@ -35,7 +35,7 @@ static gboolean db_request_idle (DbRequest * obj)
if (obj->callback) if (obj->callback)
obj->callback (obj, obj->user_data); obj->callback (obj, obj->user_data);
return FALSE; return G_SOURCE_REMOVE;
} }
static void db_request_idle_notify (DbRequest * obj) static void db_request_idle_notify (DbRequest * obj)

2
debian/changelog vendored
View File

@ -1,4 +1,4 @@
libhedera (1.0-8) stable; urgency=low libhedera (1.0-9) stable; urgency=low
* Initial Release. * Initial Release.

View File

@ -110,7 +110,7 @@
<xi:include href="xml/vn-gui.xml"/> <xi:include href="xml/vn-gui.xml"/>
<xi:include href="xml/vn-mod.xml"/> <xi:include href="xml/vn-mod.xml"/>
<xi:include href="xml/vn-form.xml"/> <xi:include href="xml/vn-form.xml"/>
<xi:include href="xml/vn-model.xml"/> <xi:include href="xml/vn-grid-model.xml"/>
<xi:include href="xml/vn-grid.xml"/> <xi:include href="xml/vn-grid.xml"/>
<xi:include href="xml/vn-handler.xml"/> <xi:include href="xml/vn-handler.xml"/>
<xi:include href="xml/vn-batch.xml"/> <xi:include href="xml/vn-batch.xml"/>

View File

@ -24,9 +24,9 @@
<command>pkg-config</command> to know where <command>pkg-config</command> to know where
these directories actually are in your installation: these directories actually are in your installation:
<programlisting> <programlisting>
$ pkg-config --variable=modulelibdir hedera pkg-config --variable=modulelibdir hedera
$ pkg-config --variable=moduledatadir hedera pkg-config --variable=moduledatadir hedera
$ pkg-config --variable=modulequerydir hedera</programlisting> pkg-config --variable=modulequerydir hedera</programlisting>
</para> </para>
<para> <para>
It is also possible to put your files in any other path and tell It is also possible to put your files in any other path and tell

View File

@ -15,10 +15,12 @@ libgladevn_la_LDFLAGS = -avoid-version
libgladevn_la_SOURCES = \ libgladevn_la_SOURCES = \
glade-vn.h \ glade-vn.h \
glade-vn.c \ glade-vn.c \
glade-db-iterator.c \
glade-eprop-model.c \
glade-vn-batch.c \ glade-vn-batch.c \
glade-db-sql.c \
glade-db-model.c \ glade-db-model.c \
glade-db-iterator.c glade-db-model-editor.h \
glade-db-model-editor.c
gladevn_data_DATA = vn.xml gladevn_data_DATA = vn.xml

View File

@ -18,108 +18,38 @@
#include "glade-vn.h" #include "glade-vn.h"
#include <vn/glade/vn-iterator.h> #include <vn/glade/vn-iterator.h>
static void glade_db_iterator_on_name_changed (GladeProject * project, static void glade_db_iterator_on_param_col_name_changed (GladeProperty * property,
GladeWidget * widget)
{
const gchar * new_name;
gchar * prefix, * old_name;
GList * n, * list;
if (G_OBJECT_TYPE (glade_widget_get_object (widget)) != VN_TYPE_ITERATOR)
return;
old_name = g_object_get_data (G_OBJECT (widget), "old-name");
prefix = g_strconcat (old_name, "-", NULL);
new_name = glade_widget_get_name (widget);
g_object_set_data_full (G_OBJECT (widget), "old-name",
g_strdup (new_name), (GDestroyNotify) g_free);
list = db_iterator_get_params (DB_ITERATOR (glade_widget_get_object (widget)));
for (n = list; n; n = n->next)
{
GladeWidget * param = glade_widget_get_from_gobject (G_OBJECT (n->data));
const gchar * child_name = glade_widget_get_name (param);
if (g_str_has_prefix (child_name, prefix))
{
glong offset = g_utf8_strlen (prefix, -1);
gchar * new_child_name = g_strconcat (new_name, "-", child_name + offset, NULL);
glade_project_set_widget_name (project, param, new_child_name);
g_free (new_child_name);
}
}
g_list_free (list);
g_free (prefix);
}
void glade_db_iterator_post_create (GladeWidgetAdaptor * adaptor,
DbIterator * iterator, GladeCreateReason * reason)
{
static gboolean connected = FALSE;
GladeWidget * widget = glade_widget_get_from_gobject (G_OBJECT (iterator));
GladeProject * project = glade_widget_get_project (widget);
g_object_set_data_full (G_OBJECT (widget), "old-name",
g_strdup (glade_widget_get_name (widget)), (GDestroyNotify) g_free);
if (!connected)
{
g_signal_connect (project, "widget-name-changed",
G_CALLBACK (glade_db_iterator_on_name_changed), NULL);
connected = TRUE;
}
}
static void glade_db_iterator_on_column_name_changed (GladeProperty * property,
GValue * old, GValue * new, GladeWidget * param) GValue * old, GValue * new, GladeWidget * param)
{ {
const gchar * parent_name; gchar * name = g_value_dup_string (new);
gchar * prefix; GladeProject * project;
GladeWidget * parent = glade_widget_get_parent (param); GladeWidget * parent = glade_widget_get_parent (param);
if (!parent if (!name || name[0] == '\0' || !parent
|| G_OBJECT_TYPE (glade_widget_get_object (parent)) != VN_TYPE_ITERATOR) || G_OBJECT_TYPE (glade_widget_get_object (parent)) != VN_TYPE_ITERATOR)
return; return;
parent_name = glade_widget_get_name (parent); project = glade_widget_get_project (param);
prefix = g_strconcat (parent_name, "-", NULL); glade_project_set_widget_name (project, param, g_strdelimit (name, "_", '-'));
g_free (name);
if (g_str_has_prefix (glade_widget_get_name (param), prefix))
{
GladeProject * project = glade_widget_get_project (param);
gchar * new_name = g_strconcat (prefix, g_value_get_string (new), NULL);
glade_project_set_widget_name (project, param, new_name);
}
g_free (prefix);
} }
void glade_db_iterator_add_child (GladeWidgetAdaptor * adaptor, void glade_db_iterator_add_child (GladeWidgetAdaptor * adaptor,
DbIterator * parent, DbParam * child) DbIterator * parent, DbParam * child)
{ {
gchar * new_name;
const gchar * param_name, * parent_name;
GladeWidget * param = glade_widget_get_from_gobject (G_OBJECT (child)); GladeWidget * param = glade_widget_get_from_gobject (G_OBJECT (child));
GladeProperty * name_prop = glade_widget_get_property (param, "column-name"); GladeProperty * name_prop = glade_widget_get_property (param, "column-name");
param_name = glade_widget_get_name (param);
parent_name = glade_widget_get_name (glade_widget_get_from_gobject (G_OBJECT (parent)));
new_name = g_strconcat (parent_name, "-",param_name, NULL);
glade_project_set_widget_name (glade_widget_get_project (param), param, new_name);
g_free (new_name);
g_signal_connect (name_prop, "value-changed", g_signal_connect (name_prop, "value-changed",
G_CALLBACK (glade_db_iterator_on_column_name_changed), param); G_CALLBACK (glade_db_iterator_on_param_col_name_changed), param);
db_iterator_add_param (parent, child); vn_iterator_add_param (parent, child);
} }
void glade_db_iterator_remove_child (GladeWidgetAdaptor * adaptor, void glade_db_iterator_remove_child (GladeWidgetAdaptor * adaptor,
DbIterator * parent, DbParam * child) DbIterator * parent, DbParam * child)
{ {
// db_iterator_remove_param (parent, child); vn_iterator_remove_param (parent, child);
} }
void glade_db_iterator_replace_child (GladeWidgetAdaptor * adaptor, void glade_db_iterator_replace_child (GladeWidgetAdaptor * adaptor,
@ -129,6 +59,21 @@ void glade_db_iterator_replace_child (GladeWidgetAdaptor * adaptor,
glade_db_iterator_add_child (adaptor, container, new); glade_db_iterator_add_child (adaptor, container, new);
} }
GList * glade_db_iterator_get_children (GladeWidgetAdaptor * adaptor,
DbIterator * parent)
{
return vn_iterator_get_params (parent);
}
static void glade_db_iterator_child_selected (GladeBaseEditor * editor,
GladeWidget * child, gpointer data)
{
glade_base_editor_add_label (editor, _("Parameter"));
glade_base_editor_add_default_properties (editor, child);
glade_base_editor_add_label (editor, _("Properties"));
glade_base_editor_add_editable (editor, child, GLADE_PAGE_GENERAL);
}
gboolean glade_db_iterator_add_verify (GladeWidgetAdaptor * adaptor, gboolean glade_db_iterator_add_verify (GladeWidgetAdaptor * adaptor,
DbIterator * container, DbParam * child, gboolean user_feedback) DbIterator * container, DbParam * child, gboolean user_feedback)
{ {
@ -152,28 +97,13 @@ gboolean glade_db_iterator_add_verify (GladeWidgetAdaptor * adaptor,
return FALSE; return FALSE;
} }
GList * glade_db_iterator_get_children (GladeWidgetAdaptor * adaptor,
DbIterator * parent)
{
return db_iterator_get_params (parent);
}
static void glade_db_iterator_child_selected (GladeBaseEditor * editor,
GladeWidget * child, gpointer data)
{
glade_base_editor_add_label (editor, _("Parameter"));
glade_base_editor_add_default_properties (editor, child);
glade_base_editor_add_label (editor, _("Properties"));
glade_base_editor_add_editable (editor, child, GLADE_PAGE_GENERAL);
}
static gboolean glade_db_iterator_move_child (GladeBaseEditor * editor, static gboolean glade_db_iterator_move_child (GladeBaseEditor * editor,
GladeWidget * parent, GladeWidget * child, gpointer data) GladeWidget * parent, GladeWidget * child, gpointer data)
{ {
return FALSE; return FALSE;
} }
static void glade_db_iterator_launch_editor (GObject * iterator) static void glade_db_iterator_on_launch_editor (GObject * iterator)
{ {
GladeBaseEditor * editor; GladeBaseEditor * editor;
GladeEditable * param_editor; GladeEditable * param_editor;
@ -181,20 +111,21 @@ static void glade_db_iterator_launch_editor (GObject * iterator)
GladeWidget * widget = glade_widget_get_from_gobject (iterator); GladeWidget * widget = glade_widget_get_from_gobject (iterator);
GladeWidgetAdaptor * adaptor = glade_widget_get_adaptor (widget); GladeWidgetAdaptor * adaptor = glade_widget_get_adaptor (widget);
widget = glade_widget_get_toplevel (widget);
param_editor = glade_widget_adaptor_create_editable (adaptor, GLADE_PAGE_GENERAL); param_editor = glade_widget_adaptor_create_editable (adaptor, GLADE_PAGE_GENERAL);
editor = glade_base_editor_new (glade_widget_get_object (widget), editor = glade_base_editor_new (glade_widget_get_object (widget),
param_editor, _("Parameter"), DB_TYPE_PARAM, NULL); param_editor, _("Parameter"), DB_TYPE_PARAM, NULL);
g_signal_connect (editor, "child-selected", G_CALLBACK (glade_db_iterator_child_selected), NULL); g_signal_connect (editor, "child-selected",
g_signal_connect (editor, "move-child", G_CALLBACK (glade_db_iterator_move_child), NULL); G_CALLBACK (glade_db_iterator_child_selected), NULL);
g_signal_connect (editor, "move-child",
G_CALLBACK (glade_db_iterator_move_child), NULL);
gtk_widget_show (GTK_WIDGET (editor)); gtk_widget_show (GTK_WIDGET (editor));
window = glade_base_editor_pack_new_window (editor, _("Iterator Editor"), NULL); window = glade_base_editor_pack_new_window (editor, _("Iterator Editor"), NULL);
gtk_widget_show (window); gtk_widget_show (window);
} }
static void glade_db_iterator_generate_params (GladeWidget * iterator) static void glade_db_iterator_on_generate_params (GladeWidget * iterator)
{ {
gboolean use_file = TRUE; gboolean use_file = TRUE;
gchar * sql = NULL; gchar * sql = NULL;
@ -203,8 +134,8 @@ static void glade_db_iterator_generate_params (GladeWidget * iterator)
SqlSelect * select; SqlSelect * select;
GladeWidget * model_w; GladeWidget * model_w;
DbModel * model = NULL; DbModel * model = NULL;
GList * params = vn_iterator_get_params
GList * params = db_iterator_get_params (DB_ITERATOR (glade_widget_get_object (iterator))); (DB_ITERATOR (glade_widget_get_object (iterator)));
if (params) if (params)
{ {
@ -241,39 +172,106 @@ static void glade_db_iterator_generate_params (GladeWidget * iterator)
//TODO Cambios cuando se use g_object_get (select, "fields", &fields, NULL) //TODO Cambios cuando se use g_object_get (select, "fields", &fields, NULL)
GSList * l, * fields = select->expr; GSList * l, * fields = select->expr;
GladeProject * project = glade_widget_get_project (iterator); GladeProject * project = glade_widget_get_project (iterator);
fields = g_slist_reverse (fields);
for (l = fields; l; l = l->next) for (l = fields; l; l = l->next)
{ {
gchar * column_name;
gchar * param_name, * param_new_name = NULL; gchar * param_name, * param_new_name = NULL;
GladeWidget * param; GladeWidget * param;
param = glade_command_create (glade_widget_adaptor_get_by_type (DB_TYPE_PARAM), param = glade_command_create (glade_widget_adaptor_get_by_type (DB_TYPE_PARAM),
iterator, NULL, project); iterator, NULL, project);
column_name = sql_select_get_column_name (select, SQL_EXPR (l->data)); param_name = sql_select_get_column_name (select, SQL_EXPR (l->data));
param_name = g_strconcat (name, "-"
,column_name ? column_name : "param"
,NULL);
if (param_name)
{
if (!glade_project_available_widget_name (project, param, param_name)) if (!glade_project_available_widget_name (project, param, param_name))
param_new_name = glade_project_new_widget_name (project, param, param_name); param_new_name = glade_project_new_widget_name (project, param, param_name);
glade_project_set_widget_name (project, param, param_new_name ? param_new_name : param_name); glade_project_set_widget_name (project, param, param_new_name ? param_new_name : param_name);
glade_widget_property_set (param, "column-name", column_name); glade_widget_property_set (param, "column-name", param_name);
g_free (column_name);
g_free (param_new_name); g_free (param_new_name);
g_free (param_name); g_free (param_name);
} }
} }
}
} }
void glade_db_iterator_action_activate (GladeWidgetAdaptor * adaptor, void glade_db_iterator_action_activate (GladeWidgetAdaptor * adaptor,
GObject * object, const gchar * action_path) GObject * object, const gchar * action_path)
{ {
if (!g_strcmp0 (action_path, "launch-editor")) if (!g_strcmp0 (action_path, "launch-editor"))
glade_db_iterator_launch_editor (object); glade_db_iterator_on_launch_editor (object);
else if (!g_strcmp0 (action_path, "generate-params")) else if (!g_strcmp0 (action_path, "generate-params"))
glade_db_iterator_generate_params (glade_widget_get_from_gobject (object)); glade_db_iterator_on_generate_params (glade_widget_get_from_gobject (object));
}
// XXX Workaround for an error in Glade while loading child params
static GSList * correction_data = NULL;
static void clean_correction_data ()
{
GSList * l;
for (l = correction_data; l; l = l->next)
{
g_free (l->data);
}
g_slist_free (correction_data);
correction_data = NULL;
}
void glade_db_iterator_read_widget (GladeWidgetAdaptor * adaptor,
GladeWidget * widget, GladeXmlNode * node)
{
GSList * l;
GList * n, * children;
GladeXmlNode * links_node;
if (!glade_xml_node_verify (node, GLADE_XML_TAG_WIDGET))
return;
GWA_GET_CLASS (G_TYPE_OBJECT)->read_widget (adaptor, widget, node);
if ((links_node = glade_xml_search_child (node, "child")) == NULL)
return;
// Param name correction
if (!correction_data)
return;
children = glade_widget_adaptor_get_children (adaptor,
glade_widget_get_object (widget));
for (n = children; n; n = n->next)
{
GladeWidget * w = glade_widget_get_from_gobject (G_OBJECT (n->data));
const gchar * name = glade_widget_get_name (w);
for (l = correction_data; l; l = l->next)
if (g_str_has_suffix (name, (gchar *)l->data))
glade_widget_set_name (w, (gchar *) l->data);
}
clean_correction_data ();
}
void glade_db_param_read_widget (GladeWidgetAdaptor * adaptor,
GladeWidget * widget, GladeXmlNode * node)
{
GladeWidget * parent;
if (!glade_xml_node_verify (node, GLADE_XML_TAG_WIDGET))
return;
GWA_GET_CLASS (G_TYPE_OBJECT)->read_widget (adaptor, widget, node);
parent = glade_widget_get_parent (widget);
if (!parent || !DB_IS_ITERATOR (glade_widget_get_object (parent)))
return;
correction_data = g_slist_prepend (correction_data,
g_strdup (glade_widget_get_name (widget)));
} }

View File

@ -0,0 +1,135 @@
/*
* Copyright (C) 2014 - Juan Ferrer Toribio
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "glade-db-model-editor.h"
//+++++++++++++++++++++++++++++++++++++++++++++++++++ GladeModelEditor
GtkWidget * glade_model_editor_new (GladeWidgetAdaptor * adaptor,
GladeEditable * editable)
{
GladeModelEditor * obj;
GladeEditorProperty * eprop;
GtkWidget * frame, * alignment, * vbox;
g_return_val_if_fail (GLADE_IS_WIDGET_ADAPTOR (adaptor), NULL);
g_return_val_if_fail (GLADE_IS_EDITABLE (editable), NULL);
obj = g_object_new (GLADE_TYPE_MODEL_EDITOR, NULL);
obj->base = GTK_WIDGET (editable);
gtk_box_pack_start (GTK_BOX (obj), GTK_WIDGET (editable), FALSE, FALSE, 0);
eprop = glade_widget_adaptor_create_eprop_by_name (adaptor, "links", FALSE, TRUE);
obj->props = g_list_prepend (obj->props, eprop);
frame = gtk_frame_new (NULL);
gtk_frame_set_label_widget (GTK_FRAME (frame),
glade_editor_property_get_item_label (eprop));
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE);
gtk_box_pack_start (GTK_BOX (obj), frame, FALSE, FALSE, 12);
alignment = gtk_alignment_new (0.5F, 0.5F, 1.0F, 1.0F);
gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 0, 12, 0);
gtk_container_add (GTK_CONTAINER (frame), alignment);
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_container_add (GTK_CONTAINER (alignment), vbox);
gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (eprop), FALSE, FALSE, 4);
gtk_widget_set_tooltip_text (vbox, _("List of parameters linked to the model"));
gtk_widget_show_all (GTK_WIDGET (obj));
return GTK_WIDGET (obj);
}
static void glade_model_editor_load (GladeEditable * editable, GladeWidget * widget)
{
GList *l;
GladeModelEditor * obj = GLADE_MODEL_EDITOR (editable);
GladeEditableIface * iface = g_type_default_interface_peek (GLADE_TYPE_EDITABLE);
iface->load (editable, widget);
if (obj->base)
glade_editable_load (GLADE_EDITABLE (obj->base), widget);
for (l = obj->props; l; l = l->next)
glade_editor_property_load_by_widget (GLADE_EDITOR_PROPERTY (l->data), widget);
}
static void glade_model_editor_set_show_name (GladeEditable * editable, gboolean show_name)
{
GladeModelEditor * obj = GLADE_MODEL_EDITOR (editable);
glade_editable_set_show_name (GLADE_EDITABLE (obj->base), show_name);
}
static void glade_model_editor_finalize (GObject * object)
{
GladeModelEditor * obj = GLADE_MODEL_EDITOR (object);
GObjectClass * parent = g_type_class_peek_parent (GLADE_MODEL_EDITOR_GET_CLASS (obj));
if (obj->props)
g_list_free (obj->props);
obj->props = NULL;
obj->base = NULL;
glade_editable_load (GLADE_EDITABLE (obj), NULL);
parent->finalize (G_OBJECT (obj));
}
static void glade_model_editor_class_init (GladeModelEditorClass * k)
{
GObjectClass * klass = G_OBJECT_CLASS (k);
klass->finalize = glade_model_editor_finalize;
}
static void glade_model_editor_init (GladeModelEditor * obj)
{
}
static void glade_model_editor_editable_init (GladeEditableIface * iface)
{
iface->load = glade_model_editor_load;
iface->set_show_name = glade_model_editor_set_show_name;
}
G_DEFINE_TYPE_WITH_CODE (GladeModelEditor, glade_model_editor, GTK_TYPE_VBOX,
G_IMPLEMENT_INTERFACE (GLADE_TYPE_EDITABLE, glade_model_editor_editable_init));
//+++++++++++++++++++++++++++++++++++++++++++++++++++ GladeDbList
G_DEFINE_BOXED_TYPE (GladeDbList, glade_db_list, glade_db_list_copy, glade_db_list_free);
void glade_db_list_free (GladeDbList * list)
{
if (!list)
return;
if (list->list)
g_object_unref (list->list);
g_free (list);
list = NULL;
}
GladeDbList * glade_db_list_copy (const GladeDbList * list)
{
GladeDbList * l = g_new (GladeDbList, 1);
l->list = list->list ? g_object_ref (list->list) : NULL;
return l;
}

View File

@ -0,0 +1,63 @@
/*
* Copyright (C) 2014 - Juan Ferrer Toribio
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef GLADE_MODEL_EDITOR_H
#define GLADE_MODEL_EDITOR_H
#include "glade-vn.h"
#define GLADE_TYPE_MODEL_EDITOR (glade_model_editor_get_type ())
#define GLADE_MODEL_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_MODEL_EDITOR, GladeModelEditor))
#define GLADE_MODEL_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_MODEL_EDITOR, GladeModelEditorClass))
#define GLADE_IS_MODEL_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_MODEL_EDITOR))
#define GLADE_IS_MODEL_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GLADE_TYPE_MODEL_EDITOR))
#define GLADE_MODEL_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GLADE_TYPE_MODEL_EDITOR, GladeModelEditorClass))
typedef struct _GladeModelEditor GladeModelEditor;
typedef struct _GladeModelEditorClass GladeModelEditorClass;
struct _GladeModelEditor
{
GtkVBox parent;
GtkWidget * base;
GList * props;
};
struct _GladeModelEditorClass
{
GtkVBoxClass parent;
};
GType glade_model_editor_get_type (void) G_GNUC_CONST;
GtkWidget * glade_model_editor_new (GladeWidgetAdaptor * adaptor,
GladeEditable * editable);
#define GLADE_TYPE_DB_LIST (glade_db_list_get_type())
typedef struct _GladeDbList GladeDbList;
struct _GladeDbList
{
GtkListStore * list;
};
GType glade_db_list_get_type (void) G_GNUC_CONST;
void glade_db_list_free (GladeDbList * list);
GladeDbList * glade_db_list_copy (const GladeDbList * list);
#endif

View File

@ -16,8 +16,27 @@
*/ */
#include "glade-vn.h" #include "glade-vn.h"
#include "glade-db-model-editor.h"
//+++++++++++++++++++++++++++++++++++++++++++++++++ DbModel GladeEditorProperty /*
* Contents of this file:
* definition of the custom property editors for the DbModel properties.
* definition of the SQL statement editor for the "sql" property of the
* DbModel.
* the definition of the param-related properties can be found at their
* own file glade-db-model-links.c and glade-db-model-batch.c
*/
#ifdef _HAVE_GTKSOURCEVIEW
#include <gtksourceview/gtksourceview.h>
#include <gtksourceview/gtksourcebuffer.h>
#include <gtksourceview/gtksourcelanguage.h>
#include <gtksourceview/gtksourcelanguagemanager.h>
#endif
#define NEW_SQL _("New SQL statement")
//+++++++++++++++++++++++++++++++++++++++++++++++++++ SQL Editor Property
typedef struct typedef struct
{ {
@ -25,332 +44,565 @@ typedef struct
GtkWidget * button; GtkWidget * button;
GtkWidget * entry; GtkWidget * entry;
gboolean connected; gint width;
GladeWidget * widget; gint height;
} }
GladeEPropModel; GladeEPropSql;
GLADE_MAKE_EPROP (GladeEPropModel, glade_eprop_model) GLADE_MAKE_EPROP (GladeEPropSql, glade_eprop_sql)
#define GLADE_TYPE_EPROP_MODEL (glade_eprop_model_get_type()) #define GLADE_TYPE_EPROP_SQL (glade_eprop_sql_get_type())
#define GLADE_EPROP_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EPROP_MODEL, GladeEPropModel)) #define GLADE_EPROP_SQL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EPROP_SQL, GladeEPropSql))
#define GLADE_EPROP_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EPROP_MODEL, GladeEPropModelClass)) #define GLADE_EPROP_SQL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EPROP_SQL, GladeEPropSqlClass))
#define GLADE_IS_EPROP_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EPROP_MODEL)) #define GLADE_IS_EPROP_SQL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EPROP_SQL))
#define GLADE_IS_EPROP_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GLADE_TYPE_EPROP_MODEL)) #define GLADE_IS_EPROP_SQL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GLADE_TYPE_EPROP_SQL))
#define GLADE_EPROP_MODEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GLADE_EPROP_MODEL, GladeEPropModelClass)) #define GLADE_EPROP_SQL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GLADE_EPROP_SQL, GladeEPropSqlClass))
static void glade_eprop_model_name_changed (GladeProject * project, static void glade_eprop_sql_show_dialog (GtkButton * button, GladeEditorProperty * eprop)
GladeWidget * widget, GladeEPropModel * obj)
{ {
if (widget == obj->widget) gpointer text, buffer;
gtk_entry_set_text (GTK_ENTRY (obj->entry), glade_widget_get_name (widget)); const gchar * sql;
} GladeEPropSql * obj = GLADE_EPROP_SQL (eprop);
PangoFontDescription * font;
static GladeWidget * glade_model_create (GladeProperty * prop) GtkWidget * scroll;
{ GladeProperty * p = glade_editor_property_get_property (eprop);
gboolean use = FALSE; GtkDialog * dialog = GTK_DIALOG (gtk_dialog_new_with_buttons
VnBatch * batch; (_("SQL Editor")
GladeWidget * batch_w; ,GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (eprop)))
GladeProject * project = glade_widget_get_project (glade_property_get_widget (prop));
const GList * l, * n, * objects = glade_project_get_objects (project);
for (n = objects; n; n = n->next)
if (VN_IS_BATCH (n->data))
{
batch = n->data;
use = TRUE;
for (l = vn_batch_get_objects (batch); l; l = l->next)
if (!DB_IS_MODEL (l->data))
{
use = FALSE;
break;
}
if (use)
break;
}
if (!use)
{
batch_w = glade_command_create
(glade_widget_adaptor_get_by_type (VN_TYPE_BATCH), NULL, NULL, project);
glade_widget_set_name (batch_w,
glade_project_new_widget_name (project, batch_w, "models"));
}
else
batch_w = glade_widget_get_from_gobject (batch);
return glade_command_create
(glade_widget_adaptor_get_by_type (DB_TYPE_MODEL), batch_w, NULL, project);
}
/*
* glade_eprop_model_show_dialog:
* @button:(allow-none): a #GtkButton or @NULL
* @object: a #GladeEditorPropery or a #GladeWidget
*
* Opens a dialog to edit a #DbModel.
* Can be called by a #GladeEditorProperty or by the "edit" action of a
* #GladeWidgetAdaptor directly (in which case @button is %NULL and @obj is a
* #GladeWidget).
**/
static void glade_eprop_model_show_dialog (GtkButton * button, GObject * object)
{
gboolean created = FALSE;
GObject * o;
GtkWidget * box;
GtkDialog * dialog;
GladeWidget * widget;
GladeWidgetAdaptor * adaptor;
GladeEditable * editor;
GladeProperty * p = NULL;
GladeEditorProperty * eprop = NULL;
if (GLADE_IS_EDITOR_PROPERTY (object))
{
eprop = GLADE_EDITOR_PROPERTY (object);
p = glade_editor_property_get_property (eprop);
o = g_value_get_object (glade_property_inline_value (p));
if (o && DB_IS_MODEL (o))
widget = glade_widget_get_from_gobject (o);
else
{
GValue val = G_VALUE_INIT;
glade_command_push_group
(_("Create and set a model for a DbModelHolder"));
widget = glade_model_create (p);
created = TRUE;
g_value_init (&val, DB_TYPE_MODEL);
g_value_set_object (&val, glade_widget_get_object (widget));
glade_command_set_property_value (p, &val);
g_value_unset (&val);
glade_command_pop_group ();
glade_project_selection_set (glade_widget_get_project (widget),
glade_widget_get_object (glade_property_get_widget (p)),
TRUE);
if (!GLADE_EPROP_MODEL (eprop)->connected)
{
g_signal_connect (glade_widget_get_project
(glade_property_get_widget (p)), "widget-name-changed",
G_CALLBACK (glade_eprop_model_name_changed), eprop);
GLADE_EPROP_MODEL (eprop)->connected = TRUE;
}
}
}
else
widget = GLADE_WIDGET (object);
adaptor = glade_widget_get_adaptor (widget);
editor = glade_widget_adaptor_create_editable (adaptor, GLADE_PAGE_GENERAL);
glade_editable_load (editor, widget);
dialog = GTK_DIALOG (gtk_dialog_new_with_buttons
(eprop ? _("Model configuration") : _("DbModel properties configuration")
,GTK_WINDOW (glade_app_get_window ())
,GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT ,GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT
,GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL ,GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL
,GTK_STOCK_CLEAR, GTK_RESPONSE_REJECT ,GTK_STOCK_CLEAR, GTK_RESPONSE_REJECT
,GTK_STOCK_OK, GTK_RESPONSE_OK ,GTK_STOCK_OK, GTK_RESPONSE_OK
,NULL ,NULL
)); ));
gtk_dialog_set_alternative_button_order (dialog, gtk_dialog_set_alternative_button_order (dialog,
GTK_RESPONSE_OK, GTK_RESPONSE_REJECT, GTK_RESPONSE_CANCEL, -1); GTK_RESPONSE_OK, GTK_RESPONSE_REJECT, GTK_RESPONSE_CANCEL, -1);
gtk_dialog_set_default_response (dialog, GTK_RESPONSE_OK); gtk_dialog_set_default_response (dialog, GTK_RESPONSE_OK);
gtk_window_set_default_size (GTK_WINDOW (dialog), 400, 300); gtk_window_set_default_size (GTK_WINDOW (dialog), obj->width, obj->height);
if (!eprop) scroll = gtk_scrolled_window_new (gtk_adjustment_new (0,0,0,0,0,0),
gtk_widget_hide (gtk_dialog_get_widget_for_response gtk_adjustment_new (0,0,0,0,0,0));
(dialog, GTK_RESPONSE_REJECT)); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll), GTK_SHADOW_IN);
gtk_widget_set_margin_top (scroll, 6);
box = gtk_alignment_new (0,0,1,1); gtk_widget_set_margin_right (scroll, 6);
gtk_alignment_set_padding (GTK_ALIGNMENT (box), 8, 8, 8, 8); gtk_widget_set_margin_bottom (scroll, 6);
gtk_container_add (GTK_CONTAINER (box), GTK_WIDGET (editor)); gtk_widget_set_margin_left (scroll, 6);
gtk_widget_show_all (box);
gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (dialog)), gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (dialog)),
box, TRUE, TRUE, 0); scroll, TRUE, TRUE, 6);
#ifdef _HAVE_GTKSOURCEVIEW
GtkSourceLanguageManager * lm = gtk_source_language_manager_new ();
GtkSourceLanguage * lang = gtk_source_language_manager_get_language (lm, "sql");
text = gtk_source_view_new ();
gtk_source_view_set_tab_width (text, 4);
gtk_source_view_set_show_line_numbers (text, TRUE);
gtk_source_view_set_highlight_current_line (text, TRUE);
buffer = gtk_text_view_get_buffer (text);
gtk_source_buffer_set_language (buffer, lang);
gtk_source_buffer_set_highlight_matching_brackets (buffer, TRUE);
#else
text = gtk_text_view_new ();
buffer = gtk_text_view_get_buffer (text);
#endif
font = pango_font_description_from_string ("Monospace");
gtk_widget_override_font (text, font);
pango_font_description_free (font);
if ((sql = g_value_get_string (glade_property_inline_value (p))))
gtk_text_buffer_set_text (buffer, sql, -1);
gtk_container_add (GTK_CONTAINER (scroll), text);
gtk_widget_show_all (scroll);
switch (gtk_dialog_run (dialog)) switch (gtk_dialog_run (dialog))
{ {
case GTK_RESPONSE_OK: case GTK_RESPONSE_OK:
{ {
if (eprop) GValue val = G_VALUE_INIT;
{ GtkTextIter * start = g_new (GtkTextIter, 1),
gtk_entry_set_text (GTK_ENTRY (GLADE_EPROP_MODEL (eprop)->entry), * end = g_new (GtkTextIter, 1);
glade_widget_get_name (widget)); g_value_init (&val, G_TYPE_STRING);
GLADE_EPROP_MODEL (eprop)->widget = widget; gtk_text_buffer_get_bounds (buffer, start, end);
}
sql = gtk_text_buffer_get_text (buffer, start, end, TRUE);
g_value_set_string (&val, sql);
glade_command_set_property_value (p, &val);
g_value_unset (&val);
g_free (start);
g_free (end);
break; break;
} }
case GTK_RESPONSE_REJECT: case GTK_RESPONSE_REJECT:
{ {
if (eprop) GValue val = G_VALUE_INIT;
{ g_value_init (&val, G_TYPE_STRING);
glade_command_set_property (p, NULL); g_value_set_string (&val, "");
GLADE_EPROP_MODEL (eprop)->widget = NULL; glade_command_set_property_value (p, &val);
} g_value_unset (&val);
break; break;
} }
case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_CANCEL:
{
if (created)
{
GList * list = g_list_append (NULL, widget);
GladeWidget * batch = glade_widget_get_parent (widget);
if (vn_batch_get_length
VN_BATCH (glade_widget_get_object (batch)) == 1)
list = g_list_prepend (list, batch);
glade_command_delete (list);
g_list_free (list);
GLADE_EPROP_MODEL (eprop)->widget = NULL;
}
break;
}
default: default:
break; break;
} }
obj->width = gtk_widget_get_allocated_width (GTK_WIDGET (dialog));
obj->height = gtk_widget_get_allocated_height (GTK_WIDGET (dialog));
gtk_widget_destroy (GTK_WIDGET (dialog)); gtk_widget_destroy (GTK_WIDGET (dialog));
} }
static void glade_eprop_model_show_object_dialog (GtkButton * button, static void glade_eprop_sql_entry_text_changed (GtkEntry * entry,
GladeEditorProperty * eprop) GladeEditorProperty * eprop)
{ {
const gchar * text = gtk_entry_get_text (entry);
GladeProperty * p = glade_editor_property_get_property (eprop); GladeProperty * p = glade_editor_property_get_property (eprop);
// Widget to which the property belongs (e.g. Model Holder)
GladeWidget * widget = glade_property_get_widget (p);
GladeProject * project = glade_widget_get_project (widget);
GObject * object = g_value_get_object (glade_property_inline_value (p));
// Widget representing the property itself (i.e. DbModel)
widget = object ? glade_widget_get_from_gobject (object) : NULL;
GLADE_EPROP_MODEL (eprop)->widget = widget;
if (glade_editor_property_show_object_dialog (project, if (text)
_("Select a DbModel for the property"), NULL,
DB_TYPE_MODEL, NULL, &widget))
{
if (widget)
{ {
GValue val = G_VALUE_INIT; GValue val = G_VALUE_INIT;
g_value_init (&val, DB_TYPE_MODEL); g_value_init (&val, G_TYPE_STRING);
g_value_set_object (&val, glade_widget_get_object (widget)); g_value_set_string (&val, text);
glade_command_set_property_value (p, &val); glade_command_set_property_value (p, &val);
g_value_unset (&val); g_value_unset (&val);
} }
else
glade_command_set_property (p, NULL);
}
} }
static GtkWidget * glade_eprop_model_create_input (GladeEditorProperty * eprop) static GtkWidget * glade_eprop_sql_create_input (GladeEditorProperty * eprop)
{ {
GtkWidget * hbox, * box, * object_button; GladeEPropSql * obj = GLADE_EPROP_SQL (eprop);
GladeEPropModel * obj = GLADE_EPROP_MODEL (eprop); GtkWidget * box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
obj->button = gtk_button_new_with_label (_("New Model"));
g_signal_connect (G_OBJECT (obj->button), "clicked",
G_CALLBACK (glade_eprop_model_show_dialog), eprop);
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
obj->entry = gtk_entry_new (); obj->entry = gtk_entry_new ();
gtk_editable_set_editable (GTK_EDITABLE (obj->entry), FALSE);
gtk_widget_set_hexpand (obj->entry, TRUE); gtk_widget_set_hexpand (obj->entry, TRUE);
gtk_container_add (GTK_CONTAINER (hbox), obj->entry); g_signal_connect (obj->entry, "changed",
G_CALLBACK (glade_eprop_sql_entry_text_changed), obj);
gtk_container_add (GTK_CONTAINER (box), obj->entry);
object_button = gtk_button_new_with_label ("..."); obj->button = gtk_button_new_with_label ("...");
gtk_container_add (GTK_CONTAINER (hbox), object_button); g_signal_connect (obj->button, "clicked",
g_signal_connect (G_OBJECT (object_button), "clicked", G_CALLBACK (glade_eprop_sql_show_dialog), obj);
G_CALLBACK (glade_eprop_model_show_object_dialog), eprop); gtk_widget_set_tooltip_text (obj->button, _("Open the SQL Editor"));
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_container_add (GTK_CONTAINER (box), hbox);
gtk_container_add (GTK_CONTAINER (box), obj->button); gtk_container_add (GTK_CONTAINER (box), obj->button);
gtk_widget_show_all (box); gtk_widget_show_all (box);
obj->widget = NULL; obj->width = 750;
/* project = glade_widget_get_project (glade_property_get_widget obj->height = 550;
(glade_editor_property_get_property (eprop)));
*/
return box; return box;
} }
static void glade_eprop_model_load (GladeEditorProperty * eprop, GladeProperty * property) static void glade_eprop_sql_load (GladeEditorProperty * eprop, GladeProperty * property)
{ {
gchar * label; const gchar * sql;
const gchar * text; GladeEPropSql * obj = GLADE_EPROP_SQL (eprop);
GObject * object;
GladeEditorPropertyClass * parent_class = GladeEditorPropertyClass * parent_class =
g_type_class_peek_parent (GLADE_EDITOR_PROPERTY_GET_CLASS (eprop)); g_type_class_peek_parent (GLADE_EDITOR_PROPERTY_GET_CLASS (eprop));
parent_class->load (eprop, property); parent_class->load (eprop, property);
if (property == NULL) if (!property)
return; return;
if ((object = g_value_get_object (glade_property_inline_value (property)))) if ((sql = g_value_get_string (glade_property_inline_value (property))))
{ gtk_entry_set_text (GTK_ENTRY (obj->entry), sql);
label = _("Edit Model");
text = glade_widget_get_name (glade_widget_get_from_gobject (object));
}
else else
{ gtk_entry_set_text (GTK_ENTRY (obj->entry), "");
label = _("New Model");
text = "";
}
gtk_button_set_label (GTK_BUTTON (GLADE_EPROP_MODEL (eprop)->button), label);
gtk_entry_set_text (GTK_ENTRY (GLADE_EPROP_MODEL (eprop)->entry), text);
} }
static void glade_eprop_model_finalize (GObject * object) static void glade_eprop_sql_finalize (GObject * object)
{ {
GObjectClass * parent_class = g_type_class_peek_parent (G_OBJECT_GET_CLASS (object)); GObjectClass * parent_class = g_type_class_peek_parent (G_OBJECT_GET_CLASS (object));
G_OBJECT_CLASS (parent_class)->finalize (object); G_OBJECT_CLASS (parent_class)->finalize (object);
} }
//+++++++++++++++++++++++++++++++++++++++++++++++++++ DbModel Action Callback //+++++++++++++++++++++++++++++++++++++++++++++++++++ Links Editor Property
void glade_db_model_action_activate (GladeWidgetAdaptor * adaptor, typedef struct
DbModel * model, const gchar * path)
{ {
glade_eprop_model_show_dialog (NULL, GladeEditorProperty parent;
(GObject *) glade_widget_get_from_gobject (model));
GtkTreeView * view;
gchar * path;
}
GladeEPropLinks;
GLADE_MAKE_EPROP (GladeEPropLinks, glade_eprop_links)
#define GLADE_TYPE_EPROP_LINKS (glade_eprop_links_get_type ())
#define GLADE_EPROP_LINKS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EPROP_LINKS, GladeEPropLinks))
#define GLADE_EPROP_LINKS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EPROP_LINKS, GladeEPropLinksClass))
#define GLADE_IS_EPROP_LINKS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EPROP_LINKS))
#define GLADE_IS_EPROP_LINKS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GLADE_TYPE_EPROP_LINKS))
#define GLADE_EPROP_LINKS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GLADE_EPROP_LINKS, GladeEPropLinksClass))
enum
{
FIELD_COL
,PARAM_COL
,N_COLS
};
static void glade_eprop_links_on_param_col_clicked (GtkEntry * entry,
GtkEntryIconPosition icon_pos, GdkEvent * event, GladeEditorProperty * eprop)
{
GtkTreeIter iter;
GladeProperty * p = glade_editor_property_get_property (eprop);
GladeWidget * widget = glade_property_get_widget (p);
GladeProject * project = glade_widget_get_project (widget);
GtkListStore * store = ((GladeDbList *) g_value_get_boxed (glade_property_inline_value (p)))->list;
gchar * path = GLADE_EPROP_LINKS (eprop)->path;
if (!gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (store), &iter, path))
return;
gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, PARAM_COL, &widget, -1);
if (glade_editor_property_show_object_dialog (project,
_("Select a GvnParam"), NULL, GVN_TYPE_PARAM, NULL, &widget))
{
if (widget)
gtk_list_store_set (store, &iter, PARAM_COL, widget, -1);
else
gtk_list_store_set (store, &iter, PARAM_COL, NULL, -1);
}
} }
//++++++++++++++++++++++++++++++++++++++++++++ DbModelHolder GladeWidgetAdaptor static gboolean glade_eprop_links_on_param_key_pressed (GtkEntry * entry,
GdkEventKey * event, GladeEditorProperty * eprop)
{
if (event->keyval == GDK_KEY_Return)
{
glade_eprop_links_on_param_col_clicked (entry, 0, NULL, eprop);
return TRUE;
}
else if (event->keyval == GDK_KEY_Delete)
{
GtkTreeIter iter;
gchar * path = GLADE_EPROP_LINKS (eprop)->path;
GladeProperty * p = glade_editor_property_get_property (eprop);
GtkListStore * store = ((GladeDbList *) g_value_get_boxed (glade_property_inline_value (p)))->list;
GladeEditorProperty * glade_db_model_holder_create_eprop (GladeWidgetAdaptor * adaptor, if (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (store), &iter, path))
{
gtk_list_store_set (store, &iter, PARAM_COL, NULL, -1);
return TRUE;
}
}
return FALSE;
}
void param_col_cell_data (GtkTreeViewColumn * view, GtkCellRenderer * cell,
GtkTreeModel * model, GtkTreeIter * iter, gpointer data)
{
GladeWidget * param;
gtk_tree_model_get (model, iter, PARAM_COL, &param, -1);
if (param)
g_object_set (cell, "text", glade_widget_get_name (param), NULL);
else
{
g_object_set (cell, "text", "", NULL);
}
}
static void glade_eporp_links_on_param_col_editing_started (GtkCellRendererText * cell,
GtkEntry * entry, gchar * path, GladeEditorProperty * eprop)
{
GladeEPropLinks * obj = GLADE_EPROP_LINKS (eprop);
if (GTK_IS_ENTRY (entry))
{
GList * n;
gboolean have_params = FALSE;
GladeProperty * p = glade_editor_property_get_property (eprop);
GladeProject * project = glade_widget_get_project
(glade_property_get_widget (p));
GList * objects = (GList *) glade_project_get_objects (project);
for (n = objects; n; n = n->next)
if ((have_params = GVN_IS_PARAM (n->data)))
break;
if (have_params)
{
g_object_set (entry
,"secondary-icon-name", "content-loading-symbolic"
,"secondary-icon-sensitive", TRUE
,"secondary-icon-tooltip-text", _("Select the parameter from a list")
,NULL);
if (obj->path)
g_free (obj->path);
obj->path = g_strdup (path);
g_signal_connect (entry, "icon-press",
G_CALLBACK (glade_eprop_links_on_param_col_clicked), eprop);
g_signal_connect (entry, "key-press-event",
G_CALLBACK (glade_eprop_links_on_param_key_pressed), eprop);
}
else
{
g_object_set (entry
,"secondary-icon-name", "dialog-warning-symbolic"
,"secondary-icon-sensitive", FALSE
,"secondary-icon-tooltip-text", _("You need to create at least "
"one GvnParam or derived object")
,NULL);
g_signal_handlers_disconnect_by_data (entry, eprop);
}
g_object_set (entry
,"editable", FALSE
,NULL);
}
}
static void glade_eporp_links_on_field_col_edited (GtkCellRendererText * cell,
gchar * path, const gchar * text, GladeEditorProperty * eprop)
{
GtkTreeIter iter;
GladeProperty * p = glade_editor_property_get_property (eprop);
GladeDbList * list = g_value_get_boxed (glade_property_inline_value (p));
GtkListStore * store = list->list;
if (!gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (store), &iter, path))
return;
gtk_list_store_set (store, &iter, FIELD_COL, text, -1);
}
static void glade_widget_on_remove_widget (GladeProject * project,
GladeWidget * widget, GtkListStore * store)
{
if (g_type_is_a (G_OBJECT_TYPE (glade_widget_get_object (widget)), GVN_TYPE_PARAM))
{
GtkTreeIter iter;
GtkTreeModel * m = GTK_TREE_MODEL (store);
if (gtk_tree_model_get_iter_first (m, &iter))
do
{
GladeWidget * param;
gtk_tree_model_get (m, &iter, PARAM_COL, &param, -1);
if (param == widget)
gtk_list_store_set (store, &iter, PARAM_COL, NULL, -1);
}
while (gtk_tree_model_iter_next (m, &iter));
}
}
static void glade_eporp_links_on_add_clicked (GtkButton * button,
GladeEPropLinks * obj)
{
GtkTreeIter iter;
GtkTreePath * path;
GladeDbList * list;
GtkListStore * store;
GladeProperty * p = glade_editor_property_get_property (GLADE_EDITOR_PROPERTY (obj));
if (!(list = g_value_get_boxed (glade_property_inline_value (p))))
{
list = g_new (GladeDbList, 1);
list->list = gtk_list_store_new (N_COLS, G_TYPE_STRING, GLADE_TYPE_WIDGET);
glade_property_set (p, list);
g_signal_connect (glade_widget_get_project (glade_property_get_widget (p)),
"remove-widget", G_CALLBACK (glade_widget_on_remove_widget), list->list);
}
store = list->list;
gtk_tree_view_set_model (obj->view, GTK_TREE_MODEL (store));
gtk_list_store_append (store, &iter);
path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &iter);
gtk_tree_view_scroll_to_cell (obj->view, path, NULL, FALSE, 0, 0);
gtk_tree_view_set_cursor (obj->view, path, NULL, TRUE);
gtk_widget_grab_focus (GTK_WIDGET (obj->view));
gtk_tree_path_free (path);
}
static void glade_eporp_links_on_remove_clicked (GtkButton * button,
GladeEPropLinks * obj)
{
GtkTreeIter iter;
GtkListStore * store;
GtkTreeSelection * selection = gtk_tree_view_get_selection (obj->view);
GladeProperty * p;
if (!gtk_tree_selection_get_selected (selection, (GtkTreeModel **) &store, &iter))
return;
p = glade_editor_property_get_property (GLADE_EDITOR_PROPERTY (obj));
gtk_list_store_remove (store, &iter);
if (!gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter))
{
gtk_tree_view_set_model (obj->view, NULL);
glade_command_set_property (p, NULL);
g_signal_handlers_disconnect_by_func (
glade_widget_get_project (glade_property_get_widget (p)),
glade_widget_on_remove_widget, store);
}
}
static gboolean glade_eprop_links_on_view_key_press (GtkWidget * treeview,
GdkEventKey * event, GladeEPropLinks * obj)
{
if (event->keyval == GDK_KEY_Delete)
{
glade_eporp_links_on_remove_clicked (NULL, obj);
return TRUE;
}
else if ((event->state & GDK_CONTROL_MASK) != 0
&& (event->keyval == GDK_KEY_n || event->keyval == GDK_KEY_N))
{
glade_eporp_links_on_add_clicked (NULL, obj);
return TRUE;
}
return FALSE;
}
static GtkWidget * glade_eprop_links_create_input (GladeEditorProperty * eprop)
{
GtkCellRenderer * cell;
GtkTreeViewColumn * column;
GladeEPropLinks * obj = GLADE_EPROP_LINKS (eprop);
GtkWidget * scroll, * button, * label,
* hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4),
* box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
label = gtk_label_new (_("<b>Add or remove links</b>"));
gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
gtk_misc_set_padding (GTK_MISC (label), 2, 4);
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
button = gtk_button_new ();
gtk_button_set_image (GTK_BUTTON (button),
gtk_image_new_from_icon_name ("list-add", GTK_ICON_SIZE_BUTTON));
g_signal_connect (button, "clicked",
G_CALLBACK (glade_eporp_links_on_add_clicked), obj);
gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
button = gtk_button_new ();
gtk_button_set_image (GTK_BUTTON (button),
gtk_image_new_from_icon_name ("list-remove", GTK_ICON_SIZE_BUTTON));
g_signal_connect (button, "clicked",
G_CALLBACK (glade_eporp_links_on_remove_clicked), obj);
gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (box), hbox, FALSE, FALSE, 0);
scroll = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll), GTK_SHADOW_IN);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_box_pack_start (GTK_BOX (box), scroll, TRUE, TRUE, 0);
obj->view = GTK_TREE_VIEW (gtk_tree_view_new ());
gtk_tree_view_set_grid_lines (obj->view, GTK_TREE_VIEW_GRID_LINES_BOTH);
g_signal_connect (obj->view, "key-press-event",
G_CALLBACK (glade_eprop_links_on_view_key_press), obj);
gtk_container_add (GTK_CONTAINER (scroll), GTK_WIDGET (obj->view));
cell = gtk_cell_renderer_text_new ();
g_object_set (cell, "editable", TRUE, NULL);
column = gtk_tree_view_column_new_with_attributes (_("Column"), cell,
"text", FIELD_COL, NULL);
gtk_tree_view_column_set_expand (column, TRUE);
g_signal_connect (cell, "edited",
G_CALLBACK (glade_eporp_links_on_field_col_edited), obj);
gtk_tree_view_append_column (obj->view, column);
cell = gtk_cell_renderer_text_new ();
g_object_set (cell, "editable", TRUE, NULL);
column = gtk_tree_view_column_new_with_attributes (_("Param"), cell, NULL);
gtk_tree_view_column_set_cell_data_func (column, cell, param_col_cell_data, obj, NULL);
gtk_tree_view_column_set_expand (column, TRUE);
g_signal_connect (cell, "editing-started",
G_CALLBACK (glade_eporp_links_on_param_col_editing_started), obj);
gtk_tree_view_append_column (obj->view, column);
g_object_set (G_OBJECT (box), "height-request", 200, NULL);
gtk_widget_show_all (box);
return box;
}
static void glade_eprop_links_finalize (GObject * object)
{
GladeEPropLinks * obj = GLADE_EPROP_LINKS (object);
GObjectClass * parent =
g_type_class_peek_parent (GLADE_EPROP_LINKS_GET_CLASS (obj));
parent->finalize (G_OBJECT (obj));
}
static void glade_eprop_links_load (GladeEditorProperty * eprop, GladeProperty * property)
{
GladeDbList * list;
GladeEPropLinks * obj = GLADE_EPROP_LINKS (eprop);
GladeEditorPropertyClass * parent_class =
g_type_class_peek_parent (GLADE_EDITOR_PROPERTY_GET_CLASS (eprop));
parent_class->load (eprop, property);
if (!property)
return;
if ((list = g_value_get_boxed (glade_property_inline_value (property))))
gtk_tree_view_set_model (obj->view, GTK_TREE_MODEL (list->list));
else
gtk_tree_view_set_model (obj->view, NULL);
}
//++++++++++++++++++++++++++++++++++++++++++++++++++ DbModel Widget Adaptor
GladeEditorProperty * glade_db_model_create_eprop (GladeWidgetAdaptor * adaptor,
GladePropertyClass * klass, gboolean use_command) GladePropertyClass * klass, gboolean use_command)
{ {
GladeEditorProperty * eprop; GladeEditorProperty * eprop;
GParamSpec * pspec = glade_property_class_get_pspec (klass); GParamSpec * pspec = glade_property_class_get_pspec (klass);
if (pspec->value_type == DB_TYPE_MODEL) if (!g_strcmp0 (pspec->name, "sql"))
{ eprop = g_object_new (GLADE_TYPE_EPROP_SQL,
eprop = g_object_new (GLADE_TYPE_EPROP_MODEL, "property-class", klass,
"use-command", use_command, NULL);
else if (pspec->value_type == GLADE_TYPE_DB_LIST)
eprop = g_object_new (GLADE_TYPE_EPROP_LINKS,
"property-class", klass, "property-class", klass,
"use-command", use_command, NULL); "use-command", use_command, NULL);
}
else else
eprop = GWA_GET_CLASS (G_TYPE_OBJECT)->create_eprop (adaptor, klass, use_command); eprop = GWA_GET_CLASS (G_TYPE_OBJECT)->create_eprop (adaptor,
klass, use_command);
return eprop; return eprop;
} }
GladeEditable * glade_db_model_create_editable (GladeWidgetAdaptor * adaptor,
GladeEditorPageType type)
{
GladeEditable * editable =
GWA_GET_CLASS (G_TYPE_OBJECT)->create_editable (adaptor, type);
if (type == GLADE_PAGE_GENERAL)
return GLADE_EDITABLE (glade_model_editor_new (adaptor, editable));
return editable;
}
void glade_db_model_write_widget (GladeWidgetAdaptor * adaptor, void glade_db_model_write_widget (GladeWidgetAdaptor * adaptor,
GladeWidget * widget, GladeXmlContext * context, GladeXmlNode * node) GladeWidget * widget, GladeXmlContext * context, GladeXmlNode * node)
{ {
GtkTreeIter iter;
GladeDbList * l;
GtkTreeModel * m;
GladeXmlNode * links_node;
GladeProperty * prop; GladeProperty * prop;
if (!glade_xml_node_verify (node, GLADE_XML_TAG_WIDGET)) if (!glade_xml_node_verify (node, GLADE_XML_TAG_WIDGET))
@ -363,4 +615,123 @@ void glade_db_model_write_widget (GladeWidgetAdaptor * adaptor,
glade_property_write (prop, context, node); glade_property_write (prop, context, node);
GWA_GET_CLASS (G_TYPE_OBJECT)->write_widget (adaptor, widget, context, node); GWA_GET_CLASS (G_TYPE_OBJECT)->write_widget (adaptor, widget, context, node);
prop = glade_widget_get_property (widget, "links");
// Custom tag for the "links" property, e.g.:
// <links>
// <link field="table.name" param="param1"/>
// </links>
if (!(l = g_value_get_boxed (glade_property_inline_value (prop))))
return;
m = GTK_TREE_MODEL (l->list);
if (!gtk_tree_model_get_iter_first (m, &iter))
return;
links_node = glade_xml_node_new (context, "links");
do
{
gchar * field;
GladeWidget * param;
GladeXmlNode * link_node;
gtk_tree_model_get (m, &iter, FIELD_COL, &field, PARAM_COL, &param, -1);
link_node = glade_xml_node_new (context, "link");
glade_xml_node_append_child (links_node, link_node);
glade_xml_node_set_property_string (link_node, "field",
field ? field : "");
glade_xml_node_set_property_string (link_node, "param",
param ? glade_widget_get_name (param) : "");
g_free (field);
}
while (gtk_tree_model_iter_next (m, &iter));
if (!glade_xml_node_get_children (links_node))
glade_xml_node_delete (links_node);
else
glade_xml_node_append_child (node, links_node);
}
typedef struct
{
GtkListStore * store;
GtkTreeIter * iter;
gchar * param_name;
}
ParseData;
void glade_db_model_on_parse_finished (GladeProject * p, ParseData * pd)
{
GladeWidget * param = glade_project_get_widget_by_name (p, pd->param_name);
gtk_list_store_set (pd->store, pd->iter, PARAM_COL, param, -1);
g_object_unref (pd->store);
gtk_tree_iter_free (pd->iter);
g_free (pd->param_name);
g_free (pd);
}
void glade_db_model_read_widget (GladeWidgetAdaptor * adaptor,
GladeWidget * widget, GladeXmlNode * node)
{
GladeXmlNode * links_node;
GladeProperty * prop;
GladeProject * proj;
GladeDbList * list;
GtkListStore * store;
if (!glade_xml_node_verify (node, GLADE_XML_TAG_WIDGET))
return;
GWA_GET_CLASS (G_TYPE_OBJECT)->read_widget (adaptor, widget, node);
if ((links_node = glade_xml_search_child (node, "links")) == NULL)
return;
proj = glade_widget_get_project (widget);
list = g_new (GladeDbList, 1);
store = gtk_list_store_new (N_COLS, G_TYPE_STRING, GLADE_TYPE_WIDGET);
list->list = store;
for (links_node = glade_xml_node_get_children (links_node); links_node;
links_node = glade_xml_node_next (links_node))
{
GtkTreeIter iter;
gint col = PARAM_COL;
gchar * field = glade_xml_get_property_string (links_node, "field"),
* param_name = glade_xml_get_property_string (links_node, "param");
GladeWidget * param = glade_project_get_widget_by_name (proj, param_name);
gtk_list_store_append (store, &iter);
if (!param)
{
ParseData * pd;
pd = g_new (ParseData, 1);
pd->store = g_object_ref (store);
pd->iter = gtk_tree_iter_copy (&iter);
pd->param_name = g_strdup (param_name);
g_signal_connect (proj, "parse-finished",
G_CALLBACK (glade_db_model_on_parse_finished), pd);
col = -1;
}
gtk_list_store_set (store, &iter
,FIELD_COL, field
,col, param
,-1);
g_free (field);
g_free (param_name);
}
prop = glade_widget_get_property (widget, "links");
glade_property_set (prop, list);
} }

View File

@ -1,231 +0,0 @@
/*
* Copyright (C) 2013 - Juan Ferrer Toribio
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "glade-vn.h"
#ifdef _HAVE_GTKSOURCEVIEW
#include <gtksourceview/gtksourceview.h>
#include <gtksourceview/gtksourcebuffer.h>
#include <gtksourceview/gtksourcelanguage.h>
#include <gtksourceview/gtksourcelanguagemanager.h>
#endif
#define NEW_SQL _("New SQL statement")
//+++++++++++++++++++++++++++++++++++++++++++++++++++ GladeEPropSql
typedef struct
{
GladeEditorProperty parent;
GtkWidget * button;
GtkWidget * entry;
gint width;
gint height;
}
GladeEPropSql;
GLADE_MAKE_EPROP (GladeEPropSql, glade_eprop_sql)
#define GLADE_TYPE_EPROP_SQL (glade_eprop_sql_get_type())
#define GLADE_EPROP_SQL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EPROP_SQL, GladeEPropSql))
#define GLADE_EPROP_SQL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EPROP_SQL, GladeEPropSqlClass))
#define GLADE_IS_EPROP_SQL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EPROP_SQL))
#define GLADE_IS_EPROP_SQL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GLADE_TYPE_EPROP_SQL))
#define GLADE_EPROP_SQL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GLADE_EPROP_SQL, GladeEPropSqlClass))
static void glade_eprop_sql_show_dialog (GtkButton * button, GladeEditorProperty * eprop)
{
gpointer text, buffer;
const gchar * sql;
GladeEPropSql * obj = GLADE_EPROP_SQL (eprop);
PangoFontDescription * font;
GtkWidget * scroll;
GladeProperty * p = glade_editor_property_get_property (eprop);
GtkDialog * dialog = GTK_DIALOG (gtk_dialog_new_with_buttons
(_("SQL Editor")
,GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (eprop)))
,GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT
,GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL
,GTK_STOCK_CLEAR, GTK_RESPONSE_REJECT
,GTK_STOCK_OK, GTK_RESPONSE_OK
,NULL
));
gtk_dialog_set_alternative_button_order (dialog,
GTK_RESPONSE_OK, GTK_RESPONSE_REJECT, GTK_RESPONSE_CANCEL, -1);
gtk_dialog_set_default_response (dialog, GTK_RESPONSE_OK);
gtk_window_set_default_size (GTK_WINDOW (dialog), obj->width, obj->height);
scroll = gtk_scrolled_window_new (gtk_adjustment_new (0,0,0,0,0,0),
gtk_adjustment_new (0,0,0,0,0,0));
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll), GTK_SHADOW_IN);
gtk_widget_set_margin_top (scroll, 6);
gtk_widget_set_margin_right (scroll, 6);
gtk_widget_set_margin_bottom (scroll, 6);
gtk_widget_set_margin_left (scroll, 6);
gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (dialog)),
scroll, TRUE, TRUE, 6);
#ifdef _HAVE_GTKSOURCEVIEW
GtkSourceLanguageManager * lm = gtk_source_language_manager_new ();
GtkSourceLanguage * lang = gtk_source_language_manager_get_language (lm, "sql");
text = gtk_source_view_new ();
gtk_source_view_set_tab_width (text, 4);
gtk_source_view_set_show_line_numbers (text, TRUE);
gtk_source_view_set_highlight_current_line (text, TRUE);
buffer = gtk_text_view_get_buffer (text);
gtk_source_buffer_set_language (buffer, lang);
gtk_source_buffer_set_highlight_matching_brackets (buffer, TRUE);
#else
text = gtk_text_view_new ();
buffer = gtk_text_view_get_buffer (text);
#endif
font = pango_font_description_from_string ("Monospace");
gtk_widget_override_font (text, font);
pango_font_description_free (font);
sql = g_value_get_string (glade_property_inline_value (p));
if (sql)
gtk_text_buffer_set_text (buffer, sql, -1);
gtk_container_add (GTK_CONTAINER (scroll), text);
gtk_widget_show_all (scroll);
switch (gtk_dialog_run (dialog))
{
case GTK_RESPONSE_OK:
{
GValue val = G_VALUE_INIT;
GtkTextIter * start = g_new (GtkTextIter, 1),
* end = g_new (GtkTextIter, 1);
g_value_init (&val, G_TYPE_STRING);
gtk_text_buffer_get_bounds (buffer, start, end);
sql = gtk_text_buffer_get_text (buffer, start, end, TRUE);
g_value_set_string (&val, sql);
glade_command_set_property_value (p, &val);
g_value_unset (&val);
g_free (start);
g_free (end);
break;
}
case GTK_RESPONSE_REJECT:
{
GValue val = G_VALUE_INIT;
g_value_init (&val, G_TYPE_STRING);
g_value_set_string (&val, "");
glade_command_set_property_value (p, &val);
g_value_unset (&val);
break;
}
case GTK_RESPONSE_CANCEL:
default:
break;
}
obj->width = gtk_widget_get_allocated_width (GTK_WIDGET (dialog));
obj->height = gtk_widget_get_allocated_height (GTK_WIDGET (dialog));
gtk_widget_destroy (GTK_WIDGET (dialog));
}
static void glade_eprop_sql_entry_text_changed (GtkEntry * entry,
GladeEditorProperty * eprop)
{
const gchar * text = gtk_entry_get_text (entry);
GladeProperty * p = glade_editor_property_get_property (eprop);
if (text)
{
GValue val = G_VALUE_INIT;
g_value_init (&val, G_TYPE_STRING);
g_value_set_string (&val, text);
glade_command_set_property_value (p, &val);
g_value_unset (&val);
}
}
static GtkWidget * glade_eprop_sql_create_input (GladeEditorProperty * eprop)
{
GladeEPropSql * obj = GLADE_EPROP_SQL (eprop);
GtkWidget * box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
obj->entry = gtk_entry_new ();
gtk_widget_set_hexpand (obj->entry, TRUE);
g_signal_connect (obj->entry, "changed",
G_CALLBACK (glade_eprop_sql_entry_text_changed), obj);
gtk_container_add (GTK_CONTAINER (box), obj->entry);
obj->button = gtk_button_new_with_label ("...");
g_signal_connect (obj->button, "clicked",
G_CALLBACK (glade_eprop_sql_show_dialog), obj);
gtk_widget_set_tooltip_text (obj->button, _("Open the SQL Editor"));
gtk_container_add (GTK_CONTAINER (box), obj->button);
gtk_widget_show_all (box);
obj->width = 750;
obj->height = 550;
return box;
}
static void glade_eprop_sql_load (GladeEditorProperty * eprop, GladeProperty * property)
{
const gchar * sql;
GladeEPropSql * obj = GLADE_EPROP_SQL (eprop);
GladeEditorPropertyClass * parent_class =
g_type_class_peek_parent (GLADE_EDITOR_PROPERTY_GET_CLASS (eprop));
parent_class->load (eprop, property);
if (!property)
return;
if ((sql = g_value_get_string (glade_property_inline_value (property))))
gtk_entry_set_text (GTK_ENTRY (obj->entry), sql);
}
static void glade_eprop_sql_finalize (GObject * object)
{
GObjectClass * parent_class = g_type_class_peek_parent (G_OBJECT_GET_CLASS (object));
G_OBJECT_CLASS (parent_class)->finalize (object);
}
//++++++++++++++++++++++++++++++++++++++++++++++++++ DbModel GladeWidgetAdaptor
GladeEditorProperty * glade_db_sql_create_eprop (GladeWidgetAdaptor * adaptor,
GladePropertyClass * klass, gboolean use_command)
{
GladeEditorProperty * eprop;
GParamSpec * pspec = glade_property_class_get_pspec (klass);
if (!g_strcmp0 (pspec->name, "sql"))
{
eprop = g_object_new (GLADE_TYPE_EPROP_SQL,
"property-class", klass,
"use-command", use_command, NULL);
}
else
eprop = GWA_GET_CLASS (G_TYPE_OBJECT)->create_eprop (adaptor, klass, use_command);
return eprop;
}

354
glade/glade-eprop-model.c Normal file
View File

@ -0,0 +1,354 @@
/*
* Copyright (C) 2013 - Juan Ferrer Toribio
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "glade-vn.h"
#include <vn/glade/vn-model.h>
/*
* Contents of this file:
* definition of the DbModel editor as a property for objects implementing
* the DbModelHolder interface.
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++ DbModel GladeEditorProperty
typedef struct
{
GladeEditorProperty parent;
GtkWidget * button;
GtkWidget * entry;
gboolean connected;
GladeWidget * widget;
}
GladeEPropModel;
GLADE_MAKE_EPROP (GladeEPropModel, glade_eprop_model)
#define GLADE_TYPE_EPROP_MODEL (glade_eprop_model_get_type())
#define GLADE_EPROP_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EPROP_MODEL, GladeEPropModel))
#define GLADE_EPROP_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EPROP_MODEL, GladeEPropModelClass))
#define GLADE_IS_EPROP_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EPROP_MODEL))
#define GLADE_IS_EPROP_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GLADE_TYPE_EPROP_MODEL))
#define GLADE_EPROP_MODEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GLADE_EPROP_MODEL, GladeEPropModelClass))
static void glade_eprop_model_name_changed (GladeProject * project,
GladeWidget * widget, GladeEPropModel * obj)
{
if (widget == obj->widget)
gtk_entry_set_text (GTK_ENTRY (obj->entry), glade_widget_get_name (widget));
}
static GladeWidget * glade_model_create (GladeProperty * prop)
{
gboolean use = FALSE;
VnBatch * batch;
GladeWidget * batch_w;
GladeProject * project = glade_widget_get_project (glade_property_get_widget (prop));
const GList * l, * n, * objects = glade_project_get_objects (project);
for (n = objects; n; n = n->next)
if (VN_IS_BATCH (n->data))
{
batch = n->data;
use = TRUE;
for (l = vn_batch_get_objects (batch); l; l = l->next)
if (!DB_IS_MODEL (l->data))
{
use = FALSE;
break;
}
if (use)
break;
}
if (!use)
{
batch_w = glade_command_create
(glade_widget_adaptor_get_by_type (VN_TYPE_BATCH), NULL, NULL, project);
glade_widget_set_name (batch_w,
glade_project_new_widget_name (project, batch_w, "models"));
}
else
batch_w = glade_widget_get_from_gobject (batch);
return glade_command_create
(glade_widget_adaptor_get_by_type (VN_TYPE_MODEL), batch_w, NULL, project);
}
/*
* glade_eprop_model_show_dialog:
* @button:(allow-none): a #GtkButton or @NULL
* @object: a #GladeEditorPropery or a #GladeWidget
*
* Opens a dialog to edit a #DbModel.
* Can be called by a #GladeEditorProperty or by the "edit" action of a
* #GladeWidgetAdaptor directly (in which case @button is %NULL and @obj is a
* #GladeWidget).
**/
static void glade_eprop_model_show_dialog (GtkButton * button, GObject * object)
{
gboolean created = FALSE;
GObject * o;
GtkWidget * box;
GtkDialog * dialog;
GladeWidget * widget;
GladeWidgetAdaptor * adaptor;
GladeEditable * editor;
GladeProperty * p = NULL;
GladeEditorProperty * eprop = NULL;
if (GLADE_IS_EDITOR_PROPERTY (object))
{
eprop = GLADE_EDITOR_PROPERTY (object);
p = glade_editor_property_get_property (eprop);
o = g_value_get_object (glade_property_inline_value (p));
if (o && DB_IS_MODEL (o))
widget = glade_widget_get_from_gobject (o);
else
{
GValue val = G_VALUE_INIT;
glade_command_push_group
(_("Create and set a model for a DbModelHolder"));
widget = glade_model_create (p);
created = TRUE;
g_value_init (&val, DB_TYPE_MODEL);
g_value_set_object (&val, glade_widget_get_object (widget));
glade_command_set_property_value (p, &val);
g_value_unset (&val);
glade_command_pop_group ();
glade_project_selection_set (glade_widget_get_project (widget),
glade_widget_get_object (glade_property_get_widget (p)),
TRUE);
if (!GLADE_EPROP_MODEL (eprop)->connected)
{
g_signal_connect (glade_widget_get_project
(glade_property_get_widget (p)), "widget-name-changed",
G_CALLBACK (glade_eprop_model_name_changed), eprop);
GLADE_EPROP_MODEL (eprop)->connected = TRUE;
}
}
}
else
widget = GLADE_WIDGET (object);
adaptor = glade_widget_get_adaptor (widget);
editor = glade_widget_adaptor_create_editable (adaptor, GLADE_PAGE_GENERAL);
glade_editable_load (editor, widget);
dialog = GTK_DIALOG (gtk_dialog_new_with_buttons
(eprop ? _("Model configuration") : _("Model properties configuration")
,GTK_WINDOW (glade_app_get_window ())
,GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT
,GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL
,GTK_STOCK_CLEAR, GTK_RESPONSE_REJECT
,GTK_STOCK_OK, GTK_RESPONSE_OK
,NULL
));
gtk_dialog_set_alternative_button_order (dialog,
GTK_RESPONSE_OK, GTK_RESPONSE_REJECT, GTK_RESPONSE_CANCEL, -1);
gtk_dialog_set_default_response (dialog, GTK_RESPONSE_OK);
gtk_window_set_default_size (GTK_WINDOW (dialog), 400, 300);
if (!eprop)
gtk_widget_hide (gtk_dialog_get_widget_for_response
(dialog, GTK_RESPONSE_REJECT));
box = gtk_alignment_new (0,0,1,1);
gtk_alignment_set_padding (GTK_ALIGNMENT (box), 8, 8, 8, 8);
gtk_container_add (GTK_CONTAINER (box), GTK_WIDGET (editor));
gtk_widget_show_all (box);
gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (dialog)),
box, TRUE, TRUE, 0);
switch (gtk_dialog_run (dialog))
{
case GTK_RESPONSE_OK:
{
if (eprop)
{
gtk_entry_set_text (GTK_ENTRY (GLADE_EPROP_MODEL (eprop)->entry),
glade_widget_get_name (widget));
GLADE_EPROP_MODEL (eprop)->widget = widget;
}
break;
}
case GTK_RESPONSE_REJECT:
{
if (eprop)
{
glade_command_set_property (p, NULL);
GLADE_EPROP_MODEL (eprop)->widget = NULL;
}
break;
}
case GTK_RESPONSE_CANCEL:
{
if (created)
{
GList * list = g_list_append (NULL, widget);
GladeWidget * batch = glade_widget_get_parent (widget);
if (vn_batch_get_length
VN_BATCH (glade_widget_get_object (batch)) == 1)
list = g_list_prepend (list, batch);
glade_command_delete (list);
g_list_free (list);
GLADE_EPROP_MODEL (eprop)->widget = NULL;
}
break;
}
default:
break;
}
gtk_widget_destroy (GTK_WIDGET (dialog));
}
static void glade_eprop_model_show_object_dialog (GtkButton * button,
GladeEditorProperty * eprop)
{
GladeProperty * p = glade_editor_property_get_property (eprop);
// Widget to which the property belongs (e.g. Model Holder)
GladeWidget * widget = glade_property_get_widget (p);
GladeProject * project = glade_widget_get_project (widget);
GObject * object = g_value_get_object (glade_property_inline_value (p));
// Widget representing the property itself (i.e. VnModel)
widget = object ? glade_widget_get_from_gobject (object) : NULL;
GLADE_EPROP_MODEL (eprop)->widget = widget;
if (glade_editor_property_show_object_dialog (project,
_("Select a VnModel for the property"), NULL,
DB_TYPE_MODEL, NULL, &widget))
{
if (widget)
{
GValue val = G_VALUE_INIT;
g_value_init (&val, DB_TYPE_MODEL);
g_value_set_object (&val, glade_widget_get_object (widget));
glade_command_set_property_value (p, &val);
g_value_unset (&val);
}
else
glade_command_set_property (p, NULL);
}
}
static GtkWidget * glade_eprop_model_create_input (GladeEditorProperty * eprop)
{
GtkWidget * hbox, * box, * object_button;
GladeEPropModel * obj = GLADE_EPROP_MODEL (eprop);
obj->button = gtk_button_new_with_label (_("New Model"));
g_signal_connect (G_OBJECT (obj->button), "clicked",
G_CALLBACK (glade_eprop_model_show_dialog), eprop);
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
obj->entry = gtk_entry_new ();
gtk_editable_set_editable (GTK_EDITABLE (obj->entry), FALSE);
gtk_widget_set_hexpand (obj->entry, TRUE);
gtk_container_add (GTK_CONTAINER (hbox), obj->entry);
object_button = gtk_button_new_with_label ("...");
gtk_container_add (GTK_CONTAINER (hbox), object_button);
g_signal_connect (G_OBJECT (object_button), "clicked",
G_CALLBACK (glade_eprop_model_show_object_dialog), eprop);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_container_add (GTK_CONTAINER (box), hbox);
gtk_container_add (GTK_CONTAINER (box), obj->button);
gtk_widget_show_all (box);
obj->widget = NULL;
/* project = glade_widget_get_project (glade_property_get_widget
(glade_editor_property_get_property (eprop)));
*/
return box;
}
static void glade_eprop_model_load (GladeEditorProperty * eprop, GladeProperty * property)
{
gchar * label;
const gchar * text;
GObject * object;
GladeEditorPropertyClass * parent_class =
g_type_class_peek_parent (GLADE_EDITOR_PROPERTY_GET_CLASS (eprop));
parent_class->load (eprop, property);
if (property == NULL)
return;
if ((object = g_value_get_object (glade_property_inline_value (property))))
{
label = _("Edit Model");
text = glade_widget_get_name (glade_widget_get_from_gobject (object));
}
else
{
label = _("New Model");
text = "";
}
gtk_button_set_label (GTK_BUTTON (GLADE_EPROP_MODEL (eprop)->button), label);
gtk_entry_set_text (GTK_ENTRY (GLADE_EPROP_MODEL (eprop)->entry), text);
}
static void glade_eprop_model_finalize (GObject * object)
{
GObjectClass * parent_class = g_type_class_peek_parent (G_OBJECT_GET_CLASS (object));
G_OBJECT_CLASS (parent_class)->finalize (object);
}
//++++++++++++++++++++++++++++++++++++++++++++ DbModelHolder GladeWidgetAdaptor
GladeEditorProperty * glade_db_model_holder_create_eprop (GladeWidgetAdaptor * adaptor,
GladePropertyClass * klass, gboolean use_command)
{
GladeEditorProperty * eprop;
GParamSpec * pspec = glade_property_class_get_pspec (klass);
if (pspec->value_type == DB_TYPE_MODEL)
{
eprop = g_object_new (GLADE_TYPE_EPROP_MODEL,
"property-class", klass,
"use-command", use_command, NULL);
}
else
eprop = GWA_GET_CLASS (G_TYPE_OBJECT)->create_eprop (adaptor, klass, use_command);
return eprop;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++ DbModel Action Callback
void glade_db_model_action_activate (GladeWidgetAdaptor * adaptor,
DbModel * model, const gchar * path)
{
glade_eprop_model_show_dialog (NULL,
(GObject *) glade_widget_get_from_gobject (model));
}

View File

@ -17,29 +17,6 @@
#include "glade-vn.h" #include "glade-vn.h"
gboolean glade_vn_batch_add_verify (GladeWidgetAdaptor * adaptor,
VnBatch * container, GObject * child, gboolean user_feedback)
{
if (G_IS_OBJECT (child))
return TRUE;
if (user_feedback)
{
GladeWidgetAdaptor * object_adaptor =
glade_widget_adaptor_get_by_type (G_TYPE_OBJECT);
glade_util_ui_message (glade_app_get_window ()
,GLADE_UI_INFO
,NULL
,"Only objects of type %s can be added to objects of type %s."
,glade_widget_adaptor_get_name (object_adaptor)
,glade_widget_adaptor_get_name (adaptor)
);
}
return FALSE;
}
void glade_vn_batch_add_child (GladeWidgetAdaptor * adaptor, void glade_vn_batch_add_child (GladeWidgetAdaptor * adaptor,
VnBatch * group, GObject * child) VnBatch * group, GObject * child)
{ {
@ -67,3 +44,26 @@ GList * glade_vn_batch_get_children (GladeWidgetAdaptor * adaptor,
{ {
return vn_batch_get_objects_list (group); return vn_batch_get_objects_list (group);
} }
gboolean glade_vn_batch_add_verify (GladeWidgetAdaptor * adaptor,
VnBatch * container, GObject * child, gboolean user_feedback)
{
if (G_IS_OBJECT (child))
return TRUE;
if (user_feedback)
{
GladeWidgetAdaptor * object_adaptor =
glade_widget_adaptor_get_by_type (G_TYPE_OBJECT);
glade_util_ui_message (glade_app_get_window ()
,GLADE_UI_INFO
,NULL
,"Only objects of type %s can be added to objects of type %s."
,glade_widget_adaptor_get_name (object_adaptor)
,glade_widget_adaptor_get_name (adaptor)
);
}
return FALSE;
}

View File

@ -17,7 +17,44 @@
#include "glade-vn.h" #include "glade-vn.h"
gboolean glade_vn_set_first_catalog (gpointer catalog_name)
{
GList * l, * catalogs = glade_app_get_catalogs (),
* clone = NULL;
GladeCatalog * catalog = NULL;
for (l = catalogs; l; l = l->next)
if (!g_strcmp0 (catalog_name, glade_catalog_get_name (l->data)))
catalog = l->data;
else
clone = g_list_prepend (clone, l->data);
if (catalog)
{
GList * trash = catalogs->next;
catalogs->data = catalog;
clone = g_list_reverse (clone);
catalogs->next = clone;
if (clone)
clone->prev = catalogs;
if (trash)
{
trash->prev = NULL;
g_list_free (trash);
}
return G_SOURCE_REMOVE;
}
g_list_free (clone);
return G_SOURCE_CONTINUE;
}
void glade_vn_init () void glade_vn_init ()
{ {
g_message ("Hedera objects loaded!"); g_message ("Hedera objects loaded!");
g_idle_add (glade_vn_set_first_catalog, "vn");
} }

View File

@ -4,4 +4,6 @@ MODULE_PATH=../build/glade/
export GLADE_MODULE_SEARCH_PATH="$MODULE_PATH/.libs" export GLADE_MODULE_SEARCH_PATH="$MODULE_PATH/.libs"
export GLADE_CATALOG_SEARCH_PATH=. export GLADE_CATALOG_SEARCH_PATH=.
glade
glade $@

View File

@ -13,19 +13,36 @@
</properties> </properties>
</glade-widget-class> </glade-widget-class>
<glade-widget-class name="DbModel" generic-name="model" title="Data Model" icon-name="widget-gtk-liststore"> <glade-widget-class name="DbCalc" generic-name="calc" title="Calculated field" icon-name="widget-gtk-entry">
<properties>
<property id="model" ignore="True"/>
<property id="type" ignore="True"/>
<property id="col" ignore="True"/>
</properties>
</glade-widget-class>
<glade-widget-class name="VnModel" generic-name="model" title="Data Model" icon-name="widget-gtk-liststore">
<properties> <properties>
<property id="conn" ignore="True" disabled="True"/> <property id="conn" ignore="True" disabled="True"/>
<property id="stmt" ignore="True" disabled="True"/> <property id="stmt" ignore="True" disabled="True"/>
<property save="False" weight="1.2" id="use-file" ignore="True"/> <property save="False" weight="1.2" id="use-file" ignore="True"/>
<property save="False" weight="1.3" id="sql" ignore="True"/> <property save="False" weight="1.3" id="sql" ignore="True"/>
<property save="False" ignore="True" id="links" name="Links" disabled="True">
<parameter-spec>
<type>GParamBoxed</type>
<value-type>GladeDbList</value-type>
</parameter-spec>
<tooltip translatable="yes">List of parameters linked to the model</tooltip>
</property>
</properties> </properties>
<create-editor-property-function>glade_db_model_create_eprop</create-editor-property-function>
<create-editable-function>glade_db_model_create_editable</create-editable-function>
<write-widget-function>glade_db_model_write_widget</write-widget-function>
<read-widget-function>glade_db_model_read_widget</read-widget-function>
<action-activate-function>glade_db_model_action_activate</action-activate-function>
<actions> <actions>
<action important="True" id="launch_editor" name="Edit&#8230;" stock="gtk-edit"/> <action important="True" id="launch_editor" name="Edit&#8230;" stock="gtk-edit"/>
</actions> </actions>
<action-activate-function>glade_db_model_action_activate</action-activate-function>
<create-editor-property-function>glade_db_sql_create_eprop</create-editor-property-function>
<write-widget-function>glade_db_model_write_widget</write-widget-function>
</glade-widget-class> </glade-widget-class>
<glade-widget-class name="VnIterator" generic-name="iterator" title="Iterator" icon-name="widget-gtk-texttagtable"> <glade-widget-class name="VnIterator" generic-name="iterator" title="Iterator" icon-name="widget-gtk-texttagtable">
@ -35,20 +52,22 @@
<type>GParamObject</type> <type>GParamObject</type>
<value-type>DbModel</value-type> <value-type>DbModel</value-type>
</parameter-spec> </parameter-spec>
<tooltip translatable="yes">The model held by the object</tooltip>
</property> </property>
</properties> </properties>
<create-editor-property-function>glade_db_model_holder_create_eprop</create-editor-property-function> <create-editor-property-function>glade_db_model_holder_create_eprop</create-editor-property-function>
<actions>
<action important="True" id="launch-editor" name="Edit&#8230;" stock="gtk-edit"/>
<action important="True" id="generate-params" name="Generate params" icon-name="system-run"/>
</actions>
<action-activate-function>glade_db_iterator_action_activate</action-activate-function>
<post-create-function>glade_db_iterator_post_create</post-create-function> <post-create-function>glade_db_iterator_post_create</post-create-function>
<add-child-verify-function>glade_db_iterator_add_verify</add-child-verify-function> <add-child-verify-function>glade_db_iterator_add_verify</add-child-verify-function>
<add-child-function>glade_db_iterator_add_child</add-child-function> <add-child-function>glade_db_iterator_add_child</add-child-function>
<remove-child-function>glade_db_iterator_remove_child</remove-child-function> <remove-child-function>glade_db_iterator_remove_child</remove-child-function>
<replace-child-function>glade_db_iterator_replace_child</replace-child-function> <replace-child-function>glade_db_iterator_replace_child</replace-child-function>
<get-children-function>glade_db_iterator_get_children</get-children-function> <get-children-function>glade_db_iterator_get_children</get-children-function>
<read-widget-function>glade_db_iterator_read_widget</read-widget-function>
<action-activate-function>glade_db_iterator_action_activate</action-activate-function>
<actions>
<action important="True" id="launch-editor" name="Edit&#8230;" stock="gtk-edit"/>
<action important="True" id="generate-params" name="Generate params" icon-name="system-run"/>
</actions>
</glade-widget-class> </glade-widget-class>
<glade-widget-class name="DbParam" generic-name="param" title="Iterator Parameter" icon-name="widget-gtk-texttag"> <glade-widget-class name="DbParam" generic-name="param" title="Iterator Parameter" icon-name="widget-gtk-texttag">
@ -57,6 +76,7 @@
<property id="column-name" ignore="True"/> <property id="column-name" ignore="True"/>
<property id="column-index" ignore="True"/> <property id="column-index" ignore="True"/>
</properties> </properties>
<read-widget-function>glade_db_param_read_widget</read-widget-function>
</glade-widget-class> </glade-widget-class>
<glade-widget-class name="DbFileLoader" generic-name="file-loader" toplevel="True" <glade-widget-class name="DbFileLoader" generic-name="file-loader" toplevel="True"
@ -93,6 +113,7 @@
<type>GParamObject</type> <type>GParamObject</type>
<value-type>DbModel</value-type> <value-type>DbModel</value-type>
</parameter-spec> </parameter-spec>
<tooltip translatable="yes">The model held by the object</tooltip>
</property> </property>
</properties> </properties>
<create-editor-property-function>glade_db_model_holder_create_eprop</create-editor-property-function> <create-editor-property-function>glade_db_model_holder_create_eprop</create-editor-property-function>
@ -118,6 +139,7 @@
<type>GParamObject</type> <type>GParamObject</type>
<value-type>DbModel</value-type> <value-type>DbModel</value-type>
</parameter-spec> </parameter-spec>
<tooltip translatable="yes">The model held by the object</tooltip>
</property> </property>
<!-- This is used to avoid weird error about this unexisting property --> <!-- This is used to avoid weird error about this unexisting property -->
<property id="accelerator" disabled="True"/> <property id="accelerator" disabled="True"/>
@ -133,6 +155,7 @@
<type>GParamObject</type> <type>GParamObject</type>
<value-type>DbModel</value-type> <value-type>DbModel</value-type>
</parameter-spec> </parameter-spec>
<tooltip translatable="yes">The model held by the object</tooltip>
</property> </property>
<property id="field" ignore="True"/> <property id="field" ignore="True"/>
<!-- This is used to avoid a weird error about this unexisting properties --> <!-- This is used to avoid a weird error about this unexisting properties -->
@ -168,9 +191,10 @@
<glade-widget-group name="db-toplevels" title="Data Handling"> <glade-widget-group name="db-toplevels" title="Data Handling">
<glade-widget-class-ref name="GvnParam"/> <glade-widget-class-ref name="GvnParam"/>
<glade-widget-class-ref name="DbModel"/> <glade-widget-class-ref name="VnModel"/>
<glade-widget-class-ref name="VnIterator"/> <glade-widget-class-ref name="VnIterator"/>
<glade-widget-class-ref name="DbParam"/> <glade-widget-class-ref name="DbParam"/>
<glade-widget-class-ref name="DbCalc"/>
<glade-widget-class-ref name="DbFileLoader"/> <glade-widget-class-ref name="DbFileLoader"/>
</glade-widget-group> </glade-widget-group>

View File

@ -488,6 +488,7 @@ gboolean gvn_value_ccopy (const GValue * src, GValue * dst)
* gvn_value_to_format_string: * gvn_value_to_format_string:
**/ **/
void gvn_value_to_format_string (const GValue * src, guint digits, GValue * dst) void gvn_value_to_format_string (const GValue * src, guint digits, GValue * dst)
//void gvn_value_to_format_string (const GValue * src, const gchar * format, GValue * dst)
{ {
GType type = G_VALUE_TYPE (src); GType type = G_VALUE_TYPE (src);
@ -495,6 +496,10 @@ void gvn_value_to_format_string (const GValue * src, guint digits, GValue * dst)
switch (type) switch (type)
{ {
case G_TYPE_BOOLEAN:
break;
case G_TYPE_INT://y variantes
break;
case G_TYPE_FLOAT: case G_TYPE_FLOAT:
case G_TYPE_DOUBLE: case G_TYPE_DOUBLE:
{ {
@ -514,7 +519,11 @@ void gvn_value_to_format_string (const GValue * src, guint digits, GValue * dst)
break; break;
} }
default: default:
if (!gvn_value_is_null (src)) if (type == G_TYPE_DATE)
{}
else if (type == G_TYPE_DATE_TIME)
{}
else if (!gvn_value_is_null (src))
g_value_transform (src, dst); g_value_transform (src, dst);
else else
g_value_set_string (dst, ""); g_value_set_string (dst, "");

View File

@ -196,7 +196,7 @@ static DbResultSet * db_mysql_query (DbMysql * obj, const gchar * sql, GError **
gint i, j; gint i, j;
guint errno = 0; guint errno = 0;
gulong * lengths; gulong * lengths;
GValue def = {0}; GValue def = G_VALUE_INIT;
MYSQL_ROW myrow; MYSQL_ROW myrow;
MYSQL_RES * res; MYSQL_RES * res;
MYSQL_FIELD * field; MYSQL_FIELD * field;

View File

@ -21,7 +21,7 @@ db/db-request.c
db/db-file-loader.c db/db-file-loader.c
vn/vn-gui.c vn/vn-gui.c
vn/vn-model.c vn/vn-grid-model.c
vn/vn-grid.c vn/vn-grid.c
vn/vn-handler.c vn/vn-handler.c
vn/vn-form.c vn/vn-form.c
@ -45,9 +45,11 @@ vn/gui/main.glade
vn/gui/child-window.glade vn/gui/child-window.glade
vn/gui/actions.glade vn/gui/actions.glade
glade/glade-db-sql.c
glade/glade-db-model.c glade/glade-db-model.c
glade/glade-db-model-editor.c
glade/glade-eprop-model.c
glade/glade-db-iterator.c glade/glade-db-iterator.c
[type: gettext/glade]glade/vn.xml
[type: gettext/glade]module/data/example.xml [type: gettext/glade]module/data/example.xml
module/data/consulter.glade module/data/consulter.glade

118
po/ca.po
View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: hedera 1.0\n" "Project-Id-Version: hedera 1.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-10 15:00+0100\n" "POT-Creation-Date: 2014-02-12 12:39+0100\n"
"PO-Revision-Date: 2013-06-04 13:38+0200\n" "PO-Revision-Date: 2013-06-04 13:38+0200\n"
"Last-Translator: Alejandro T. Colombini Gómez <atcolombini@verdnatura.es>\n" "Last-Translator: Alejandro T. Colombini Gómez <atcolombini@verdnatura.es>\n"
"Language-Team: Catalan\n" "Language-Team: Catalan\n"
@ -201,7 +201,7 @@ msgstr ""
msgid "The character used for delimite the name of fields, tables..." msgid "The character used for delimite the name of fields, tables..."
msgstr "" msgstr ""
#: ../sql/sql-value.c:228 #: ../sql/sql-value.c:228 ../glade/glade-db-model.c:497
msgid "Param" msgid "Param"
msgstr "" msgstr ""
@ -318,31 +318,31 @@ msgstr ""
msgid "The type of the operation applied over the function" msgid "The type of the operation applied over the function"
msgstr "" msgstr ""
#: ../db/db-calc.c:347 #: ../db/db-calc.c:346
msgid "Function" msgid "Function"
msgstr "" msgstr ""
#: ../db/db-calc.c:348 #: ../db/db-calc.c:347
msgid "The function to execute" msgid "The function to execute"
msgstr "" msgstr ""
#: ../db/db-calc.c:354 #: ../db/db-calc.c:353
msgid "Data" msgid "Data"
msgstr "" msgstr ""
#: ../db/db-calc.c:355 #: ../db/db-calc.c:354
msgid "The user provided data for the function" msgid "The user provided data for the function"
msgstr "" msgstr ""
#: ../db/db-calc.c:361 #: ../db/db-calc.c:360 ../glade/glade-db-model.c:488
msgid "Column" msgid "Column"
msgstr "" msgstr ""
#: ../db/db-calc.c:362 #: ../db/db-calc.c:361
msgid "A column to apply the operations over it" msgid "A column to apply the operations over it"
msgstr "" msgstr ""
#: ../db/db-param.c:251 ../vn/vn-grid.c:483 ../vn/vn-field.c:532 #: ../db/db-param.c:251 ../vn/vn-grid.c:491 ../vn/vn-field.c:532
msgid "Iterator" msgid "Iterator"
msgstr "" msgstr ""
@ -556,17 +556,7 @@ msgstr ""
msgid "The application handler for the entire program" msgid "The application handler for the entire program"
msgstr "" msgstr ""
#: ../vn/vn-model.c:317 #: ../vn/vn-grid.c:492
#, c-format
msgid "Function vn_model_set_sort_func not implemented"
msgstr "Funció vn_model_set_sort_func no implementada"
#: ../vn/vn-model.c:324
#, c-format
msgid "Function vn_model_set_default_sort_func not implemented"
msgstr "Funció vn_model_set_default_sort_func no implementada"
#: ../vn/vn-grid.c:484
msgid "The iterator used by VnGrid" msgid "The iterator used by VnGrid"
msgstr "" msgstr ""
@ -679,8 +669,8 @@ msgstr ""
msgid "The current value of the field" msgid "The current value of the field"
msgstr "" msgstr ""
#: ../vn/vn-field.c:525 ../glade/glade-db-iterator.c:164 #: ../vn/vn-field.c:525 ../glade/glade-db-iterator.c:95
#: ../glade/glade-db-iterator.c:187 #: ../glade/glade-db-iterator.c:117
msgid "Parameter" msgid "Parameter"
msgstr "" msgstr ""
@ -705,12 +695,12 @@ msgid "Whether the field value can be of type GVN_TYPE_NULL"
msgstr "" msgstr ""
#: ../vn/field/vn-entry.c:153 ../vn/field/vn-spin.c:172 #: ../vn/field/vn-entry.c:153 ../vn/field/vn-spin.c:172
#: ../vn/column/vn-column-entry.c:119 ../vn/column/vn-column-spin.c:183 #: ../vn/column/vn-column-entry.c:119 ../vn/column/vn-column-spin.c:226
msgid "Digits" msgid "Digits"
msgstr "" msgstr ""
#: ../vn/field/vn-entry.c:154 ../vn/field/vn-spin.c:173 #: ../vn/field/vn-entry.c:154 ../vn/field/vn-spin.c:173
#: ../vn/column/vn-column-entry.c:120 ../vn/column/vn-column-spin.c:184 #: ../vn/column/vn-column-entry.c:120 ../vn/column/vn-column-spin.c:227
msgid "The number of decimal places to display." msgid "The number of decimal places to display."
msgstr "" msgstr ""
@ -805,35 +795,35 @@ msgstr ""
msgid "Order in which the tab selects the columns for edition" msgid "Order in which the tab selects the columns for edition"
msgstr "" msgstr ""
#: ../vn/column/vn-column-spin.c:175 #: ../vn/column/vn-column-spin.c:218
msgid "Climb rate" msgid "Climb rate"
msgstr "" msgstr ""
#: ../vn/column/vn-column-spin.c:176 #: ../vn/column/vn-column-spin.c:219
msgid "The acceleration rate when you hold down a button." msgid "The acceleration rate when you hold down a button."
msgstr "" msgstr ""
#: ../vn/column/vn-column-spin.c:191 #: ../vn/column/vn-column-spin.c:234
msgid "Minimum value" msgid "Minimum value"
msgstr "" msgstr ""
#: ../vn/column/vn-column-spin.c:192 #: ../vn/column/vn-column-spin.c:235
msgid "The minimum value of the adjustment." msgid "The minimum value of the adjustment."
msgstr "" msgstr ""
#: ../vn/column/vn-column-spin.c:199 #: ../vn/column/vn-column-spin.c:242
msgid "Maximum value" msgid "Maximum value"
msgstr "" msgstr ""
#: ../vn/column/vn-column-spin.c:200 #: ../vn/column/vn-column-spin.c:243
msgid "The maximum value of the adjustment." msgid "The maximum value of the adjustment."
msgstr "" msgstr ""
#: ../vn/column/vn-column-spin.c:207 #: ../vn/column/vn-column-spin.c:250
msgid "Step Increment" msgid "Step Increment"
msgstr "" msgstr ""
#: ../vn/column/vn-column-spin.c:208 #: ../vn/column/vn-column-spin.c:251
msgid "The step increment of the adjustment" msgid "The step increment of the adjustment"
msgstr "" msgstr ""
@ -1012,64 +1002,88 @@ msgctxt "View menu option"
msgid "Tool_bar" msgid "Tool_bar"
msgstr "" msgstr ""
#: ../glade/glade-db-sql.c:27 #: ../glade/glade-db-model.c:37
msgid "New SQL statement" msgid "New SQL statement"
msgstr "" msgstr ""
#: ../glade/glade-db-sql.c:59 #: ../glade/glade-db-model.c:69
msgid "SQL Editor" msgid "SQL Editor"
msgstr "" msgstr ""
#: ../glade/glade-db-sql.c:180 #: ../glade/glade-db-model.c:186
msgid "Open the SQL Editor" msgid "Open the SQL Editor"
msgstr "" msgstr ""
#: ../glade/glade-db-model.c:123 #: ../glade/glade-db-model.c:263
msgid "Select a GvnParam"
msgstr ""
#: ../glade/glade-db-model.c:331
msgid "Select the parameter from a list"
msgstr ""
#: ../glade/glade-db-model.c:349
msgid "You need to create at least one GvnParam or derived object"
msgstr ""
#: ../glade/glade-db-model.c:452
msgid "<b>Add or remove links</b>"
msgstr ""
#: ../glade/glade-db-model-editor.c:53
msgid "List of parameters linked to the model"
msgstr ""
#: ../glade/glade-eprop-model.c:129
msgid "Create and set a model for a DbModelHolder" msgid "Create and set a model for a DbModelHolder"
msgstr "" msgstr ""
#: ../glade/glade-db-model.c:155 #: ../glade/glade-eprop-model.c:161
msgid "Model configuration" msgid "Model configuration"
msgstr "" msgstr ""
#: ../glade/glade-db-model.c:155 #: ../glade/glade-eprop-model.c:161
msgid "DbModel properties configuration" msgid "Model properties configuration"
msgstr "" msgstr ""
#: ../glade/glade-db-model.c:240 #: ../glade/glade-eprop-model.c:246
msgid "Select a DbModel for the property" msgid "Select a VnModel for the property"
msgstr "" msgstr ""
#: ../glade/glade-db-model.c:261 ../glade/glade-db-model.c:308 #: ../glade/glade-eprop-model.c:267 ../glade/glade-eprop-model.c:313
msgid "New Model" msgid "New Model"
msgstr "" msgstr ""
#: ../glade/glade-db-model.c:303 #: ../glade/glade-eprop-model.c:308
msgid "Edit Model" msgid "Edit Model"
msgstr "" msgstr ""
#: ../glade/glade-db-iterator.c:166 #: ../glade/glade-db-iterator.c:97
msgid "Properties" msgid "Properties"
msgstr "" msgstr ""
#: ../glade/glade-db-iterator.c:193 #: ../glade/glade-db-iterator.c:125
msgid "Iterator Editor" msgid "Iterator Editor"
msgstr "" msgstr ""
#: ../glade/glade-db-iterator.c:201 #: ../glade/glade-db-iterator.c:133
msgid "The model must have \"SQL\" set and \"Use file\" set to 'No'." msgid "The model must have \"SQL\" set and \"Use file\" set to 'No'."
msgstr "" msgstr ""
#: ../glade/glade-db-iterator.c:212 #: ../glade/glade-db-iterator.c:144
#, c-format #, c-format
msgid "%s can't have children before automatic generation." msgid "%s can't have children before automatic generation."
msgstr "" msgstr ""
#: ../glade/glade-db-iterator.c:223 #: ../glade/glade-db-iterator.c:155
#, c-format #, c-format
msgid "%s must have \"Model\" set. %s" msgid "%s must have \"Model\" set. %s"
msgstr "" msgstr ""
#: ../glade/vn.xml.h:1
msgid "The model held by the object"
msgstr ""
#: ../module/data/example.xml.h:1 #: ../module/data/example.xml.h:1
msgid "Example" msgid "Example"
msgstr "" msgstr ""
@ -1120,3 +1134,11 @@ msgstr ""
#: ../module/src/vn-consulter.c:217 #: ../module/src/vn-consulter.c:217
msgid "Message" msgid "Message"
msgstr "" msgstr ""
#, fuzzy
#~ msgid "Function vn_grid_model_set_sort_func not implemented"
#~ msgstr "Funció vn_model_set_sort_func no implementada"
#, fuzzy
#~ msgid "Function vn_grid_model_set_default_sort_func not implemented"
#~ msgstr "Funció vn_model_set_default_sort_func no implementada"

126
po/es.po
View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: hedera 1.0\n" "Project-Id-Version: hedera 1.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-10 15:00+0100\n" "POT-Creation-Date: 2014-02-12 12:39+0100\n"
"PO-Revision-Date: 2013-06-04 13:36+0200\n" "PO-Revision-Date: 2013-06-04 13:36+0200\n"
"Last-Translator: Alejandro T. Colombini Gómez <atcolombini@verdnatura.es>\n" "Last-Translator: Alejandro T. Colombini Gómez <atcolombini@verdnatura.es>\n"
"Language-Team: Spanish\n" "Language-Team: Spanish\n"
@ -203,7 +203,7 @@ msgstr "Delimitador"
msgid "The character used for delimite the name of fields, tables..." msgid "The character used for delimite the name of fields, tables..."
msgstr "El carácter usado para delimitar los nombres de campos, tablas..." msgstr "El carácter usado para delimitar los nombres de campos, tablas..."
#: ../sql/sql-value.c:228 #: ../sql/sql-value.c:228 ../glade/glade-db-model.c:497
msgid "Param" msgid "Param"
msgstr "Parámetro" msgstr "Parámetro"
@ -326,31 +326,31 @@ msgstr "Tipo de operación"
msgid "The type of the operation applied over the function" msgid "The type of the operation applied over the function"
msgstr "El tipo de operación aplicada sobre la función" msgstr "El tipo de operación aplicada sobre la función"
#: ../db/db-calc.c:347 #: ../db/db-calc.c:346
msgid "Function" msgid "Function"
msgstr "Función" msgstr "Función"
#: ../db/db-calc.c:348 #: ../db/db-calc.c:347
msgid "The function to execute" msgid "The function to execute"
msgstr "Función a ejecutar" msgstr "Función a ejecutar"
#: ../db/db-calc.c:354 #: ../db/db-calc.c:353
msgid "Data" msgid "Data"
msgstr "Datos" msgstr "Datos"
#: ../db/db-calc.c:355 #: ../db/db-calc.c:354
msgid "The user provided data for the function" msgid "The user provided data for the function"
msgstr "Datos proporcionados por el usuario" msgstr "Datos proporcionados por el usuario"
#: ../db/db-calc.c:361 #: ../db/db-calc.c:360 ../glade/glade-db-model.c:488
msgid "Column" msgid "Column"
msgstr "Columna" msgstr "Columna"
#: ../db/db-calc.c:362 #: ../db/db-calc.c:361
msgid "A column to apply the operations over it" msgid "A column to apply the operations over it"
msgstr "Una columna sobre la que se aplicarán las operaciones" msgstr "Una columna sobre la que se aplicarán las operaciones"
#: ../db/db-param.c:251 ../vn/vn-grid.c:483 ../vn/vn-field.c:532 #: ../db/db-param.c:251 ../vn/vn-grid.c:491 ../vn/vn-field.c:532
msgid "Iterator" msgid "Iterator"
msgstr "Iterator" msgstr "Iterator"
@ -568,17 +568,7 @@ msgstr "Aplicación"
msgid "The application handler for the entire program" msgid "The application handler for the entire program"
msgstr "El manejador de la aplicación para todo el programa" msgstr "El manejador de la aplicación para todo el programa"
#: ../vn/vn-model.c:317 #: ../vn/vn-grid.c:492
#, c-format
msgid "Function vn_model_set_sort_func not implemented"
msgstr "Función vn_model_set_sort_func no implementada"
#: ../vn/vn-model.c:324
#, c-format
msgid "Function vn_model_set_default_sort_func not implemented"
msgstr "Función vn_model_set_default_sort_func no implementada"
#: ../vn/vn-grid.c:484
msgid "The iterator used by VnGrid" msgid "The iterator used by VnGrid"
msgstr "El Iterator empleado por VnGrid" msgstr "El Iterator empleado por VnGrid"
@ -691,8 +681,8 @@ msgstr "El identificador de la aplicación"
msgid "The current value of the field" msgid "The current value of the field"
msgstr "El valor actual del campo" msgstr "El valor actual del campo"
#: ../vn/vn-field.c:525 ../glade/glade-db-iterator.c:164 #: ../vn/vn-field.c:525 ../glade/glade-db-iterator.c:95
#: ../glade/glade-db-iterator.c:187 #: ../glade/glade-db-iterator.c:117
msgid "Parameter" msgid "Parameter"
msgstr "Parámetro" msgstr "Parámetro"
@ -717,12 +707,12 @@ msgid "Whether the field value can be of type GVN_TYPE_NULL"
msgstr "Si el campo puede ser del tipo GVN_TYPE_NULL" msgstr "Si el campo puede ser del tipo GVN_TYPE_NULL"
#: ../vn/field/vn-entry.c:153 ../vn/field/vn-spin.c:172 #: ../vn/field/vn-entry.c:153 ../vn/field/vn-spin.c:172
#: ../vn/column/vn-column-entry.c:119 ../vn/column/vn-column-spin.c:183 #: ../vn/column/vn-column-entry.c:119 ../vn/column/vn-column-spin.c:226
msgid "Digits" msgid "Digits"
msgstr "Dígitos" msgstr "Dígitos"
#: ../vn/field/vn-entry.c:154 ../vn/field/vn-spin.c:173 #: ../vn/field/vn-entry.c:154 ../vn/field/vn-spin.c:173
#: ../vn/column/vn-column-entry.c:120 ../vn/column/vn-column-spin.c:184 #: ../vn/column/vn-column-entry.c:120 ../vn/column/vn-column-spin.c:227
msgid "The number of decimal places to display." msgid "The number of decimal places to display."
msgstr "El número de posiciones decimales que se muestran" msgstr "El número de posiciones decimales que se muestran"
@ -817,35 +807,35 @@ msgstr "Tab index"
msgid "Order in which the tab selects the columns for edition" msgid "Order in which the tab selects the columns for edition"
msgstr "Orden en el cual el tabulador selecciona las columnas para editar" msgstr "Orden en el cual el tabulador selecciona las columnas para editar"
#: ../vn/column/vn-column-spin.c:175 #: ../vn/column/vn-column-spin.c:218
msgid "Climb rate" msgid "Climb rate"
msgstr "Tasa de subida" msgstr "Tasa de subida"
#: ../vn/column/vn-column-spin.c:176 #: ../vn/column/vn-column-spin.c:219
msgid "The acceleration rate when you hold down a button." msgid "The acceleration rate when you hold down a button."
msgstr "La tasa de aceleración cuando se mantiene apretado el botón." msgstr "La tasa de aceleración cuando se mantiene apretado el botón."
#: ../vn/column/vn-column-spin.c:191 #: ../vn/column/vn-column-spin.c:234
msgid "Minimum value" msgid "Minimum value"
msgstr "Valor mínimo" msgstr "Valor mínimo"
#: ../vn/column/vn-column-spin.c:192 #: ../vn/column/vn-column-spin.c:235
msgid "The minimum value of the adjustment." msgid "The minimum value of the adjustment."
msgstr "Valor mínimo del ajuste." msgstr "Valor mínimo del ajuste."
#: ../vn/column/vn-column-spin.c:199 #: ../vn/column/vn-column-spin.c:242
msgid "Maximum value" msgid "Maximum value"
msgstr "Valor máximo" msgstr "Valor máximo"
#: ../vn/column/vn-column-spin.c:200 #: ../vn/column/vn-column-spin.c:243
msgid "The maximum value of the adjustment." msgid "The maximum value of the adjustment."
msgstr "Valor máximo del ajuste" msgstr "Valor máximo del ajuste"
#: ../vn/column/vn-column-spin.c:207 #: ../vn/column/vn-column-spin.c:250
msgid "Step Increment" msgid "Step Increment"
msgstr "Incremento del paso" msgstr "Incremento del paso"
#: ../vn/column/vn-column-spin.c:208 #: ../vn/column/vn-column-spin.c:251
msgid "The step increment of the adjustment" msgid "The step increment of the adjustment"
msgstr "El incremento del paso del ajuste" msgstr "El incremento del paso del ajuste"
@ -1044,64 +1034,88 @@ msgctxt "View menu option"
msgid "Tool_bar" msgid "Tool_bar"
msgstr "_Barra de herramientas" msgstr "_Barra de herramientas"
#: ../glade/glade-db-sql.c:27 #: ../glade/glade-db-model.c:37
msgid "New SQL statement" msgid "New SQL statement"
msgstr "Nueva consulta SQL" msgstr "Nueva consulta SQL"
#: ../glade/glade-db-sql.c:59 #: ../glade/glade-db-model.c:69
msgid "SQL Editor" msgid "SQL Editor"
msgstr "Editor SQL" msgstr "Editor SQL"
#: ../glade/glade-db-sql.c:180 #: ../glade/glade-db-model.c:186
msgid "Open the SQL Editor" msgid "Open the SQL Editor"
msgstr "Abrir el Editor SQL" msgstr "Abrir el Editor SQL"
#: ../glade/glade-db-model.c:123 #: ../glade/glade-db-model.c:263
msgid "Select a GvnParam"
msgstr "Elige un GvnParam"
#: ../glade/glade-db-model.c:331
msgid "Select the parameter from a list"
msgstr "Eligir un parametro de una lista"
#: ../glade/glade-db-model.c:349
msgid "You need to create at least one GvnParam or derived object"
msgstr "Necesitas crear por lo menos un GvnParam o algun objeto derivado"
#: ../glade/glade-db-model.c:452
msgid "<b>Add or remove links</b>"
msgstr "<b>Añadir o quitar enlaces</b>"
#: ../glade/glade-db-model-editor.c:53
msgid "List of parameters linked to the model"
msgstr "Lista de parámetros vinculados al modelo"
#: ../glade/glade-eprop-model.c:129
msgid "Create and set a model for a DbModelHolder" msgid "Create and set a model for a DbModelHolder"
msgstr "Crear y configurar un modelo para un DbModelHolder" msgstr "Crear y poner el modelo a un DbModelHolder"
#: ../glade/glade-db-model.c:155 #: ../glade/glade-eprop-model.c:161
msgid "Model configuration" msgid "Model configuration"
msgstr "Configuración del Model" msgstr "Configuración del modelo"
#: ../glade/glade-db-model.c:155 #: ../glade/glade-eprop-model.c:161
msgid "DbModel properties configuration" msgid "Model properties configuration"
msgstr "Configuración de propiedades de DbModelo" msgstr "Configuración de propiedades del modelo"
#: ../glade/glade-db-model.c:240 #: ../glade/glade-eprop-model.c:246
msgid "Select a DbModel for the property" msgid "Select a VnModel for the property"
msgstr "Selecciona un DbModel para la propiedad" msgstr "Elige un VnModel para la propiedad"
#: ../glade/glade-db-model.c:261 ../glade/glade-db-model.c:308 #: ../glade/glade-eprop-model.c:267 ../glade/glade-eprop-model.c:313
msgid "New Model" msgid "New Model"
msgstr "Nuevo Modelo" msgstr "Nuevo Modelo"
#: ../glade/glade-db-model.c:303 #: ../glade/glade-eprop-model.c:308
msgid "Edit Model" msgid "Edit Model"
msgstr "Editar Modelo" msgstr "Editar Modelo"
#: ../glade/glade-db-iterator.c:166 #: ../glade/glade-db-iterator.c:97
msgid "Properties" msgid "Properties"
msgstr "Propiedades" msgstr "Propiedades"
#: ../glade/glade-db-iterator.c:193 #: ../glade/glade-db-iterator.c:125
msgid "Iterator Editor" msgid "Iterator Editor"
msgstr "Editor del Iterator" msgstr "Editor del Iterator"
#: ../glade/glade-db-iterator.c:201 #: ../glade/glade-db-iterator.c:133
msgid "The model must have \"SQL\" set and \"Use file\" set to 'No'." msgid "The model must have \"SQL\" set and \"Use file\" set to 'No'."
msgstr "El modelo debe tener \"SQL\" asignado y \"Usa fichero\" puesto a 'No'." msgstr "El modelo debe tener \"SQL\" asignado y \"Usa fichero\" puesto a 'No'."
#: ../glade/glade-db-iterator.c:212 #: ../glade/glade-db-iterator.c:144
#, c-format #, c-format
msgid "%s can't have children before automatic generation." msgid "%s can't have children before automatic generation."
msgstr "%s no puede tener hijos antes de la generación automatica." msgstr "%s no puede tener hijos antes de la generación automatica."
#: ../glade/glade-db-iterator.c:223 #: ../glade/glade-db-iterator.c:155
#, c-format #, c-format
msgid "%s must have \"Model\" set. %s" msgid "%s must have \"Model\" set. %s"
msgstr "%s debe tener \"Modelo\" asignado. %s" msgstr "%s debe tener \"Modelo\" asignado. %s"
#: ../glade/vn.xml.h:1
msgid "The model held by the object"
msgstr "La conexión empleada por el objeto"
#: ../module/data/example.xml.h:1 #: ../module/data/example.xml.h:1
msgid "Example" msgid "Example"
msgstr "Ejemplo" msgstr "Ejemplo"
@ -1150,14 +1164,8 @@ msgstr "Cambios inmediatos"
#: ../module/src/vn-consulter.c:215 #: ../module/src/vn-consulter.c:215
msgid "Type or select a query" msgid "Type or select a query"
msgstr "Escribe o selecciona la consulta" msgstr "Escribe o elige una consulta"
#: ../module/src/vn-consulter.c:217 #: ../module/src/vn-consulter.c:217
msgid "Message" msgid "Message"
msgstr "Mensaje" msgstr "Mensaje"
#~ msgid "Filter field"
#~ msgstr "Campo de filtro"
#~ msgid "Name of the field to be used as query filter by the model"
#~ msgstr "Nombre del campo que se usará como filtro en la consulta del modelo"

110
po/nl.po
View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: hedera 1.0\n" "Project-Id-Version: hedera 1.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-10 15:00+0100\n" "POT-Creation-Date: 2014-02-12 12:39+0100\n"
"PO-Revision-Date: 2012-10-09 11:38+0200\n" "PO-Revision-Date: 2012-10-09 11:38+0200\n"
"Last-Translator: Alejandro T. Colombini Gómez <atcolombini@verdnatura.es>\n" "Last-Translator: Alejandro T. Colombini Gómez <atcolombini@verdnatura.es>\n"
"Language-Team: Dutch\n" "Language-Team: Dutch\n"
@ -203,7 +203,7 @@ msgstr ""
msgid "The character used for delimite the name of fields, tables..." msgid "The character used for delimite the name of fields, tables..."
msgstr "" msgstr ""
#: ../sql/sql-value.c:228 #: ../sql/sql-value.c:228 ../glade/glade-db-model.c:497
msgid "Param" msgid "Param"
msgstr "" msgstr ""
@ -319,31 +319,31 @@ msgstr ""
msgid "The type of the operation applied over the function" msgid "The type of the operation applied over the function"
msgstr "" msgstr ""
#: ../db/db-calc.c:347 #: ../db/db-calc.c:346
msgid "Function" msgid "Function"
msgstr "" msgstr ""
#: ../db/db-calc.c:348 #: ../db/db-calc.c:347
msgid "The function to execute" msgid "The function to execute"
msgstr "" msgstr ""
#: ../db/db-calc.c:354 #: ../db/db-calc.c:353
msgid "Data" msgid "Data"
msgstr "" msgstr ""
#: ../db/db-calc.c:355 #: ../db/db-calc.c:354
msgid "The user provided data for the function" msgid "The user provided data for the function"
msgstr "" msgstr ""
#: ../db/db-calc.c:361 #: ../db/db-calc.c:360 ../glade/glade-db-model.c:488
msgid "Column" msgid "Column"
msgstr "" msgstr ""
#: ../db/db-calc.c:362 #: ../db/db-calc.c:361
msgid "A column to apply the operations over it" msgid "A column to apply the operations over it"
msgstr "" msgstr ""
#: ../db/db-param.c:251 ../vn/vn-grid.c:483 ../vn/vn-field.c:532 #: ../db/db-param.c:251 ../vn/vn-grid.c:491 ../vn/vn-field.c:532
msgid "Iterator" msgid "Iterator"
msgstr "" msgstr ""
@ -557,17 +557,7 @@ msgstr ""
msgid "The application handler for the entire program" msgid "The application handler for the entire program"
msgstr "" msgstr ""
#: ../vn/vn-model.c:317 #: ../vn/vn-grid.c:492
#, c-format
msgid "Function vn_model_set_sort_func not implemented"
msgstr ""
#: ../vn/vn-model.c:324
#, c-format
msgid "Function vn_model_set_default_sort_func not implemented"
msgstr ""
#: ../vn/vn-grid.c:484
msgid "The iterator used by VnGrid" msgid "The iterator used by VnGrid"
msgstr "" msgstr ""
@ -680,8 +670,8 @@ msgstr ""
msgid "The current value of the field" msgid "The current value of the field"
msgstr "" msgstr ""
#: ../vn/vn-field.c:525 ../glade/glade-db-iterator.c:164 #: ../vn/vn-field.c:525 ../glade/glade-db-iterator.c:95
#: ../glade/glade-db-iterator.c:187 #: ../glade/glade-db-iterator.c:117
msgid "Parameter" msgid "Parameter"
msgstr "" msgstr ""
@ -706,12 +696,12 @@ msgid "Whether the field value can be of type GVN_TYPE_NULL"
msgstr "" msgstr ""
#: ../vn/field/vn-entry.c:153 ../vn/field/vn-spin.c:172 #: ../vn/field/vn-entry.c:153 ../vn/field/vn-spin.c:172
#: ../vn/column/vn-column-entry.c:119 ../vn/column/vn-column-spin.c:183 #: ../vn/column/vn-column-entry.c:119 ../vn/column/vn-column-spin.c:226
msgid "Digits" msgid "Digits"
msgstr "" msgstr ""
#: ../vn/field/vn-entry.c:154 ../vn/field/vn-spin.c:173 #: ../vn/field/vn-entry.c:154 ../vn/field/vn-spin.c:173
#: ../vn/column/vn-column-entry.c:120 ../vn/column/vn-column-spin.c:184 #: ../vn/column/vn-column-entry.c:120 ../vn/column/vn-column-spin.c:227
msgid "The number of decimal places to display." msgid "The number of decimal places to display."
msgstr "" msgstr ""
@ -806,35 +796,35 @@ msgstr ""
msgid "Order in which the tab selects the columns for edition" msgid "Order in which the tab selects the columns for edition"
msgstr "" msgstr ""
#: ../vn/column/vn-column-spin.c:175 #: ../vn/column/vn-column-spin.c:218
msgid "Climb rate" msgid "Climb rate"
msgstr "" msgstr ""
#: ../vn/column/vn-column-spin.c:176 #: ../vn/column/vn-column-spin.c:219
msgid "The acceleration rate when you hold down a button." msgid "The acceleration rate when you hold down a button."
msgstr "" msgstr ""
#: ../vn/column/vn-column-spin.c:191 #: ../vn/column/vn-column-spin.c:234
msgid "Minimum value" msgid "Minimum value"
msgstr "" msgstr ""
#: ../vn/column/vn-column-spin.c:192 #: ../vn/column/vn-column-spin.c:235
msgid "The minimum value of the adjustment." msgid "The minimum value of the adjustment."
msgstr "" msgstr ""
#: ../vn/column/vn-column-spin.c:199 #: ../vn/column/vn-column-spin.c:242
msgid "Maximum value" msgid "Maximum value"
msgstr "" msgstr ""
#: ../vn/column/vn-column-spin.c:200 #: ../vn/column/vn-column-spin.c:243
msgid "The maximum value of the adjustment." msgid "The maximum value of the adjustment."
msgstr "" msgstr ""
#: ../vn/column/vn-column-spin.c:207 #: ../vn/column/vn-column-spin.c:250
msgid "Step Increment" msgid "Step Increment"
msgstr "" msgstr ""
#: ../vn/column/vn-column-spin.c:208 #: ../vn/column/vn-column-spin.c:251
msgid "The step increment of the adjustment" msgid "The step increment of the adjustment"
msgstr "" msgstr ""
@ -1012,64 +1002,88 @@ msgctxt "View menu option"
msgid "Tool_bar" msgid "Tool_bar"
msgstr "" msgstr ""
#: ../glade/glade-db-sql.c:27 #: ../glade/glade-db-model.c:37
msgid "New SQL statement" msgid "New SQL statement"
msgstr "" msgstr ""
#: ../glade/glade-db-sql.c:59 #: ../glade/glade-db-model.c:69
msgid "SQL Editor" msgid "SQL Editor"
msgstr "" msgstr ""
#: ../glade/glade-db-sql.c:180 #: ../glade/glade-db-model.c:186
msgid "Open the SQL Editor" msgid "Open the SQL Editor"
msgstr "" msgstr ""
#: ../glade/glade-db-model.c:123 #: ../glade/glade-db-model.c:263
msgid "Select a GvnParam"
msgstr ""
#: ../glade/glade-db-model.c:331
msgid "Select the parameter from a list"
msgstr ""
#: ../glade/glade-db-model.c:349
msgid "You need to create at least one GvnParam or derived object"
msgstr ""
#: ../glade/glade-db-model.c:452
msgid "<b>Add or remove links</b>"
msgstr ""
#: ../glade/glade-db-model-editor.c:53
msgid "List of parameters linked to the model"
msgstr ""
#: ../glade/glade-eprop-model.c:129
msgid "Create and set a model for a DbModelHolder" msgid "Create and set a model for a DbModelHolder"
msgstr "" msgstr ""
#: ../glade/glade-db-model.c:155 #: ../glade/glade-eprop-model.c:161
msgid "Model configuration" msgid "Model configuration"
msgstr "" msgstr ""
#: ../glade/glade-db-model.c:155 #: ../glade/glade-eprop-model.c:161
msgid "DbModel properties configuration" msgid "Model properties configuration"
msgstr "" msgstr ""
#: ../glade/glade-db-model.c:240 #: ../glade/glade-eprop-model.c:246
msgid "Select a DbModel for the property" msgid "Select a VnModel for the property"
msgstr "" msgstr ""
#: ../glade/glade-db-model.c:261 ../glade/glade-db-model.c:308 #: ../glade/glade-eprop-model.c:267 ../glade/glade-eprop-model.c:313
msgid "New Model" msgid "New Model"
msgstr "" msgstr ""
#: ../glade/glade-db-model.c:303 #: ../glade/glade-eprop-model.c:308
msgid "Edit Model" msgid "Edit Model"
msgstr "" msgstr ""
#: ../glade/glade-db-iterator.c:166 #: ../glade/glade-db-iterator.c:97
msgid "Properties" msgid "Properties"
msgstr "" msgstr ""
#: ../glade/glade-db-iterator.c:193 #: ../glade/glade-db-iterator.c:125
msgid "Iterator Editor" msgid "Iterator Editor"
msgstr "" msgstr ""
#: ../glade/glade-db-iterator.c:201 #: ../glade/glade-db-iterator.c:133
msgid "The model must have \"SQL\" set and \"Use file\" set to 'No'." msgid "The model must have \"SQL\" set and \"Use file\" set to 'No'."
msgstr "" msgstr ""
#: ../glade/glade-db-iterator.c:212 #: ../glade/glade-db-iterator.c:144
#, c-format #, c-format
msgid "%s can't have children before automatic generation." msgid "%s can't have children before automatic generation."
msgstr "" msgstr ""
#: ../glade/glade-db-iterator.c:223 #: ../glade/glade-db-iterator.c:155
#, c-format #, c-format
msgid "%s must have \"Model\" set. %s" msgid "%s must have \"Model\" set. %s"
msgstr "" msgstr ""
#: ../glade/vn.xml.h:1
msgid "The model held by the object"
msgstr ""
#: ../module/data/example.xml.h:1 #: ../module/data/example.xml.h:1
msgid "Example" msgid "Example"
msgstr "" msgstr ""

View File

@ -639,7 +639,7 @@ static inline SqlOperation * sql_parser_create_operation
operation(A) ::= MINUS expr(X). [SIGN] operation(A) ::= MINUS expr(X). [SIGN]
{ {
GValue value = {0}; GValue value = G_VALUE_INIT;
SqlExpr * minus = sql_value_new (); SqlExpr * minus = sql_value_new ();
g_value_init (&value, G_TYPE_INT); g_value_init (&value, G_TYPE_INT);
g_value_set_int (&value, -1); g_value_set_int (&value, -1);
@ -705,7 +705,7 @@ operation(A) ::= expr(X) IS expr(Y).
value(A) ::= INTEGER(X). value(A) ::= INTEGER(X).
{ {
GValue value = {0}; GValue value = G_VALUE_INIT;
SqlExpr * v = sql_value_new (); SqlExpr * v = sql_value_new ();
g_value_set_int (g_value_init (&value, G_TYPE_INT), atoi (X)); g_value_set_int (g_value_init (&value, G_TYPE_INT), atoi (X));
sql_value_set_value (SQL_VALUE (v), &value); sql_value_set_value (SQL_VALUE (v), &value);
@ -715,7 +715,7 @@ value(A) ::= INTEGER(X).
value(A) ::= FLOAT(X). value(A) ::= FLOAT(X).
{ {
GValue value = {0}; GValue value = G_VALUE_INIT;
SqlExpr * v = sql_value_new (); SqlExpr * v = sql_value_new ();
g_value_set_double g_value_set_double
(g_value_init (&value, G_TYPE_DOUBLE), g_ascii_strtod (X, NULL)); (g_value_init (&value, G_TYPE_DOUBLE), g_ascii_strtod (X, NULL));
@ -726,7 +726,7 @@ value(A) ::= FLOAT(X).
value(A) ::= STRING(X). value(A) ::= STRING(X).
{ {
GValue value = {0}; GValue value = G_VALUE_INIT;
SqlExpr * v = sql_value_new (); SqlExpr * v = sql_value_new ();
g_value_set_string (g_value_init (&value, G_TYPE_STRING), X); g_value_set_string (g_value_init (&value, G_TYPE_STRING), X);
sql_value_set_value (SQL_VALUE (v), &value); sql_value_set_value (SQL_VALUE (v), &value);
@ -736,7 +736,7 @@ value(A) ::= STRING(X).
value(A) ::= BOOLEAN(X). value(A) ::= BOOLEAN(X).
{ {
GValue value = {0}; GValue value = G_VALUE_INIT;
SqlExpr * v = sql_value_new (); SqlExpr * v = sql_value_new ();
g_value_set_boolean (g_value_init (&value, G_TYPE_BOOLEAN) g_value_set_boolean (g_value_init (&value, G_TYPE_BOOLEAN)
,(!g_strcmp0 (X, "TRUE") || !g_strcmp0 (X, "true")) ? TRUE : FALSE); ,(!g_strcmp0 (X, "TRUE") || !g_strcmp0 (X, "true")) ? TRUE : FALSE);

View File

@ -265,3 +265,55 @@ SqlObject * sql_parser_parse (const gchar * sql, GError ** err)
return object; return object;
} }
/**
* sql_parser_parse_field:
* @field: a string containing a field name
*
* Parses a qualified or unqualified SQL field name to an #SqlField object. The
* field can be specified using both ` or " as quotes. This object must be
* unreferenced using g_object_unref().
*
* Return value: an #SqlField
**/
SqlField * sql_parser_parse_field (const gchar * field)
{
gchar ** split;
SqlExpr * object = NULL;
if (!field || !g_strcmp0 (field, ""))
return NULL;
split = g_strsplit (field, ".", 0);
switch (g_strv_length (split))
{
case 3:
{
object = sql_field_new
(g_strstrip (g_strdelimit (split[2], "`\"", ' '))
,g_strstrip (g_strdelimit (split[1], "`\"", ' '))
,g_strstrip (g_strdelimit (split[0], "`\"", ' ')));
break;
}
case 2:
{
object = sql_field_new
(g_strstrip (g_strdelimit (split[1], "`\"", ' '))
,g_strstrip (g_strdelimit (split[0], "`\"", ' '))
,NULL);
break;
}
case 1:
{
object = sql_field_new
(g_strstrip (g_strdelimit (split[0], "`\"", ' '))
,NULL
,NULL);
break;
}
}
g_strfreev (split);
return (SqlField *) object;
}

View File

@ -19,12 +19,13 @@
#define SQL_PARSER_H #define SQL_PARSER_H
#include "sql-object.h" #include "sql-object.h"
#include "sql-field.h"
#define SQL_PARSER_LOG_DOMAIN (g_quark_from_string ("SqlParser")) #define SQL_PARSER_LOG_DOMAIN (g_quark_from_string ("SqlParser"))
/** /**
* sql_parser_parse: * sql_parser_parse:
* @sql: An string containing an SQL query * @sql: a string containing an SQL query
* @err: (out) (allow-none): a return location of a #GError or %NULL to ignore * @err: (out) (allow-none): a return location of a #GError or %NULL to ignore
* errors * errors
* *
@ -34,4 +35,14 @@
*/ */
SqlObject * sql_parser_parse (const gchar * sql, GError ** err) G_GNUC_WARN_UNUSED_RESULT; SqlObject * sql_parser_parse (const gchar * sql, GError ** err) G_GNUC_WARN_UNUSED_RESULT;
/**
* sql_parser_parse_field:
* @field: a string containing a qualified (or not) SQL field
*
* Parses a qualified SQL field and returns the corresponding @SqlField object.
*
* Return value: (transfer full): an #SqlField
*/
SqlField * sql_parser_parse_field (const gchar * field);
#endif #endif

View File

@ -93,7 +93,7 @@ void sql_string_add_value (SqlString * obj, GType type, gconstpointer content)
{ {
g_return_if_fail (SQL_IS_STRING (obj)); g_return_if_fail (SQL_IS_STRING (obj));
GValue value = {0}; GValue value = G_VALUE_INIT;
SqlExpr * expr; SqlExpr * expr;
gvn_value_new_with_content (&value, type, content); gvn_value_new_with_content (&value, type, content);

View File

@ -13,7 +13,7 @@ vn_include_HEADERS = \
vn-gui.h \ vn-gui.h \
vn-mod.h \ vn-mod.h \
vn-form.h \ vn-form.h \
vn-model.h \ vn-grid-model.h \
vn-grid.h \ vn-grid.h \
vn-handler.h \ vn-handler.h \
vn-batch.h \ vn-batch.h \
@ -31,7 +31,7 @@ libvn_la_LIBADD = \
$(top_builddir)/db/libdb.la \ $(top_builddir)/db/libdb.la \
$(top_builddir)/vn/field/libvnfield.la \ $(top_builddir)/vn/field/libvnfield.la \
$(top_builddir)/vn/column/libvncolumn.la $(top_builddir)/vn/column/libvncolumn.la
libvn_la_SOURCES = \ libvn_files = \
$(vn_include_HEADERS) \ $(vn_include_HEADERS) \
vn-field.c \ vn-field.c \
vn-column.c \ vn-column.c \
@ -39,12 +39,18 @@ libvn_la_SOURCES = \
vn-gui.c \ vn-gui.c \
vn-mod.c \ vn-mod.c \
vn-form.c \ vn-form.c \
vn-model.c \ vn-grid-model.c \
vn-grid.c \ vn-grid.c \
vn-handler.c \ vn-handler.c \
vn-batch.c \ vn-batch.c
glade_files = \
$(top_srcdir)/vn/glade/vn-iterator.h \ $(top_srcdir)/vn/glade/vn-iterator.h \
$(top_srcdir)/vn/glade/vn-iterator.c $(top_srcdir)/vn/glade/vn-iterator.c \
$(top_srcdir)/vn/glade/vn-model.h \
$(top_srcdir)/vn/glade/vn-model.c
libvn_la_SOURCES = \
$(libvn_files) \
$(glade_files)
pkgconfig_DATA = vn.pc pkgconfig_DATA = vn.pc
@ -91,7 +97,7 @@ INTROSPECTION_COMPILER_ARGS = \
--includedir=$(top_builddir)/db --includedir=$(top_builddir)/db
introspection_sources = \ introspection_sources = \
$(libvn_la_SOURCES) \ $(libvn_files) \
$(top_srcdir)/vn/field/vn-*.h \ $(top_srcdir)/vn/field/vn-*.h \
$(top_srcdir)/vn/column/vn-*.h $(top_srcdir)/vn/column/vn-*.h

View File

@ -27,7 +27,7 @@ static void vn_column_check_cb_toggled (GtkCellRendererToggle * cell,
gint col; gint col;
DbIter iter; DbIter iter;
DbModel * model; DbModel * model;
GValue new_value = {0}; GValue new_value = G_VALUE_INIT;
const GValue * old_value; const GValue * old_value;
col = vn_column_get_column_index (obj); col = vn_column_get_column_index (obj);
@ -55,7 +55,7 @@ static void vn_column_check_set_editable (VnColumn * obj, gboolean editable)
static void vn_column_check_set_value (VnColumnCheck * obj, GtkTreeModel * model, static void vn_column_check_set_value (VnColumnCheck * obj, GtkTreeModel * model,
GtkTreeIter * iter, GtkCellRendererToggle * cell, const GValue * value) GtkTreeIter * iter, GtkCellRendererToggle * cell, const GValue * value)
{ {
GValue new_value = {0}; GValue new_value = G_VALUE_INIT;
g_value_init (&new_value, G_TYPE_BOOLEAN); g_value_init (&new_value, G_TYPE_BOOLEAN);
if (!gvn_value_is_null (value)) if (!gvn_value_is_null (value))

View File

@ -16,7 +16,7 @@
*/ */
#include "vn-column-combo.h" #include "vn-column-combo.h"
#include "../vn-model.h" #include "../vn-grid-model.h"
static void vn_column_combo_model_holder_init (DbModelHolderInterface * iface); static void vn_column_combo_model_holder_init (DbModelHolderInterface * iface);
@ -107,7 +107,7 @@ static void vn_column_combo_on_edited (GtkCellRendererText * renderer,
gchar * path, gchar * new_text, VnColumnCombo * obj) gchar * path, gchar * new_text, VnColumnCombo * obj)
{ {
DbIter iter; DbIter iter;
GValue value = {0}; GValue value = G_VALUE_INIT;
if (!g_strcmp0 (new_text, "")) if (!g_strcmp0 (new_text, ""))
{ {
@ -216,7 +216,7 @@ static void vn_column_combo_set_model (VnColumnCombo * obj,
if (model) if (model)
{ {
obj->model = model; obj->model = model;
obj->tree_model = GTK_TREE_MODEL (vn_model_new (model)); obj->tree_model = GTK_TREE_MODEL (vn_grid_model_new (model));
g_signal_connect (model, "status-changed", g_signal_connect (model, "status-changed",
G_CALLBACK (vn_column_combo_on_status_changed), obj); G_CALLBACK (vn_column_combo_on_status_changed), obj);

View File

@ -24,7 +24,7 @@ G_DEFINE_TYPE (VnColumnEntry, vn_column_entry, VN_TYPE_COLUMN);
static void vn_column_entry_cb_edited (GtkCellRendererText * cell, static void vn_column_entry_cb_edited (GtkCellRendererText * cell,
const gchar * path, gchar * text, VnColumnEntry * obj) const gchar * path, gchar * text, VnColumnEntry * obj)
{ {
GValue value = {0}; GValue value = G_VALUE_INIT;
if (g_strcmp0 (text, "")) if (g_strcmp0 (text, ""))
{ {
@ -53,7 +53,7 @@ static void vn_column_entry_set_editable (VnColumn * obj, gboolean editable)
static void vn_column_entry_set_value (VnColumnEntry * obj, GtkTreeModel * model, static void vn_column_entry_set_value (VnColumnEntry * obj, GtkTreeModel * model,
GtkTreeIter * iter, GObject * cell, const GValue * value) GtkTreeIter * iter, GObject * cell, const GValue * value)
{ {
GValue new_value = {0}; GValue new_value = G_VALUE_INIT;
gvn_value_to_format_string (value, obj->digits, &new_value); gvn_value_to_format_string (value, obj->digits, &new_value);
g_object_set_property (cell, "text", &new_value); g_object_set_property (cell, "text", &new_value);
g_value_unset (&new_value); g_value_unset (&new_value);

View File

@ -16,7 +16,7 @@
*/ */
#include "vn-column-image.h" #include "vn-column-image.h"
#include "../vn-model.h" #include "../vn-grid-model.h"
#define LOAD_IMAGE _IMAGE_DIR"/load.gif" #define LOAD_IMAGE _IMAGE_DIR"/load.gif"
@ -223,7 +223,7 @@ static void vn_column_image_on_download (DbFileLoader * obj, GBytes * bytes,
if (error) if (error)
vn_column_image_download_error (data->obj, error); vn_column_image_download_error (data->obj, error);
else if (bytes && vn_model_iter_is_valid (data->iter, data->model)) else if (bytes && vn_grid_model_iter_is_valid (data->iter, data->model))
{ {
if (data->obj->loaded) if (data->obj->loaded)
g_hash_table_replace (data->obj->loaded, g_strdup (data->name), g_hash_table_replace (data->obj->loaded, g_strdup (data->name),

View File

@ -16,14 +16,14 @@
*/ */
#include "vn-column-spin.h" #include "vn-column-spin.h"
#include "../vn-model.h" #include "../vn-grid-model.h"
G_DEFINE_TYPE (VnColumnSpin, vn_column_spin, VN_TYPE_COLUMN); G_DEFINE_TYPE (VnColumnSpin, vn_column_spin, VN_TYPE_COLUMN);
static void vn_column_spin_on_edited (GtkCellRendererSpin * cell, static void vn_column_spin_on_edited (GtkCellRendererSpin * cell,
const gchar * path, gchar * text, VnColumnSpin * obj) const gchar * path, gchar * text, VnColumnSpin * obj)
{ {
GValue value = {0}; GValue value = G_VALUE_INIT;
DbModelStatus status = db_model_get_status (vn_column_get_model (VN_COLUMN (obj))); DbModelStatus status = db_model_get_status (vn_column_get_model (VN_COLUMN (obj)));
if (status != DB_MODEL_STATUS_READY) if (status != DB_MODEL_STATUS_READY)
@ -116,7 +116,7 @@ static void vn_column_spin_set_value (VnColumnSpin * obj, GtkTreeModel * model,
GtkTreeIter * iter, GObject * cell, const GValue * value) GtkTreeIter * iter, GObject * cell, const GValue * value)
{ {
gint digits; gint digits;
GValue new_value = {0}; GValue new_value = G_VALUE_INIT;
g_object_get (cell, "digits", &digits, NULL); g_object_get (cell, "digits", &digits, NULL);
gvn_value_to_format_string (value, digits, &new_value); gvn_value_to_format_string (value, digits, &new_value);

View File

@ -34,6 +34,7 @@ struct _VnColumnSpin
{ {
VnColumn parent; VnColumn parent;
GtkAdjustment * adjustment; GtkAdjustment * adjustment;
gchar * format;
}; };
struct _VnColumnSpinClass struct _VnColumnSpinClass

View File

@ -49,7 +49,7 @@ static void vn_calendar_cb_day_selected (GtkCalendar * calendar, VnCalendar * ob
guint month; guint month;
guint day; guint day;
GDate new_date; GDate new_date;
GValue value = {0}; GValue value = G_VALUE_INIT;
gtk_calendar_clear_marks (calendar); gtk_calendar_clear_marks (calendar);
gtk_calendar_get_date (calendar, &year, &month, &day); gtk_calendar_get_date (calendar, &year, &month, &day);
@ -102,7 +102,7 @@ static void vn_calendar_set_value (VnCalendar * obj, const GValue * value)
if (G_VALUE_TYPE (value) != G_TYPE_DATE) if (G_VALUE_TYPE (value) != G_TYPE_DATE)
{ {
GValue new_value = {0}; GValue new_value = G_VALUE_INIT;
g_value_init (&new_value, G_TYPE_DATE); g_value_init (&new_value, G_TYPE_DATE);
g_value_transform (value, &new_value); g_value_transform (value, &new_value);
date = g_value_get_boxed (&new_value); date = g_value_get_boxed (&new_value);

View File

@ -45,7 +45,7 @@ VnField * vn_check_new ()
static void vn_check_changed (VnCheck * obj) static void vn_check_changed (VnCheck * obj)
{ {
GValue value = {0}; GValue value = G_VALUE_INIT;
if (!gtk_toggle_button_get_inconsistent (obj->button)) if (!gtk_toggle_button_get_inconsistent (obj->button))
{ {
@ -85,7 +85,7 @@ static gboolean vn_check_on_secondary_button (GtkToggleButton * button, GdkEvent
static void vn_check_set_value (VnCheck * obj, const GValue * value) static void vn_check_set_value (VnCheck * obj, const GValue * value)
{ {
GValue new_value = {0}; GValue new_value = G_VALUE_INIT;
if (!gvn_value_is_null (value)) if (!gvn_value_is_null (value))
{ {

View File

@ -16,7 +16,7 @@
*/ */
#include "vn-combo.h" #include "vn-combo.h"
#include "../vn-model.h" #include "../vn-grid-model.h"
#include <db/db.h> #include <db/db.h>
/** /**
@ -55,7 +55,7 @@ VnField * vn_combo_new (DbModel * model)
static void vn_combo_cb_changed (GtkComboBox * combo, VnCombo * obj) static void vn_combo_cb_changed (GtkComboBox * combo, VnCombo * obj)
{ {
GtkTreeIter iter; GtkTreeIter iter;
GValue value = {0}; GValue value = G_VALUE_INIT;
if (gtk_combo_box_get_active_iter (combo, &iter)) if (gtk_combo_box_get_active_iter (combo, &iter))
gtk_tree_model_get_value (obj->tree, &iter, obj->index_column, &value); gtk_tree_model_get_value (obj->tree, &iter, obj->index_column, &value);
@ -127,7 +127,7 @@ static void vn_combo_set_model (VnCombo * obj, DbModel * model)
} }
if (model) if (model)
{ {
obj->tree = GTK_TREE_MODEL (vn_model_new (model)); obj->tree = GTK_TREE_MODEL (vn_grid_model_new (model));
obj->model = g_object_ref (model); obj->model = g_object_ref (model);
g_signal_connect (model, "status-changed", g_signal_connect (model, "status-changed",
G_CALLBACK (vn_combo_cb_status_changed), obj); G_CALLBACK (vn_combo_cb_status_changed), obj);

View File

@ -17,7 +17,7 @@
#include "vn-completion.h" #include "vn-completion.h"
#include <db/db.h> #include <db/db.h>
#include <vn/vn-model.h> #include <vn/vn-grid-model.h>
#include <string.h> #include <string.h>
#define set_icon(obj,icon_name) (gtk_entry_set_icon_from_icon_name (obj->entry, GTK_ENTRY_ICON_SECONDARY, icon_name)) #define set_icon(obj,icon_name) (gtk_entry_set_icon_from_icon_name (obj->entry, GTK_ENTRY_ICON_SECONDARY, icon_name))
@ -64,7 +64,7 @@ static void vn_completion_cb_status_changed (DbModel * model,
if (status == DB_MODEL_STATUS_READY) if (status == DB_MODEL_STATUS_READY)
{ {
GtkTreeModel * tree = GTK_TREE_MODEL (vn_model_new (model)); GtkTreeModel * tree = GTK_TREE_MODEL (vn_grid_model_new (model));
gtk_entry_completion_set_model (obj->completion, tree); gtk_entry_completion_set_model (obj->completion, tree);
g_signal_emit_by_name (obj->entry, "changed"); g_signal_emit_by_name (obj->entry, "changed");
g_object_unref (tree); g_object_unref (tree);
@ -104,7 +104,7 @@ static void vn_completion_cb_changed (GtkEditable * entry, VnCompletion * obj)
&& (!obj->last_match || g_strcmp0 (text, obj->last_match))) && (!obj->last_match || g_strcmp0 (text, obj->last_match)))
{ {
gchar * pattern; gchar * pattern;
GValue value = {0}; GValue value = G_VALUE_INIT;
set_icon (obj, "edit-find-symbolic"); set_icon (obj, "edit-find-symbolic");
@ -164,7 +164,7 @@ static void vn_completion_cb_activate (GtkEntry * entry, VnCompletion * obj)
if (!ok) if (!ok)
{ {
GValue value = {0}; GValue value = G_VALUE_INIT;
g_value_init (&value, GVN_TYPE_NULL); g_value_init (&value, GVN_TYPE_NULL);
VN_FIELD_GET_CLASS (obj)->value_changed (VN_FIELD (obj), &value); VN_FIELD_GET_CLASS (obj)->value_changed (VN_FIELD (obj), &value);

View File

@ -87,7 +87,7 @@ static void vn_date_chooser_set_value (VnDateChooser * obj, const GValue * value
if (G_VALUE_TYPE (value) != G_TYPE_DATE) if (G_VALUE_TYPE (value) != G_TYPE_DATE)
{ {
GValue new_value = {0}; GValue new_value = G_VALUE_INIT;
g_value_init (&new_value, G_TYPE_DATE); g_value_init (&new_value, G_TYPE_DATE);
g_value_transform (value, &new_value); g_value_transform (value, &new_value);
date = g_value_get_boxed (&new_value); date = g_value_get_boxed (&new_value);
@ -109,7 +109,7 @@ static void vn_date_chooser_on_day_selected (GtkCalendar * calendar, VnDateChoos
guint month; guint month;
guint day; guint day;
GDate new_date; GDate new_date;
GValue value = {0}; GValue value = G_VALUE_INIT;
gtk_calendar_get_date (calendar, &year, &month, &day); gtk_calendar_get_date (calendar, &year, &month, &day);
month++; month++;

View File

@ -45,7 +45,7 @@ VnField * vn_entry_new (VnEntry * obj)
static void vn_entry_cb_editing_done (GtkEntry * entry, VnField * obj) static void vn_entry_cb_editing_done (GtkEntry * entry, VnField * obj)
{ {
GValue value = {0}; GValue value = G_VALUE_INIT;
const gchar * text = gtk_entry_get_text (entry); const gchar * text = gtk_entry_get_text (entry);
if (g_strcmp0 (text, "") || !vn_field_get_null (obj)) if (g_strcmp0 (text, "") || !vn_field_get_null (obj))
@ -68,7 +68,7 @@ static gboolean vn_entry_cb_focus_out (GtkEntry * entry, GdkEvent * event, VnFie
static void vn_entry_set_value (VnEntry * obj, const GValue * value) static void vn_entry_set_value (VnEntry * obj, const GValue * value)
{ {
GValue new_value = {0}; GValue new_value = G_VALUE_INIT;
gvn_value_to_format_string (value, obj->digits, &new_value); gvn_value_to_format_string (value, obj->digits, &new_value);
g_signal_handlers_block_by_func (obj->entry, g_signal_handlers_block_by_func (obj->entry,

View File

@ -155,7 +155,7 @@ static gboolean vn_image_cb_event (VnField * field, GdkEvent * event, VnImage *
if (g_file_get_contents (filename, &data, &len, &err)) if (g_file_get_contents (filename, &data, &len, &err))
{ {
GValue value = {0}; GValue value = G_VALUE_INIT;
g_value_init (&value, G_TYPE_BYTES); g_value_init (&value, G_TYPE_BYTES);
g_value_take_boxed (&value, g_bytes_new_take (data, len)); g_value_take_boxed (&value, g_bytes_new_take (data, len));

View File

@ -45,7 +45,7 @@ VnField * vn_spin_new ()
static void vn_spin_on_value_changed (GtkSpinButton * spin, VnField * obj) static void vn_spin_on_value_changed (GtkSpinButton * spin, VnField * obj)
{ {
GValue value = {0}; GValue value = G_VALUE_INIT;
if (g_strcmp0 (gtk_entry_get_text (GTK_ENTRY (spin)), "")) if (g_strcmp0 (gtk_entry_get_text (GTK_ENTRY (spin)), ""))
{ {
@ -81,7 +81,7 @@ static void vn_spin_set_value (VnSpin * obj, const GValue * value)
if (!gvn_value_is_null (value)) if (!gvn_value_is_null (value))
{ {
GValue new_value = {0}; GValue new_value = G_VALUE_INIT;
g_value_init (&new_value, G_TYPE_DOUBLE); g_value_init (&new_value, G_TYPE_DOUBLE);
g_value_transform (value, &new_value); g_value_transform (value, &new_value);
gtk_spin_button_set_value (obj->spin, gtk_spin_button_set_value (obj->spin,

View File

@ -17,20 +17,60 @@
#include "vn-iterator.h" #include "vn-iterator.h"
static void vn_iterator_buildable_init (GtkBuildableIface * iface);
G_DEFINE_TYPE_WITH_CODE (VnIterator, vn_iterator, DB_TYPE_ITERATOR,
G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
vn_iterator_buildable_init)
);
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Methods for Glade
void vn_iterator_add_param (DbIterator * obj, DbParam * param)
{
VnIterator * i = (VnIterator *) obj;
g_return_if_fail (DB_IS_ITERATOR (obj));
g_return_if_fail (DB_IS_PARAM (param));
i->params = g_list_prepend (i->params, param);
}
void vn_iterator_remove_param (DbIterator * obj, DbParam * param)
{
VnIterator * i = (VnIterator *) obj;
g_return_if_fail (DB_IS_ITERATOR (obj));
g_return_if_fail (DB_IS_PARAM (param));
i->params = g_list_remove (i->params, param);
}
GList * vn_iterator_get_params (DbIterator * obj)
{
g_return_if_fail (DB_IS_ITERATOR (obj));
return g_list_copy (((VnIterator *) obj)->params);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++ GtkBuildable //+++++++++++++++++++++++++++++++++++++++++++++++++++ GtkBuildable
static void vn_iterator_buildable_add_child (GtkBuildable * obj, static void vn_iterator_buildable_add_child (GtkBuildable * obj,
GtkBuilder * builder, GObject * child, const gchar * type) GtkBuilder * builder, GObject * child, const gchar * type)
{ {
db_iterator_add_param (DB_ITERATOR (obj), DB_PARAM (child)); db_iterator_add_param ((DbIterator *) obj, (DbParam *) child);
} }
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Class //+++++++++++++++++++++++++++++++++++++++++++++++++++ Class
static void vn_iterator_init (VnIterator * obj)
{
obj->params = NULL;
}
static void vn_iterator_finalize (VnIterator * obj) static void vn_iterator_finalize (VnIterator * obj)
{ {
GObjectClass * parent = g_type_class_peek_parent (VN_ITERATOR_GET_CLASS (obj)); g_list_free_full (obj->params, g_object_unref);
parent->finalize (G_OBJECT (obj));
G_OBJECT_CLASS (vn_iterator_parent_class)->finalize (G_OBJECT (obj));
} }
static void vn_iterator_class_init (VnIteratorClass * klass) static void vn_iterator_class_init (VnIteratorClass * klass)
@ -39,15 +79,7 @@ static void vn_iterator_class_init (VnIteratorClass * klass)
k->finalize = (GObjectFinalizeFunc) vn_iterator_finalize; k->finalize = (GObjectFinalizeFunc) vn_iterator_finalize;
} }
static void vn_iterator_buildable_interface_init (GtkBuildableIface * iface) static void vn_iterator_buildable_init (GtkBuildableIface * iface)
{ {
iface->add_child = vn_iterator_buildable_add_child; iface->add_child = vn_iterator_buildable_add_child;
} }
static void vn_iterator_init (VnIterator * obj)
{}
G_DEFINE_TYPE_WITH_CODE (VnIterator, vn_iterator, DB_TYPE_ITERATOR,
G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
vn_iterator_buildable_interface_init)
);

View File

@ -34,6 +34,7 @@ typedef struct _VnIteratorClass VnIteratorClass;
struct _VnIterator struct _VnIterator
{ {
DbIterator iterator; DbIterator iterator;
GList * params;
}; };
struct _VnIteratorClass struct _VnIteratorClass
@ -43,4 +44,8 @@ struct _VnIteratorClass
GType vn_iterator_get_type (); GType vn_iterator_get_type ();
void vn_iterator_add_param (DbIterator * obj, DbParam * param);
void vn_iterator_remove_param (DbIterator * obj, DbParam * param);
GList * vn_iterator_get_params (DbIterator * obj);
#endif #endif

140
vn/glade/vn-model.c Normal file
View File

@ -0,0 +1,140 @@
/*
* Copyright (C) 2012 - Juan Ferrer Toribio
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "vn-model.h"
static void vn_model_buildable_init (GtkBuildableIface * iface);
G_DEFINE_TYPE_WITH_CODE (VnModel, vn_model, DB_TYPE_MODEL,
G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
vn_model_buildable_init)
);
/* GtkBuildable custom tag implementation
*
* <links>
* <link field="db.table.field" param="param-id"/>
* ...
* </links>
*/
typedef struct
{
GtkBuilder * builder;
DbModel * model;
GSList * fields;
GSList * params;
}
VnModelData;
//+++++++++++++++++++++++++++++++++++++++++++++++++++ GtkBuildable
static void vn_model_start_element (GMarkupParseContext * context,
const gchar * element, const gchar ** names,
const gchar ** values, gpointer data, GError ** err)
{
guint i;
VnModelData * d = (VnModelData *) data;
for (i = 0; names[i]; i++)
if (!g_strcmp0 (names[i], "field"))
d->fields = g_slist_prepend (d->fields, g_strdup (values[i]));
else if (!g_strcmp0 (names[i], "param"))
d->params = g_slist_prepend (d->params, g_strdup (values[i]));
}
static void vn_model_end_element (GMarkupParseContext * context,
const gchar * element, gpointer data, GError ** error)
{
GSList * f, * p;
VnModelData * d = (VnModelData *) data;
g_return_if_fail (d->builder);
if (g_strcmp0 (element, "links"))
return;
d->fields = g_slist_reverse (d->fields);
d->params = g_slist_reverse (d->params);
for (f = d->fields, p = d->params; f && p; f = f->next, p = p->next)
{
gchar * field = f->data;
GvnParam * param = GVN_PARAM (gtk_builder_get_object (d->builder, p->data));
db_model_set_default_value_from_param (d->model, field, param);
g_free (f->data);
g_free (p->data);
}
g_slist_free (d->fields);
g_slist_free (d->params);
g_slice_free (VnModelData, d);
}
static const GMarkupParser vn_model_parser =
{
vn_model_start_element
,vn_model_end_element
};
static gboolean vn_model_buildable_custom_tag_start (GtkBuildable *buildable,
GtkBuilder * builder, GObject * child, const gchar * tag,
GMarkupParser * parser, gpointer * data)
{
if (child)
return FALSE;
if (!g_strcmp0 (tag, "links"))
{
VnModelData * data_ptr = g_slice_new (VnModelData);
data_ptr->builder = builder;
data_ptr->model = DB_MODEL (buildable);
data_ptr->fields = NULL;
data_ptr->params = NULL;
*data = data_ptr;
*parser = vn_model_parser;
return TRUE;
}
return FALSE;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Class
static void vn_model_finalize (VnModel * obj)
{
G_OBJECT_CLASS (vn_model_parent_class)->finalize (G_OBJECT (obj));
}
static void vn_model_class_init (VnModelClass * klass)
{
GObjectClass * k = G_OBJECT_CLASS (klass);
k->finalize = (GObjectFinalizeFunc) vn_model_finalize;
}
static void vn_model_buildable_init (GtkBuildableIface * iface)
{
iface->custom_tag_start = vn_model_buildable_custom_tag_start;
}
static void vn_model_init (VnModel * obj)
{}

46
vn/glade/vn-model.h Normal file
View File

@ -0,0 +1,46 @@
/*
* Copyright (C) 2012 - Juan Ferrer Toribio
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef VN_MODEL_H
#define VN_MODEL_H
#include <db/db.h>
#include <gtk/gtk.h>
#define VN_TYPE_MODEL (vn_model_get_type ())
#define VN_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST (obj, VN_TYPE_MODEL, VnModel))
#define VN_IS_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE (obj, VN_TYPE_MODEL))
#define VN_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST (klass, VN_TYPE_MODEL, VnModelClass))
#define VN_IS_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE (klass, VN_TYPE_MODEL))
#define VN_MODEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, VN_TYPE_MODEL, VnModelClass))
typedef struct _VnModel VnModel;
typedef struct _VnModelClass VnModelClass;
struct _VnModel
{
DbModel model;
};
struct _VnModelClass
{
DbModelClass parent;
};
GType vn_model_get_type ();
#endif

View File

@ -25,6 +25,13 @@
* A group of GObjects. * A group of GObjects.
*/ */
static void vn_batch_buildable_interface_init (GtkBuildableIface * iface);
G_DEFINE_TYPE_WITH_CODE (VnBatch, vn_batch, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
vn_batch_buildable_interface_init)
);
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Methods //+++++++++++++++++++++++++++++++++++++++++++++++++++ Methods
/** /**
@ -140,8 +147,3 @@ static void vn_batch_buildable_interface_init (GtkBuildableIface * iface)
{ {
iface->add_child = vn_batch_buildable_add_child; iface->add_child = vn_batch_buildable_add_child;
} }
G_DEFINE_TYPE_WITH_CODE (VnBatch, vn_batch, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
vn_batch_buildable_interface_init)
);

View File

@ -41,14 +41,14 @@ static void vn_column_data_func (GtkTreeViewColumn * col, GtkCellRenderer * cell
DbIter dbiter; DbIter dbiter;
DbModelRowOp ops; DbModelRowOp ops;
GValue value = {0}; GValue value = G_VALUE_INIT;
gtk_tree_model_get_value (model, iter, obj->column_index, &value); gtk_tree_model_get_value (model, iter, obj->column_index, &value);
obj->set_value (obj, model, iter, cell, &value); obj->set_value (obj, model, iter, cell, &value);
g_value_unset (&value); g_value_unset (&value);
vn_gtk_tree_iter_to_db_iter (iter, &dbiter); vn_gtk_tree_iter_to_db_iter (iter, &dbiter);
ops = db_model_get_row_operations ( ops = db_model_get_row_operations (
vn_model_get_model (VN_MODEL (model)) vn_grid_model_get_model (VN_GRID_MODEL (model))
,&dbiter ,&dbiter
); );

445
vn/vn-grid-model.c Normal file
View File

@ -0,0 +1,445 @@
/*
* Copyright (C) 2012 - Juan Ferrer Toribio
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "vn-grid-model.h"
static void vn_grid_model_tree_model_init (GtkTreeModelIface * iface);
static void vn_grid_model_tree_sortable_init (GtkTreeSortableIface * iface);
G_DEFINE_TYPE_WITH_CODE (VnGridModel, vn_grid_model, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL,
vn_grid_model_tree_model_init)
G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_SORTABLE,
vn_grid_model_tree_sortable_init)
);
/**
* vn_grid_model_new:
* @model: a #DbModel
*
* Creates a new #VnGridModel with @model as the data model.
*
* Return value: (transfer full): a #VnGridModel.
**/
VnGridModel * vn_grid_model_new (DbModel * model)
{
return g_object_new (VN_TYPE_GRID_MODEL, "model", model, NULL);
}
/**
* vn_grid_model_get_model:
* @obj: a #VnGridModel
*
* Passes the #DbModel used internally by @model.
*
* Return value: (transfer none): a #DbModel.
**/
DbModel * vn_grid_model_get_model (VnGridModel * obj)
{
g_return_val_if_fail (VN_IS_GRID_MODEL (obj), NULL);
return obj->model;
}
/**
* vn_gtk_tree_iter_from_db_iter:
* @dest_iter: the #GtkTreeIter to set using the data on @src_iter
* @src_iter: a valid #DbIter
*
* Sets a #GtkTreeIter with the data of a #DbIter. This function is mostly used
* internally.
**/
void gtk_tree_iter_from_db_iter (GtkTreeIter * dest_iter, const DbIter * src_iter)
{
dest_iter->stamp = src_iter->stamp;
dest_iter->user_data = src_iter->data;
}
/**
* vn_gtk_tree_iter_to_db_iter:
* @src_iter: a valid #GtkTreeIter
* @dest_iter: the #DbIter to set using the data on @src_iter
*
* Sets a with #DbIter the data of a #GtkTreeIter. This function is mostly used
* internally.
**/
void gtk_tree_iter_to_db_iter (const GtkTreeIter * src_iter, DbIter * dest_iter)
{
dest_iter->stamp = src_iter->stamp;
dest_iter->data = src_iter->user_data;
}
/**
* vn_grid_model_iter_is_valid:
* @iter: a #GtkTreeIter
* @model: a #GtkTreeModel
*
* Checks if @iter is a valid #GtkTreeIter pointing inside #GtkTreeModel.
**/
gboolean vn_grid_model_iter_is_valid (GtkTreeIter * iter, GtkTreeModel * model)
{
DbIter db_iter;
g_return_val_if_fail (GTK_IS_TREE_MODEL (model), FALSE);
gtk_tree_iter_to_db_iter (iter, &db_iter);
return db_model_iter_is_valid (&db_iter, VN_GRID_MODEL (model)->model);
}
static gint vn_grid_model_get_nrows (GtkTreeModel * obj)
{
return db_model_get_nrows (VN_GRID_MODEL (obj)->model);
}
//++++ Broadcast of GtkTreeModel and GtkTreeSortable signals:
static void vn_grid_model_on_line_updated (DbModel * model, DbIter * db_iter, GtkTreeModel * obj)
{
GtkTreeIter iter;
gtk_tree_iter_from_db_iter (&iter, db_iter);
GtkTreePath * path = gtk_tree_path_new ();
gtk_tree_path_append_index (path, db_model_get_path (model, db_iter));
gtk_tree_model_row_changed (obj, path, &iter);
gtk_tree_path_free (path);
}
static void vn_grid_model_on_line_inserted (DbModel * model, DbIter * db_iter, GtkTreeModel * obj)
{
GtkTreeIter iter;
gtk_tree_iter_from_db_iter (&iter, db_iter);
GtkTreePath * path = gtk_tree_path_new ();
gtk_tree_path_append_index (path,
db_model_get_path (model, db_iter));
gtk_tree_model_row_inserted (obj, path, &iter);
gtk_tree_path_free (path);
}
static void vn_grid_model_on_line_deleted (DbModel * model, gint position, GtkTreeModel * obj)
{
GtkTreePath * path = gtk_tree_path_new ();
gtk_tree_path_append_index (path, position);
if (gtk_tree_path_get_indices (path))
gtk_tree_model_row_deleted (obj, path);
gtk_tree_path_free (path);
}
static void vn_grid_model_on_lines_reordered (DbModel * model, guint col, gint * new_order, GtkTreeModel * obj)
{
GtkTreePath * path = gtk_tree_path_new ();
gtk_tree_model_rows_reordered (obj, path, NULL, new_order);
gtk_tree_path_free (path);
}
static void vn_grid_model_on_sort_changed (DbModel * model, GtkTreeSortable * obj)
{
g_signal_emit_by_name (obj, "sort-column-changed");
}
//++++ Implementation of GtkTreeModel methods (using DbModel methods)
static GtkTreeModelFlags vn_grid_model_get_flags (GtkTreeModel * obj)
{
return GTK_TREE_MODEL_ITERS_PERSIST | GTK_TREE_MODEL_LIST_ONLY;
}
static gint vn_grid_model_get_ncols (GtkTreeModel * obj)
{
return db_model_get_ncols (VN_GRID_MODEL (obj)->model);
}
static GType vn_grid_model_get_column_type (GtkTreeModel * obj, gint index_)
{
return db_model_get_column_type (VN_GRID_MODEL (obj)->model, index_);
}
static gboolean vn_grid_model_get_iter (GtkTreeModel * obj, GtkTreeIter * iter,
GtkTreePath * path)
{
DbIter db_iter;
gint p = gtk_tree_path_get_indices (path)[0];
gboolean ret = db_model_get_iter (VN_GRID_MODEL (obj)->model, &db_iter, p);
if (ret)
gtk_tree_iter_from_db_iter (iter, &db_iter);
return ret;
}
static GtkTreePath * vn_grid_model_get_path (GtkTreeModel * obj, GtkTreeIter * iter)
{
GtkTreePath * path;
DbIter db_iter;
gtk_tree_iter_to_db_iter (iter, &db_iter);
path = gtk_tree_path_new ();
gtk_tree_path_append_index (path,
db_model_get_path (VN_GRID_MODEL (obj)->model, &db_iter));
return path;
}
static void vn_grid_model_get_value (GtkTreeModel * obj, GtkTreeIter * iter,
gint column, GValue * value)
{
const GValue * v;
DbIter db_iter;
gtk_tree_iter_to_db_iter (iter, &db_iter);
v = db_model_get_value (VN_GRID_MODEL (obj)->model, &db_iter, column, NULL);
if (v)
{
g_value_init (value, G_VALUE_TYPE (v));
g_value_copy (v, value);
}
else
g_value_init (value, GVN_TYPE_NULL);
}
static gboolean vn_grid_model_iter_next (GtkTreeModel * obj, GtkTreeIter * iter)
{
DbIter db_iter;
gtk_tree_iter_to_db_iter (iter, &db_iter);
gboolean ret_val = db_model_iter_next (VN_GRID_MODEL (obj)->model, &db_iter);
iter->user_data = db_iter.data;
return ret_val;
}
static gboolean vn_grid_model_iter_previous (GtkTreeModel * obj, GtkTreeIter * iter)
{
DbIter db_iter;
gtk_tree_iter_to_db_iter (iter, &db_iter);
gboolean ret_val = db_model_iter_prev (VN_GRID_MODEL (obj)->model, &db_iter);
iter->user_data = db_iter.data;
return ret_val;
}
static gboolean vn_grid_model_iter_children (GtkTreeModel * obj, GtkTreeIter * iter,
GtkTreeIter * parent)
{
if (parent == NULL)
{
DbIter db_iter;
gboolean ret_val = db_model_get_iter_first (VN_GRID_MODEL (obj)->model
,&db_iter);
if (ret_val)
gtk_tree_iter_from_db_iter (iter, &db_iter);
return ret_val;
}
return FALSE;
}
static gboolean vn_grid_model_iter_has_child (GtkTreeModel * obj, GtkTreeIter * iter)
{
return FALSE;
}
static gint vn_grid_model_iter_n_children (GtkTreeModel * obj, GtkTreeIter * iter)
{
if (iter == NULL)
return vn_grid_model_get_nrows (obj);
return 0;
}
static gboolean vn_grid_model_iter_nth_child (GtkTreeModel * obj, GtkTreeIter * iter
,GtkTreeIter * parent, gint n)
{
if (parent == NULL)
{
DbIter db_iter;
gboolean ret = db_model_get_iter (VN_GRID_MODEL (obj)->model, &db_iter, n);
if (ret)
gtk_tree_iter_from_db_iter (iter, &db_iter);
}
return FALSE;
}
static gboolean vn_grid_model_iter_parent (GtkTreeModel * obj, GtkTreeIter * iter,
GtkTreeIter * child)
{
return FALSE;
}
//++++ Implementation of GtkTreeSortable methods (using DbModel methods)
static gboolean vn_grid_model_get_sort_column_id (GtkTreeSortable * obj,
gint * sort_column_id,
GtkSortType * order)
{
return db_model_get_sort_column_id (VN_GRID_MODEL (obj)->model
,sort_column_id, (DbSortType *) order);
}
static void vn_grid_model_set_sort_column_id (GtkTreeSortable * obj, gint sort_column_id,
GtkSortType order)
{
DbSortType db_order;
if (order == GTK_SORT_ASCENDING)
db_order = DB_SORT_ASCENDING;
else
db_order = DB_SORT_DESCENDING;
db_model_set_sort_column_id (VN_GRID_MODEL (obj)->model, sort_column_id, db_order);
}
static void vn_grid_model_set_sort_func (GtkTreeSortable *sortable, gint sort_column_id,
GtkTreeIterCompareFunc sort_func, gpointer user_data, GDestroyNotify destroy)
{
g_log (g_quark_to_string (VN_GRID_MODEL_LOG_DOMAIN)
,G_LOG_LEVEL_WARNING, "Function vn_grid_model_set_sort_func not implemented");
}
static void vn_grid_model_set_default_sort_func (GtkTreeSortable *sortable,
GtkTreeIterCompareFunc sort_func, gpointer user_data, GDestroyNotify destroy)
{
g_log (g_quark_to_string (VN_GRID_MODEL_LOG_DOMAIN)
,G_LOG_LEVEL_WARNING, "Function vn_grid_model_set_default_sort_func not implemented");
}
static gboolean vn_grid_model_has_default_sort_func (GtkTreeSortable * obj)
{
return TRUE;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Properties
typedef enum
{
PROP_MODEL = 1
}
VnGridModelProp;
static void vn_grid_model_set_property (VnGridModel * obj, guint property_id,
const GValue * value, GParamSpec * pspec)
{
switch (property_id)
{
case PROP_MODEL:
obj->model = g_value_get_object (value);
g_object_ref_sink (obj->model);
g_object_connect (obj->model
,"signal-after::line-updated", vn_grid_model_on_line_updated, obj
,"signal::line-inserted", vn_grid_model_on_line_inserted, obj
,"signal-after::line-deleted", vn_grid_model_on_line_deleted, obj
,"signal::lines-reordered", vn_grid_model_on_lines_reordered, obj
,"signal::sort-changed", vn_grid_model_on_sort_changed, obj, NULL);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec);
}
}
static void vn_grid_model_get_property (VnGridModel * obj, guint property_id,
GValue * value, GParamSpec * pspec)
{
switch (property_id)
{
case PROP_MODEL:
g_value_set_object (value, obj->model);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec);
}
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Class
static void vn_grid_model_finalize (VnGridModel * obj)
{
g_object_disconnect (obj->model
,"any_signal", vn_grid_model_on_line_updated, obj
,"any_signal", vn_grid_model_on_line_inserted, obj
,"any_signal", vn_grid_model_on_line_deleted, obj
,"any_signal", vn_grid_model_on_lines_reordered, obj
,"any_signal", vn_grid_model_on_sort_changed, obj, NULL);
g_object_unref (obj->model);
G_OBJECT_CLASS (vn_grid_model_parent_class)->finalize (G_OBJECT (obj));
}
static void vn_grid_model_class_init (VnGridModelClass * k)
{
GObjectClass * klass = G_OBJECT_CLASS (k);
klass->set_property = (GObjectSetPropertyFunc) vn_grid_model_set_property;
klass->get_property = (GObjectGetPropertyFunc) vn_grid_model_get_property;
klass->finalize = (GObjectFinalizeFunc) vn_grid_model_finalize;
g_object_class_install_property (klass, PROP_MODEL,
g_param_spec_object ("model"
,"Model"
,"The #DbModel with the data used by the #VnGridModel"
,DB_TYPE_MODEL
,G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE
));
}
static void vn_grid_model_tree_model_init (GtkTreeModelIface * iface)
{
iface->get_flags = vn_grid_model_get_flags;
iface->get_n_columns = vn_grid_model_get_ncols;
iface->get_column_type = vn_grid_model_get_column_type;
iface->get_iter = vn_grid_model_get_iter;
iface->get_path = vn_grid_model_get_path;
iface->get_value = vn_grid_model_get_value;
iface->iter_next = vn_grid_model_iter_next;
iface->iter_previous = vn_grid_model_iter_previous;
iface->iter_children = vn_grid_model_iter_children;
iface->iter_has_child = vn_grid_model_iter_has_child;
iface->iter_n_children = vn_grid_model_iter_n_children;
iface->iter_nth_child = vn_grid_model_iter_nth_child;
iface->iter_parent = vn_grid_model_iter_parent;
}
static void vn_grid_model_tree_sortable_init (GtkTreeSortableIface * iface)
{
iface->get_sort_column_id = vn_grid_model_get_sort_column_id;
iface->set_sort_column_id = vn_grid_model_set_sort_column_id;
iface->set_sort_func = vn_grid_model_set_sort_func;
iface->set_default_sort_func = vn_grid_model_set_default_sort_func;
iface->has_default_sort_func = vn_grid_model_has_default_sort_func;
}
static void vn_grid_model_init (VnGridModel * obj)
{
obj->model = NULL;
}

View File

@ -15,44 +15,44 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef VN_MODEL_H #ifndef VN_GRID_MODEL_H
#define VN_MODEL_H #define VN_GRID_MODEL_H
#include <glib-object.h> #include <glib-object.h>
#include <db/db-model.h> #include <db/db-model.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
#define VN_TYPE_MODEL (vn_model_get_type()) #define VN_TYPE_GRID_MODEL (vn_grid_model_get_type())
#define VN_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VN_TYPE_MODEL, VnModel)) #define VN_GRID_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VN_TYPE_GRID_MODEL, VnGridModel))
#define VN_IS_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VN_TYPE_MODEL)) #define VN_IS_GRID_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VN_TYPE_GRID_MODEL))
#define VN_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VN_TYPE_MODEL, VnModelClass)) #define VN_GRID_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VN_TYPE_GRID_MODEL, VnGridModelClass))
#define VN_IS_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VN_TYPE_MODEL)) #define VN_IS_GRID_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VN_TYPE_GRID_MODEL))
#define VN_MODEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VN_TYPE_MODEL, VnModelClass)) #define VN_GRID_MODEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VN_TYPE_GRID_MODEL, VnGridModelClass))
#define VN_MODEL_LOG_DOMAIN (g_quark_from_string ("VnModel")) #define VN_GRID_MODEL_LOG_DOMAIN (g_quark_from_string ("VnGridModel"))
#define gtk_tree_iter_from_db_iter(d,s) vn_gtk_tree_iter_from_db_iter(d,s) #define gtk_tree_iter_from_db_iter(d,s) vn_gtk_tree_iter_from_db_iter(d,s)
#define gtk_tree_iter_to_db_iter(s,d) vn_gtk_tree_iter_to_db_iter(s,d) #define gtk_tree_iter_to_db_iter(s,d) vn_gtk_tree_iter_to_db_iter(s,d)
typedef struct _VnModel VnModel; typedef struct _VnGridModel VnGridModel;
typedef struct _VnModelClass VnModelClass; typedef struct _VnGridModelClass VnGridModelClass;
struct _VnModel struct _VnGridModel
{ {
GObject parent; GObject parent;
DbModel * model; DbModel * model;
}; };
struct _VnModelClass struct _VnGridModelClass
{ {
/* <private> */ /* <private> */
GObjectClass parent; GObjectClass parent;
}; };
GType vn_model_get_type (); GType vn_grid_model_get_type ();
VnModel * vn_model_new (DbModel * model); VnGridModel * vn_grid_model_new (DbModel * model);
DbModel * vn_model_get_model (VnModel * obj); DbModel * vn_grid_model_get_model (VnGridModel * obj);
gboolean vn_model_iter_is_valid (GtkTreeIter * iter, GtkTreeModel * model); gboolean vn_grid_model_iter_is_valid (GtkTreeIter * iter, GtkTreeModel * model);
void vn_gtk_tree_iter_from_db_iter (GtkTreeIter * dest_iter void vn_gtk_tree_iter_from_db_iter (GtkTreeIter * dest_iter
,const DbIter * src_iter); ,const DbIter * src_iter);
void vn_gtk_tree_iter_to_db_iter (const GtkTreeIter * src_iter void vn_gtk_tree_iter_to_db_iter (const GtkTreeIter * src_iter

View File

@ -109,7 +109,7 @@ static void vn_grid_on_status_changed (DbIterator * iterator, gboolean ready, Vn
if (ready) if (ready)
{ {
GtkTreeModel * tree_model = GTK_TREE_MODEL (vn_model_new (obj->model)); GtkTreeModel * tree_model = GTK_TREE_MODEL (vn_grid_model_new (obj->model));
gtk_tree_view_set_model (GTK_TREE_VIEW (obj), tree_model); gtk_tree_view_set_model (GTK_TREE_VIEW (obj), tree_model);
vn_grid_on_iter_changed (obj->iterator, GTK_TREE_VIEW (obj)); vn_grid_on_iter_changed (obj->iterator, GTK_TREE_VIEW (obj));
g_object_unref (tree_model); g_object_unref (tree_model);

View File

@ -20,7 +20,7 @@
#include <db/db.h> #include <db/db.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include "vn-model.h" #include "vn-grid-model.h"
#include "vn-column.h" #include "vn-column.h"
#define VN_TYPE_GRID (vn_grid_get_type ()) #define VN_TYPE_GRID (vn_grid_get_type ())

View File

@ -699,7 +699,7 @@ static gboolean vn_gui_reconnect_idle (GuiData * gui_data)
if (!gui_data->aux) if (!gui_data->aux)
vn_gui_show_error (gui_data->obj, gui_data->error); vn_gui_show_error (gui_data->obj, gui_data->error);
return FALSE; return G_SOURCE_REMOVE;
} }
/* /*
@ -737,7 +737,7 @@ static gboolean vn_gui_logout_idle (GuiData * gui_data)
else else
g_signal_emit (gui_data->obj, signals[LOGOUT], 0); g_signal_emit (gui_data->obj, signals[LOGOUT], 0);
return FALSE; return G_SOURCE_REMOVE;
} }
/* /*

View File

@ -307,7 +307,7 @@ static gboolean vn_login_done (ConnectData * connect_data)
} }
vn_login_set_loading (obj, FALSE); vn_login_set_loading (obj, FALSE);
return FALSE; return G_SOURCE_REMOVE;
} }
/* /*

View File

@ -1,447 +0,0 @@
/*
* Copyright (C) 2012 - Juan Ferrer Toribio
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "vn-model.h"
/**
* vn_model_new:
* @model: a #DbModel
*
* Creates a new #VnModel with @model as the data model.
*
* Return value: (transfer full): a #VnModel.
**/
VnModel * vn_model_new (DbModel * model)
{
return g_object_new (VN_TYPE_MODEL, "model", model, NULL);
}
/**
* vn_model_get_model:
* @obj: a #VnModel
*
* Passes the #DbModel used internally by @model.
*
* Return value: (transfer none): a #DbModel.
**/
DbModel * vn_model_get_model (VnModel * obj)
{
g_return_val_if_fail (VN_IS_MODEL (obj), NULL);
return obj->model;
}
/**
* vn_gtk_tree_iter_from_db_iter:
* @dest_iter: the #GtkTreeIter to set using the data on @src_iter
* @src_iter: a valid #DbIter
*
* Sets a #GtkTreeIter with the data of a #DbIter. This function is mostly used
* internally.
**/
void gtk_tree_iter_from_db_iter (GtkTreeIter * dest_iter, const DbIter * src_iter)
{
dest_iter->stamp = src_iter->stamp;
dest_iter->user_data = src_iter->data;
}
/**
* vn_gtk_tree_iter_to_db_iter:
* @src_iter: a valid #GtkTreeIter
* @dest_iter: the #DbIter to set using the data on @src_iter
*
* Sets a with #DbIter the data of a #GtkTreeIter. This function is mostly used
* internally.
**/
void gtk_tree_iter_to_db_iter (const GtkTreeIter * src_iter, DbIter * dest_iter)
{
dest_iter->stamp = src_iter->stamp;
dest_iter->data = src_iter->user_data;
}
/**
* vn_model_iter_is_valid:
* @iter: a #GtkTreeIter
* @model: a #GtkTreeModel
*
* Checks if @iter is a valid #GtkTreeIter pointing inside #GtkTreeModel.
**/
gboolean vn_model_iter_is_valid (GtkTreeIter * iter, GtkTreeModel * model)
{
DbIter db_iter;
g_return_val_if_fail (GTK_IS_TREE_MODEL (model), FALSE);
gtk_tree_iter_to_db_iter (iter, &db_iter);
return db_model_iter_is_valid (&db_iter, VN_MODEL (model)->model);
}
static gint vn_model_get_nrows (GtkTreeModel * obj)
{
return db_model_get_nrows (VN_MODEL (obj)->model);
}
//++++ Broadcast of GtkTreeModel and GtkTreeSortable signals:
static void vn_model_on_line_updated (DbModel * model, DbIter * db_iter, GtkTreeModel * obj)
{
GtkTreeIter iter;
gtk_tree_iter_from_db_iter (&iter, db_iter);
GtkTreePath * path = gtk_tree_path_new ();
gtk_tree_path_append_index (path, db_model_get_path (model, db_iter));
gtk_tree_model_row_changed (obj, path, &iter);
gtk_tree_path_free (path);
}
static void vn_model_on_line_inserted (DbModel * model, DbIter * db_iter, GtkTreeModel * obj)
{
GtkTreeIter iter;
gtk_tree_iter_from_db_iter (&iter, db_iter);
GtkTreePath * path = gtk_tree_path_new ();
gtk_tree_path_append_index (path,
db_model_get_path (model, db_iter));
gtk_tree_model_row_inserted (obj, path, &iter);
gtk_tree_path_free (path);
}
static void vn_model_on_line_deleted (DbModel * model, gint position, GtkTreeModel * obj)
{
GtkTreePath * path = gtk_tree_path_new ();
gtk_tree_path_append_index (path, position);
if (gtk_tree_path_get_indices (path))
gtk_tree_model_row_deleted (obj, path);
gtk_tree_path_free (path);
}
static void vn_model_on_lines_reordered (DbModel * model, guint col, gint * new_order, GtkTreeModel * obj)
{
GtkTreePath * path = gtk_tree_path_new ();
gtk_tree_model_rows_reordered (obj, path, NULL, new_order);
gtk_tree_path_free (path);
}
static void vn_model_on_sort_changed (DbModel * model, GtkTreeSortable * obj)
{
g_signal_emit_by_name (obj, "sort-column-changed");
}
//++++ Implementation of GtkTreeModel methods (using DbModel methods)
static GtkTreeModelFlags vn_model_get_flags (GtkTreeModel * obj)
{
return GTK_TREE_MODEL_ITERS_PERSIST | GTK_TREE_MODEL_LIST_ONLY;
}
static gint vn_model_get_ncols (GtkTreeModel * obj)
{
return db_model_get_ncols (VN_MODEL (obj)->model);
}
static GType vn_model_get_column_type (GtkTreeModel * obj, gint index_)
{
return db_model_get_column_type (VN_MODEL (obj)->model, index_);
}
static gboolean vn_model_get_iter (GtkTreeModel * obj, GtkTreeIter * iter,
GtkTreePath * path)
{
DbIter db_iter;
gint p = gtk_tree_path_get_indices (path)[0];
gboolean ret = db_model_get_iter (VN_MODEL (obj)->model, &db_iter, p);
if (ret)
gtk_tree_iter_from_db_iter (iter, &db_iter);
return ret;
}
static GtkTreePath * vn_model_get_path (GtkTreeModel * obj, GtkTreeIter * iter)
{
GtkTreePath * path;
DbIter db_iter;
gtk_tree_iter_to_db_iter (iter, &db_iter);
path = gtk_tree_path_new ();
gtk_tree_path_append_index (path,
db_model_get_path (VN_MODEL (obj)->model, &db_iter));
return path;
}
static void vn_model_get_value (GtkTreeModel * obj, GtkTreeIter * iter,
gint column, GValue * value)
{
const GValue * v;
DbIter db_iter;
gtk_tree_iter_to_db_iter (iter, &db_iter);
v = db_model_get_value (VN_MODEL (obj)->model, &db_iter, column, NULL);
if (v)
{
g_value_init (value, G_VALUE_TYPE (v));
g_value_copy (v, value);
}
else
g_value_init (value, GVN_TYPE_NULL);
}
static gboolean vn_model_iter_next (GtkTreeModel * obj, GtkTreeIter * iter)
{
DbIter db_iter;
gtk_tree_iter_to_db_iter (iter, &db_iter);
gboolean ret_val = db_model_iter_next (VN_MODEL (obj)->model, &db_iter);
iter->user_data = db_iter.data;
return ret_val;
}
static gboolean vn_model_iter_previous (GtkTreeModel * obj, GtkTreeIter * iter)
{
DbIter db_iter;
gtk_tree_iter_to_db_iter (iter, &db_iter);
gboolean ret_val = db_model_iter_prev (VN_MODEL (obj)->model, &db_iter);
iter->user_data = db_iter.data;
return ret_val;
}
static gboolean vn_model_iter_children (GtkTreeModel * obj, GtkTreeIter * iter,
GtkTreeIter * parent)
{
if (parent == NULL)
{
DbIter db_iter;
gboolean ret_val = db_model_get_iter_first (VN_MODEL (obj)->model
,&db_iter);
if (ret_val)
gtk_tree_iter_from_db_iter (iter, &db_iter);
return ret_val;
}
return FALSE;
}
static gboolean vn_model_iter_has_child (GtkTreeModel * obj, GtkTreeIter * iter)
{
return FALSE;
}
static gint vn_model_iter_n_children (GtkTreeModel * obj, GtkTreeIter * iter)
{
if (iter == NULL)
return vn_model_get_nrows (obj);
return 0;
}
static gboolean vn_model_iter_nth_child (GtkTreeModel * obj, GtkTreeIter * iter
,GtkTreeIter * parent, gint n)
{
if (parent == NULL)
{
DbIter db_iter;
gboolean ret = db_model_get_iter (VN_MODEL (obj)->model, &db_iter, n);
if (ret)
gtk_tree_iter_from_db_iter (iter, &db_iter);
}
return FALSE;
}
static gboolean vn_model_iter_parent (GtkTreeModel * obj, GtkTreeIter * iter,
GtkTreeIter * child)
{
return FALSE;
}
//++++ Implementation of GtkTreeSortable methods (using DbModel methods)
static gboolean vn_model_get_sort_column_id (GtkTreeSortable * obj,
gint * sort_column_id,
GtkSortType * order)
{
return db_model_get_sort_column_id (VN_MODEL (obj)->model
,sort_column_id, (DbSortType *) order);
}
static void vn_model_set_sort_column_id (GtkTreeSortable * obj, gint sort_column_id,
GtkSortType order)
{
DbSortType db_order;
if (order == GTK_SORT_ASCENDING)
db_order = DB_SORT_ASCENDING;
else
db_order = DB_SORT_DESCENDING;
db_model_set_sort_column_id (VN_MODEL (obj)->model, sort_column_id, db_order);
}
static void vn_model_set_sort_func (GtkTreeSortable *sortable, gint sort_column_id,
GtkTreeIterCompareFunc sort_func, gpointer user_data, GDestroyNotify destroy)
{
g_log (g_quark_to_string (VN_MODEL_LOG_DOMAIN)
,G_LOG_LEVEL_WARNING, _("Function vn_model_set_sort_func not implemented"));
}
static void vn_model_set_default_sort_func (GtkTreeSortable *sortable,
GtkTreeIterCompareFunc sort_func, gpointer user_data, GDestroyNotify destroy)
{
g_log (g_quark_to_string (VN_MODEL_LOG_DOMAIN)
,G_LOG_LEVEL_WARNING, _("Function vn_model_set_default_sort_func not implemented"));
}
static gboolean vn_model_has_default_sort_func (GtkTreeSortable * obj)
{
return TRUE;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Properties
typedef enum
{
PROP_MODEL = 1
}
VnModelProp;
static void vn_model_set_property (VnModel * obj, guint property_id,
const GValue * value, GParamSpec * pspec)
{
switch (property_id)
{
case PROP_MODEL:
obj->model = g_value_get_object (value);
g_object_ref_sink (obj->model);
g_object_connect (obj->model
,"signal-after::line-updated", vn_model_on_line_updated, obj
,"signal::line-inserted", vn_model_on_line_inserted, obj
,"signal-after::line-deleted", vn_model_on_line_deleted, obj
,"signal::lines-reordered", vn_model_on_lines_reordered, obj
,"signal::sort-changed", vn_model_on_sort_changed, obj, NULL);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec);
}
}
static void vn_model_get_property (VnModel * obj, guint property_id,
GValue * value, GParamSpec * pspec)
{
switch (property_id)
{
case PROP_MODEL:
g_value_set_object (value, obj->model);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec);
}
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Class
static void vn_model_finalize (VnModel * obj)
{
GObjectClass * parent;
parent = g_type_class_peek_parent (VN_MODEL_GET_CLASS (obj));
g_object_disconnect (obj->model
,"any_signal", vn_model_on_line_updated, obj
,"any_signal", vn_model_on_line_inserted, obj
,"any_signal", vn_model_on_line_deleted, obj
,"any_signal", vn_model_on_lines_reordered, obj
,"any_signal", vn_model_on_sort_changed, obj, NULL);
g_object_unref (obj->model);
parent->finalize (G_OBJECT (obj));
}
static void vn_model_class_init (VnModelClass * k)
{
GObjectClass * klass = G_OBJECT_CLASS (k);
klass->set_property = (GObjectSetPropertyFunc) vn_model_set_property;
klass->get_property = (GObjectGetPropertyFunc) vn_model_get_property;
klass->finalize = (GObjectFinalizeFunc) vn_model_finalize;
g_object_class_install_property (klass, PROP_MODEL,
g_param_spec_object ("model"
,"Model"
,"The #DbModel with the data used by the #VnModel"
,DB_TYPE_MODEL
,G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE
));
}
// tienen que implementarse con métodos heredados de db-model
static void vn_model_tree_model_interface_init (GtkTreeModelIface * iface)
{
iface->get_flags = vn_model_get_flags;
iface->get_n_columns = vn_model_get_ncols;
iface->get_column_type = vn_model_get_column_type;
iface->get_iter = vn_model_get_iter;
iface->get_path = vn_model_get_path;
iface->get_value = vn_model_get_value;
iface->iter_next = vn_model_iter_next;
iface->iter_previous = vn_model_iter_previous;
iface->iter_children = vn_model_iter_children;
iface->iter_has_child = vn_model_iter_has_child;
iface->iter_n_children = vn_model_iter_n_children;
iface->iter_nth_child = vn_model_iter_nth_child;
iface->iter_parent = vn_model_iter_parent;
}
static void vn_model_tree_sortable_interface_init (GtkTreeSortableIface * iface)
{
iface->get_sort_column_id = vn_model_get_sort_column_id;
iface->set_sort_column_id = vn_model_set_sort_column_id;
iface->set_sort_func = vn_model_set_sort_func;
iface->set_default_sort_func = vn_model_set_default_sort_func;
iface->has_default_sort_func = vn_model_has_default_sort_func;
}
static void vn_model_init (VnModel * obj)
{
obj->model = NULL;
}
G_DEFINE_TYPE_WITH_CODE (VnModel, vn_model, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL,
vn_model_tree_model_interface_init)
G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_SORTABLE,
vn_model_tree_sortable_interface_init)
);

View File

@ -20,7 +20,7 @@
#include <db/db.h> #include <db/db.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include "vn-model.h" #include "vn-grid-model.h"
#include "vn-handler.h" #include "vn-handler.h"
#include "vn-grid.h" #include "vn-grid.h"
#include "vn-login.h" #include "vn-login.h"