diff --git a/anjuta/Makefile.am b/anjuta/Makefile.am
index 8bc7e54..b43c821 100644
--- a/anjuta/Makefile.am
+++ b/anjuta/Makefile.am
@@ -9,7 +9,8 @@ template_DATA = \
hedera/anjuta.session.tpl \
hedera/AUTHORS.tpl \
hedera/configure.ac.tpl \
- hedera/Makefile.am.tpl
+ hedera/Makefile.am.tpl \
+ hedera/potfiles
anjuta_srcdir = $(templatedir)/src
anjuta_src_DATA = \
@@ -33,8 +34,7 @@ anjuta_m4_DATA = hedera/build/m4/pkg.m4
anjuta_podir = $(templatedir)/po
anjuta_po_DATA = \
- hedera/po/POTFILES.in.tpl \
- hedera/po/POTFILES.skip.tpl
+ hedera/po/potfiles
anjuta_debiandir = $(templatedir)/debian
anjuta_debian_DATA = \
diff --git a/anjuta/hedera.wiz b/anjuta/hedera.wiz
index 904b47e..03f0566 100644
--- a/anjuta/hedera.wiz
+++ b/anjuta/hedera.wiz
@@ -103,10 +103,9 @@
[+ENDIF+]
[+IF (=(get "HaveI18n") "1") +]
-
+
-
-
+
[+ENDIF+]
@@ -119,12 +118,14 @@
[+IF (=(get "HaveI18n") "1") +]
-
[+ENDIF+]
-
+
diff --git a/anjuta/hedera/Makefile.am.tpl b/anjuta/hedera/Makefile.am.tpl
index 7450f69..f2b6bea 100644
--- a/anjuta/hedera/Makefile.am.tpl
+++ b/anjuta/hedera/Makefile.am.tpl
@@ -21,13 +21,17 @@ ACLOCAL_AMFLAGS = -I build/m4
SUBDIRS = \
src \
data[+IF (=(get "HaveI18n") "1")+] \
+ . \
po
translationsdir =
translations_DATA = \
po/es.po \
- po/POTFILES.in \
- po/POTFILES.skip
+ po/potfiles
+
+all-local:
+ @(cd $(top_srcdir); $(abs_top_srcdir)/potfiles)
+
[+ENDIF+]
EXTRA_DIST = \
README \
diff --git a/anjuta/hedera/anjuta.session.tpl b/anjuta/hedera/anjuta.session.tpl
index d620193..ead6b24 100644
--- a/anjuta/hedera/anjuta.session.tpl
+++ b/anjuta/hedera/anjuta.session.tpl
@@ -13,7 +13,7 @@ Files=../../src/[+FormName+].vala#30
bookmarks=\n\n
[Execution]
-Program arguments=-u
+Program arguments=
Program uri=file:///usr/bin/hedera-bin
Run in terminal=2
Working directories=../../../[+Name+]%%%../../build
diff --git a/anjuta/hedera/po/POTFILES.in.tpl b/anjuta/hedera/po/POTFILES.in.tpl
deleted file mode 100644
index 2701ca6..0000000
--- a/anjuta/hedera/po/POTFILES.in.tpl
+++ /dev/null
@@ -1,9 +0,0 @@
-[+ autogen5 template +]
-# List of source files containing translatable strings.
-
-src/[+Name+].vala
-src/[+FormName+].vala
-data/[+FormName+].glade
-[type: gettext/glade]data/[+Name+]-menu.xml
-[type: gettext/glade]data/[+Name+].xml
-
diff --git a/anjuta/hedera/po/POTFILES.skip.tpl b/anjuta/hedera/po/POTFILES.skip.tpl
deleted file mode 100644
index b6dc3f9..0000000
--- a/anjuta/hedera/po/POTFILES.skip.tpl
+++ /dev/null
@@ -1,5 +0,0 @@
-[+ autogen5 template +]
-# List of source files to skip from translation.
-
-src/[+Name+].c
-src/[+FormName+].c
diff --git a/anjuta/hedera/po/potfiles b/anjuta/hedera/po/potfiles
new file mode 100644
index 0000000..73053f8
--- /dev/null
+++ b/anjuta/hedera/po/potfiles
@@ -0,0 +1,9 @@
+
+in:
+src/*.vala
+data/*.xml
+data/*.glade
+
+skip:
+src/*.c
+
diff --git a/anjuta/hedera/potfiles b/anjuta/hedera/potfiles
new file mode 100755
index 0000000..354d64d
--- /dev/null
+++ b/anjuta/hedera/potfiles
@@ -0,0 +1,24 @@
+#! /bin/bash
+
+if [ -e po/potfiles ]
+then
+ echo Generating POTFILES.in and POTFILES.skip files
+
+ > po/POTFILES.in
+ > po/POTFILES.skip
+
+ for line in `cat po/potfiles`
+ do
+ if [ "$line" = "in:" -o "$line" = "skip:" ]
+ then
+ mode=${line/:/}
+ else
+ if [ "$mode" = "in" -a "${line: -4}" = ".xml" ]
+ then
+ echo "[type: gettext/glade]$line" >> po/POTFILES.in
+ else
+ echo $line >> po/POTFILES.$mode
+ fi
+ fi
+ done
+fi
diff --git a/configure.ac b/configure.ac
index 6c0886b..ba94e6e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -90,9 +90,9 @@ AC_CONFIG_FILES([
sql/parser/Makefile
db/Makefile
plugin/Makefile
- plugin/sqlite/Makefile
plugin/pg/Makefile
plugin/mysql/Makefile
+ plugin/sqlite/Makefile
vn/Makefile
vn/field/Makefile
vn/column/Makefile
diff --git a/db/Makefile.am b/db/Makefile.am
index 6a03152..6e29665 100644
--- a/db/Makefile.am
+++ b/db/Makefile.am
@@ -5,8 +5,9 @@ db_include_HEADERS = \
db.h \
db-iter.h \
db-calc.h \
- db-iterator.h \
db-param.h \
+ db-iterator.h \
+ db-simple-iterator.h \
db-request.h \
db-conn.h \
db-result.h \
@@ -28,8 +29,9 @@ libdb_la_SOURCES = \
$(db_include_HEADERS) \
db-iter.c \
db-calc.c \
- db-iterator.c \
db-param.c \
+ db-iterator.c \
+ db-simple-iterator.c \
db-request.c \
db-conn.c \
db-row.c \
diff --git a/db/db-file-loader.c b/db/db-file-loader.c
index 9bbd798..b000d82 100644
--- a/db/db-file-loader.c
+++ b/db/db-file-loader.c
@@ -194,6 +194,9 @@ static void file_free (File * file)
if (file->data)
g_bytes_unref (file->data);
+ if (file->cancel)
+ g_object_unref (file->cancel);
+
g_object_unref (file->obj);
g_free (file);
}
diff --git a/db/db-iterator.c b/db/db-iterator.c
index 47a2643..a11f28d 100644
--- a/db/db-iterator.c
+++ b/db/db-iterator.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012 - Juan Ferrer Toribio
+ * 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
@@ -15,25 +15,21 @@
* along with this program. If not, see .
*/
-#include "db-iterator.h"
#include "db-model-holder.h"
+#include "db-iterator.h"
-#define IS_READY(self) (self->model && db_model_is_ready (self->model))
-
-static void db_iterator_model_holder_init (DbModelHolderInterface * iface);
+#define GET_MODEL(self) DB_MODEL_HOLDER_GET_INTERFACE (self)->get_model (DB_MODEL_HOLDER (self))
/**
- * SECTION:db-iterator
- * @short_description: manages a iterator with its events
- * @title: DbIterator
+ * SECTION: db-iterator
+ * @Short_description: An implementation of iterator
+ * @Title: DbIterator
*
* The #DbIterator manages a connection with a data base. The function
* db_iterator_new() creates a new #DbIterator.
*/
-G_DEFINE_TYPE_WITH_CODE (DbIterator, db_iterator, G_TYPE_OBJECT,
- G_IMPLEMENT_INTERFACE (DB_TYPE_MODEL_HOLDER,
- db_iterator_model_holder_init)
-);
+
+G_DEFINE_INTERFACE (DbIterator, db_iterator, DB_TYPE_MODEL_HOLDER);
enum {
ITER_CHANGED
@@ -46,205 +42,28 @@ enum {
static guint signals[LAST_SIGNAL] = {0};
-/**
- * db_iterator_new:
- * @model: the #DbModel used by iterator.
- *
- * Creates a new #DbIterator.
- *
- * Return value: a #DbIterator.
- **/
-DbIterator * db_iterator_new (DbModel * model)
-{
- return g_object_new (DB_TYPE_ITERATOR, "model", model, NULL);
-}
-
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Private
static void db_iterator_unref_param (DbIterator * self, DbParam * param)
{
- self->params = g_list_remove (self->params, param);
-}
-
-/*
- * #DbIterator instances call this function every time line in
- * the model is changed.
- */
-static void db_iterator_row_num_changed (DbIterator * self)
-{
- if (self->row_selected)
- self->row = db_model_get_path (self->model, &self->iter);
- else if (self->selected || !self->remember_selection)
- self->row = -1;
-
- g_signal_emit (self, signals[ROW_NUM_CHANGED], 0);
-}
-
-/*
- * #DbIterator instances call this function every time the data of the params
- * mustbe updated.
- */
-static void db_iterator_iter_changed (DbIterator * self)
-{
- db_iterator_row_num_changed (self);
- g_signal_emit (self, signals[ITER_CHANGED], 0);
-}
-
-static void db_iterator_unselect (DbIterator * self)
-{
- if (self->selected)
- {
- g_hash_table_destroy (self->selected);
- self->selected = NULL;
- }
+ GList * params = DB_ITERATOR_GET_INTERFACE (self)->get_param_list (self);
+ params = g_list_remove (params, param);
}
static void db_iterator_set_iter (DbIterator * self, DbIter * iter)
{
+ DB_ITERATOR_GET_INTERFACE (self)->set_iter (self, iter);
+}
+
+/*
+ * Check if the iterator has a row selected, otherwise issues a message.
+ */
+static gboolean db_iterator_has_row_selected (DbIterator * self)
+{
+ DbIter * iter;
+ DB_ITERATOR_GET_INTERFACE (self)->get_iter (self, &iter);
+
if (iter)
- {
- self->row_selected = TRUE;
- self->iter = *iter;
- db_iterator_iter_changed (self);
- }
- else if (self->row_selected)
- {
- self->row_selected = FALSE;
- db_iterator_iter_changed (self);
- }
-
- db_iterator_unselect (self);
-}
-
-/*
- * Function called when row is inserted on the model.
- */
-static void db_iterator_on_model_line_inserted (DbModel * model, DbIter * iter, DbIterator * self)
-{
- g_signal_emit (self, signals[DATA_CHANGED], 0);
-}
-
-/*
- * Function called when row is updated on the model.
- */
-static void db_iterator_on_model_line_updated_after (DbModel * model, DbIter * iter, DbIterator * self)
-{
- if (self->row_selected && db_iter_compare (iter, &self->iter))
- db_iterator_iter_changed (self);
-
- g_signal_emit (self, signals[DATA_CHANGED], 0);
-}
-
-/*
- * Function called when row is deleted on the model.
- */
-static void db_iterator_on_model_line_deleted (DbModel * model, gint row, DbIterator * self)
-{
- if (self->row_selected && row == self->row)
- {
- DbIter iter;
-
- if (db_model_get_iter (model, &iter, row + 1)
- || db_model_get_iter (model, &iter, row - 1))
- db_iterator_set_iter (self, &iter);
- else
- db_iterator_set_iter (self, NULL);
- }
-}
-
-static void db_iterator_on_model_line_deleted_after (DbModel * model, gint row, DbIterator * self)
-{
- if (self->row_selected || self->selected)
- db_iterator_row_num_changed (self);
-
- g_signal_emit (self, signals[DATA_CHANGED], 0);
-}
-
-/*
- * Function called when model rows are reordered.
- */
-static void db_iterator_on_model_lines_reordered (DbModel * model,
- gint column, gint * new_order, DbIterator * self)
-{
- if (self->row_selected || self->selected)
- db_iterator_row_num_changed (self);
-}
-
-/*
- * Function called when model status changes.
- */
-static void db_iterator_on_model_status_changed (DbModel * model, DbModelStatus status, DbIterator * self)
-{
- if (status == DB_MODEL_STATUS_READY)
- {
- DbIter iter;
-
- g_signal_emit (self, signals[STATUS_CHANGED], 0, IS_READY(self));
-
- if (self->row >= 0 && self->row < db_model_get_nrows (model)
- && db_model_get_iter (model, &iter, self->row))
- db_iterator_set_iter (self, &iter);
- else
- db_iterator_set_iter (self, NULL);
- }
- else
- {
- db_iterator_set_iter (self, NULL);
- g_signal_emit (self, signals[STATUS_CHANGED], 0, IS_READY(self));
- }
-}
-
-/*
- * Function called when model operations are done.
- */
-static void db_iterator_on_model_operations_done (DbModel * model, DbIterator * self)
-{
- g_signal_emit (self, signals[OPERATIONS_DONE], 0);
-}
-
-static void db_iterator_set_model_mode (DbIterator * self)
-{
- if (self->mode == DB_ITERATOR_MODE_ON_CHANGE)
- db_model_set_mode (self->model, DB_MODEL_MODE_ON_CHANGE);
- else
- db_model_set_mode (self->model, DB_MODEL_MODE_ON_DEMAND);
-}
-
-/*
- * Sets the model used as a data source by iterator.
- */
-static void db_iterator_set_model (DbIterator * self, DbModel * model)
-{
- if (!model)
- return;
-
- if (!self->model)
- {
- self->model = g_object_ref (model);
- g_object_connect (self->model
- ,"signal::lines-reordered", db_iterator_on_model_lines_reordered, self
- ,"signal::line-inserted", db_iterator_on_model_line_inserted, self
- ,"signal-after::line-updated", db_iterator_on_model_line_updated_after, self
- ,"signal::line-deleted", db_iterator_on_model_line_deleted, self
- ,"signal-after::line-deleted", db_iterator_on_model_line_deleted_after, self
- ,"signal::status-changed", db_iterator_on_model_status_changed, self
- ,"signal::operations-done", db_iterator_on_model_operations_done, self
- ,NULL
- );
- db_iterator_set_model_mode (self);
- db_iterator_on_model_status_changed (model,
- db_model_get_status (model), self);
- }
- else
- g_warning ("DbIterator: Can't reassign the 'model' property");
-}
-
-/*
- * Check if the iterator has any selected row, otherwise issues a message.
- */
-static gboolean db_iterator_check_row_selected (DbIterator * self)
-{
- if (self->row_selected)
return TRUE;
g_warning ("DbIterator: Row not selected");
@@ -253,54 +72,6 @@ static gboolean db_iterator_check_row_selected (DbIterator * self)
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Public
-/**
- * db_iterator_get_row:
- * @self: a #DbIterator
- *
- * Gets the selected row number.
- *
- * Return value: the row number
- **/
-gint db_iterator_get_row (DbIterator * self)
-{
- g_return_val_if_fail (DB_IS_ITERATOR (self), -1);
-
- if (self->row_selected)
- return self->row;
- else
- return -1;
-}
-
-/**
- * db_iterator_get_model:
- * @self: a #DbIterator
- *
- * Gets the model used as a data source by iterator.
- *
- * Return value: (transfer none): the #DbModel
- **/
-DbModel * db_iterator_get_model (DbIterator * self)
-{
- g_return_val_if_fail (DB_IS_ITERATOR (self), NULL);
-
- return self->model;
-}
-
-/**
- * db_iterator_is_ready:
- * @self: a #DbIterator
- *
- * Gets if the iterator is ready.
- *
- * Return value: %TRUE if the iterator and its model are ready, %FALSE otherwise.
- **/
-gboolean db_iterator_is_ready (DbIterator * self)
-{
- g_return_val_if_fail (DB_IS_ITERATOR (self), FALSE);
-
- return IS_READY (self);
-}
-
/**
* db_iterator_get_mode:
* @self: a #DbIterator
@@ -313,7 +84,7 @@ DbIteratorMode db_iterator_get_mode (DbIterator * self)
{
g_return_val_if_fail (DB_IS_ITERATOR (self), 0);
- return self->mode;
+ return DB_ITERATOR_GET_INTERFACE (self)->get_mode (self);
}
/**
@@ -326,315 +97,62 @@ DbIteratorMode db_iterator_get_mode (DbIterator * self)
void db_iterator_set_mode (DbIterator * self, DbIteratorMode mode)
{
g_return_if_fail (DB_IS_ITERATOR (self));
-
- self->mode = mode;
- if (self->model)
- db_iterator_set_model_mode (self);
+ DB_ITERATOR_GET_INTERFACE (self)->set_mode (self, mode);
+}
+
+/**
+ * db_iterator_get_row:
+ * @self: a #DbIterator
+ *
+ * Gets the selected row number.
+ *
+ * Return value: the row number
+ **/
+gint db_iterator_get_row (DbIterator * self)
+{
+ g_return_val_if_fail (DB_IS_ITERATOR (self), -1);
+
+ return DB_ITERATOR_GET_INTERFACE (self)->get_row (self);
}
/**
* db_iterator_get_iter:
* @self: a #DbIterator
- * @iter: (allow-none) (out): return location for selected row iter, or %NULL.
+ * @iter: (allow-none) (out) (transfer full): return location for selected row
+ * iter, or %NULL.
*
- * Gets the currently selected iter.
+ * Gets the currently selected iter. The iter must be freed with db_iter_free().
*
* Return value: %TRUE if any row is selected, %FALSE otherwise.
**/
-gboolean db_iterator_get_iter (DbIterator * self, DbIter * iter)
+gboolean db_iterator_get_iter (DbIterator * self, DbIter ** iter)
{
+ DbIter * self_iter;
+ gboolean ok;
+
g_return_val_if_fail (DB_IS_ITERATOR (self), FALSE);
- if (!self->row_selected)
- return FALSE;
+ ok = DB_ITERATOR_GET_INTERFACE (self)->get_iter (self, &self_iter);
+ *iter = db_iter_copy (self_iter);
- *iter = self->iter;
- return TRUE;
+ return ok;
}
/**
- * db_iterator_select_iter:
+ * db_iterator_get_params:
* @self: a #DbIterator
- * @iter: a #DbIter
- *
- * Adds a new #DbIter to the current selection.
- */
-void db_iterator_select_iter (DbIterator * self, DbIter * iter)
-{
- gint pos;
-
- g_return_if_fail (DB_IS_ITERATOR (self));
- g_return_if_fail (IS_READY (self));
-
- if (!iter)
- return;
-
- if (!self->selected)
- self->selected = g_hash_table_new_full (g_int_hash, g_int_equal,
- NULL, (GDestroyNotify) db_iter_free);
-
- self->iter = *iter;
- self->row_selected = FALSE;
- g_signal_emit (self, signals[ROW_NUM_CHANGED], 0);
- pos = db_model_get_path (self->model, iter);
-
- if (!g_hash_table_contains (self->selected, &pos))
- g_hash_table_insert (self->selected, &pos, db_iter_copy (iter));
-}
-
-/**
- * db_iterator_move_iter:
- * @self: a #DbIterator
- * @iter: a #DbIter
*
- * Moves the iterator cursor to the specified iter, if model is ready.
+ * Gets a list of params linked with the iterator. The returned list shoud be
+ * freed.
+ *
+ * Return value: (element-type Db.Param) (transfer container): a #GList
**/
-void db_iterator_move_iter (DbIterator * self, DbIter * iter)
-{
- g_return_if_fail (DB_IS_ITERATOR (self));
- g_return_if_fail (IS_READY (self));
- g_return_if_fail (self->model);
-
- if (self->row_selected && db_iter_compare (&self->iter, iter))
- return;
-
- if (self->mode != DB_ITERATOR_MODE_ON_DEMAND)
- {
- if (self->row_selected
- && db_model_get_row_operations (self->model, &self->iter) == DB_MODEL_ROW_OP_INSERT)
- db_model_reverse_operations (self->model);
- else
- db_model_perform_operations (self->model, FALSE);
- }
-
- db_iterator_set_iter (self, iter);
-}
-
-/**
- * db_iterator_move_first:
- * @self: a #DbIterator
- *
- * Moves the iterator cursor to the first row.
- **/
-void db_iterator_move_first (DbIterator * self)
-{
- DbIter iter;
-
- g_return_if_fail (DB_IS_ITERATOR (self));
- g_return_if_fail (self->model);
-
- if (db_model_get_iter_first (self->model, &iter))
- db_iterator_move_iter (self, &iter);
-}
-
-/**
- * db_iterator_move_last:
- * @self: a #DbIterator
- *
- * Moves the iterator cursor to the last row.
- **/
-void db_iterator_move_last (DbIterator * self)
-{
- DbIter iter;
-
- g_return_if_fail (DB_IS_ITERATOR (self));
- g_return_if_fail (self->model);
-
- if (db_model_get_last (self->model, &iter))
- db_iterator_move_iter (self, &iter);
-}
-
-/**
- * db_iterator_move_previous:
- * @self: a #DbIterator
- *
- * Moves the iterator cursor to the previous row, or displays a message if no
- * exists. If no selected row, attempts to move the cursor to the first row.
- **/
-void db_iterator_move_previous (DbIterator * self)
-{
- g_return_if_fail (DB_IS_ITERATOR (self));
-
- if (self->row_selected)
- {
- DbIter iter = self->iter;
-
- if (db_model_iter_prev (self->model, &iter))
- db_iterator_move_iter (self, &iter);
- else
- g_warning (
- "Can't move the cursor to the previous "
- "row, because there are no more rows."
- );
- }
- else
- db_iterator_move_first (self);
-}
-
-/**
- * db_iterator_move_next:
- * @self: a #DbIterator
- *
- * Moves the iterator cursor to the next row, or displays a message if no exists.
- * If no selected row, attempts to move the cursor to the first row.
- **/
-void db_iterator_move_next (DbIterator * self)
-{
- g_return_if_fail (DB_IS_ITERATOR (self));
-
- if (self->row_selected)
- {
- DbIter iter = self->iter;
-
- if (db_model_iter_next (self->model, &iter))
- db_iterator_move_iter (self, &iter);
- else
- g_warning (
- "Can't move the cursor to the next "
- "row, because there are no more rows."
- );
- }
- else
- db_iterator_move_first (self);
-}
-
-/**
- * db_iterator_move_to:
- * @self: a #DbIterator
- * @move: a #DbIteratorMove
- *
- * Moves the iterator cursor to the predefined position.
- **/
-void db_iterator_move_to (DbIterator * self, DbIteratorMove move)
-{
- switch (move)
- {
- case DB_ITERATOR_MOVE_FIRST:
- db_iterator_move_first (self);
- break;
- case DB_ITERATOR_MOVE_PREVIOUS:
- db_iterator_move_previous (self);
- break;
- case DB_ITERATOR_MOVE_NEXT:
- db_iterator_move_next (self);
- break;
- case DB_ITERATOR_MOVE_LAST:
- db_iterator_move_last (self);
- break;
- }
-}
-
-/**
- * db_iterator_insert:
- * @self: a #DbIterator
- *
- * Inserts a new row in the model and moves the iter to it, if inserted.
- * successfully.
- **/
-void db_iterator_insert (DbIterator * self)
-{
- DbIter iter;
-
- g_return_if_fail (DB_IS_ITERATOR (self));
- g_return_if_fail (self->model);
-
- if (self->mode != DB_ITERATOR_MODE_ON_DEMAND)
- {
- if (db_model_get_row_operations (self->model, &self->iter) == DB_MODEL_ROW_OP_INSERT)
- return;
-
- db_model_perform_operations (self->model, FALSE);
- }
-
- if (db_model_insert (self->model, &iter))
- db_iterator_set_iter (self, &iter);
-}
-
-/**
- * db_iterator_delete:
- * @self: a #DbIterator
- *
- * Deletes the currently selected row from the model, if any.
- **/
-void db_iterator_delete (DbIterator * self)
-{
- g_return_if_fail (DB_IS_ITERATOR (self));
-
- if (self->row_selected)
- {
- db_model_delete (self->model, &self->iter);
-
- if (self->mode != DB_ITERATOR_MODE_ON_DEMAND)
- db_model_perform_operations (self->model, FALSE);
- }
- else if (self->selected)
- {
- GList * l, * list = g_hash_table_get_values (self->selected);
-
- for (l = list; l; l = l->next)
- db_model_delete (self->model, l->data);
-
- if (self->mode != DB_ITERATOR_MODE_ON_DEMAND)
- db_model_perform_operations (self->model, FALSE);
-
- db_iterator_unselect (self);
- }
-}
-
-/**
- * db_iterator_refresh:
- * @self: a #DbIterator
- *
- * Refresh the data of the model handled by iterator.
- **/
-void db_iterator_refresh (DbIterator * self)
-{
- g_return_if_fail (DB_IS_ITERATOR (self));
-
- if (self->model)
- {
- db_model_refresh (self->model);
- db_iterator_unselect (self);
- }
-}
-
-/**
- * db_iterator_get_spec:
- * @self: a #DbIterator
- * @column: the column index.
- *
- * Gets the spec from the model of the specified column index.
- *
- * Return value: (transfer none) (allow-none): a #GvnParamSpec or %NULL if
- * can't get it because the model isn't ready.
- **/
-const GvnParamSpec * db_iterator_get_spec (DbIterator * self, gint column)
+GList * db_iterator_get_params (DbIterator * self)
{
g_return_val_if_fail (DB_IS_ITERATOR (self), NULL);
- if (IS_READY (self))
- return db_model_get_spec (self->model, column);
- else
- return NULL;
-}
-
-/**
- * db_iterator_get_column_index:
- * @self: a #DbIterator
- * @name: the name of a column of iterator.
- *
- * Retrieves the position in the query of the column called @name.
- *
- * Return value: the position of the column with name @name or -1 if there isn't
- * a column called name or if name is %NULL.
- **/
-gint db_iterator_get_column_index (DbIterator * self, const gchar * name)
-{
- g_return_val_if_fail (DB_IS_ITERATOR (self), -1);
- g_return_val_if_fail (IS_READY (self), -1);
-
- return db_model_get_column_index (self->model, name);
+ return g_list_copy (DB_ITERATOR_GET_INTERFACE (self)->get_param_list (self));
}
/**
@@ -642,17 +160,21 @@ gint db_iterator_get_column_index (DbIterator * self, const gchar * name)
* @self: a #DbIterator
* @param: the param to add.
*
- * Adds a #DbParam to the list of iterator params.
+ * Adds a #GvnParam to the list of iterator params.
**/
void db_iterator_add_param (DbIterator * self, DbParam * param)
{
+ GList * params;
+
g_return_if_fail (DB_IS_ITERATOR (self));
- g_return_if_fail (DB_IS_PARAM (param));
-
- db_param_set_iterator (param, self);
+ g_return_if_fail (GVN_IS_PARAM (param));
+
+ db_param_set_iterator (DB_PARAM (param), self);
g_object_weak_ref (G_OBJECT (param),
(GWeakNotify) db_iterator_unref_param, self);
- self->params = g_list_prepend (self->params, param);
+
+ params = DB_ITERATOR_GET_INTERFACE (self)->get_param_list (self);
+ params = g_list_prepend (params, param);
}
/**
@@ -666,13 +188,15 @@ void db_iterator_add_param (DbIterator * self, DbParam * param)
**/
GvnParam * db_iterator_get_param (DbIterator * self, const gchar * column)
{
- GList * n;
+ GList * params, * n;
GvnParam * param;
g_return_val_if_fail (DB_IS_ITERATOR (self), NULL);
g_return_val_if_fail (column, NULL);
- for (n = self->params; n; n = n->next)
+ params = DB_ITERATOR_GET_INTERFACE (self)->get_param_list (self);
+
+ for (n = params; n; n = n->next)
if (!g_strcmp0 (db_param_get_column_name (n->data), column))
break;
@@ -687,38 +211,22 @@ GvnParam * db_iterator_get_param (DbIterator * self, const gchar * column)
return param;
}
-/**
- * db_iterator_get_params:
- * @self: a #DbIterator
- *
- * Gets a list of params linked with the iterator. The returned list shoud be freed.
- *
- * Return value: (element-type Db.Param) (transfer container): the #GList
- **/
-GList * db_iterator_get_params (DbIterator * self)
-{
- g_return_val_if_fail (DB_IS_ITERATOR (self), NULL);
-
- return g_list_copy (self->params);
-}
-
/**
* db_iterator_bind_param:
* @self: a #DbIterator
- * @column: the column index.
- * @param: the column index.
+ * @column: the column index
+ * @param: the master param
*
* Binds the param to the specified column index. If you want to link the same
- * param several times you should use the db_iterator_get_param function.
+ * param several times you should use db_iterator_get_param().
**/
-void db_iterator_bind_param (DbIterator * self, const gchar * column, GvnParam * param)
+void db_iterator_bind_param (DbIterator * self,
+ const gchar * column, GvnParam * param)
{
g_return_if_fail (DB_IS_ITERATOR (self));
g_return_if_fail (GVN_IS_PARAM (self));
- gvn_param_set_master (param,
- db_iterator_get_param (self, column)
- );
+ gvn_param_set_master (param, db_iterator_get_param (self, column));
}
/**
@@ -730,7 +238,8 @@ void db_iterator_bind_param (DbIterator * self, const gchar * column, GvnParam *
*
* Links the iterator with another iterator parameter.
**/
-void db_iterator_link (DbIterator * self, const gchar * field, DbIterator * src, const gchar * column)
+void db_iterator_link (DbIterator * self, const gchar * field,
+ DbIterator * src, const gchar * column)
{
g_return_if_fail (DB_IS_ITERATOR (self));
g_return_if_fail (DB_IS_ITERATOR (src));
@@ -748,116 +257,267 @@ void db_iterator_link (DbIterator * self, const gchar * field, DbIterator * src,
*
* Links the iterator with a parameter.
**/
-void db_iterator_link_with_param (DbIterator * self, const gchar * field, GvnParam * param)
-{
+void db_iterator_link_with_param (DbIterator * self,
+ const gchar * field, GvnParam * param)
+{
+ DbModel * model;
+
g_return_if_fail (DB_IS_ITERATOR (self));
g_return_if_fail (GVN_IS_PARAM (param));
- g_return_if_fail (self->model);
g_return_if_fail (field);
- db_model_set_default_value_from_param (self->model, field, param, TRUE);
+ model = GET_MODEL (self);
+
+ db_model_set_default_value_from_param (model, field, param, TRUE);
}
/**
- * db_iterator_get_nrows:
+ * db_iterator_move_iter:
* @self: a #DbIterator
+ * @iter: a #DbIter
*
- * Gets the number of rows in the model pointed by the iterator.
- *
- * Return value: the number of rows
+ * Moves the iterator cursor to the specified iter, if model is ready.
+ *
+ * Return value: #TRUE if the iter was succesfully moved, #FALSE otherwise
**/
-gint db_iterator_get_nrows (DbIterator * self)
-{
- g_return_val_if_fail (DB_IS_ITERATOR (self), 0);
-
- if (self->model)
- return db_model_get_nrows (self->model);
-
- return 0;
-}
-
-/**
- * db_iterator_get_update_flags:
- * @self: a #DbIterator
- *
- * Gets the flags that indicate how a model can be modified.
- *
- * Return value: the flags
- **/
-DbModelUpdateFlags db_iterator_get_update_flags (DbIterator * self)
-{
- g_return_val_if_fail (DB_IS_ITERATOR (self), 0);
-
- if (self->model)
- return db_model_get_update_flags (self->model);
-
- return 0;
-}
-
-/**
- * db_iterator_perform_operations:
- * @self: a #DbIterator
- *
- * Performs all pending operations on the model.
- **/
-void db_iterator_perform_operations (DbIterator * self)
+gboolean db_iterator_move_iter (DbIterator * self, DbIter * iter)
{
g_return_if_fail (DB_IS_ITERATOR (self));
-
- if (self->model)
- db_model_perform_operations (self->model, FALSE);
+ g_return_if_fail (db_iterator_is_ready (self));
+
+ return DB_ITERATOR_GET_INTERFACE (self)->move_iter (self, iter);
}
/**
- * db_iterator_reverse_operations:
+ * db_iterator_move_first:
* @self: a #DbIterator
*
- * Reverses all pending operations on the model.
+ * Moves the iterator cursor to the first row.
+ *
+ * Return value: #TRUE if the iter was succesfully moved, #FALSE otherwise
**/
-void db_iterator_reverse_operations (DbIterator * self)
+gboolean db_iterator_move_first (DbIterator * self)
{
+ DbIter iter;
+ DbModel * model;
+
g_return_if_fail (DB_IS_ITERATOR (self));
-
- if (self->model)
- db_model_reverse_operations (self->model);
-}
-/**
- * db_iterator_get_pending_operations:
- * @self: a #DbIterator
- *
- * Gets pending operations to perform in the current row.
- *
- * Return value: the pending operations
- **/
-DbModelRowOp db_iterator_get_pending_operations (DbIterator * self)
-{
- g_return_val_if_fail (DB_IS_ITERATOR (self), 0);
-
- if (self->model && (self->row_selected || self->selected))
- return db_model_get_row_operations (self->model, &self->iter);
-
- return 0;
-}
+ model = GET_MODEL (self);
+
+ if (db_model_get_iter_first (model, &iter))
+ return db_iterator_move_iter (self, &iter);
-/**
- * db_iterator_has_pending_operations:
- * @self: a #DbIterator
- *
- * Checks for pending operations to perform.
- *
- * Return value: %TRUE if there are pending operations, %FALSE otherwise
- **/
-gboolean db_iterator_has_pending_operations (DbIterator * self)
-{
- g_return_val_if_fail (DB_IS_ITERATOR (self), FALSE);
-
- if (self->model)
- return db_model_has_pending_operations (self->model);
-
return FALSE;
}
+/**
+ * db_iterator_move_last:
+ * @self: a #DbIterator
+ *
+ * Moves the iterator cursor to the last row.
+ *
+ * Return value: #TRUE if the iter was succesfully moved, #FALSE otherwise
+ **/
+gboolean db_iterator_move_last (DbIterator * self)
+{
+ DbIter iter;
+ DbModel * model;
+
+ g_return_if_fail (DB_IS_ITERATOR (self));
+
+ model = GET_MODEL (self);
+
+ if (db_model_get_last (model, &iter))
+ return db_iterator_move_iter (self, &iter);
+
+ return FALSE;
+}
+
+/**
+ * db_iterator_move_previous:
+ * @self: a #DbIterator
+ *
+ * Moves the iterator cursor to the previous row, or displays a message if no
+ * exists. If no selected row, attempts to move the cursor to the first row.
+ *
+ * Return value: #TRUE if the iter was succesfully moved, #FALSE otherwise
+ **/
+gboolean db_iterator_move_previous (DbIterator * self)
+{
+ DbIter * self_iter;
+
+ DB_ITERATOR_GET_INTERFACE (self)->get_iter (self, &self_iter);
+
+ if (self_iter)
+ {
+ gboolean ret = FALSE;
+ DbIter * iter = db_iter_copy (self_iter);
+ DbModel * model = GET_MODEL (self);
+
+ if (db_model_iter_prev (model, iter))
+ ret = db_iterator_move_iter (self, iter);
+ else
+ g_warning (
+ "Can't move the cursor to the previous "
+ "row, because there are no more rows."
+ );
+
+ db_iter_free (iter);
+
+ return ret;
+ }
+ else
+ return db_iterator_move_first (self);
+}
+
+/**
+ * db_iterator_move_next:
+ * @self: a #DbIterator
+ *
+ * Moves the iterator cursor to the next row, or displays a message if no exists.
+ * If no selected row, attempts to move the cursor to the first row.
+ *
+ * Return value: #TRUE if the iter was succesfully moved, #FALSE otherwise
+ **/
+gboolean db_iterator_move_next (DbIterator * self)
+{
+ DbIter * self_iter;
+
+ DB_ITERATOR_GET_INTERFACE (self)->get_iter (self, &self_iter);
+
+ if (self_iter)
+ {
+ gboolean ret;
+ DbIter * iter = db_iter_copy (self_iter);
+ DbModel * model = GET_MODEL (self);
+
+ if (db_model_iter_next (model, iter))
+ ret = db_iterator_move_iter (self, iter);
+ else
+ g_warning (
+ "Can't move the cursor to the next "
+ "row, because there are no more rows."
+ );
+
+ db_iter_free (iter);
+
+ return ret;
+ }
+ else
+ return db_iterator_move_last (self);
+}
+
+/**
+ * db_iterator_move_to:
+ * @self: a #DbIterator
+ * @move: a #DbIteratorMove
+ *
+ * Moves the iterator cursor to the predefined position.
+ *
+ * Return value: #TRUE if the iter was succesfully moved, #FALSE otherwise
+ **/
+gboolean db_iterator_move_to (DbIterator * self, DbIteratorMove move)
+{
+ switch (move)
+ {
+ case DB_ITERATOR_MOVE_FIRST:
+ return db_iterator_move_first (self);
+ case DB_ITERATOR_MOVE_PREVIOUS:
+ return db_iterator_move_previous (self);
+ case DB_ITERATOR_MOVE_NEXT:
+ return db_iterator_move_next (self);
+ case DB_ITERATOR_MOVE_LAST:
+ return db_iterator_move_last (self);
+ default:
+ return FALSE;
+ }
+}
+
+/**
+ * db_iterator_insert:
+ * @self: a #DbIterator
+ *
+ * Inserts a new row in the model and moves the iter to it, if inserted.
+ * successfully.
+ **/
+void db_iterator_insert (DbIterator * self)
+{
+ DbIter iter, * self_iter;
+ DbModel * model;
+
+ DB_ITERATOR_GET_INTERFACE (self)->get_iter (self, &self_iter);
+ model = GET_MODEL (self);
+
+ if (self_iter && db_iterator_get_mode (self) != DB_ITERATOR_MODE_ON_DEMAND)
+ {
+ if (db_model_get_row_operations (model, self_iter) == DB_MODEL_ROW_OP_INSERT)
+ return;
+
+ db_model_perform_operations (model, FALSE);
+ }
+
+ if (db_model_insert (model, &iter))
+ db_iterator_set_iter (self, &iter);
+}
+
+/**
+ * db_iterator_delete:
+ * @self: a #DbIterator
+ *
+ * Deletes the currently selected row from the model, if any.
+ **/
+void db_iterator_delete (DbIterator * self)
+{
+ DB_ITERATOR_GET_INTERFACE (self)->delete_selection (self);
+
+ if (DB_ITERATOR_GET_INTERFACE (self)->get_mode (self) != DB_ITERATOR_MODE_ON_DEMAND)
+ db_model_perform_operations
+ (DB_MODEL_HOLDER_GET_INTERFACE (self)->get_model (DB_MODEL_HOLDER (self)), FALSE);
+}
+
+/**
+ * db_iterator_refresh:
+ * @self: a #DbIterator
+ *
+ * Refresh the data of the model handled by iterator.
+ **/
+void db_iterator_refresh (DbIterator * self)
+{
+ DbModel * model;
+
+ g_return_if_fail (DB_IS_ITERATOR (self));
+
+ model = GET_MODEL (self);
+
+ if (model)
+ db_model_refresh (model);
+}
+
+/**
+ * db_iterator_get_spec:
+ * @self: a #DbIterator
+ * @column: the column index.
+ *
+ * Gets the spec from the model of the specified column index.
+ *
+ * Return value: (transfer none) (allow-none): a #GvnParamSpec or %NULL if
+ * can't get it because the model isn't ready.
+ **/
+const GvnParamSpec * db_iterator_get_spec (DbIterator * self, gint column)
+{
+ DbModel * model;
+
+ g_return_val_if_fail (DB_IS_ITERATOR (self), NULL);
+
+ model = GET_MODEL (self);
+
+ if (db_iterator_is_ready (self))
+ return db_model_get_spec (model, column);
+ else
+ return NULL;
+}
+
/**
* db_iterator_get_value:
* @self: a #DbIterator
@@ -870,14 +530,20 @@ gboolean db_iterator_has_pending_operations (DbIterator * self)
**/
const GValue * db_iterator_get_value (DbIterator * self, const gchar * column_name)
{
+ DbModel * model;
+ DbIter * self_iter;
+
g_return_val_if_fail (DB_IS_ITERATOR (self), NULL);
- if (self->row_selected)
+ model = GET_MODEL (self);
+ DB_ITERATOR_GET_INTERFACE (self)->get_iter (self, &self_iter);
+
+ if (self_iter)
{
- gint column = db_model_get_column_index (self->model, column_name);
+ gint column = db_model_get_column_index (model, column_name);
if (column != -1)
- return db_model_get_value (self->model, &self->iter, column, NULL);
+ return db_model_get_value (model, self_iter, column, NULL);
}
return NULL;
@@ -896,19 +562,26 @@ const GValue * db_iterator_get_value (DbIterator * self, const gchar * column_na
**/
gboolean db_iterator_set_value (DbIterator * self, const gchar * column_name, const GValue * value, GError ** err)
{
- g_return_val_if_fail (DB_IS_ITERATOR (self), FALSE);
+ DbModel * model;
+ DbIter * self_iter;
- if (db_iterator_check_row_selected (self))
+ g_return_val_if_fail (DB_IS_ITERATOR (self), NULL);
+
+ model = GET_MODEL (self);
+ DB_ITERATOR_GET_INTERFACE (self)->get_iter (self, &self_iter);
+
+ if (db_iterator_has_row_selected (self))
{
- gint column = db_model_get_column_index (self->model, column_name);
+ gint column = db_model_get_column_index (model, column_name);
if (column != -1)
- return db_model_set_value (self->model, &self->iter, column, value, err);
+ return db_model_set_value (model, self_iter, column, value, err);
}
return FALSE;
}
+
/**
* db_iterator_get_value_by_index:
* @self: a #DbIterator
@@ -921,11 +594,15 @@ gboolean db_iterator_set_value (DbIterator * self, const gchar * column_name, co
**/
const GValue * db_iterator_get_value_by_index (DbIterator * self, gint column)
{
- g_return_val_if_fail (DB_IS_ITERATOR (self), NULL);
+ DbIter * self_iter;
+ DbModel * model;
+
+ DB_ITERATOR_GET_INTERFACE (self)->get_iter (self, &self_iter);
+ model = GET_MODEL (self);
+
+ if (self_iter)
+ return db_model_get_value (model, self_iter, column, NULL);
- if (self->row_selected)
- return db_model_get_value (self->model, &self->iter, column, NULL);
-
return NULL;
}
@@ -944,9 +621,161 @@ gboolean db_iterator_set_value_by_index (DbIterator * self, gint column, const G
{
g_return_val_if_fail (DB_IS_ITERATOR (self), FALSE);
- if (db_iterator_check_row_selected (self))
- return db_model_set_value (self->model, &self->iter, column, value, err);
+ if (db_iterator_has_row_selected (self))
+ {
+ DbIter * self_iter;
+ DbModel * model = GET_MODEL (self);
+
+ DB_ITERATOR_GET_INTERFACE (self)->get_iter (self, &self_iter);
+
+ return db_model_set_value (model, self_iter, column, value, err);
+ }
+
+ return FALSE;
+}
+
+/**
+ * db_iterator_get_column_index:
+ * @self: a #DbIterator
+ * @name: the name of a column of iterator.
+ *
+ * Retrieves the position in the query of the column called @name.
+ *
+ * Return value: the position of the column with name @name or -1 if there isn't
+ * a column called name or if name is %NULL.
+ **/
+gint db_iterator_get_column_index (DbIterator * self, const gchar * name)
+{
+ DbModel * model;
+
+ g_return_val_if_fail (DB_IS_ITERATOR (self), -1);
+ g_return_val_if_fail (db_iterator_is_ready (self), -1);
+
+ model = GET_MODEL (self);
+ return db_model_get_column_index (model, name);
+}
+
+/**
+ * db_iterator_get_nrows:
+ * @self: a #DbIterator
+ *
+ * Gets the number of rows in the model pointed by the iterator.
+ *
+ * Return value: the number of rows
+ **/
+gint db_iterator_get_nrows (DbIterator * self)
+{
+ DbModel * model;
+
+ g_return_val_if_fail (DB_IS_ITERATOR (self), 0);
+
+ model = GET_MODEL (self);
+
+ if (model)
+ return db_model_get_nrows (model);
+
+ return 0;
+}
+
+/**
+ * db_iterator_get_update_flags:
+ * @self: a #DbIterator
+ *
+ * Gets the flags that indicate how a model can be modified.
+ *
+ * Return value: the flags
+ **/
+DbModelUpdateFlags db_iterator_get_update_flags (DbIterator * self)
+{
+ DbModel * model;
+
+ g_return_val_if_fail (DB_IS_ITERATOR (self), 0);
+
+ model = GET_MODEL (self);
+
+ if (model)
+ return db_model_get_update_flags (model);
+ return 0;
+}
+
+/**
+ * db_iterator_perform_operations:
+ * @self: a #DbIterator
+ *
+ * Performs all pending operations on the model.
+ **/
+void db_iterator_perform_operations (DbIterator * self)
+{
+ DbModel * model;
+
+ g_return_if_fail (DB_IS_ITERATOR (self));
+
+ model = GET_MODEL (self);
+
+ if (model)
+ db_model_perform_operations (model, FALSE);
+}
+
+/**
+ * db_iterator_reverse_operations:
+ * @self: a #DbIterator
+ *
+ * Reverses all pending operations on the model.
+ **/
+void db_iterator_reverse_operations (DbIterator * self)
+{
+ DbModel * model;
+
+ g_return_if_fail (DB_IS_ITERATOR (self));
+
+ model = GET_MODEL (self);
+
+ if (model)
+ db_model_reverse_operations (model);
+}
+
+/**
+ * db_iterator_get_pending_operations:
+ * @self: a #DbIterator
+ *
+ * Gets pending operations to perform in the current row.
+ *
+ * Return value: the pending operations
+ **/
+DbModelRowOp db_iterator_get_pending_operations (DbIterator * self)
+{
+ DbIter * self_iter;
+ DbModel * model;
+
+ DB_ITERATOR_GET_INTERFACE (self)->get_iter (self, &self_iter);
+ model = GET_MODEL (self);
+
+ if (model && self_iter)
+ return db_model_get_row_operations (model, self_iter);
+
+ return 0;
+}
+
+/**
+ * db_iterator_has_pending_operations:
+ * @self: a #DbIterator
+ *
+ * Checks for pending operations to perform.
+ *
+ * Return value: %TRUE if there are pending operations, %FALSE otherwise
+ **/
+gboolean db_iterator_has_pending_operations (DbIterator * self)
+{
+ DbModel * model;
+
+ g_return_val_if_fail (DB_IS_ITERATOR (self), 0);
+
+ model = GET_MODEL (self);
+
+ if (model)
+ return db_model_has_pending_operations (model);
+
return FALSE;
}
@@ -1056,102 +885,86 @@ void db_iterator_set_boxed (DbIterator * self, const gchar * column_name, gpoint
db_iterator_take_value (self, column_name, gvn_value_new_boxed (value));
}
*/
-//+++++++++++++++++++++++++++++++++++++++++++++++++++ Properties
-enum
+/*
+ * db_iterator_is_ready:
+ * @self: a #DbIterator
+ *
+ * Gets if the iterator is ready.
+ *
+ * Return value: %TRUE if the iterator and its model are ready, %FALSE otherwise.
+ **/
+gboolean db_iterator_is_ready (DbIterator * self)
{
- PROP_MODEL = 1
- ,PROP_MODE
- ,PROP_REMEMBER_SELECTION
-};
-
-static void db_iterator_set_property (DbIterator * self, guint id,
- const GValue * value, GParamSpec * pspec)
-{
- switch (id)
- {
- case PROP_MODEL:
- db_iterator_set_model (self, g_value_get_object (value));
- break;
- case PROP_MODE:
- db_iterator_set_mode (self, g_value_get_enum (value));
- break;
- case PROP_REMEMBER_SELECTION:
- self->remember_selection = g_value_get_boolean (value);
- db_iterator_row_num_changed (self);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (self, id, pspec);
- }
+ DbModel * model = GET_MODEL (self);
+ return model && db_model_is_ready (model);
}
-static void db_iterator_get_property (DbIterator * self, guint id,
- GValue * value, GParamSpec * pspec)
-{
- switch (id)
- {
- case PROP_MODEL:
- g_value_set_object (value, self->model);
- break;
- case PROP_MODE:
- g_value_set_enum (value, self->mode);
- break;
- case PROP_REMEMBER_SELECTION:
- g_value_set_boolean (value, self->remember_selection);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (self, id, pspec);
- }
+/**
+ * db_iterator_data_changed:
+ * @self: a #DbIterator
+ *
+ * Emits the "data-changed" signal on @self.
+ * This function should only be called by #DbIterator implementations.
+ **/
+void db_iterator_data_changed (DbIterator * self)
+{
+ g_signal_emit (self, signals[DATA_CHANGED], 0);
}
-//+++++++++++++++++++++++++++++++++++++++++++++++++++ Class
-
-static void db_iterator_init (DbIterator * self)
+/**
+ * db_iterator_iter_changed:
+ * @self: a #DbIterator
+ *
+ * Emits the "iter-changed" signal on @self.
+ * This function should only be called by #DbIterator implementations.
+ **/
+void db_iterator_iter_changed (DbIterator * self)
{
- self->model = NULL;
- self->params = NULL;
- self->row = 0;
- self->row_selected = FALSE;
- self->selected = NULL;
+ g_signal_emit (self, signals[ITER_CHANGED], 0);
}
-static void db_iterator_finalize (DbIterator * self)
+/**
+ * db_iterator_operations_done:
+ * @self: a #DbIterator
+ *
+ * Emits the "operations-done" signal on @self.
+ * This function should only be called by #DbIterator implementations.
+ **/
+void db_iterator_operations_done (DbIterator * self)
{
- GList * n;
-
- for (n = self->params; n; n = n->next)
- g_object_weak_unref (n->data,
- (GWeakNotify) db_iterator_unref_param, self);
-
- g_list_free (self->params);
-
- db_iterator_unselect (self);
-
- if (self->model)
- {
- g_object_disconnect (self->model
- ,"any_signal", db_iterator_on_model_line_inserted, self
- ,"any_signal", db_iterator_on_model_line_updated_after, self
- ,"any_signal", db_iterator_on_model_line_deleted, self
- ,"any_signal", db_iterator_on_model_line_deleted_after, self
- ,"any_signal", db_iterator_on_model_lines_reordered, self
- ,"any_signal", db_iterator_on_model_status_changed, self
- ,"any_signal", db_iterator_on_model_operations_done, self
- ,NULL
- );
- g_object_unref (self->model);
- }
-
- G_OBJECT_CLASS (db_iterator_parent_class)->finalize (G_OBJECT (self));
+ g_signal_emit (self, signals[OPERATIONS_DONE], 0);
}
-static void db_iterator_class_init (DbIteratorClass * klass)
+/**
+ * db_iterator_row_num_changed:
+ * @self: a #DbIterator
+ *
+ * Emits the "row-num-changed" signal on @self.
+ * This function should only be called by #DbIterator implementations.
+ **/
+void db_iterator_row_num_changed (DbIterator * self)
{
- GObjectClass * k = G_OBJECT_CLASS (klass);
- k->set_property = (GObjectSetPropertyFunc) db_iterator_set_property;
- k->get_property = (GObjectGetPropertyFunc) db_iterator_get_property;
- k->finalize = (GObjectFinalizeFunc) db_iterator_finalize;
+ g_signal_emit (self, signals[ROW_NUM_CHANGED], 0);
+}
+/**
+ * db_iterator_status_changed:
+ * @self: a #DbIterator
+ * @ready: #TRUE if @iterator is ready, #FALSE otherwise
+ *
+ * Emits the "status-changed" signal on @self.
+ * This function should only be called by #DbIterator implementations.
+ **/
+void db_iterator_status_changed (DbIterator * self, gboolean ready)
+{
+ g_signal_emit (self, signals[STATUS_CHANGED], 0, ready);
+}
+
+//+++++++++++++++++++++++++++++++++++++++++++++++++++ Interface
+
+static void db_iterator_default_init (DbIteratorInterface * iface)
+{
/**
* DbIterator::iter-changed:
* @iterator: the object on which the signal is emitted
@@ -1209,31 +1022,24 @@ static void db_iterator_class_init (DbIteratorClass * klass)
g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0
);
- g_object_class_override_property (k, PROP_MODEL, "model");
-
- g_object_class_install_property (k, PROP_MODE,
+ g_object_interface_install_property (iface,
g_param_spec_enum ("mode"
- ,_("Mode")
- ,_("The mode in which the iterator is working")
+ ,"Mode"
+ ,"The mode in which the iterator is working"
,DB_TYPE_ITERATOR_MODE
,DB_ITERATOR_MODE_ON_CHANGE
,G_PARAM_CONSTRUCT | G_PARAM_READWRITE
));
- g_object_class_install_property (k, PROP_REMEMBER_SELECTION,
+
+ g_object_interface_install_property (iface,
g_param_spec_boolean ("remember-selection"
- ,_("Remember selection")
- ,_("Wether to rememeber the selection when model is refreshed")
+ ,"Remember selection"
+ ,"Wether to rememeber the selection when model is refreshed"
,TRUE
,G_PARAM_CONSTRUCT | G_PARAM_READWRITE
));
}
-static void db_iterator_model_holder_init (DbModelHolderInterface * iface)
-{
- iface->get_model = (DbModelHolderGetModelFunc) db_iterator_get_model;
- iface->set_model = (DbModelHolderSetModelFunc) db_iterator_set_model;
-}
-
GType db_iterator_mode_get_type ()
{
static GType type = 0;
@@ -1253,4 +1059,4 @@ GType db_iterator_mode_get_type ()
}
return type;
-}
+}
\ No newline at end of file
diff --git a/db/db-iterator.h b/db/db-iterator.h
index 65aacc3..c5e3e46 100644
--- a/db/db-iterator.h
+++ b/db/db-iterator.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012 - Juan Ferrer Toribio
+ * 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
@@ -18,19 +18,18 @@
#ifndef DB_ITERATOR_H
#define DB_ITERATOR_H
+#include
#include "db-model.h"
-#define DB_TYPE_ITERATOR (db_iterator_get_type ())
-#define DB_ITERATOR(self) (G_TYPE_CHECK_INSTANCE_CAST (self, DB_TYPE_ITERATOR, DbIterator))
-#define DB_IS_ITERATOR(self) (G_TYPE_CHECK_INSTANCE_TYPE (self, DB_TYPE_ITERATOR))
-#define DB_ITERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST (klass, DB_TYPE_ITERATOR, DbIteratorClass))
-#define DB_IS_ITERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE (klass, DB_TYPE_ITERATOR))
-#define DB_ITERATOR_GET_CLASS(self) (G_TYPE_INSTANCE_GET_CLASS (self, DB_TYPE_ITERATOR, DbIteratorClass))
+#define DB_TYPE_ITERATOR (db_iterator_get_type ())
+#define DB_ITERATOR(self) (G_TYPE_CHECK_INSTANCE_CAST (self, DB_TYPE_ITERATOR, DbIterator))
+#define DB_IS_ITERATOR(self) (G_TYPE_CHECK_INSTANCE_TYPE (self, DB_TYPE_ITERATOR))
+#define DB_ITERATOR_GET_INTERFACE(self) (G_TYPE_INSTANCE_GET_INTERFACE (self, DB_TYPE_ITERATOR, DbIteratorInterface))
-#define DB_TYPE_ITERATOR_MODE (db_iterator_mode_get_type ())
+#define DB_TYPE_ITERATOR_MODE (db_iterator_mode_get_type ())
typedef struct _DbIterator DbIterator;
-typedef struct _DbIteratorClass DbIteratorClass;
+typedef struct _DbIteratorInterface DbIteratorInterface;
#include "db-param.h"
@@ -40,10 +39,10 @@ typedef struct _DbIteratorClass DbIteratorClass;
* database instantly.
* @DB_ITERATOR_MODE_ON_ITER: every change made in a row will be sent to the
* database when iter changes.
- * @DB_ITERATOR_MODE_ON_DEMAND: nothing will be sent to the database since it's
+ * @DB_ITERATOR_MODE_ON_DEMAND: nothing will be sent to the database until it's
* demanded.
*
- * The working mode of a Iterator.
+ * The working mode of an Iterator.
**/
typedef enum
{
@@ -71,41 +70,48 @@ typedef enum
}
DbIteratorMove;
-struct _DbIterator
-{
- GObject parent;
- DbModel * model;
- GList * params;
- DbIteratorMode mode;
- DbIter iter;
- GHashTable * selected;
- gint row;
- gboolean row_selected;
- gboolean remember_selection;
-};
+typedef DbIteratorMode (* DbIteratorGetMode) (DbIterator * self);
+typedef void (* DbIteratorSetMode) (DbIterator * self, DbIteratorMode mode);
+typedef gint (* DbIteratorGetRow) (DbIterator * self);
+typedef gboolean (* DbIteratorGetIter) (DbIterator * self, DbIter ** iter);
+typedef void (* DbIteratorSetIter) (DbIterator * self, DbIter * iter);
+typedef gboolean (* DbIteratorMoveIter) (DbIterator * self, DbIter * iter);
+typedef GList * (* DbIteratorGetParamList) (DbIterator * self);
+typedef void (* DbIteratorDeleteSelection) (DbIterator * self);
-struct _DbIteratorClass
+struct _DbIteratorInterface
{
- /* */
- GObjectClass parent;
+ GTypeInterface parent;
+ DbIteratorGetMode get_mode;
+ DbIteratorSetMode set_mode;
+ DbIteratorGetRow get_row;
+ DbIteratorGetIter get_iter;
+ DbIteratorSetIter set_iter;
+ DbIteratorMoveIter move_iter;
+ DbIteratorGetParamList get_param_list;
+ DbIteratorDeleteSelection delete_selection;
};
GType db_iterator_get_type ();
GType db_iterator_mode_get_type () G_GNUC_CONST;
-DbIterator * db_iterator_new (DbModel * model);
gboolean db_iterator_is_ready (DbIterator * self);
DbIteratorMode db_iterator_get_mode (DbIterator * self);
void db_iterator_set_mode (DbIterator * self, DbIteratorMode mode);
gint db_iterator_get_row (DbIterator * self);
-gboolean db_iterator_get_iter (DbIterator * self, DbIter * iter);
-void db_iterator_select_iter (DbIterator * self, DbIter * iter);
-void db_iterator_move_iter (DbIterator * self, DbIter * iter);
-void db_iterator_move_first (DbIterator * self);
-void db_iterator_move_last (DbIterator * self);
-void db_iterator_move_previous (DbIterator * self);
-void db_iterator_move_next (DbIterator * self);
-void db_iterator_move_to (DbIterator * self, DbIteratorMove move);
+gboolean db_iterator_get_iter (DbIterator * self, DbIter ** iter);
+void db_iterator_add_param (DbIterator * self, DbParam * param);
+GvnParam * db_iterator_get_param (DbIterator * self, const gchar * column);
+GList * db_iterator_get_params (DbIterator * self);
+void db_iterator_bind_param (DbIterator * self, const gchar * column, GvnParam * param);
+void db_iterator_link (DbIterator * self, const gchar * field, DbIterator * src, const gchar * column);
+void db_iterator_link_with_param (DbIterator * self, const gchar * field, GvnParam * param);
+gboolean db_iterator_move_iter (DbIterator * self, DbIter * iter);
+gboolean db_iterator_move_first (DbIterator * self);
+gboolean db_iterator_move_last (DbIterator * self);
+gboolean db_iterator_move_previous (DbIterator * self);
+gboolean db_iterator_move_next (DbIterator * self);
+gboolean db_iterator_move_to (DbIterator * self, DbIteratorMove move);
void db_iterator_refresh (DbIterator * self);
const GvnParamSpec * db_iterator_get_spec (DbIterator * self, gint column);
gint db_iterator_get_column_index (DbIterator * self, const gchar * name);
@@ -115,12 +121,6 @@ const GValue * db_iterator_get_value_by_index (DbIterator * self, gint column
gboolean db_iterator_set_value_by_index (DbIterator * self, gint column, const GValue * value, GError ** err);
void db_iterator_delete (DbIterator * self);
void db_iterator_insert (DbIterator * self);
-void db_iterator_add_param (DbIterator * self, DbParam * param);
-GvnParam * db_iterator_get_param (DbIterator * self, const gchar * column);
-GList * db_iterator_get_params (DbIterator * self);
-void db_iterator_bind_param (DbIterator * self, const gchar * column, GvnParam * param);
-void db_iterator_link (DbIterator * self, const gchar * field, DbIterator * src, const gchar * column);
-void db_iterator_link_with_param (DbIterator * self, const gchar * field, GvnParam * param);
gint db_iterator_get_nrows (DbIterator * self);
DbModelUpdateFlags db_iterator_get_update_flags (DbIterator * self);
void db_iterator_reverse_operations (DbIterator * self);
@@ -128,4 +128,10 @@ void db_iterator_perform_operations (DbIterator * self);
DbModelRowOp db_iterator_get_pending_operations (DbIterator * self);
gboolean db_iterator_has_pending_operations (DbIterator * self);
-#endif
\ No newline at end of file
+void db_iterator_data_changed (DbIterator * self);
+void db_iterator_iter_changed (DbIterator * self);
+void db_iterator_operations_done (DbIterator * self);
+void db_iterator_row_num_changed (DbIterator * self);
+void db_iterator_status_changed (DbIterator * self, gboolean ready);
+
+#endif
diff --git a/db/db-model-holder.c b/db/db-model-holder.c
index 599c62a..b81bd0a 100644
--- a/db/db-model-holder.c
+++ b/db/db-model-holder.c
@@ -57,7 +57,7 @@ DbModel * db_model_holder_get_model (DbModelHolder * self)
void db_model_holder_set_model (DbModelHolder * self, DbModel * model)
{
g_return_if_fail (DB_IS_MODEL_HOLDER (self));
- g_return_if_fail (DB_IS_MODEL (self));
+ g_return_if_fail (DB_IS_MODEL (model));
DB_MODEL_HOLDER_GET_INTERFACE (self)->set_model (self, model);
}
@@ -67,7 +67,7 @@ void db_model_holder_set_model (DbModelHolder * self, DbModel * model)
static void db_model_holder_default_init (DbModelHolderInterface * iface)
{
g_object_interface_install_property (iface,
- g_param_spec_object ("model"
+ g_param_spec_object ("data-model"
,_("Model")
,_("The model used by the holder")
,DB_TYPE_MODEL
diff --git a/db/db-model-holder.h b/db/db-model-holder.h
index 7a8e158..a9aa662 100644
--- a/db/db-model-holder.h
+++ b/db/db-model-holder.h
@@ -31,8 +31,6 @@ typedef struct _DbModelHolderInterface DbModelHolderInterface;
typedef DbModel * (* DbModelHolderGetModelFunc) (DbModelHolder * self);
typedef void (* DbModelHolderSetModelFunc) (DbModelHolder * self, DbModel * model);
-struct _DbModelHolder;
-
struct _DbModelHolderInterface
{
/* */
diff --git a/db/db-model-private.c b/db/db-model-private.c
index 0bd446e..cb4dfbb 100644
--- a/db/db-model-private.c
+++ b/db/db-model-private.c
@@ -190,6 +190,7 @@ static void table_info_free (TableInfo * table_info)
g_free (table_info->alias);
g_slist_free (table_info->pkeys);
g_hash_table_unref (table_info->columns);
+ g_free (table_info);
}
//----------------------------------------------- ColumnDef
diff --git a/db/db-model.c b/db/db-model.c
index cd82347..196f02c 100644
--- a/db/db-model.c
+++ b/db/db-model.c
@@ -35,7 +35,7 @@
*
* The #DbModel class gets an SQL query statement to retrieve the data from the
* database connected by a #DbConn. It is normally used undirectly, using
- * a #DbIterator or another #DbModelHolder instead.
+ * a #DbSimpleIterator or another #DbModelHolder instead.
**/
G_DEFINE_TYPE (DbModel, db_model, G_TYPE_OBJECT)
@@ -250,6 +250,14 @@ static void db_model_on_line_deleted (DbModel * self, gint position)
// External signal handlers
+static void array_free (gpointer array_ptr)
+{
+ GArray * array = array_ptr;
+
+ if (array)
+ g_array_free (array, TRUE);
+}
+
static void db_model_calculate_update_flags (DbModel * self)
{
gint i;
@@ -304,8 +312,8 @@ static void db_model_calculate_update_flags (DbModel * self)
tinfo->columns = g_hash_table_new_full (
g_str_hash
,g_str_equal
- ,NULL
- ,(GDestroyNotify) g_array_free
+ ,g_free
+ ,array_free
);
tinfo->pkeys = NULL;
g_hash_table_insert (priv->tables, table_copy (&table), tinfo);
@@ -2289,7 +2297,6 @@ gboolean db_model_search_value
DbModelRowOp db_model_get_row_operations (DbModel * self, DbIter * iter)
{
DbOperation * op = NULL;
-
g_return_val_if_fail (DB_IS_MODEL (self), 0);
g_return_val_if_fail (VALID_ITER (iter, self), 0);
diff --git a/db/db-param.c b/db/db-param.c
index b6e2c56..5efdf67 100644
--- a/db/db-param.c
+++ b/db/db-param.c
@@ -304,7 +304,7 @@ static void db_param_finalize (DbParam * self)
,"any_signal", db_param_on_iterator_status_changed, self
,NULL
);
- g_clear_object (&self->iterator);
+ g_clear_object (&self->iterator);
}
g_value_unset (self->value);
diff --git a/db/db-simple-iterator.c b/db/db-simple-iterator.c
new file mode 100644
index 0000000..18b0f60
--- /dev/null
+++ b/db/db-simple-iterator.c
@@ -0,0 +1,431 @@
+/*
+ * 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 .
+ */
+
+#include "db-simple-iterator.h"
+#include "db-model-holder.h"
+#include "db-param.h"
+
+static void db_simple_iterator_set_iter (DbSimpleIterator * self, DbIter * iter);
+static void db_simple_iterator_model_holder_init (DbModelHolderInterface * iface);
+static void db_simple_iterator_iterator_init (DbIteratorInterface * iface);
+
+/**
+ * SECTION:db-simple-iterator
+ * @short_description: manages a iterator with its events
+ * @title: DbSimpleIterator
+ *
+ * The #DbSimpleIterator manages a connection with a data base. The function
+ * db_simple_iterator_new() creates a new #DbSimpleIterator.
+ */
+G_DEFINE_TYPE_WITH_CODE (DbSimpleIterator, db_simple_iterator, G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (DB_TYPE_MODEL_HOLDER,
+ db_simple_iterator_model_holder_init)
+ G_IMPLEMENT_INTERFACE (DB_TYPE_ITERATOR,
+ db_simple_iterator_iterator_init)
+);
+
+/**
+ * DbSimpleIterator:
+ * @params: (element-type Db.Param):
+ **/
+
+/**
+ * db_simple_iterator_new:
+ * @model: the #DbModel used by iterator.
+ *
+ * Creates a new #DbSimpleIterator.
+ *
+ * Return value: (transfer full): a #DbSimpleIterator.
+ **/
+DbIterator * db_simple_iterator_new (DbModel * model)
+{
+ return g_object_new (DB_TYPE_SIMPLE_ITERATOR, "model", model, NULL);
+}
+
+//+++++++++++++++++++++++++++++++++++++++++++++++++++ Private
+
+static void db_simple_iterator_unref_param (DbSimpleIterator * self, DbParam * param)
+{
+ self->params = g_list_remove (self->params, param);
+}
+
+/*
+ * #DbSimpleIterator instances call this function every time line in
+ * the model is changed.
+ */
+static void db_simple_iterator_row_num_changed (DbSimpleIterator * self)
+{
+ if (self->iter)
+ self->row = db_model_get_path (self->model, self->iter);
+ else if (!self->remember_selection)
+ self->row = 0;
+
+ db_iterator_row_num_changed (DB_ITERATOR (self));
+}
+
+/*
+ * #DbSimpleIterator instances call this function every time the data of the
+ * params must be updated.
+ */
+static void db_simple_iterator_iter_changed (DbSimpleIterator * self)
+{
+ db_simple_iterator_row_num_changed (self);
+ db_iterator_iter_changed (DB_ITERATOR (self));
+}
+
+
+//+++++++++++++++++++++++++++++++++++++++++++++++++++ DbModelHolder methods
+
+static void db_simple_iterator_set_model_mode (DbSimpleIterator * self)
+{
+ if (self->mode == DB_ITERATOR_MODE_ON_CHANGE)
+ db_model_set_mode (self->model, DB_MODEL_MODE_ON_CHANGE);
+ else
+ db_model_set_mode (self->model, DB_MODEL_MODE_ON_DEMAND);
+}
+
+/*
+ * Function called when row is inserted on the model.
+ */
+static void db_simple_iterator_on_model_line_inserted (DbModel * model, DbIter * iter, DbSimpleIterator * self)
+{
+ db_iterator_data_changed (DB_ITERATOR (self));
+}
+
+/*
+ * Function called when row is updated on the model.
+ */
+static void db_simple_iterator_on_model_line_updated_after (DbModel * model, DbIter * iter, DbSimpleIterator * self)
+{
+ if (self->iter && db_iter_compare (iter, self->iter))
+ db_simple_iterator_iter_changed (self);
+
+ db_iterator_data_changed (DB_ITERATOR (self));
+}
+
+/*
+ * Function called when row is deleted on the model.
+ */
+static void db_simple_iterator_on_model_line_deleted (DbModel * model, gint row, DbSimpleIterator * self)
+{
+ if (self->iter && row == self->row)
+ {
+ DbIter iter;
+
+ if (db_model_get_iter (model, &iter, row + 1)
+ || db_model_get_iter (model, &iter, row - 1))
+ db_simple_iterator_set_iter (self, &iter);
+ else
+ db_simple_iterator_set_iter (self, NULL);
+ }
+}
+
+static void db_simple_iterator_on_model_line_deleted_after (DbModel * model, gint row, DbSimpleIterator * self)
+{
+ if (self->iter)
+ db_simple_iterator_row_num_changed (self);
+
+ db_iterator_data_changed (DB_ITERATOR (self));
+}
+
+/*
+ * Function called when model rows are reordered.
+ */
+static void db_simple_iterator_on_model_lines_reordered (DbModel * model,
+ gint column, gint * new_order, DbSimpleIterator * self)
+{
+ if (self->iter)
+ db_simple_iterator_row_num_changed (self);
+}
+
+/*
+ * Function called when model status changes.
+ */
+static void db_simple_iterator_on_model_status_changed (DbModel * model, DbModelStatus status, DbSimpleIterator * self)
+{
+ if (status == DB_MODEL_STATUS_READY)
+ {
+ DbIter iter;
+
+ db_iterator_status_changed (DB_ITERATOR (self), TRUE);
+
+ if (self->row >= 0 && self->row < db_model_get_nrows (model)
+ && db_model_get_iter (model, &iter, self->row))
+ db_simple_iterator_set_iter (self, &iter);
+ else
+ db_simple_iterator_set_iter (self, NULL);
+ }
+ else
+ {
+ db_iterator_status_changed (DB_ITERATOR (self), FALSE);
+ db_simple_iterator_set_iter (self, NULL);
+ }
+}
+
+/*
+ * Function called when model operations are done.
+ */
+static void db_simple_iterator_on_model_operations_done (DbModel * model, DbSimpleIterator * self)
+{
+ db_iterator_operations_done (DB_ITERATOR (self));
+}
+
+static DbModel * db_simple_iterator_get_model (DbSimpleIterator * self)
+{
+ g_return_val_if_fail (DB_IS_SIMPLE_ITERATOR (self), NULL);
+
+ return self->model;
+}
+
+static void db_simple_iterator_set_model (DbSimpleIterator * self, DbModel * model)
+{
+ if (!model)
+ return;
+
+ if (!self->model)
+ {
+ self->model = g_object_ref (model);
+ g_object_connect (self->model
+ ,"signal::line-inserted", db_simple_iterator_on_model_line_inserted, self
+ ,"signal-after::line-updated", db_simple_iterator_on_model_line_updated_after, self
+ ,"signal::line-deleted", db_simple_iterator_on_model_line_deleted, self
+ ,"signal-after::line-deleted", db_simple_iterator_on_model_line_deleted_after, self
+ ,"signal::lines-reordered", db_simple_iterator_on_model_lines_reordered, self
+ ,"signal::status-changed", db_simple_iterator_on_model_status_changed, self
+ ,"signal::operations-done", db_simple_iterator_on_model_operations_done, self
+ ,NULL
+ );
+ db_simple_iterator_set_model_mode (self);
+ db_simple_iterator_on_model_status_changed (model,
+ db_model_get_status (model), self);
+ }
+ else
+ g_warning ("DbSimpleIterator: Can't reassign the 'model' property");
+}
+
+//+++++++++++++++++++++++++++++++++++++++++++++++++++ DbIterator methods
+
+static gint db_simple_iterator_get_row (DbSimpleIterator * self)
+{
+ g_return_val_if_fail (DB_IS_SIMPLE_ITERATOR (self), -1);
+
+ if (self->iter)
+ return self->row;
+ else
+ return -1;
+}
+
+static DbIteratorMode db_simple_iterator_get_mode (DbSimpleIterator * self)
+{
+ g_return_val_if_fail (DB_IS_SIMPLE_ITERATOR (self), 0);
+
+ return self->mode;
+}
+
+static void db_simple_iterator_set_mode (DbSimpleIterator * self, DbIteratorMode mode)
+{
+ g_return_if_fail (DB_IS_SIMPLE_ITERATOR (self));
+
+ self->mode = mode;
+
+ if (self->model)
+ db_simple_iterator_set_model_mode (self);
+}
+
+static gboolean db_simple_iterator_get_iter (DbSimpleIterator * self, DbIter ** iter)
+{
+ g_return_val_if_fail (DB_IS_SIMPLE_ITERATOR (self), FALSE);
+
+ if (!self->iter)
+ return FALSE;
+
+ *iter = self->iter;
+ return TRUE;
+}
+
+static void db_simple_iterator_set_iter (DbSimpleIterator * self, DbIter * iter)
+{
+ if (iter)
+ {
+ db_iter_free (self->iter);
+ self->iter = db_iter_copy (iter);
+ db_simple_iterator_iter_changed (self);
+ }
+ else if (self->iter)
+ {
+ if (!self->remember_selection)
+ self->row = 0;
+
+ db_iter_free (self->iter);
+ self->iter = NULL;
+ db_simple_iterator_iter_changed (self);
+ }
+}
+
+static gboolean db_simple_iterator_move_iter (DbSimpleIterator * self, DbIter * iter)
+{
+ g_return_val_if_fail (DB_IS_SIMPLE_ITERATOR (self), FALSE);
+
+ if (self->iter && db_iter_compare (self->iter, iter))
+ return FALSE;
+
+ if (self->iter && self->mode != DB_ITERATOR_MODE_ON_DEMAND)
+ {
+ if (db_model_get_row_operations (self->model, self->iter) == DB_MODEL_ROW_OP_INSERT)
+ db_model_reverse_operations (self->model);
+
+ db_model_perform_operations (self->model, FALSE);
+ }
+
+ db_simple_iterator_set_iter (self, iter);
+ return TRUE;
+}
+
+static GList * db_simple_iterator_get_param_list (DbSimpleIterator * self)
+{
+ g_return_val_if_fail (DB_IS_SIMPLE_ITERATOR (self), NULL);
+
+ return self->params;
+}
+
+static void db_simple_iterator_delete_selection (DbSimpleIterator * self)
+{
+ g_return_if_fail (DB_IS_SIMPLE_ITERATOR (self));
+
+ if (self->model && self->iter)
+ db_model_delete (self->model, self->iter);
+}
+
+//+++++++++++++++++++++++++++++++++++++++++++++++++++ Properties
+
+enum
+{
+ PROP_MODEL = 1
+ ,PROP_MODE
+ ,PROP_REMEMBER_SELECTION
+};
+
+static void db_simple_iterator_set_property (DbSimpleIterator * self, guint id,
+ const GValue * value, GParamSpec * pspec)
+{
+ switch (id)
+ {
+ case PROP_MODEL:
+ db_simple_iterator_set_model (self, g_value_get_object (value));
+ break;
+ case PROP_MODE:
+ db_simple_iterator_set_mode (self, g_value_get_enum (value));
+ break;
+ case PROP_REMEMBER_SELECTION:
+ self->remember_selection = g_value_get_boolean (value);
+ db_simple_iterator_row_num_changed (self);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (self, id, pspec);
+ }
+}
+
+static void db_simple_iterator_get_property (DbSimpleIterator * self, guint id,
+ GValue * value, GParamSpec * pspec)
+{
+ switch (id)
+ {
+ case PROP_MODEL:
+ g_value_set_object (value, self->model);
+ break;
+ case PROP_MODE:
+ g_value_set_enum (value, self->mode);
+ break;
+ case PROP_REMEMBER_SELECTION:
+ g_value_set_boolean (value, self->remember_selection);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (self, id, pspec);
+ }
+}
+
+//+++++++++++++++++++++++++++++++++++++++++++++++++++ Class
+
+static void db_simple_iterator_init (DbSimpleIterator * self)
+{
+ self->params = NULL;
+ self->iter = NULL;
+ self->row = 0;
+ self->model = NULL;
+}
+
+static void db_simple_iterator_finalize (DbSimpleIterator * self)
+{
+ GList * n;
+
+ for (n = self->params; n; n = n->next)
+ g_object_weak_unref (n->data,
+ (GWeakNotify) db_simple_iterator_unref_param, self);
+
+ g_list_free (self->params);
+
+ db_iter_free (self->iter);
+ self->iter = NULL;
+
+ if (self->model)
+ {
+ g_object_disconnect (self->model
+ ,"any_signal", db_simple_iterator_on_model_line_inserted, self
+ ,"any_signal", db_simple_iterator_on_model_line_updated_after, self
+ ,"any_signal", db_simple_iterator_on_model_line_deleted, self
+ ,"any_signal", db_simple_iterator_on_model_line_deleted_after, self
+ ,"any_signal", db_simple_iterator_on_model_lines_reordered, self
+ ,"any_signal", db_simple_iterator_on_model_status_changed, self
+ ,"any_signal", db_simple_iterator_on_model_operations_done, self
+ ,NULL
+ );
+ g_object_unref (self->model);
+ }
+
+ G_OBJECT_CLASS (db_simple_iterator_parent_class)->finalize (G_OBJECT (self));
+}
+
+static void db_simple_iterator_class_init (DbSimpleIteratorClass * klass)
+{
+ GObjectClass * k = G_OBJECT_CLASS (klass);
+ k->set_property = (GObjectSetPropertyFunc) db_simple_iterator_set_property;
+ k->get_property = (GObjectGetPropertyFunc) db_simple_iterator_get_property;
+ k->finalize = (GObjectFinalizeFunc) db_simple_iterator_finalize;
+
+ g_object_class_override_property (k, PROP_MODEL, "data-model");
+
+ g_object_class_override_property (k, PROP_MODE, "mode");
+ g_object_class_override_property (k, PROP_REMEMBER_SELECTION, "remember-selection");
+}
+
+static void db_simple_iterator_model_holder_init (DbModelHolderInterface * iface)
+{
+ iface->get_model = (DbModelHolderGetModelFunc) db_simple_iterator_get_model;
+ iface->set_model = (DbModelHolderSetModelFunc) db_simple_iterator_set_model;
+}
+
+static void db_simple_iterator_iterator_init (DbIteratorInterface * iface)
+{
+ iface->get_mode = (DbIteratorGetMode) db_simple_iterator_get_mode;
+ iface->set_mode = (DbIteratorSetMode) db_simple_iterator_set_mode;
+ iface->get_row = (DbIteratorGetRow) db_simple_iterator_get_row;
+ iface->get_iter = (DbIteratorGetIter) db_simple_iterator_get_iter;
+ iface->set_iter = (DbIteratorSetIter) db_simple_iterator_set_iter;
+ iface->move_iter = (DbIteratorMoveIter) db_simple_iterator_move_iter;
+ iface->get_param_list = (DbIteratorGetParamList) db_simple_iterator_get_param_list;
+ iface->delete_selection = (DbIteratorDeleteSelection) db_simple_iterator_delete_selection;
+}
diff --git a/db/db-simple-iterator.h b/db/db-simple-iterator.h
new file mode 100644
index 0000000..c39f246
--- /dev/null
+++ b/db/db-simple-iterator.h
@@ -0,0 +1,54 @@
+/*
+ * 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 .
+ */
+
+#ifndef DB_SIMPLE_ITERATOR_H
+#define DB_SIMPLE_ITERATOR_H
+
+#include "db-model.h"
+#include "db-iterator.h"
+
+#define DB_TYPE_SIMPLE_ITERATOR (db_simple_iterator_get_type ())
+#define DB_SIMPLE_ITERATOR(self) (G_TYPE_CHECK_INSTANCE_CAST (self, DB_TYPE_SIMPLE_ITERATOR, DbSimpleIterator))
+#define DB_IS_SIMPLE_ITERATOR(self) (G_TYPE_CHECK_INSTANCE_TYPE (self, DB_TYPE_SIMPLE_ITERATOR))
+#define DB_SIMPLE_ITERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST (klass, DB_TYPE_SIMPLE_ITERATOR, DbSimpleIteratorClass))
+#define DB_IS_SIMPLE_ITERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE (klass, DB_TYPE_SIMPLE_ITERATOR))
+#define DB_SIMPLE_ITERATOR_GET_CLASS(self) (G_TYPE_INSTANCE_GET_CLASS (self, DB_TYPE_SIMPLE_ITERATOR, DbSimpleIteratorClass))
+
+typedef struct _DbSimpleIterator DbSimpleIterator;
+typedef struct _DbSimpleIteratorClass DbSimpleIteratorClass;
+
+struct _DbSimpleIterator
+{
+ GObject parent;
+ DbModel * model;
+ GList * params;
+ DbIteratorMode mode;
+ DbIter * iter;
+ gint row;
+ gboolean remember_selection;
+};
+
+struct _DbSimpleIteratorClass
+{
+ /* */
+ GObjectClass parent;
+};
+
+GType db_simple_iterator_get_type ();
+DbIterator * db_simple_iterator_new (DbModel * model);
+
+#endif
diff --git a/db/db.h b/db/db.h
index a42ba00..e1feda8 100644
--- a/db/db.h
+++ b/db/db.h
@@ -25,6 +25,7 @@
#include "db-request.h"
#include "db-conn.h"
#include "db-row.h"
+#include "db-simple-iterator.h"
#include "db-iterator.h"
#include "db-param.h"
#include "db-plugin.h"
diff --git a/docs/reference/hedera/adding-modules.xml b/docs/reference/hedera/adding-modules.xml
index 6832a02..9e25664 100644
--- a/docs/reference/hedera/adding-modules.xml
+++ b/docs/reference/hedera/adding-modules.xml
@@ -19,8 +19,8 @@
Previous stage
- Before you can add a module, you have to create it. To do so,
- the Hedera Library ships with an
+ First you have to create a module. To do so, the Hedera Library
+ ships with an
Anjuta IDE project
wizzard that creates an empty module written in Vala, ready
to be configured and built. If you won't be using the Anjuta IDE,
diff --git a/docs/reference/hedera/configuring.xml b/docs/reference/hedera/configuring.xml
index 157502a..9fea0ab 100644
--- a/docs/reference/hedera/configuring.xml
+++ b/docs/reference/hedera/configuring.xml
@@ -20,8 +20,7 @@
This chapter covers how to configure the library from the tarball,
if you have received it packed in any other form, like a .deb
- package, this section can be ignored, but you'll need to know how
- to use the package you received.
+ package, this section can be ignored.
diff --git a/docs/reference/hedera/hedera-docs.sgml b/docs/reference/hedera/hedera-docs.sgml
index c7bca0f..b623528 100644
--- a/docs/reference/hedera/hedera-docs.sgml
+++ b/docs/reference/hedera/hedera-docs.sgml
@@ -26,11 +26,6 @@
-
Using Hedera library
@@ -74,23 +69,29 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
DbLib
@@ -114,9 +115,12 @@
-
+
+
+
+
Fields
diff --git a/docs/reference/hedera/introduction.xml b/docs/reference/hedera/introduction.xml
index c3eea24..8544bc3 100644
--- a/docs/reference/hedera/introduction.xml
+++ b/docs/reference/hedera/introduction.xml
@@ -19,30 +19,29 @@
The Hedera Library
- The Hedera library is a utility library that offers an easy
- way to connect to a database and show and manipulate the retrieved
- data using
+ The Hedera library offers an easy way to connect to a database and
+ to show and manipulate its data using
GTK+
graphical interfaces.
It features a modular system to easily add new functionalities
- to your applications with the minimum maintenance needed. This
- system offers the developer the chance to use either
+ to your applications with the minimum configuration needed. This
+ system offers the developer the chance to use
GLib
and
- GObject from C or
+ GObject either from C or from
Vala to implement new
- modules and also comes with an easy integration method to add them
- to the existing application in no time.
+ modules.
Althought you can write your own applications, the library is
thought to use the shipped application and link the modules
- to it, in order to ease the process. The linking of the
- application and the modules will be described in the section
- about adding new modules and an example of the process will be
+ to it, in order to ease the process. The way to use the modules
+ from the application will be described in the section about
+
+ adding new modules and an example of the process will be
shown in a tutorial.
diff --git a/docs/reference/hedera/running.xml b/docs/reference/hedera/running.xml
index fa1f605..d9d2f44 100644
--- a/docs/reference/hedera/running.xml
+++ b/docs/reference/hedera/running.xml
@@ -21,8 +21,8 @@
To run your own modules you need to install them in the
search directories of Hedera. You can use
- pkg-config to know where
- these directories actually are in your installation:
+ pkg-config to know where these directories
+ actually are in your installation:
pkg-config --variable=modulelibdir hedera
pkg-config --variable=moduledatadir hedera
diff --git a/glade/glade-db-iterator.c b/glade/glade-db-iterator.c
index 63e7efa..ba690b6 100644
--- a/glade/glade-db-iterator.c
+++ b/glade/glade-db-iterator.c
@@ -26,7 +26,7 @@ static void glade_db_iterator_on_param_col_name_changed (GladeProperty * propert
GladeWidget * parent = glade_widget_get_parent (param);
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;
project = glade_widget_get_project (param);
@@ -35,7 +35,7 @@ static void glade_db_iterator_on_param_col_name_changed (GladeProperty * propert
}
void glade_db_iterator_add_child (GladeWidgetAdaptor * adaptor,
- DbIterator * parent, DbParam * child)
+ DbIterator * parent, GObject * child)
{
GladeWidget * param = glade_widget_get_from_gobject (G_OBJECT (child));
GladeProperty * name_prop = glade_widget_get_property (param, "column-name");
@@ -43,17 +43,19 @@ void glade_db_iterator_add_child (GladeWidgetAdaptor * adaptor,
g_signal_connect (name_prop, "value-changed",
G_CALLBACK (glade_db_iterator_on_param_col_name_changed), param);
- vn_iterator_add_param (parent, child);
+ if (VN_IS_ITERATOR (parent))
+ vn_iterator_add_param (DB_SIMPLE_ITERATOR (parent), DB_PARAM (child));
}
void glade_db_iterator_remove_child (GladeWidgetAdaptor * adaptor,
- DbIterator * parent, DbParam * child)
+ DbIterator * parent, GObject * child)
{
- vn_iterator_remove_param (parent, child);
+ if (VN_IS_ITERATOR (parent))
+ vn_iterator_remove_param (DB_SIMPLE_ITERATOR (parent), DB_PARAM (child));
}
void glade_db_iterator_replace_child (GladeWidgetAdaptor * adaptor,
- DbIterator * container, DbParam * current, DbParam * new)
+ DbIterator * container, GObject * current, GObject * new)
{
glade_db_iterator_remove_child (adaptor, container, current);
glade_db_iterator_add_child (adaptor, container, new);
@@ -62,69 +64,34 @@ void glade_db_iterator_replace_child (GladeWidgetAdaptor * adaptor,
GList * glade_db_iterator_get_children (GladeWidgetAdaptor * adaptor,
DbIterator * parent)
{
- return vn_iterator_get_params (parent);
-}
+ if (VN_IS_ITERATOR (parent))
+ return vn_iterator_get_params (DB_SIMPLE_ITERATOR (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);
+ return NULL;
}
gboolean glade_db_iterator_add_verify (GladeWidgetAdaptor * adaptor,
- DbIterator * container, DbParam * child, gboolean user_feedback)
+ DbIterator * container, GObject * child, gboolean user_feedback)
{
if (DB_IS_PARAM (child))
return TRUE;
if (user_feedback)
{
- GladeWidgetAdaptor * object_adaptor =
- glade_widget_adaptor_get_by_type (DB_TYPE_PARAM);
+ GladeWidgetAdaptor * child_adaptor = glade_widget_adaptor_get_by_type (DB_TYPE_PARAM);
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_title (object_adaptor)
+ ,"Objects of type %s only accept objects of type %s as children."
,glade_widget_adaptor_get_title (adaptor)
+ ,glade_widget_adaptor_get_title (child_adaptor)
);
}
return FALSE;
}
-static gboolean glade_db_iterator_move_child (GladeBaseEditor * editor,
- GladeWidget * parent, GladeWidget * child, gpointer data)
-{
- return FALSE;
-}
-
-static void glade_db_iterator_on_launch_editor (GObject * iterator)
-{
- GladeBaseEditor * editor;
- GladeEditable * param_editor;
- GtkWidget * window;
- GladeWidget * widget = glade_widget_get_from_gobject (iterator);
- GladeWidgetAdaptor * adaptor = glade_widget_get_adaptor (widget);
-
- param_editor = glade_widget_adaptor_create_editable (adaptor, GLADE_PAGE_GENERAL);
- editor = glade_base_editor_new (glade_widget_get_object (widget),
- 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, "move-child",
- G_CALLBACK (glade_db_iterator_move_child), NULL);
-
- gtk_widget_show (GTK_WIDGET (editor));
- window = glade_base_editor_pack_new_window (editor, _("Iterator Editor"), NULL);
- gtk_widget_show (window);
-}
-
static void glade_db_iterator_on_generate_params (GladeWidget * iterator)
{
gboolean use_file = TRUE;
@@ -134,9 +101,9 @@ static void glade_db_iterator_on_generate_params (GladeWidget * iterator)
SqlSelect * select;
GladeWidget * model_w;
DbModel * model = NULL;
- GList * params = vn_iterator_get_params
- (DB_ITERATOR (glade_widget_get_object (iterator)));
GError * err = NULL;
+ GList * params =
+ vn_iterator_get_params (DB_SIMPLE_ITERATOR (glade_widget_get_object (iterator)));
if (params)
{
@@ -145,9 +112,8 @@ static void glade_db_iterator_on_generate_params (GladeWidget * iterator)
g_list_free (params);
return;
}
- g_list_free (params);
- glade_widget_property_get (iterator, "model", &model, NULL);
+ glade_widget_property_get (iterator, "data-model", &model, NULL);
if (!model)
{
@@ -173,13 +139,14 @@ static void glade_db_iterator_on_generate_params (GladeWidget * iterator)
SqlList * list;
GList * l, * fields;
GladeProject * project = glade_widget_get_project (iterator);
+ gint field_pos = 0;
g_object_get (select, "fields", &list, NULL);
fields = sql_list_get_items (list);
glade_command_push_group (_("Automatic generation of params for %s"), name);
- for (l = fields; l; l = l->next)
+ for (l = fields; l; l = l->next, field_pos++)
{
const gchar * param_name = NULL;
gchar * param_new_name = NULL;
@@ -210,6 +177,8 @@ static void glade_db_iterator_on_generate_params (GladeWidget * iterator)
g_free (param_new_name);
}
+ else
+ glade_widget_property_set (param, "column-index", field_pos);
}
glade_command_pop_group ();
@@ -223,13 +192,50 @@ static void glade_db_iterator_on_generate_params (GladeWidget * iterator)
}
}
+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,
+ GladeWidget * parent, GladeWidget * child, gpointer data)
+{
+ return FALSE;
+}
+
+static void glade_db_iterator_on_launch_editor (GObject * iterator)
+{
+ GladeBaseEditor * editor;
+ GladeEditable * param_editor;
+ GtkWidget * window;
+ GladeWidget * widget = glade_widget_get_from_gobject (iterator);
+ GladeWidgetAdaptor * adaptor = glade_widget_get_adaptor (widget);
+
+ param_editor = glade_widget_adaptor_create_editable (adaptor, GLADE_PAGE_GENERAL);
+ editor = glade_base_editor_new (glade_widget_get_object (widget),
+ 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, "move-child",
+ G_CALLBACK (glade_db_iterator_move_child), NULL);
+
+ gtk_widget_show (GTK_WIDGET (editor));
+ window = glade_base_editor_pack_new_window (editor, _("Iterator Editor"), NULL);
+ gtk_widget_show (window);
+}
+
void glade_db_iterator_action_activate (GladeWidgetAdaptor * adaptor,
GObject * object, const gchar * action_path)
{
- if (!g_strcmp0 (action_path, "launch-editor"))
- glade_db_iterator_on_launch_editor (object);
- else if (!g_strcmp0 (action_path, "generate-params"))
+ if (!g_strcmp0 (action_path, "generate-params"))
glade_db_iterator_on_generate_params (glade_widget_get_from_gobject (object));
+ else if (!g_strcmp0 (action_path, "launch-editor"))
+ glade_db_iterator_on_launch_editor (object);
}
// XXX Workaround for an error in Glade while loading child params
@@ -275,7 +281,7 @@ void glade_db_iterator_read_widget (GladeWidgetAdaptor * adaptor,
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))
+ if (g_str_has_suffix (name, (gchar *) l->data))
glade_widget_set_name (w, (gchar *) l->data);
}
diff --git a/glade/glade-vn.c b/glade/glade-vn.c
index 9c33e58..94c010c 100644
--- a/glade/glade-vn.c
+++ b/glade/glade-vn.c
@@ -59,7 +59,7 @@ void glade_vn_init ()
g_idle_add (glade_vn_set_first_catalog, "vn");
}
-//+++++++++++++++++++++++++++++++++++++++++++++++++++ GladeDbList
+//+++++++++++++++++++++++++++++++++++++++++++++++++++ GladeVnList
G_DEFINE_BOXED_TYPE (GladeVnList, glade_vn_list, glade_vn_list_copy, glade_vn_list_free);
@@ -90,6 +90,19 @@ GObject * glade_vn_field_get_internal_child (GladeWidgetAdaptor * adaptor,
return G_OBJECT (vn_field_get_widget (VN_FIELD (parent)));
}
+void glade_vn_field_write_child (GladeWidgetAdaptor * adaptor, GladeWidget * widget,
+ GladeXmlContext * context, GladeXmlNode * node)
+{
+ if (!glade_xml_node_verify (node, GLADE_XML_TAG_WIDGET))
+ return;
+
+ GWA_GET_CLASS (G_TYPE_OBJECT)->write_widget (adaptor, widget, context, node);
+
+// Force can focus to True, leave others property as set or by default
+
+// g_message ("glade_vn_field_write_child called for %s", glade_widget_get_name (widget));
+}
+
GObject * glade_vn_column_get_internal_child (GladeWidgetAdaptor * adaptor,
GObject * parent, const gchar * name)
{
diff --git a/glade/vn.xml b/glade/vn.xml
index 55295de..979f1de 100644
--- a/glade/vn.xml
+++ b/glade/vn.xml
@@ -5,6 +5,20 @@
glade_vn_init
+
@@ -49,7 +63,7 @@
-
+
GParamObject
DbModel
@@ -73,7 +87,7 @@
-
+
@@ -90,7 +104,18 @@
-
+
+
+
+
+ GParamObject
+ DbModel
+
+ The model held by the object
+
+
+ glade_db_model_holder_create_eprop
+
@@ -116,7 +141,7 @@
-
+
GParamObject
DbModel
@@ -144,12 +169,13 @@
- glade_vn_field_get_internal_child
+ glade_vn_field_get_internal_child
+
-
+
GParamObject
DbModel
@@ -165,7 +191,7 @@
-
+
GParamObject
DbModel
diff --git a/gvn/gvn-value.c b/gvn/gvn-value.c
index 558f916..68ad25d 100644
--- a/gvn/gvn-value.c
+++ b/gvn/gvn-value.c
@@ -582,7 +582,12 @@ void gvn_value_to_format_string (const GValue * src, const gchar * format, GValu
{
gchar buffer[120];
GDate * date = g_value_get_boxed (src);
- g_date_strftime (buffer, 120, format ? format : "%Y-%m-%d", date);
+
+ if (date)
+ g_date_strftime (buffer, 120, format ? format : "%Y-%m-%d", date);
+ else
+ buffer[0] = '\0';
+
g_value_set_string (dst, buffer);
}
else if (type == G_TYPE_DATE_TIME)
diff --git a/module/data/consulter-menu.xml b/module/data/consulter-menu.xml
index d83e0d6..2935a23 100644
--- a/module/data/consulter-menu.xml
+++ b/module/data/consulter-menu.xml
@@ -4,12 +4,12 @@
-
Send
win.send
- <Shift>s
+ <Primary>s
-
Clean
win.clean
- <Shift>c
+ <Primary>l
diff --git a/module/data/consulter.glade b/module/data/consulter.glade
index d469055..41bba2f 100644
--- a/module/data/consulter.glade
+++ b/module/data/consulter.glade
@@ -159,15 +159,7 @@
True
in
-
+
diff --git a/module/data/shelves.glade b/module/data/shelves.glade
index 09a7a46..646ca1f 100644
--- a/module/data/shelves.glade
+++ b/module/data/shelves.glade
@@ -20,8 +20,8 @@
-
- items
+
+ model-items
False
diff --git a/module/src/vn-consulter.c b/module/src/vn-consulter.c
index 7afb336..86f2454 100644
--- a/module/src/vn-consulter.c
+++ b/module/src/vn-consulter.c
@@ -76,14 +76,11 @@ static void vn_consulter_model_status_changed (DbModel * model,
{
gint i;
GList * n;
- GtkTreeView * tv = GTK_TREE_VIEW (obj->grid);
+ GtkTreeView * tv = GTK_TREE_VIEW (vn_handler_get_iterator (obj->handler));
GList * cols = gtk_tree_view_get_columns (tv);
for (n = cols; n; n = n->next)
- {
- GtkTreeViewColumn * col = n->data;
- gtk_tree_view_remove_column (tv, col);
- }
+ gtk_tree_view_remove_column (tv, (GtkTreeViewColumn *) n->data);
g_list_free (cols);
@@ -187,7 +184,7 @@ static void vn_consulter_model_status_changed (DbModel * model,
// Appends the column to the grid
- gtk_tree_view_append_column (GTK_TREE_VIEW (obj->grid),
+ gtk_tree_view_append_column (tv,
GTK_TREE_VIEW_COLUMN (column));
}
else if (status == DB_MODEL_STATUS_ERROR)
@@ -199,18 +196,17 @@ static void vn_consulter_model_status_changed (DbModel * model,
void vn_consulter_mode_toggled (GtkToggleButton * mode, VnConsulter * obj)
{
DbIterator * iterator = vn_handler_get_iterator (obj->handler);
-
db_iterator_set_mode (iterator
,(gtk_toggle_button_get_active (mode)) ?
- DB_ITERATOR_MODE_ON_CHANGE:
- DB_ITERATOR_MODE_ON_DEMAND
+ DB_ITERATOR_MODE_ON_CHANGE : DB_ITERATOR_MODE_ON_DEMAND
);
}
void vn_consulter_send (GtkButton * button, VnConsulter * obj)
{
- DbIterator * iterator;
DbModel * model;
+ VnGrid * grid;
+ DbIterator * old_grid;
gchar * sql;
sql = gtk_combo_box_text_get_active_text (obj->combo);
@@ -224,20 +220,27 @@ void vn_consulter_send (GtkButton * button, VnConsulter * obj)
model = db_model_new_with_sql (VN_FORM (obj)->conn, sql);
db_model_request_update_flags (model, DB_MODEL_ALL);
+
// Get sure to connect after the columns do, to destroy them.
g_signal_connect_after (model, "status-changed",
G_CALLBACK (vn_consulter_model_status_changed), obj);
- iterator = db_iterator_new (model);
- iterator->mode = DB_ITERATOR_MODE_ON_DEMAND;
- vn_handler_set_iterator (obj->handler, iterator);
- vn_grid_set_iterator (obj->grid, iterator);
+ if ((old_grid = vn_handler_get_iterator (obj->handler)))
+ gtk_container_remove (obj->grid_scroll, GTK_WIDGET (old_grid));
+
+ grid = vn_grid_new (model);
+ g_object_set (grid
+ ,"mode", DB_ITERATOR_MODE_ON_DEMAND
+ ,"remember-selection", TRUE
+ ,NULL);
+ vn_handler_set_iterator (obj->handler, DB_ITERATOR (grid));
+ gtk_container_add (obj->grid_scroll, GTK_WIDGET (grid));
+ gtk_widget_show (GTK_WIDGET (grid));
vn_consulter_mode_toggled (GTK_TOGGLE_BUTTON (obj->mode), obj);
g_free (sql);
g_object_unref (model);
- g_object_unref (iterator);
}
static void vn_consulter_open (VnConsulter * obj)
@@ -251,7 +254,8 @@ static void vn_consulter_open (VnConsulter * obj)
obj->combo = vn_form_get (form, "query");
obj->tv = vn_form_get (form, "treeview");
obj->mode = vn_form_get (form, "mode");
- obj->grid = vn_form_get (form, "consulter");
+// obj->grid = vn_form_get (form, "consulter");
+ obj->grid_scroll = vn_form_get (form, "scrolledwindow-data");
obj->handler = vn_form_get (form, "handler");
column = vn_form_get (form, "column-log");
diff --git a/module/src/vn-consulter.h b/module/src/vn-consulter.h
index 45d8c6e..bafeb91 100644
--- a/module/src/vn-consulter.h
+++ b/module/src/vn-consulter.h
@@ -34,7 +34,7 @@ struct _VnConsulter
GtkCheckButton * mode;
GtkComboBoxText * combo;
GtkTreeView * tv;
- VnGrid * grid;
+ GtkContainer * grid_scroll;
VnHandler * handler;
gchar * file;
diff --git a/plugin/mysql/db-mysql.c b/plugin/mysql/db-mysql.c
index 00c583b..8df0451 100644
--- a/plugin/mysql/db-mysql.c
+++ b/plugin/mysql/db-mysql.c
@@ -84,7 +84,7 @@ static gboolean db_mysql_open (DbMysql * obj, const gchar * host,
}
g_set_error (err
- ,DB_CONN_ERROR_OPENING
+ ,DB_CONN_LOG_DOMAIN
,error_code
,"%s", mysql_error (obj->mysql)
);
diff --git a/plugin/pg/db-pg.c b/plugin/pg/db-pg.c
index c7083fb..46d1de7 100644
--- a/plugin/pg/db-pg.c
+++ b/plugin/pg/db-pg.c
@@ -68,6 +68,8 @@
G_DEFINE_TYPE (DbPg, db_pg, DB_TYPE_PLUGIN);
+static SqlMultiStmt * info_query_stmt;
+
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Private
static void db_pg_close (DbPlugin * obj)
@@ -131,7 +133,7 @@ static gboolean db_pg_open (DbPlugin * obj, const gchar * host,
static void db_pg_set_ssl (DbPg * obj, const gchar * ca)
{
- g_warning ("DbPg: SSL not supported by this plugin");
+ g_message ("DbPg: SSL not supported by this plugin");
}
//+++++++ Internal Methods for db_pg_query ()
@@ -490,90 +492,62 @@ static DbResultSet * __db_pg_query
if (!failed && sel_count > 0 && columns)
{
gint k;
- Oid t_oid;
- GPtrArray * col_num = NULL;
- GPtrArray * oid = NULL;
- gchar * info_query = g_strdup ("");
- gchar * pkey_query;
- gchar * pkey_buff = NULL // buffers for memory leak avoidance
- ,* info_buff = NULL;
+ SqlBatch * batch = sql_batch_new ();
+ gchar * info_query = g_new0 (gchar, 1);
-// Set info_query string using the previously stored table OIDs and column numbers
for (i = 0; i < (gint) sel_count; i++)
{
- pkey_query = g_strdup ("");
- oid = g_ptr_array_index (rel_oid, i);
- col_num = g_ptr_array_index (col, i);
-
- info_buff = info_query;
- info_query = g_strconcat (info_query,
- "SELECT attname, attrelid, attnotnull, adsrc, attnum "
- "FROM pg_attribute "
- "INNER JOIN pg_class c ON c.oid = attrelid "
- "LEFT JOIN pg_attrdef a "
- "ON a.adrelid = attrelid AND a.adnum = attnum "
- "WHERE attisdropped = false AND (c.oid, attnum) IN ("
- , NULL);
- g_free (info_buff);
-
- pkey_buff = pkey_query;
- pkey_query = g_strconcat (pkey_query,
- "SELECT c.oid, relname, indkey "
- "FROM pg_class c "
- "LEFT JOIN pg_index i ON indrelid = c.oid "
- "AND indisprimary "
- "WHERE c.oid IN ("
- , NULL);
- g_free (pkey_buff);
+ gchar * buff;
+ GHashTable * added_tables = g_hash_table_new (g_int_hash, g_int_equal);
+ SqlList * fields_list, * tables_list;
+ SqlObject * fields_set = sql_set_new (),
+ * tables_set = sql_set_new ();
+ GPtrArray * oid = g_ptr_array_index (rel_oid, i),
+ * col_num = g_ptr_array_index (col, i);
gint ncolumns = (gint) oid->len;
- gchar * buff_j = NULL;
+
+ fields_list = sql_list_new (SQL_TYPE_EXPR);
+ sql_object_set (fields_set, "exprs", SQL_OBJECT (fields_list));
+
+ tables_list = sql_list_new (SQL_TYPE_EXPR);
+ sql_object_set (tables_set, "exprs", SQL_OBJECT (tables_list));
for (j = 0; j < ncolumns; j++)
{
- t_oid = GPOINTER_TO_UINT (g_ptr_array_index (oid, j));
+ SqlList * list;
+ Oid table_oid = GPOINTER_TO_UINT (g_ptr_array_index (oid, j));
+ guint column = GPOINTER_TO_INT (g_ptr_array_index (col_num, j));
+ SqlObject * tab, * col, * set = sql_set_new ();
- buff_j = g_strdup_printf ("%d", t_oid);
- pkey_buff = pkey_query;
- pkey_query = g_strconcat (pkey_query, buff_j, NULL);
- g_free (pkey_buff);
- g_free (buff_j);
+ GValue tab_val = G_VALUE_INIT;
+ g_value_set_uint (g_value_init (&tab_val, G_TYPE_UINT), table_oid);
+ tab = sql_value_new_with_value (&tab_val);
+ g_value_unset (&tab_val);
- if (j < ncolumns-1 && ncolumns > 1)
- {
- pkey_buff = pkey_query;
- pkey_query = g_strconcat (pkey_query, ",", NULL);
- g_free (pkey_buff);
- }
+ GValue col_val = G_VALUE_INIT;
+ g_value_set_uint (g_value_init (&col_val, G_TYPE_UINT), column);
+ col = sql_value_new_with_value (&col_val);
+ g_value_unset (&col_val);
- buff_j = g_strdup_printf ("(%d,%d)"
- ,t_oid
- ,GPOINTER_TO_INT (g_ptr_array_index (col_num, j)));
- info_buff = info_query;
- info_query = g_strconcat (info_query, buff_j, NULL);
- g_free (buff_j);
- g_free (info_buff);
+ list = sql_list_new_with_items (SQL_TYPE_EXPR, tab, col, NULL);
+ sql_object_set (set, "exprs", SQL_OBJECT (list));
- info_buff = info_query;
- if (j < ncolumns-1 && ncolumns > 1)
- info_query = g_strconcat (info_query, ",", NULL);
- else
- info_query = g_strconcat (info_query, ")", NULL);
- g_free (info_buff);
+ sql_list_add (fields_list, set);
+
+ if (g_hash_table_insert (added_tables, &table_oid, NULL))
+ sql_list_add (tables_list, tab);
}
- pkey_buff = pkey_query;
- pkey_query = g_strconcat (pkey_query, ");", NULL);
- g_free (pkey_buff);
+ sql_batch_add (batch, "fields", fields_set);
+ sql_batch_add (batch, "tables", tables_set);
+ buff = info_query;
+ info_query = g_strconcat (buff,
+ db_plugin_render (DB_PLUGIN (obj), info_query_stmt, batch, NULL),
+ ";", NULL);
+ g_free (buff);
- info_buff = info_query;
- info_query = g_strconcat (info_query, ";", NULL);
- g_free (info_buff);
-
- info_buff = info_query;
- info_query = g_strconcat (info_query, pkey_query, NULL);
- g_free (info_buff);
- g_free (pkey_query);
+ g_hash_table_destroy (added_tables);
}
PGresult * res_col;
@@ -897,6 +871,195 @@ static void db_pg_value_render (SqlValue * obj, SqlRender * render, SqlBatch * b
sql_object_render (SQL_OBJECT (obj), render, batch);
}
+/*
+ * Called from the class initializer to set the file global variable
+ * 'info_query_stmt' which will be used to obtain information about the
+ * requested tables and fields in the db_pg_query method.
+ */
+static void db_pg_init_info_stmt ()
+{
+ SqlObject * select;
+ SqlList * list;
+ SqlSelectField * select_field;
+ SqlJoin * join;
+ SqlTarget * target;
+ SqlObject * and, * equal, * expr, * set,
+ * fields_holder, * tables_holder,
+ * oid_field = sql_field_new_with_target ("oid", "c", NULL),
+ * attrelid_field = sql_field_new ("attrelid"),
+ * attnum_field = sql_field_new ("attnum");
+
+ SqlList * stmts = sql_list_new (SQL_TYPE_STMT);
+ info_query_stmt = g_object_new (SQL_TYPE_MULTI_STMT, "stmts", stmts, NULL);
+
+ // Fields for the first SELECT
+
+ select = sql_select_new ();
+ sql_list_add (stmts, select);
+
+ list = sql_list_new (SQL_TYPE_SELECT_FIELD);
+
+ select_field = g_object_new (SQL_TYPE_SELECT_FIELD,
+ "expr", sql_field_new ("attname"), NULL);
+ sql_list_add (list, select_field);
+ select_field = g_object_new (SQL_TYPE_SELECT_FIELD,
+ "expr", attrelid_field, NULL);
+ sql_list_add (list, select_field);
+ select_field = g_object_new (SQL_TYPE_SELECT_FIELD,
+ "expr", sql_field_new ("attnotnull"), NULL);
+ sql_list_add (list, select_field);
+ select_field = g_object_new (SQL_TYPE_SELECT_FIELD,
+ "expr", sql_field_new ("adsrc"), NULL);
+ sql_list_add (list, select_field);
+ select_field = g_object_new (SQL_TYPE_SELECT_FIELD,
+ "expr", attnum_field, NULL);
+ sql_list_add (list, select_field);
+
+ sql_object_set (select, "fields", SQL_OBJECT (list));
+
+ // Target for the first SELECT
+
+ target = SQL_TARGET (sql_table_new ("pg_class", NULL));
+ sql_target_set_alias (target, "c");
+ join = SQL_JOIN (sql_join_new
+ (SQL_TARGET (sql_table_new ("pg_attribute", NULL)),
+ target,
+ SQL_JOIN_TYPE_INNER));
+
+ equal = sql_operation_new (SQL_OPERATION_TYPE_EQUAL);
+ list = sql_list_new_with_items (SQL_TYPE_EXPR,
+ oid_field,
+ attrelid_field,
+ NULL);
+ sql_operation_set_operands (SQL_OPERATION (equal), list);
+
+ sql_join_set_condition (join, SQL_EXPR (equal));
+
+ target = SQL_TARGET (sql_table_new ("pg_attrdef", NULL));
+ sql_target_set_alias (target, "a");
+ join = SQL_JOIN (sql_join_new
+ (SQL_TARGET (join),
+ target,
+ SQL_JOIN_TYPE_LEFT));
+
+ equal = sql_operation_new (SQL_OPERATION_TYPE_EQUAL);
+ list = sql_list_new_with_items (SQL_TYPE_EXPR,
+ sql_field_new_with_target ("adrelid", "a", NULL),
+ attrelid_field,
+ NULL);
+ sql_operation_set_operands (SQL_OPERATION (equal), list);
+
+ expr = sql_operation_new (SQL_OPERATION_TYPE_EQUAL);
+ list = sql_list_new_with_items (SQL_TYPE_EXPR,
+ sql_field_new_with_target ("adnum", "a", NULL),
+ attnum_field,
+ NULL);
+ sql_operation_set_operands (SQL_OPERATION (expr), list);
+
+ and = sql_operation_new (SQL_OPERATION_TYPE_AND);
+ list = sql_list_new_with_items (SQL_TYPE_EXPR, equal, expr, NULL);
+ sql_operation_set_operands (SQL_OPERATION (and), list);
+
+ sql_join_set_condition (join, SQL_EXPR (and));
+ list = sql_list_new_with_items (SQL_TYPE_TARGET, join, NULL);
+
+ sql_object_set (select, "targets", SQL_OBJECT (list));
+
+ // WHERE clause for the first SELECT
+
+ equal = sql_operation_new (SQL_OPERATION_TYPE_EQUAL);
+ GValue val = G_VALUE_INIT;
+ g_value_set_boolean (g_value_init (&val, G_TYPE_BOOLEAN), FALSE);
+ list = sql_list_new_with_items (SQL_TYPE_EXPR,
+ sql_field_new ("attisdropped"),
+ sql_value_new_with_value (&val),
+ NULL);
+ sql_operation_set_operands (SQL_OPERATION (equal), list);
+ g_value_unset (&val);
+
+ expr = sql_operation_new (SQL_OPERATION_TYPE_IN);
+
+ set = sql_set_new ();
+ list = sql_list_new_with_items (SQL_TYPE_EXPR,
+ oid_field,
+ attnum_field,
+ NULL);
+ sql_object_set (set, "exprs", SQL_OBJECT (list));
+ fields_holder = sql_holder_new ("fields");
+
+ list = sql_list_new_with_items (SQL_TYPE_EXPR,
+ set,
+ fields_holder,
+ NULL);
+ sql_operation_set_operands (SQL_OPERATION (expr), list);
+
+ and = sql_operation_new (SQL_OPERATION_TYPE_AND);
+ list = sql_list_new_with_items (SQL_TYPE_EXPR, equal, expr, NULL);
+ sql_operation_set_operands (SQL_OPERATION (and), list);
+
+ sql_dml_set_where (SQL_DML (select), and);
+
+ // Fields for the second SELECT
+
+ select = sql_select_new ();
+ sql_list_add (stmts, select);
+
+ list = sql_list_new (SQL_TYPE_SELECT_FIELD);
+
+ select_field = g_object_new (SQL_TYPE_SELECT_FIELD,
+ "expr", oid_field, NULL);
+ sql_list_add (list, select_field);
+ select_field = g_object_new (SQL_TYPE_SELECT_FIELD,
+ "expr", sql_field_new ("relname"), NULL);
+ sql_list_add (list, select_field);
+ select_field = g_object_new (SQL_TYPE_SELECT_FIELD,
+ "expr", sql_field_new ("indkey"), NULL);
+ sql_list_add (list, select_field);
+
+ sql_object_set (select, "fields", SQL_OBJECT (list));
+
+ // Target for the second SELECT
+
+ join = SQL_JOIN (sql_join_new (NULL, NULL, SQL_JOIN_TYPE_LEFT));
+ target = SQL_TARGET (sql_table_new ("pg_class", NULL));
+ sql_target_set_alias (target, "c");
+ sql_join_set_target_left (join, target);
+ target = SQL_TARGET (sql_table_new ("pg_index", NULL));
+ sql_target_set_alias (target, "i");
+ sql_join_set_target_right (join, target);
+
+ equal = sql_operation_new (SQL_OPERATION_TYPE_EQUAL);
+ list = sql_list_new_with_items (SQL_TYPE_EXPR,
+ sql_field_new ("indrelid"),
+ oid_field,
+ NULL);
+ sql_operation_set_operands (SQL_OPERATION (equal), list);
+
+ and = sql_operation_new (SQL_OPERATION_TYPE_AND);
+ list = sql_list_new_with_items (SQL_TYPE_EXPR,
+ equal,
+ sql_field_new ("indisprimary"),
+ NULL);
+ sql_operation_set_operands (SQL_OPERATION (and), list);
+
+ sql_join_set_condition (join, SQL_EXPR (and));
+ list = sql_list_new_with_items (SQL_TYPE_TARGET, join, NULL);
+
+ sql_object_set (select, "targets", SQL_OBJECT (list));
+
+ // WHERE clause for the first SELECT
+
+ expr = sql_operation_new (SQL_OPERATION_TYPE_IN);
+ tables_holder = sql_holder_new ("tables");
+ list = sql_list_new_with_items (SQL_TYPE_EXPR,
+ oid_field,
+ tables_holder,
+ NULL);
+ sql_operation_set_operands (SQL_OPERATION (expr), list);
+
+ sql_dml_set_where (SQL_DML (select), expr);
+}
+
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Class
static void db_pg_init (DbPg * obj)
@@ -918,4 +1081,6 @@ static void db_pg_class_init (DbPgClass * k)
klass->set_ssl = (DbPluginSetSSL) db_pg_set_ssl;
klass->query = db_pg_query;
klass->kill_query = (DbPluginKillQueryFunc) db_pg_kill_query;
+
+ db_pg_init_info_stmt ();
}
diff --git a/plugin/sqlite/db-sqlite.c b/plugin/sqlite/db-sqlite.c
index 4c0def7..a4d809b 100644
--- a/plugin/sqlite/db-sqlite.c
+++ b/plugin/sqlite/db-sqlite.c
@@ -218,7 +218,7 @@ static DbResultSet * db_sqlite_query (DbSqlite * self, const gchar * sql, GError
static void db_sqlite_kill_query (DbSqlite * self)
{
- g_warning ("DbSqlite: Kill doesn't supported by this plugin");
+ g_warning ("DbSqlite: Kill not supported by this plugin");
}
static void db_sqlite_value_render (SqlValue * self, SqlRender * render, SqlBatch * batch)
diff --git a/po/ca.po b/po/ca.po
index 4503225..70fa433 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -1,15 +1,15 @@
# Catalan translations for hedera package.
# Copyright (C) 2012 THE hedera'S COPYRIGHT HOLDER
# This file is distributed under the same license as the hedera package.
-# Alejandro T. Colombini Gómez , 2012.
+# Alejandro T. Colombini Gómez , 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: hedera 1.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-07-15 14:27+0200\n"
+"POT-Creation-Date: 2014-09-22 15:30+0200\n"
"PO-Revision-Date: 2013-06-04 13:38+0200\n"
-"Last-Translator: Alejandro T. Colombini Gómez \n"
+"Last-Translator: Alejandro T. Colombini Gómez \n"
"Language-Team: Catalan\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
@@ -31,88 +31,33 @@ msgstr "El parametre no pot ser nul"
msgid "Incompatible type for this param"
msgstr "Tipus incompatible per a aquest parametre"
-#: ../gvn/gvn-param.c:443 ../sql/sql-value.c:255 ../vn/vn-field.c:576
+#: ../gvn/gvn-param.c:285
msgid "Value"
msgstr ""
-#: ../gvn/gvn-param.c:444
+#: ../gvn/gvn-param.c:286
msgid "The value of the param"
msgstr ""
-#: ../gvn/gvn-param.c:450
+#: ../gvn/gvn-param.c:292
msgid "Master"
msgstr ""
-#: ../gvn/gvn-param.c:451
-msgid "The master GvnParam of this parameter"
-msgstr ""
+#: ../gvn/gvn-param.c:293
+#, fuzzy
+msgid "The master parameter"
+msgstr "Nom d'usuari"
-#: ../gvn/gvn-param.c:457 ../db/db-iterator.c:1062
-msgid "Mode"
-msgstr ""
-
-#: ../gvn/gvn-param.c:458
-msgid "The mode of the parameter"
-msgstr ""
-
-#: ../gvn/gvn-param.c:464
-msgid "Status"
-msgstr "Estat"
-
-#: ../gvn/gvn-param.c:465
-msgid "The current status of the parameter"
-msgstr ""
-
-#: ../gvn/gvn-param.c:471
-msgid "Spec"
-msgstr ""
-
-#: ../gvn/gvn-param.c:472
-msgid "The spec of the parameter"
-msgstr ""
-
-#: ../gvn/gvn-param.c:478 ../vn/vn-field.c:604
-msgid "Glib Type"
-msgstr ""
-
-#: ../gvn/gvn-param.c:479 ../vn/vn-field.c:605
-msgid "The type of the value"
-msgstr ""
-
-#: ../gvn/gvn-param.c:485 ../vn/vn-field.c:611 ../vn/vn-column.c:507
-msgid "Editable"
-msgstr ""
-
-#: ../gvn/gvn-param.c:486
-msgid "Whether the param value can be modified"
-msgstr ""
-
-#: ../gvn/gvn-param.c:492 ../vn/vn-field.c:618 ../vn/vn-column.c:514
-msgid "Null"
-msgstr ""
-
-#: ../gvn/gvn-param.c:493
-msgid "Whether the param value can be of type GVN_TYPE_NULL"
-msgstr ""
-
-#: ../gvn/gvn-param.c:499 ../vn/vn-field.c:625
-msgid "Default Value"
-msgstr ""
-
-#: ../gvn/gvn-param.c:500 ../vn/vn-field.c:626
-msgid "The default value"
-msgstr ""
-
-#: ../gvn/gvn-value.c:431
+#: ../gvn/gvn-value.c:434
#, c-format
msgid "Attempting to compare invalid types: %s\n"
-msgstr "S'ha intentat comparar tipus invà lids: %s\n"
+msgstr "S'ha intentat comparar tipus invà lids: %s\n"
-#: ../gvn/gvn-value.c:540
+#: ../gvn/gvn-value.c:543
msgid "Yes"
msgstr ""
-#: ../gvn/gvn-value.c:540
+#: ../gvn/gvn-value.c:543
msgid "No"
msgstr ""
@@ -124,19 +69,7 @@ msgstr ""
msgid "The character used for delimite the name of fields, tables..."
msgstr ""
-#: ../sql/sql-value.c:248 ../glade/glade-db-model.c:638
-msgid "Param"
-msgstr ""
-
-#: ../sql/sql-value.c:249
-msgid "The param which is linked"
-msgstr ""
-
-#: ../sql/sql-value.c:256
-msgid "The value"
-msgstr ""
-
-#: ../sql/sql-string.c:188 ../db/db-model.c:3315 ../db/db-request.c:449
+#: ../sql/sql-string.c:188 ../db/db-model.c:3337 ../db/db-request.c:449
msgid "SQL"
msgstr ""
@@ -324,102 +257,89 @@ msgstr ""
msgid "One of the possible options of #SqlSelectType"
msgstr ""
-#: ../plugin/mysql/db-mysql.c:68 ../plugin/pg/db-pg.c:111
+#: ../plugin/mysql/db-mysql.c:68 ../plugin/pg/db-pg.c:113
#, c-format
msgid "Can't allocate the needed memory"
msgstr ""
-#: ../db/db-iterator.c:1063
-msgid "The mode in which the iterator is working"
-msgstr ""
-
-#: ../db/db-iterator.c:1070
-#, fuzzy
-msgid "Remember selection"
-msgstr "Recordar"
-
-#: ../db/db-iterator.c:1071
-msgid "Wether to rememeber the selection when model is refreshed"
-msgstr ""
-
-#: ../db/db-model.c:3289 ../db/db-request.c:442 ../vn/vn-gui.c:1472
+#: ../db/db-model.c:3311 ../db/db-request.c:442 ../vn/vn-gui.c:1408
#: ../vn/vn-form.c:245
msgid "Connection"
msgstr ""
-#: ../db/db-model.c:3290
+#: ../db/db-model.c:3312
msgid "The DbConn that manages the connection to the database"
msgstr ""
-#: ../db/db-model.c:3297
+#: ../db/db-model.c:3319
msgid "Statement"
msgstr ""
-#: ../db/db-model.c:3298
+#: ../db/db-model.c:3320
msgid "The statement which retrieves the data"
msgstr ""
-#: ../db/db-model.c:3305
+#: ../db/db-model.c:3327
msgid "Use file"
msgstr ""
-#: ../db/db-model.c:3306
+#: ../db/db-model.c:3328
msgid ""
"If this is set to TRUE, the \"sql\" property will hold the name of a file "
"containing a query, if set to FALSE, \"sql\" is used as an SQL string"
msgstr ""
-#: ../db/db-model.c:3316
+#: ../db/db-model.c:3338
msgid ""
"Depending on the \"use-file\" property this will be the path to a file with "
"queries for the model or a SQL string"
msgstr ""
-#: ../db/db-model.c:3325
+#: ../db/db-model.c:3347
msgid "Main Table"
msgstr ""
-#: ../db/db-model.c:3326
+#: ../db/db-model.c:3348
msgid "The main table of the model"
msgstr ""
-#: ../db/db-model.c:3333
+#: ../db/db-model.c:3355
msgid "Update flags"
msgstr ""
-#: ../db/db-model.c:3334
+#: ../db/db-model.c:3356
msgid "The flags that indicate how a model can be modified"
msgstr ""
-#: ../db/db-model.c:3342
+#: ../db/db-model.c:3364
msgid "Result position"
msgstr ""
-#: ../db/db-model.c:3343
+#: ../db/db-model.c:3365
msgid ""
"The position where the query that will fill the model will be placed in a "
"multi-query"
msgstr ""
-#: ../db/db-model.c:3353
+#: ../db/db-model.c:3375
msgid "Partial delete"
msgstr ""
-#: ../db/db-model.c:3354
+#: ../db/db-model.c:3376
msgid ""
"When a row is deleted set all the fields from the table to null rather than "
"delete it."
msgstr ""
-#: ../db/db-model.c:3362
+#: ../db/db-model.c:3384
msgid "Batch"
msgstr ""
-#: ../db/db-model.c:3363
+#: ../db/db-model.c:3385
msgid "The batch assigned to the model"
msgstr ""
-#: ../db/db-model-holder.c:71 ../db/db-calc.c:405
+#: ../db/db-model-holder.c:71 ../db/db-calc.c:480
msgid "Model"
msgstr ""
@@ -427,64 +347,64 @@ msgstr ""
msgid "The model used by the holder"
msgstr ""
-#: ../db/db-calc.c:406
+#: ../db/db-calc.c:481
msgid "The model where the operations will be applied"
msgstr ""
-#: ../db/db-calc.c:413
+#: ../db/db-calc.c:487
msgid "Operation type"
msgstr ""
-#: ../db/db-calc.c:414
+#: ../db/db-calc.c:488
msgid "The type of the operation applied over the function"
msgstr ""
-#: ../db/db-calc.c:422
+#: ../db/db-calc.c:495
msgid "Function"
msgstr ""
-#: ../db/db-calc.c:423
+#: ../db/db-calc.c:496
msgid "The function to execute"
msgstr ""
-#: ../db/db-calc.c:429
+#: ../db/db-calc.c:501
msgid "Data"
msgstr ""
-#: ../db/db-calc.c:430
+#: ../db/db-calc.c:502
msgid "The user provided data for the function"
msgstr ""
-#: ../db/db-calc.c:436 ../db/db-param.c:258 ../vn/vn-column.c:493
+#: ../db/db-calc.c:507 ../db/db-param.c:335 ../vn/vn-column.c:493
msgid "Column index"
msgstr ""
-#: ../db/db-calc.c:437
+#: ../db/db-calc.c:508
msgid "A column to apply the operations over it"
msgstr ""
-#: ../db/db-calc.c:446 ../db/db-param.c:265 ../vn/vn-field.c:597
+#: ../db/db-calc.c:516 ../db/db-param.c:342 ../vn/vn-field.c:583
#: ../vn/vn-column.c:500
msgid "Column name"
msgstr "Nom de la columna"
-#: ../db/db-calc.c:447
+#: ../db/db-calc.c:517
msgid "A column name to apply the operations over it"
msgstr ""
-#: ../db/db-param.c:251 ../vn/vn-grid.c:421 ../vn/vn-field.c:590
+#: ../db/db-param.c:328 ../vn/vn-field.c:576
msgid "Iterator"
msgstr ""
-#: ../db/db-param.c:252
+#: ../db/db-param.c:329
msgid "The iterator owner of param"
msgstr ""
-#: ../db/db-param.c:259
+#: ../db/db-param.c:336
msgid "The referenced column index"
msgstr ""
-#: ../db/db-param.c:266 ../vn/vn-column.c:501
+#: ../db/db-param.c:343 ../vn/vn-column.c:501
msgid "The referenced column name"
msgstr "Nom de la columna referenciada"
@@ -524,7 +444,7 @@ msgstr ""
msgid "The path where query files are located"
msgstr ""
-#: ../db/db-conn.c:1062 ../db/db-file-loader.c:716
+#: ../db/db-conn.c:1062 ../db/db-file-loader.c:719
#: ../vn/column/vn-column-image.c:498
msgid "Host"
msgstr ""
@@ -533,7 +453,7 @@ msgstr ""
msgid "The host name to connect to"
msgstr ""
-#: ../db/db-conn.c:1069
+#: ../db/db-conn.c:1069 ../vn/gui/login.glade.h:2
msgid "User"
msgstr "Usuari"
@@ -578,167 +498,163 @@ msgstr ""
msgid "The GError, if an error ocurred"
msgstr ""
-#: ../db/db-file-loader.c:330
+#: ../db/db-file-loader.c:333
#, c-format
msgid "%s not cached"
msgstr ""
-#: ../db/db-file-loader.c:426
+#: ../db/db-file-loader.c:429
#, c-format
msgid "Unknown content length of file %s"
msgstr ""
-#: ../db/db-file-loader.c:717 ../vn/column/vn-column-image.c:499
+#: ../db/db-file-loader.c:720 ../vn/column/vn-column-image.c:499
msgid "The host web server name to get the images"
msgstr ""
-#: ../db/db-file-loader.c:724 ../vn/column/vn-column-image.c:506
+#: ../db/db-file-loader.c:727 ../vn/column/vn-column-image.c:506
msgid "Path"
msgstr ""
-#: ../db/db-file-loader.c:725
+#: ../db/db-file-loader.c:728
msgid "The path of the directory to interact with"
msgstr ""
-#: ../db/db-file-loader.c:732
+#: ../db/db-file-loader.c:735
msgid "Cache directory"
msgstr ""
-#: ../db/db-file-loader.c:733
+#: ../db/db-file-loader.c:736
msgid ""
"The local directory where the downloaded files will be stored. The default "
"cache directory is 'hedera', under g_get_user_cache_dir()."
msgstr ""
-#: ../db/db-file-loader.c:741
+#: ../db/db-file-loader.c:744
msgid "Maximal cache size"
msgstr ""
-#: ../db/db-file-loader.c:742
+#: ../db/db-file-loader.c:745
msgid "The maximal size for the contents of the cache directory"
msgstr ""
-#: ../vn/vn-gui.c:545
+#: ../vn/vn-gui.c:530
msgid "Connection has been lost. Do you want to reconnect?"
msgstr ""
-#: ../vn/vn-gui.c:552
+#: ../vn/vn-gui.c:537
msgid "An error occurred in the connection."
msgstr ""
-#: ../vn/vn-gui.c:555
+#: ../vn/vn-gui.c:540
msgid "Database error"
msgstr ""
-#: ../vn/vn-gui.c:562
+#: ../vn/vn-gui.c:547
msgid "Unknown error"
msgstr ""
-#: ../vn/vn-gui.c:910
+#: ../vn/vn-gui.c:550
+msgid "Colse all"
+msgstr ""
+
+#: ../vn/vn-gui.c:909
msgid "Closing connection"
msgstr ""
-#: ../vn/vn-gui.c:912
+#: ../vn/vn-gui.c:911
msgid "Transaction started"
msgstr ""
-#: ../vn/vn-gui.c:914
+#: ../vn/vn-gui.c:913
msgid "Connecting"
msgstr ""
-#: ../vn/vn-gui.c:916
+#: ../vn/vn-gui.c:915
msgid "Connection lost"
msgstr ""
-#: ../vn/vn-gui.c:918
+#: ../vn/vn-gui.c:917
msgid "Connection closed"
msgstr ""
-#: ../vn/vn-gui.c:920 ../vn/field/vn-http-image.c:119
+#: ../vn/vn-gui.c:919 ../vn/field/vn-http-image.c:119
msgid "Loading"
msgstr ""
-#: ../vn/vn-gui.c:922
+#: ../vn/vn-gui.c:921
msgid "Ready"
msgstr ""
-#: ../vn/vn-gui.c:1473
+#: ../vn/vn-gui.c:1409
msgid "The connection used by Gui"
msgstr ""
-#: ../vn/vn-gui.c:1479
+#: ../vn/vn-gui.c:1415 ../vn/vn-login.c:611
msgid "Application"
msgstr ""
-#: ../vn/vn-gui.c:1480
+#: ../vn/vn-gui.c:1416
msgid "The application handler for the entire program"
msgstr ""
-#: ../vn/vn-grid.c:422
-msgid "The iterator used by VnGrid"
-msgstr ""
-
#: ../vn/vn-handler.c:74
msgid "Are you sure you want to delete the current selection?"
msgstr ""
-#: ../vn/vn-handler.c:82
-msgid "Are you sure you want to save the changes?"
-msgstr ""
-
-#: ../vn/vn-handler.c:88
+#: ../vn/vn-handler.c:85
msgid "Are you sure you want to undo all changes?"
msgstr ""
-#: ../vn/vn-handler.c:214
+#: ../vn/vn-handler.c:213
msgid "Undo changes"
msgstr ""
-#: ../vn/vn-handler.c:217
+#: ../vn/vn-handler.c:216
msgid "Save changes"
msgstr ""
-#: ../vn/vn-handler.c:220
+#: ../vn/vn-handler.c:219
msgid "Refresh data"
msgstr ""
-#: ../vn/vn-handler.c:223
+#: ../vn/vn-handler.c:222
msgid "Remove record"
msgstr ""
-#: ../vn/vn-handler.c:226
+#: ../vn/vn-handler.c:225
msgid "Add record"
msgstr ""
-#: ../vn/vn-handler.c:229
+#: ../vn/vn-handler.c:228
msgid "Move to the first row"
msgstr ""
-#: ../vn/vn-handler.c:232
+#: ../vn/vn-handler.c:231
msgid "Move to the previous row"
msgstr ""
-#: ../vn/vn-handler.c:235
+#: ../vn/vn-handler.c:234
msgid "Move to the next row"
msgstr ""
-#: ../vn/vn-handler.c:238
+#: ../vn/vn-handler.c:237
msgid "Move to the last row"
msgstr ""
-#: ../vn/vn-handler.c:531
+#: ../vn/vn-handler.c:534
msgid "Show flags"
msgstr ""
-#: ../vn/vn-handler.c:532
+#: ../vn/vn-handler.c:535
msgid "Sets the buttons that will be shown on the interface"
msgstr ""
-#: ../vn/vn-handler.c:539
+#: ../vn/vn-handler.c:542
msgid "Simple record"
msgstr ""
-#: ../vn/vn-handler.c:540
+#: ../vn/vn-handler.c:543
msgid "Sets if it is used to handle a iterator with a single record"
msgstr ""
@@ -766,100 +682,111 @@ msgstr ""
msgid "The module"
msgstr ""
-#: ../vn/vn-login.c:292 ../vn/vn-login.c:294
+#: ../vn/vn-login.c:396 ../vn/vn-login.c:398 ../vn/vn-login.c:490
msgid "Login error"
msgstr ""
-#: ../vn/vn-login.c:350
+#: ../vn/vn-login.c:456
#, c-format
msgid "Bad connection settings, please check it."
msgstr ""
-#: ../vn/vn-login.c:489
-msgid "Application id"
+#: ../vn/vn-login.c:488
+msgid "Please select a connection"
msgstr ""
-#: ../vn/vn-login.c:490
-msgid "The application identifier"
+#: ../vn/vn-login.c:612
+msgid "The application"
msgstr ""
#: ../vn/vn-field.c:577
-msgid "The current value of the field"
-msgstr ""
-
-#: ../vn/vn-field.c:583 ../glade/glade-db-iterator.c:71
-#: ../glade/glade-db-iterator.c:116 ../glade/glade-sql-batch.c:445
-msgid "Parameter"
-msgstr ""
-
-#: ../vn/vn-field.c:584
-msgid "The param where the field can read/write its value"
-msgstr ""
-
-#: ../vn/vn-field.c:591
msgid "The iterator used to get the field param"
msgstr ""
-#: ../vn/vn-field.c:598
+#: ../vn/vn-field.c:584
msgid "The column name on the iterator"
msgstr ""
-#: ../vn/vn-field.c:612
+#: ../vn/vn-field.c:590
+msgid "Glib Type"
+msgstr ""
+
+#: ../vn/vn-field.c:591
+msgid "The type of the value"
+msgstr ""
+
+#: ../vn/vn-field.c:597 ../vn/vn-column.c:507
+msgid "Editable"
+msgstr ""
+
+#: ../vn/vn-field.c:598
msgid "Whether the field value is user editable"
msgstr ""
-#: ../vn/vn-field.c:619 ../vn/vn-column.c:515
+#: ../vn/vn-field.c:604 ../vn/vn-column.c:514
+msgid "Null"
+msgstr ""
+
+#: ../vn/vn-field.c:605 ../vn/vn-column.c:515
msgid "Whether the field value can be of type GVN_TYPE_NULL"
msgstr ""
-#: ../vn/vn-field.c:632 ../vn/vn-column.c:528
+#: ../vn/vn-field.c:611
+msgid "Default Value"
+msgstr ""
+
+#: ../vn/vn-field.c:612
+msgid "The default value"
+msgstr ""
+
+#: ../vn/vn-field.c:618 ../vn/vn-column.c:528
msgid "Style function"
msgstr ""
-#: ../vn/vn-field.c:633
+#: ../vn/vn-field.c:619
msgid ""
"A VnFieldStyleFunc to set the properties of each field depending on its value"
msgstr ""
-#: ../vn/field/vn-entry.c:156 ../vn/field/vn-date-chooser.c:477
-#: ../vn/field/vn-label.c:115 ../vn/column/vn-column-entry.c:127
+#: ../vn/field/vn-entry.c:157 ../vn/field/vn-date-chooser.c:479
+#: ../vn/field/vn-label.c:116 ../vn/column/vn-column-entry.c:127
msgid "Format"
msgstr ""
-#: ../vn/field/vn-entry.c:157 ../vn/field/vn-label.c:116
+#: ../vn/field/vn-entry.c:158 ../vn/field/vn-label.c:117
#: ../vn/column/vn-column-entry.c:128
msgid "The format string describing the output of the entry."
msgstr ""
-#: ../vn/field/vn-spin.c:171 ../vn/column/vn-column-spin.c:201
+#: ../vn/field/vn-spin.c:174 ../vn/column/vn-column-spin.c:202
msgid "Digits"
msgstr ""
-#: ../vn/field/vn-spin.c:172 ../vn/column/vn-column-spin.c:202
+#: ../vn/field/vn-spin.c:175 ../vn/column/vn-column-spin.c:203
msgid "The number of decimal places to display."
msgstr ""
-#: ../vn/field/vn-combo.c:286 ../vn/column/vn-column-combo.c:340
+#: ../vn/field/vn-combo.c:298 ../vn/column/vn-column-combo.c:340
msgid "Index column"
msgstr ""
-#: ../vn/field/vn-combo.c:287 ../vn/column/vn-column-combo.c:341
+#: ../vn/field/vn-combo.c:299 ../vn/column/vn-column-combo.c:341
msgid "The column index of the model"
msgstr ""
-#: ../vn/field/vn-combo.c:293 ../vn/column/vn-column-combo.c:347
+#: ../vn/field/vn-combo.c:305 ../vn/column/vn-column-combo.c:347
msgid "Show column"
msgstr ""
-#: ../vn/field/vn-combo.c:294 ../vn/column/vn-column-combo.c:348
+#: ../vn/field/vn-combo.c:306 ../vn/column/vn-column-combo.c:348
msgid "The column of the model shown by combo"
msgstr ""
-#: ../vn/field/vn-completion.c:332
+#: ../vn/field/vn-completion.c:334
msgid "Field"
msgstr ""
-#: ../vn/field/vn-completion.c:333
+#: ../vn/field/vn-completion.c:335
msgid "The name of the field used for the search"
msgstr ""
@@ -867,30 +794,30 @@ msgstr ""
msgid "Change date"
msgstr ""
-#: ../vn/field/vn-date-chooser.c:478
+#: ../vn/field/vn-date-chooser.c:480
msgid "The date format string describing the order of the elements."
msgstr ""
-#: ../vn/field/vn-date-chooser.c:479
+#: ../vn/field/vn-date-chooser.c:481
msgctxt "Default date format string"
msgid "%a, %d %b %Y"
msgstr ""
-#: ../vn/field/vn-date-chooser.c:485
+#: ../vn/field/vn-date-chooser.c:487
msgid "Show time"
msgstr ""
-#: ../vn/field/vn-date-chooser.c:486
+#: ../vn/field/vn-date-chooser.c:488
msgid ""
"Whether to show the hour, minute and second fields to set the time of the "
"day in the popup."
msgstr ""
-#: ../vn/field/vn-date-chooser.c:494
+#: ../vn/field/vn-date-chooser.c:496
msgid "Show date"
msgstr ""
-#: ../vn/field/vn-date-chooser.c:495
+#: ../vn/field/vn-date-chooser.c:497
msgid "Whether to show the calendar to set the date in the popup."
msgstr ""
@@ -907,32 +834,32 @@ msgid "File loader already set"
msgstr ""
#. Se usará para subir imagenes y cambiar nombres, o abrir un menu contextual
-#. g_signal_connect (obj, "event", G_CALLBACK (vn_http_image_cb_event), obj);
+#. g_signal_connect (self, "event", G_CALLBACK (vn_http_image_on_event), self);
#: ../vn/field/vn-http-image.c:184
msgid "No image set"
msgstr ""
-#: ../vn/field/vn-http-image.c:211 ../vn/column/vn-column-image.c:536
+#: ../vn/field/vn-http-image.c:212 ../vn/column/vn-column-image.c:536
msgid "File loader"
msgstr ""
-#: ../vn/field/vn-http-image.c:212
+#: ../vn/field/vn-http-image.c:213
msgid "A DbFileLoader, used to download the files"
msgstr ""
-#: ../vn/field/vn-http-image.c:219
+#: ../vn/field/vn-http-image.c:220
msgid "File path"
msgstr ""
-#: ../vn/field/vn-http-image.c:220
+#: ../vn/field/vn-http-image.c:221
msgid "The relative path to the image from file loader path"
msgstr ""
-#: ../vn/field/vn-http-image.c:227
+#: ../vn/field/vn-http-image.c:228
msgid "Image bytes"
msgstr ""
-#: ../vn/field/vn-http-image.c:228
+#: ../vn/field/vn-http-image.c:229
msgid "A GBytes structure with the image data"
msgstr ""
@@ -996,19 +923,17 @@ msgstr ""
#: ../vn/gui/login.glade.h:1
#, fuzzy
msgid "Access"
-msgstr "Accés"
-
-#: ../vn/gui/login.glade.h:2
-msgid "User:"
-msgstr "Usuari:"
+msgstr "Accés"
#: ../vn/gui/login.glade.h:3
-msgid "Password:"
+#, fuzzy
+msgid "Show password"
msgstr "Contrasenya:"
#: ../vn/gui/login.glade.h:4
-msgid "Press here to see the password"
-msgstr ""
+#, fuzzy
+msgid "Password"
+msgstr "Contrasenya:"
#: ../vn/gui/login.glade.h:5
msgid "Remember"
@@ -1019,11 +944,11 @@ msgid "Configuration"
msgstr ""
#: ../vn/gui/login.glade.h:7
-msgid "Plugin:"
+msgid "Connections"
msgstr ""
#: ../vn/gui/login.glade.h:8
-msgid "Host:"
+msgid "SSL CA:"
msgstr ""
#: ../vn/gui/login.glade.h:9
@@ -1031,15 +956,27 @@ msgid "Schema:"
msgstr ""
#: ../vn/gui/login.glade.h:10
-msgid "SSL CA:"
+msgid "Host:"
msgstr ""
#: ../vn/gui/login.glade.h:11
+msgid "Plugin:"
+msgstr ""
+
+#: ../vn/gui/login.glade.h:12
msgid ""
"Path to the file containing the CA certificate, if this is empty SSL won't "
"be used"
msgstr ""
+#: ../vn/gui/login.glade.h:13
+msgid "Name:"
+msgstr ""
+
+#: ../vn/gui/login.glade.h:14
+msgid "User:"
+msgstr "Usuari:"
+
#: ../vn/gui/main.glade.h:1
msgid "Copyright - Verdnatura Levante S. L."
msgstr "Copyright - Verdnatura Levante S. L."
@@ -1152,6 +1089,10 @@ msgstr ""
msgid "Column"
msgstr ""
+#: ../glade/glade-db-model.c:638
+msgid "Param"
+msgstr ""
+
#: ../glade/glade-db-model.c:646
msgctxt "Verb"
msgid "Link"
@@ -1181,33 +1122,38 @@ msgstr ""
msgid "Edit Model"
msgstr ""
-#: ../glade/glade-db-iterator.c:73
-msgid "Properties"
-msgstr ""
-
-#: ../glade/glade-db-iterator.c:124
-msgid "Iterator Editor"
-msgstr ""
-
-#: ../glade/glade-db-iterator.c:132
+#: ../glade/glade-db-iterator.c:99
msgid "The model must have \"SQL\" set and \"Use file\" set to 'No'."
msgstr ""
-#: ../glade/glade-db-iterator.c:144
+#: ../glade/glade-db-iterator.c:111
#, c-format
msgid "%s can't have children before automatic generation."
msgstr ""
-#: ../glade/glade-db-iterator.c:155
+#: ../glade/glade-db-iterator.c:121
#, c-format
msgid "%s must have \"Model\" set. %s"
msgstr ""
-#: ../glade/glade-db-iterator.c:180
+#: ../glade/glade-db-iterator.c:147
#, c-format
msgid "Automatic generation of params for %s"
msgstr ""
+#: ../glade/glade-db-iterator.c:198 ../glade/glade-db-iterator.c:220
+#: ../glade/glade-sql-batch.c:445
+msgid "Parameter"
+msgstr ""
+
+#: ../glade/glade-db-iterator.c:200
+msgid "Properties"
+msgstr ""
+
+#: ../glade/glade-db-iterator.c:228
+msgid "Iterator Editor"
+msgstr ""
+
#: ../glade/glade-sql-batch.c:79
msgid "List of items"
msgstr ""
@@ -1234,6 +1180,13 @@ msgstr ""
#: ../module/data/example.xml.h:5
msgid ""
"\n"
+"\t\t\tShelfs\n"
+"\t\t"
+msgstr ""
+
+#: ../module/data/example.xml.h:8
+msgid ""
+"\n"
"\t\t\tCustomer\n"
"\t\t"
msgstr ""
@@ -1243,6 +1196,10 @@ msgid "Consulter"
msgstr ""
#: ../module/data/example-menu.xml.h:2
+msgid "Shelfs"
+msgstr ""
+
+#: ../module/data/example-menu.xml.h:3
msgid "Customer"
msgstr ""
@@ -1282,6 +1239,13 @@ msgstr ""
msgid "Immediate changes"
msgstr ""
+#~ msgid "Status"
+#~ msgstr "Estat"
+
+#, fuzzy
+#~ msgid "Remember selection"
+#~ msgstr "Recordar"
+
#~ msgid "Hedera"
#~ msgstr "Hedera"
@@ -1290,8 +1254,8 @@ msgstr ""
#, fuzzy
#~ msgid "Function vn_grid_model_set_sort_func not implemented"
-#~ msgstr "Funció vn_model_set_sort_func no implementada"
+#~ 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"
+#~ msgstr "Funció vn_model_set_default_sort_func no implementada"
diff --git a/po/es.po b/po/es.po
index 0051e0c..4fc4216 100644
--- a/po/es.po
+++ b/po/es.po
@@ -1,16 +1,16 @@
# Spanish translations for hedera package
-# Traducciones al español para el paquete hedera.
+# Traducciones al español para el paquete hedera.
# Copyright (C) 2012 THE hedera'S COPYRIGHT HOLDER
# This file is distributed under the same license as the hedera package.
-# Alejandro T. Colombini Gómez , 2012.
+# Alejandro T. Colombini Gómez , 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: hedera 1.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-07-15 14:27+0200\n"
+"POT-Creation-Date: 2014-09-22 15:30+0200\n"
"PO-Revision-Date: 2013-06-04 13:36+0200\n"
-"Last-Translator: Alejandro T. Colombini Gómez \n"
+"Last-Translator: Alejandro T. Colombini Gómez \n"
"Language-Team: Spanish\n"
"Language: es\n"
"MIME-Version: 1.0\n"
@@ -21,7 +21,7 @@ msgstr ""
#: ../gvn/gvn-param-spec.c:263
#, c-format
msgid "Param not editable"
-msgstr "Parametro no editable"
+msgstr "Parámetro no editable"
#: ../gvn/gvn-param-spec.c:268
#, c-format
@@ -31,90 +31,34 @@ msgstr "El parámetro no puede ser nulo"
#: ../gvn/gvn-param-spec.c:274
#, c-format
msgid "Incompatible type for this param"
-msgstr "Tipo incompatible para este parametro"
+msgstr "Tipo incompatible para este parámetro"
-#: ../gvn/gvn-param.c:443 ../sql/sql-value.c:255 ../vn/vn-field.c:576
+#: ../gvn/gvn-param.c:285
msgid "Value"
msgstr "Valor"
-#: ../gvn/gvn-param.c:444
+#: ../gvn/gvn-param.c:286
msgid "The value of the param"
msgstr "El valor del parámetro"
-#: ../gvn/gvn-param.c:450
+#: ../gvn/gvn-param.c:292
msgid "Master"
msgstr "Maestro"
-#: ../gvn/gvn-param.c:451
-msgid "The master GvnParam of this parameter"
-msgstr "El GvnParam maestro de este parámetro"
+#: ../gvn/gvn-param.c:293
+msgid "The master parameter"
+msgstr "El parámetro maestro"
-#: ../gvn/gvn-param.c:457 ../db/db-iterator.c:1062
-msgid "Mode"
-msgstr "Modo"
-
-#: ../gvn/gvn-param.c:458
-msgid "The mode of the parameter"
-msgstr "El modo del parámetro"
-
-#: ../gvn/gvn-param.c:464
-msgid "Status"
-msgstr "Estado"
-
-#: ../gvn/gvn-param.c:465
-msgid "The current status of the parameter"
-msgstr "El estado actual del parámetro"
-
-#: ../gvn/gvn-param.c:471
-msgid "Spec"
-msgstr "Spec"
-
-#: ../gvn/gvn-param.c:472
-msgid "The spec of the parameter"
-msgstr "Datos especÃficos del parámetro"
-
-#: ../gvn/gvn-param.c:478 ../vn/vn-field.c:604
-msgid "Glib Type"
-msgstr "Tipo Glib"
-
-#: ../gvn/gvn-param.c:479 ../vn/vn-field.c:605
-msgid "The type of the value"
-msgstr "El tipo del valor"
-
-#: ../gvn/gvn-param.c:485 ../vn/vn-field.c:611 ../vn/vn-column.c:507
-msgid "Editable"
-msgstr "Editable"
-
-#: ../gvn/gvn-param.c:486
-msgid "Whether the param value can be modified"
-msgstr "Indica si el parámetro puede modificarse"
-
-#: ../gvn/gvn-param.c:492 ../vn/vn-field.c:618 ../vn/vn-column.c:514
-msgid "Null"
-msgstr "Nulo"
-
-#: ../gvn/gvn-param.c:493
-msgid "Whether the param value can be of type GVN_TYPE_NULL"
-msgstr "Indica si el parámetro puede ser nulo"
-
-#: ../gvn/gvn-param.c:499 ../vn/vn-field.c:625
-msgid "Default Value"
-msgstr "Valor por defecto"
-
-#: ../gvn/gvn-param.c:500 ../vn/vn-field.c:626
-msgid "The default value"
-msgstr "El valor por defecto"
-
-#: ../gvn/gvn-value.c:431
+#: ../gvn/gvn-value.c:434
#, c-format
msgid "Attempting to compare invalid types: %s\n"
msgstr "Se ha intentado comparar tipos incompatibles: %s\n"
-#: ../gvn/gvn-value.c:540
+#: ../gvn/gvn-value.c:543
msgid "Yes"
-msgstr "SÃ"
+msgstr "SÃÂ"
-#: ../gvn/gvn-value.c:540
+#: ../gvn/gvn-value.c:543
msgid "No"
msgstr "No"
@@ -126,19 +70,7 @@ msgstr "Delimitador"
msgid "The character used for delimite the name of fields, tables..."
msgstr "El carácter usado para delimitar los nombres de campos, tablas..."
-#: ../sql/sql-value.c:248 ../glade/glade-db-model.c:638
-msgid "Param"
-msgstr "Parámetro"
-
-#: ../sql/sql-value.c:249
-msgid "The param which is linked"
-msgstr "El parametro al cual está vinculado"
-
-#: ../sql/sql-value.c:256
-msgid "The value"
-msgstr "Valor"
-
-#: ../sql/sql-string.c:188 ../db/db-model.c:3315 ../db/db-request.c:449
+#: ../sql/sql-string.c:188 ../db/db-model.c:3337 ../db/db-request.c:449
msgid "SQL"
msgstr "SQL"
@@ -322,46 +254,33 @@ msgstr "Tipo"
msgid "One of the possible options of #SqlSelectType"
msgstr "Una de las posibles opciones de #SqlSelectType"
-#: ../plugin/mysql/db-mysql.c:68 ../plugin/pg/db-pg.c:111
+#: ../plugin/mysql/db-mysql.c:68 ../plugin/pg/db-pg.c:113
#, c-format
msgid "Can't allocate the needed memory"
msgstr "No es posible asignar la memoria necesaria"
-#: ../db/db-iterator.c:1063
-msgid "The mode in which the iterator is working"
-msgstr "El modo en el que está trabajando el Iterator"
-
-#: ../db/db-iterator.c:1070
-msgid "Remember selection"
-msgstr "Recordar fila seleccionada"
-
-#: ../db/db-iterator.c:1071
-msgid "Wether to rememeber the selection when model is refreshed"
-msgstr ""
-"Si se recordará o no la fila seleccionado cuando se refresque el modelo"
-
-#: ../db/db-model.c:3289 ../db/db-request.c:442 ../vn/vn-gui.c:1472
+#: ../db/db-model.c:3311 ../db/db-request.c:442 ../vn/vn-gui.c:1408
#: ../vn/vn-form.c:245
msgid "Connection"
msgstr "Conexión"
-#: ../db/db-model.c:3290
+#: ../db/db-model.c:3312
msgid "The DbConn that manages the connection to the database"
msgstr "La DbConn que controla la conexión a la base de datos"
-#: ../db/db-model.c:3297
+#: ../db/db-model.c:3319
msgid "Statement"
msgstr "Consulta"
-#: ../db/db-model.c:3298
+#: ../db/db-model.c:3320
msgid "The statement which retrieves the data"
msgstr "La consulta que recupera los datos"
-#: ../db/db-model.c:3305
+#: ../db/db-model.c:3327
msgid "Use file"
msgstr "Usa fichero"
-#: ../db/db-model.c:3306
+#: ../db/db-model.c:3328
msgid ""
"If this is set to TRUE, the \"sql\" property will hold the name of a file "
"containing a query, if set to FALSE, \"sql\" is used as an SQL string"
@@ -369,7 +288,7 @@ msgstr ""
"Si es TRUE, la propiedad \"sql\" contiene el nombre de un archivo, si es "
"falso, \"sql\" se usa como una cadena SQL"
-#: ../db/db-model.c:3316
+#: ../db/db-model.c:3338
msgid ""
"Depending on the \"use-file\" property this will be the path to a file with "
"queries for the model or a SQL string"
@@ -377,27 +296,27 @@ msgstr ""
"Dependiendo de la propiedad \"use-file\", esta propiedad será la ruta a un "
"fichero con consultas para el modelo o una cadena SQL"
-#: ../db/db-model.c:3325
+#: ../db/db-model.c:3347
msgid "Main Table"
msgstr "Tabla principal"
-#: ../db/db-model.c:3326
+#: ../db/db-model.c:3348
msgid "The main table of the model"
msgstr "La tabla principal del modelo"
-#: ../db/db-model.c:3333
+#: ../db/db-model.c:3355
msgid "Update flags"
msgstr "Flags de actualización"
-#: ../db/db-model.c:3334
+#: ../db/db-model.c:3356
msgid "The flags that indicate how a model can be modified"
msgstr "Indican como se puede modificar el modelo"
-#: ../db/db-model.c:3342
+#: ../db/db-model.c:3364
msgid "Result position"
msgstr "Posición del resultado"
-#: ../db/db-model.c:3343
+#: ../db/db-model.c:3365
msgid ""
"The position where the query that will fill the model will be placed in a "
"multi-query"
@@ -405,11 +324,11 @@ msgstr ""
"La posición en la que se situa la consulta que pone datos en el modelo en "
"una consulta múltiple"
-#: ../db/db-model.c:3353
+#: ../db/db-model.c:3375
msgid "Partial delete"
msgstr "Delete parcial"
-#: ../db/db-model.c:3354
+#: ../db/db-model.c:3376
msgid ""
"When a row is deleted set all the fields from the table to null rather than "
"delete it."
@@ -417,15 +336,15 @@ msgstr ""
"Cuando una fila es eliminada, poner todos los campos de la tabla a nulo en "
"lugar de borrarla."
-#: ../db/db-model.c:3362
+#: ../db/db-model.c:3384
msgid "Batch"
msgstr "Batch"
-#: ../db/db-model.c:3363
+#: ../db/db-model.c:3385
msgid "The batch assigned to the model"
msgstr "El batch asignado al modelo"
-#: ../db/db-model-holder.c:71 ../db/db-calc.c:405
+#: ../db/db-model-holder.c:71 ../db/db-calc.c:480
msgid "Model"
msgstr "Modelo"
@@ -433,64 +352,64 @@ msgstr "Modelo"
msgid "The model used by the holder"
msgstr "La conexión empleada por el objeto"
-#: ../db/db-calc.c:406
+#: ../db/db-calc.c:481
msgid "The model where the operations will be applied"
msgstr "El modelo en el que se aplicarán las operaciones"
-#: ../db/db-calc.c:413
+#: ../db/db-calc.c:487
msgid "Operation type"
msgstr "Tipo de operación"
-#: ../db/db-calc.c:414
+#: ../db/db-calc.c:488
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:422
+#: ../db/db-calc.c:495
msgid "Function"
msgstr "Función"
-#: ../db/db-calc.c:423
+#: ../db/db-calc.c:496
msgid "The function to execute"
msgstr "Función a ejecutar"
-#: ../db/db-calc.c:429
+#: ../db/db-calc.c:501
msgid "Data"
msgstr "Datos"
-#: ../db/db-calc.c:430
+#: ../db/db-calc.c:502
msgid "The user provided data for the function"
msgstr "Datos proporcionados por el usuario"
-#: ../db/db-calc.c:436 ../db/db-param.c:258 ../vn/vn-column.c:493
+#: ../db/db-calc.c:507 ../db/db-param.c:335 ../vn/vn-column.c:493
msgid "Column index"
msgstr "Posición"
-#: ../db/db-calc.c:437
+#: ../db/db-calc.c:508
msgid "A column to apply the operations over it"
msgstr "Una columna sobre la que se aplicarán las operaciones"
-#: ../db/db-calc.c:446 ../db/db-param.c:265 ../vn/vn-field.c:597
+#: ../db/db-calc.c:516 ../db/db-param.c:342 ../vn/vn-field.c:583
#: ../vn/vn-column.c:500
msgid "Column name"
msgstr "Nombre de la columna"
-#: ../db/db-calc.c:447
+#: ../db/db-calc.c:517
msgid "A column name to apply the operations over it"
msgstr "Nombre de la columna sobre la que se aplicarán las operaciones"
-#: ../db/db-param.c:251 ../vn/vn-grid.c:421 ../vn/vn-field.c:590
+#: ../db/db-param.c:328 ../vn/vn-field.c:576
msgid "Iterator"
msgstr "Iterator"
-#: ../db/db-param.c:252
+#: ../db/db-param.c:329
msgid "The iterator owner of param"
msgstr "El Iterator dueño del parámetro"
-#: ../db/db-param.c:259
+#: ../db/db-param.c:336
msgid "The referenced column index"
msgstr "La posición de la columna en el Grid"
-#: ../db/db-param.c:266 ../vn/vn-column.c:501
+#: ../db/db-param.c:343 ../vn/vn-column.c:501
msgid "The referenced column name"
msgstr ""
"El nombre del campo en el Iterator vinculado al Grid al que pretenece la "
@@ -532,7 +451,7 @@ msgstr "Ruta de consultas"
msgid "The path where query files are located"
msgstr "La ruta donde se encuentran los archivos de consultas"
-#: ../db/db-conn.c:1062 ../db/db-file-loader.c:716
+#: ../db/db-conn.c:1062 ../db/db-file-loader.c:719
#: ../vn/column/vn-column-image.c:498
msgid "Host"
msgstr "Host"
@@ -541,7 +460,7 @@ msgstr "Host"
msgid "The host name to connect to"
msgstr "El nombre del host al que se conectará"
-#: ../db/db-conn.c:1069
+#: ../db/db-conn.c:1069 ../vn/gui/login.glade.h:2
msgid "User"
msgstr "Usuario"
@@ -586,169 +505,165 @@ msgstr "Error"
msgid "The GError, if an error ocurred"
msgstr "El GError, si ha habido algún error"
-#: ../db/db-file-loader.c:330
+#: ../db/db-file-loader.c:333
#, c-format
msgid "%s not cached"
msgstr "No se ha guardado %s en la cache"
-#: ../db/db-file-loader.c:426
+#: ../db/db-file-loader.c:429
#, c-format
msgid "Unknown content length of file %s"
msgstr "Longitud del contenido del archivo %s desconocida"
-#: ../db/db-file-loader.c:717 ../vn/column/vn-column-image.c:499
+#: ../db/db-file-loader.c:720 ../vn/column/vn-column-image.c:499
msgid "The host web server name to get the images"
msgstr "El nombre del servidor web al que se conectará"
-#: ../db/db-file-loader.c:724 ../vn/column/vn-column-image.c:506
+#: ../db/db-file-loader.c:727 ../vn/column/vn-column-image.c:506
msgid "Path"
msgstr "Ruta"
-#: ../db/db-file-loader.c:725
+#: ../db/db-file-loader.c:728
msgid "The path of the directory to interact with"
msgstr "La ruta del directorio con el que se interactuará"
-#: ../db/db-file-loader.c:732
+#: ../db/db-file-loader.c:735
msgid "Cache directory"
msgstr "Directorio de caché"
-#: ../db/db-file-loader.c:733
+#: ../db/db-file-loader.c:736
msgid ""
"The local directory where the downloaded files will be stored. The default "
"cache directory is 'hedera', under g_get_user_cache_dir()."
msgstr ""
-"El directorio local en el cual se guardarán los archivos descargados.El "
-"directorio por defecto es 'hedera', debajo de g_get_user_cache_dir()."
+"El directorio local en el cual se guardarán los archivos descargados.Por "
+"defecto es 'hedera', debajo de g_get_user_cache_dir()."
-#: ../db/db-file-loader.c:741
+#: ../db/db-file-loader.c:744
msgid "Maximal cache size"
msgstr "Tamaño máximo de la caché"
-#: ../db/db-file-loader.c:742
+#: ../db/db-file-loader.c:745
msgid "The maximal size for the contents of the cache directory"
msgstr "El tamaño máximo para los contenidos del directorio de caché"
-#: ../vn/vn-gui.c:545
+#: ../vn/vn-gui.c:530
msgid "Connection has been lost. Do you want to reconnect?"
-msgstr "Se ha perdido la conexión. ¿Quieres reconectar?"
+msgstr "Se ha perdido la conexión. ¿Reconectar?"
-#: ../vn/vn-gui.c:552
+#: ../vn/vn-gui.c:537
msgid "An error occurred in the connection."
msgstr "Ha habido un error en la conexión."
-#: ../vn/vn-gui.c:555
+#: ../vn/vn-gui.c:540
msgid "Database error"
msgstr "Error en la base de datos"
-#: ../vn/vn-gui.c:562
+#: ../vn/vn-gui.c:547
msgid "Unknown error"
msgstr "Error desconocido"
-#: ../vn/vn-gui.c:910
+#: ../vn/vn-gui.c:550
+msgid "Colse all"
+msgstr "Cerrar todos"
+
+#: ../vn/vn-gui.c:909
msgid "Closing connection"
msgstr "Cerrando conexión"
-#: ../vn/vn-gui.c:912
+#: ../vn/vn-gui.c:911
msgid "Transaction started"
msgstr "Transacción iniciada"
-#: ../vn/vn-gui.c:914
+#: ../vn/vn-gui.c:913
msgid "Connecting"
msgstr "Conectando"
-#: ../vn/vn-gui.c:916
+#: ../vn/vn-gui.c:915
msgid "Connection lost"
msgstr "Conexión perdida"
-#: ../vn/vn-gui.c:918
+#: ../vn/vn-gui.c:917
msgid "Connection closed"
msgstr "Conexión cerrada"
-#: ../vn/vn-gui.c:920 ../vn/field/vn-http-image.c:119
+#: ../vn/vn-gui.c:919 ../vn/field/vn-http-image.c:119
msgid "Loading"
msgstr "Cargando"
-#: ../vn/vn-gui.c:922
+#: ../vn/vn-gui.c:921
msgid "Ready"
msgstr "Preparado"
-#: ../vn/vn-gui.c:1473
+#: ../vn/vn-gui.c:1409
msgid "The connection used by Gui"
msgstr "La conexión empleada por Gui"
-#: ../vn/vn-gui.c:1479
+#: ../vn/vn-gui.c:1415 ../vn/vn-login.c:611
msgid "Application"
msgstr "Aplicación"
-#: ../vn/vn-gui.c:1480
+#: ../vn/vn-gui.c:1416
msgid "The application handler for the entire program"
msgstr "El manejador de la aplicación para todo el programa"
-#: ../vn/vn-grid.c:422
-msgid "The iterator used by VnGrid"
-msgstr "El Iterator empleado por VnGrid"
-
#: ../vn/vn-handler.c:74
msgid "Are you sure you want to delete the current selection?"
msgstr "¿Estás seguro de que quieres eliminar los registros seleccionados?"
-#: ../vn/vn-handler.c:82
-msgid "Are you sure you want to save the changes?"
-msgstr "¿Estás seguro de que quieres guardar los cambios?"
-
-#: ../vn/vn-handler.c:88
+#: ../vn/vn-handler.c:85
msgid "Are you sure you want to undo all changes?"
msgstr "¿Estás seguro de que quieres deshacer todos los cambios?"
-#: ../vn/vn-handler.c:214
+#: ../vn/vn-handler.c:213
msgid "Undo changes"
msgstr "Deshacer cambios"
-#: ../vn/vn-handler.c:217
+#: ../vn/vn-handler.c:216
msgid "Save changes"
msgstr "Guardar cambios"
-#: ../vn/vn-handler.c:220
+#: ../vn/vn-handler.c:219
msgid "Refresh data"
msgstr "Refrescar datos"
-#: ../vn/vn-handler.c:223
+#: ../vn/vn-handler.c:222
msgid "Remove record"
msgstr "Eliminar registro"
-#: ../vn/vn-handler.c:226
+#: ../vn/vn-handler.c:225
msgid "Add record"
msgstr "Añadir registro"
-#: ../vn/vn-handler.c:229
+#: ../vn/vn-handler.c:228
msgid "Move to the first row"
msgstr "Mover a la primera fila"
-#: ../vn/vn-handler.c:232
+#: ../vn/vn-handler.c:231
msgid "Move to the previous row"
msgstr "Mover a la fila anterior"
-#: ../vn/vn-handler.c:235
+#: ../vn/vn-handler.c:234
msgid "Move to the next row"
msgstr "Mover a la siguiente fila"
-#: ../vn/vn-handler.c:238
+#: ../vn/vn-handler.c:237
msgid "Move to the last row"
msgstr "Mover a la última fila"
-#: ../vn/vn-handler.c:531
+#: ../vn/vn-handler.c:534
msgid "Show flags"
msgstr "Visibilidad"
-#: ../vn/vn-handler.c:532
+#: ../vn/vn-handler.c:535
msgid "Sets the buttons that will be shown on the interface"
msgstr "Indica los botones que se mostrarán en la interfaz"
-#: ../vn/vn-handler.c:539
+#: ../vn/vn-handler.c:542
msgid "Simple record"
msgstr "Registro simple"
-#: ../vn/vn-handler.c:540
+#: ../vn/vn-handler.c:543
msgid "Sets if it is used to handle a iterator with a single record"
msgstr "Indica si se utiliza para manejar solo un registro"
@@ -776,102 +691,113 @@ msgstr "Módulo"
msgid "The module"
msgstr "El módulo"
-#: ../vn/vn-login.c:292 ../vn/vn-login.c:294
+#: ../vn/vn-login.c:396 ../vn/vn-login.c:398 ../vn/vn-login.c:490
msgid "Login error"
msgstr "Error de acceso"
-#: ../vn/vn-login.c:350
+#: ../vn/vn-login.c:456
#, c-format
msgid "Bad connection settings, please check it."
-msgstr "Los parámetros de la conexión son incorrectos, compruébelos por favor."
+msgstr "Los parámetros de la conexión son incorrectos, compruébalos por favor."
-#: ../vn/vn-login.c:489
-msgid "Application id"
-msgstr "Id de la aplicación"
+#: ../vn/vn-login.c:488
+msgid "Please select a connection"
+msgstr "Por favor, selecciona una conexión"
-#: ../vn/vn-login.c:490
-msgid "The application identifier"
-msgstr "El identificador de la aplicación"
+#: ../vn/vn-login.c:612
+msgid "The application"
+msgstr "La aplicación"
#: ../vn/vn-field.c:577
-msgid "The current value of the field"
-msgstr "El valor actual del campo"
-
-#: ../vn/vn-field.c:583 ../glade/glade-db-iterator.c:71
-#: ../glade/glade-db-iterator.c:116 ../glade/glade-sql-batch.c:445
-msgid "Parameter"
-msgstr "Parámetro"
-
-#: ../vn/vn-field.c:584
-msgid "The param where the field can read/write its value"
-msgstr "El parámetro en el que el campo escribe/lee su valor"
-
-#: ../vn/vn-field.c:591
msgid "The iterator used to get the field param"
msgstr "El Iterator con el que se obtiene el parámetro"
-#: ../vn/vn-field.c:598
+#: ../vn/vn-field.c:584
msgid "The column name on the iterator"
msgstr "El nombre de la columna en el Iterator"
-#: ../vn/vn-field.c:612
+#: ../vn/vn-field.c:590
+msgid "Glib Type"
+msgstr "Tipo Glib"
+
+#: ../vn/vn-field.c:591
+msgid "The type of the value"
+msgstr "El tipo del valor"
+
+#: ../vn/vn-field.c:597 ../vn/vn-column.c:507
+msgid "Editable"
+msgstr "Editable"
+
+#: ../vn/vn-field.c:598
msgid "Whether the field value is user editable"
msgstr "Si el valor de campo puede ser editado por el usuario"
-#: ../vn/vn-field.c:619 ../vn/vn-column.c:515
+#: ../vn/vn-field.c:604 ../vn/vn-column.c:514
+msgid "Null"
+msgstr "Nulo"
+
+#: ../vn/vn-field.c:605 ../vn/vn-column.c:515
msgid "Whether the field value can be of type GVN_TYPE_NULL"
msgstr "Si el campo puede ser del tipo GVN_TYPE_NULL"
-#: ../vn/vn-field.c:632 ../vn/vn-column.c:528
+#: ../vn/vn-field.c:611
+msgid "Default Value"
+msgstr "Valor por defecto"
+
+#: ../vn/vn-field.c:612
+msgid "The default value"
+msgstr "El valor por defecto"
+
+#: ../vn/vn-field.c:618 ../vn/vn-column.c:528
msgid "Style function"
msgstr "Función de estilo"
-#: ../vn/vn-field.c:633
+#: ../vn/vn-field.c:619
msgid ""
"A VnFieldStyleFunc to set the properties of each field depending on its value"
msgstr ""
"Una VnFieldStyleFunc para configurar las propiedades de cada campo "
"dependiendo de su valor"
-#: ../vn/field/vn-entry.c:156 ../vn/field/vn-date-chooser.c:477
-#: ../vn/field/vn-label.c:115 ../vn/column/vn-column-entry.c:127
+#: ../vn/field/vn-entry.c:157 ../vn/field/vn-date-chooser.c:479
+#: ../vn/field/vn-label.c:116 ../vn/column/vn-column-entry.c:127
msgid "Format"
msgstr "Formato"
-#: ../vn/field/vn-entry.c:157 ../vn/field/vn-label.c:116
+#: ../vn/field/vn-entry.c:158 ../vn/field/vn-label.c:117
#: ../vn/column/vn-column-entry.c:128
msgid "The format string describing the output of the entry."
msgstr "La cadena de formato que describe la salida del campo de texto."
-#: ../vn/field/vn-spin.c:171 ../vn/column/vn-column-spin.c:201
+#: ../vn/field/vn-spin.c:174 ../vn/column/vn-column-spin.c:202
msgid "Digits"
-msgstr "DÃgitos"
+msgstr "DÃÂgitos"
-#: ../vn/field/vn-spin.c:172 ../vn/column/vn-column-spin.c:202
+#: ../vn/field/vn-spin.c:175 ../vn/column/vn-column-spin.c:203
msgid "The number of decimal places to display."
msgstr "El número de posiciones decimales que se muestran"
-#: ../vn/field/vn-combo.c:286 ../vn/column/vn-column-combo.c:340
+#: ../vn/field/vn-combo.c:298 ../vn/column/vn-column-combo.c:340
msgid "Index column"
msgstr "Columna Ãndice"
-#: ../vn/field/vn-combo.c:287 ../vn/column/vn-column-combo.c:341
+#: ../vn/field/vn-combo.c:299 ../vn/column/vn-column-combo.c:341
msgid "The column index of the model"
-msgstr "La columna Ãndice del modelo"
+msgstr "La columna ÃÂndice del modelo"
-#: ../vn/field/vn-combo.c:293 ../vn/column/vn-column-combo.c:347
+#: ../vn/field/vn-combo.c:305 ../vn/column/vn-column-combo.c:347
msgid "Show column"
msgstr "Columna visible"
-#: ../vn/field/vn-combo.c:294 ../vn/column/vn-column-combo.c:348
+#: ../vn/field/vn-combo.c:306 ../vn/column/vn-column-combo.c:348
msgid "The column of the model shown by combo"
msgstr "La columna del modelo que se mostrará en el combo"
-#: ../vn/field/vn-completion.c:332
+#: ../vn/field/vn-completion.c:334
msgid "Field"
msgstr "Campo"
-#: ../vn/field/vn-completion.c:333
+#: ../vn/field/vn-completion.c:335
msgid "The name of the field used for the search"
msgstr "El nombre del campo usado para la búsqueda"
@@ -879,33 +805,33 @@ msgstr "El nombre del campo usado para la búsqueda"
msgid "Change date"
msgstr "Cambiar fecha"
-#: ../vn/field/vn-date-chooser.c:478
+#: ../vn/field/vn-date-chooser.c:480
msgid "The date format string describing the order of the elements."
msgstr ""
"La cadena de formato de fechas que describe la salida del campo de texto."
-#: ../vn/field/vn-date-chooser.c:479
+#: ../vn/field/vn-date-chooser.c:481
msgctxt "Default date format string"
msgid "%a, %d %b %Y"
msgstr "%a, %d %b %Y"
-#: ../vn/field/vn-date-chooser.c:485
+#: ../vn/field/vn-date-chooser.c:487
msgid "Show time"
msgstr "Mostrar tiempo"
-#: ../vn/field/vn-date-chooser.c:486
+#: ../vn/field/vn-date-chooser.c:488
msgid ""
"Whether to show the hour, minute and second fields to set the time of the "
"day in the popup."
msgstr ""
"Si se muestran los campos para hora, minuto y segundo para indicar el "
-"instante del dÃa en el emergente"
+"instante del dÃÂa en el emergente"
-#: ../vn/field/vn-date-chooser.c:494
+#: ../vn/field/vn-date-chooser.c:496
msgid "Show date"
msgstr "Mostrar fecha"
-#: ../vn/field/vn-date-chooser.c:495
+#: ../vn/field/vn-date-chooser.c:497
msgid "Whether to show the calendar to set the date in the popup."
msgstr "Si se debe mostrar el calendario para poner la fecha en el emergente."
@@ -922,38 +848,38 @@ msgid "File loader already set"
msgstr "Ya se ha especificado un cargador de archivos"
#. Se usará para subir imagenes y cambiar nombres, o abrir un menu contextual
-#. g_signal_connect (obj, "event", G_CALLBACK (vn_http_image_cb_event), obj);
+#. g_signal_connect (self, "event", G_CALLBACK (vn_http_image_on_event), self);
#: ../vn/field/vn-http-image.c:184
msgid "No image set"
msgstr "Sin imagen"
-#: ../vn/field/vn-http-image.c:211 ../vn/column/vn-column-image.c:536
+#: ../vn/field/vn-http-image.c:212 ../vn/column/vn-column-image.c:536
msgid "File loader"
msgstr "Cargador de archivos"
-#: ../vn/field/vn-http-image.c:212
+#: ../vn/field/vn-http-image.c:213
msgid "A DbFileLoader, used to download the files"
msgstr "Un DbFileLoader que se usará para descargar los archivos"
-#: ../vn/field/vn-http-image.c:219
+#: ../vn/field/vn-http-image.c:220
msgid "File path"
msgstr "Ruta del archivo"
-#: ../vn/field/vn-http-image.c:220
+#: ../vn/field/vn-http-image.c:221
msgid "The relative path to the image from file loader path"
-msgstr "La ruta relativa a la imagen desde la del cargador de archivos"
+msgstr "La ruta relativa a la imágen desde la del cargador de archivos"
-#: ../vn/field/vn-http-image.c:227
+#: ../vn/field/vn-http-image.c:228
msgid "Image bytes"
msgstr "Bytes"
-#: ../vn/field/vn-http-image.c:228
+#: ../vn/field/vn-http-image.c:229
msgid "A GBytes structure with the image data"
msgstr "Una estructura GBytes con los datos de la imágen"
#: ../vn/vn-column.c:494
msgid "The column index in the model"
-msgstr "El Ãndice de la columna en el modelo"
+msgstr "La posición de la columna en el modelo"
#: ../vn/vn-column.c:508
msgid "Whether the column values are editable"
@@ -997,7 +923,7 @@ msgid ""
"the path of the column and appending the name on each cell"
msgstr ""
"Prefijo para la ruta de las imagenes que se muestren en el tooltip. "
-"Empezando desde la ruta de la columna y añadiendo después el nombre de cada "
+"Empezando desde la ruta de la columna y añadiendo después el nombre de cada "
"celda"
#: ../vn/column/vn-column-image.c:524
@@ -1020,17 +946,13 @@ msgstr "Un cargador de archivos opcional, si es nulo la columna creará uno"
msgid "Access"
msgstr "Acceso"
-#: ../vn/gui/login.glade.h:2
-msgid "User:"
-msgstr "Usuario:"
-
#: ../vn/gui/login.glade.h:3
-msgid "Password:"
-msgstr "Clave:"
+msgid "Show password"
+msgstr "Mostrar contraseña"
#: ../vn/gui/login.glade.h:4
-msgid "Press here to see the password"
-msgstr "Presiona para ver la contraseña"
+msgid "Password"
+msgstr "Contraseña"
#: ../vn/gui/login.glade.h:5
msgid "Remember"
@@ -1041,28 +963,40 @@ msgid "Configuration"
msgstr "Configuración"
#: ../vn/gui/login.glade.h:7
-msgid "Plugin:"
-msgstr "Plugin:"
+msgid "Connections"
+msgstr "Conexión"
#: ../vn/gui/login.glade.h:8
-msgid "Host:"
-msgstr "Host:"
+msgid "SSL CA:"
+msgstr "SSL CA:"
#: ../vn/gui/login.glade.h:9
msgid "Schema:"
msgstr "Esquema:"
#: ../vn/gui/login.glade.h:10
-msgid "SSL CA:"
-msgstr "SSL CA:"
+msgid "Host:"
+msgstr "Host:"
#: ../vn/gui/login.glade.h:11
+msgid "Plugin:"
+msgstr "Plugin:"
+
+#: ../vn/gui/login.glade.h:12
msgid ""
"Path to the file containing the CA certificate, if this is empty SSL won't "
"be used"
msgstr ""
"Ruta al archivo con el certificado de la CA, si está vacÃo, no se usará SSL"
+#: ../vn/gui/login.glade.h:13
+msgid "Name:"
+msgstr "Nombre:"
+
+#: ../vn/gui/login.glade.h:14
+msgid "User:"
+msgstr "Usuario:"
+
#: ../vn/gui/main.glade.h:1
msgid "Copyright - Verdnatura Levante S. L."
msgstr "Copyright - Verdnatura Levante S. L."
@@ -1175,7 +1109,7 @@ msgstr "Elige un GvnParam"
#: ../glade/glade-db-model.c:422 ../glade/glade-sql-batch.c:253
msgid "Select the parameter from a list"
-msgstr "Eligir un parametro de una lista"
+msgstr "Eligir el parámetro de una lista"
#: ../glade/glade-db-model.c:440 ../glade/glade-sql-batch.c:271
msgid "You need to create at least one GvnParam or derived object"
@@ -1189,6 +1123,10 @@ msgstr "Añadir o quitar enlaces"
msgid "Column"
msgstr "Columna"
+#: ../glade/glade-db-model.c:638
+msgid "Param"
+msgstr "Parámetro"
+
#: ../glade/glade-db-model.c:646
msgctxt "Verb"
msgid "Link"
@@ -1218,32 +1156,37 @@ msgstr "Nuevo Modelo"
msgid "Edit Model"
msgstr "Editar Modelo"
-#: ../glade/glade-db-iterator.c:73
-msgid "Properties"
-msgstr "Propiedades"
-
-#: ../glade/glade-db-iterator.c:124
-msgid "Iterator Editor"
-msgstr "Editor del Iterator"
-
-#: ../glade/glade-db-iterator.c:132
+#: ../glade/glade-db-iterator.c:99
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'."
-#: ../glade/glade-db-iterator.c:144
+#: ../glade/glade-db-iterator.c:111
#, c-format
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 automática."
-#: ../glade/glade-db-iterator.c:155
+#: ../glade/glade-db-iterator.c:121
#, c-format
msgid "%s must have \"Model\" set. %s"
msgstr "%s debe tener \"Modelo\" asignado. %s"
-#: ../glade/glade-db-iterator.c:180
+#: ../glade/glade-db-iterator.c:147
#, c-format
msgid "Automatic generation of params for %s"
-msgstr "Generación automatica de params para %s"
+msgstr "Generación automática de params para %s"
+
+#: ../glade/glade-db-iterator.c:198 ../glade/glade-db-iterator.c:220
+#: ../glade/glade-sql-batch.c:445
+msgid "Parameter"
+msgstr "Parámetro"
+
+#: ../glade/glade-db-iterator.c:200
+msgid "Properties"
+msgstr "Propiedades"
+
+#: ../glade/glade-db-iterator.c:228
+msgid "Iterator Editor"
+msgstr "Editor del Iterator"
#: ../glade/glade-sql-batch.c:79
msgid "List of items"
@@ -1274,6 +1217,16 @@ msgstr ""
#: ../module/data/example.xml.h:5
msgid ""
"\n"
+"\t\t\tShelfs\n"
+"\t\t"
+msgstr ""
+"\n"
+"\t\t\tEstanterÃas\n"
+"\t\t"
+
+#: ../module/data/example.xml.h:8
+msgid ""
+"\n"
"\t\t\tCustomer\n"
"\t\t"
msgstr ""
@@ -1286,6 +1239,10 @@ msgid "Consulter"
msgstr "Consultor"
#: ../module/data/example-menu.xml.h:2
+msgid "Shelfs"
+msgstr "EstanterÃas"
+
+#: ../module/data/example-menu.xml.h:3
msgid "Customer"
msgstr "Cliente"
@@ -1324,146 +1281,3 @@ msgstr "Registro"
#: ../module/data/consulter.glade.h:9
msgid "Immediate changes"
msgstr "Cambios inmediatos"
-
-#~ msgid "Set property value"
-#~ msgstr "Establecer valor"
-
-#~ msgid "Climb rate"
-#~ msgstr "Tasa de subida"
-
-#~ msgid "The acceleration rate when you hold down a button."
-#~ msgstr "La tasa de aceleración cuando se mantiene apretado el botón."
-
-#~ msgid "Minimum value"
-#~ msgstr "Valor mÃnimo"
-
-#~ msgid "The minimum value of the internal adjustment."
-#~ msgstr "Valor mÃnimo del ajuste interno."
-
-#~ msgid "Maximum value"
-#~ msgstr "Valor máximo"
-
-#~ msgid "The maximum value of the internal adjustment."
-#~ msgstr "Valor máximo del ajuste interno."
-
-#~ msgid "Step Increment"
-#~ msgstr "Incremento del paso"
-
-#~ msgid "The step increment of the internal adjustment"
-#~ msgstr "El incremento del paso del ajuste interno"
-
-#~ msgid "Message"
-#~ msgstr "Mensaje"
-
-#~ msgid "Add or remove holders"
-#~ msgstr "Añadir o quitar holders"
-
-#~ msgid "List of SqlHolders and identifiers"
-#~ msgstr "Lista de SqlHolders e identificadores"
-
-#~ msgid "Save"
-#~ msgstr "Guardar"
-
-#~ msgid "Model properties configuration"
-#~ msgstr "Configuración de propiedades del modelo"
-
-#~ msgid "The statement to execute"
-#~ msgstr "La instrucción a ejecutar"
-
-#~ msgid "Hedera"
-#~ msgstr "Hedera"
-
-#~ msgid "[user-name]"
-#~ msgstr "[user-name]"
-
-#~ msgid "_Quit"
-#~ msgstr "_Salir"
-
-#~ msgid "_File"
-#~ msgstr "_Archivo"
-
-#~ msgid "_Help"
-#~ msgstr "Ay_uda"
-
-#~ msgid "_Reconnect"
-#~ msgstr "_Reconectar"
-
-#~ msgid "Reconnect"
-#~ msgstr "Reconectar"
-
-#~ msgid "_View"
-#~ msgstr "_Ver"
-
-#~ msgctxt "View menu option"
-#~ msgid "Dynamic _Tabs"
-#~ msgstr "_Pestañas dinámicas"
-
-#~ msgid "Don't show tabs if there is only one tab open"
-#~ msgstr "No mostrar las pestañas si solo hay una abierta"
-
-#~ msgctxt "View menu option"
-#~ msgid "Tool_bar"
-#~ msgstr "_Barra de herramientas"
-
-#~ msgid "Err"
-#~ msgstr "Err"
-
-#~ msgid "Mon"
-#~ msgstr "Lun"
-
-#~ msgid "Tue"
-#~ msgstr "Mar"
-
-#~ msgid "Wed"
-#~ msgstr "Mie"
-
-#~ msgid "Thu"
-#~ msgstr "Jue"
-
-#~ msgid "Fri"
-#~ msgstr "Vie"
-
-#~ msgid "Sat"
-#~ msgstr "Sa"
-
-#~ msgid "Sun"
-#~ msgstr "Dom"
-
-#~ msgid "Jan"
-#~ msgstr "Ene"
-
-#~ msgid "Feb"
-#~ msgstr "Feb"
-
-#~ msgid "Mar"
-#~ msgstr "Mar"
-
-#~ msgid "Apr"
-#~ msgstr "Abr"
-
-#~ msgid "May"
-#~ msgstr "May"
-
-#~ msgid "Jun"
-#~ msgstr "Jun"
-
-#~ msgid "Jul"
-#~ msgstr "Jul"
-
-#~ msgid "Aug"
-#~ msgstr "Ago"
-
-#~ msgid "Sep"
-#~ msgstr "Sep"
-
-#~ msgid "Oct"
-#~ msgstr "Oct"
-
-#~ msgid "Nov"
-#~ msgstr "Nov"
-
-#~ msgid "Dec"
-#~ msgstr "Dic"
-
-#~ msgid "%s, %u %s %u"
-#~ msgstr "%s, %u %s %u"
diff --git a/po/nl.po b/po/nl.po
index 6a2ab37..735cf69 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -1,16 +1,16 @@
# Dutch translations for hedera package
-# Traducciones al español para el paquete hedera.
+# Traducciones al español para el paquete hedera.
# Copyright (C) 2012 THE hedera'S COPYRIGHT HOLDER
# This file is distributed under the same license as the hedera package.
-# Alejandro T. Colombini Gómez , 2012.
+# Alejandro T. Colombini Gómez , 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: hedera 1.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-07-15 14:27+0200\n"
+"POT-Creation-Date: 2014-09-22 15:30+0200\n"
"PO-Revision-Date: 2012-10-09 11:38+0200\n"
-"Last-Translator: Alejandro T. Colombini Gómez \n"
+"Last-Translator: Alejandro T. Colombini Gómez \n"
"Language-Team: Dutch\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
@@ -33,88 +33,32 @@ msgstr ""
msgid "Incompatible type for this param"
msgstr ""
-#: ../gvn/gvn-param.c:443 ../sql/sql-value.c:255 ../vn/vn-field.c:576
+#: ../gvn/gvn-param.c:285
msgid "Value"
msgstr ""
-#: ../gvn/gvn-param.c:444
+#: ../gvn/gvn-param.c:286
msgid "The value of the param"
msgstr ""
-#: ../gvn/gvn-param.c:450
+#: ../gvn/gvn-param.c:292
msgid "Master"
msgstr ""
-#: ../gvn/gvn-param.c:451
-msgid "The master GvnParam of this parameter"
+#: ../gvn/gvn-param.c:293
+msgid "The master parameter"
msgstr ""
-#: ../gvn/gvn-param.c:457 ../db/db-iterator.c:1062
-msgid "Mode"
-msgstr ""
-
-#: ../gvn/gvn-param.c:458
-msgid "The mode of the parameter"
-msgstr ""
-
-#: ../gvn/gvn-param.c:464
-msgid "Status"
-msgstr ""
-
-#: ../gvn/gvn-param.c:465
-msgid "The current status of the parameter"
-msgstr ""
-
-#: ../gvn/gvn-param.c:471
-msgid "Spec"
-msgstr ""
-
-#: ../gvn/gvn-param.c:472
-msgid "The spec of the parameter"
-msgstr ""
-
-#: ../gvn/gvn-param.c:478 ../vn/vn-field.c:604
-msgid "Glib Type"
-msgstr ""
-
-#: ../gvn/gvn-param.c:479 ../vn/vn-field.c:605
-msgid "The type of the value"
-msgstr ""
-
-#: ../gvn/gvn-param.c:485 ../vn/vn-field.c:611 ../vn/vn-column.c:507
-msgid "Editable"
-msgstr ""
-
-#: ../gvn/gvn-param.c:486
-msgid "Whether the param value can be modified"
-msgstr ""
-
-#: ../gvn/gvn-param.c:492 ../vn/vn-field.c:618 ../vn/vn-column.c:514
-msgid "Null"
-msgstr ""
-
-#: ../gvn/gvn-param.c:493
-msgid "Whether the param value can be of type GVN_TYPE_NULL"
-msgstr ""
-
-#: ../gvn/gvn-param.c:499 ../vn/vn-field.c:625
-msgid "Default Value"
-msgstr ""
-
-#: ../gvn/gvn-param.c:500 ../vn/vn-field.c:626
-msgid "The default value"
-msgstr ""
-
-#: ../gvn/gvn-value.c:431
+#: ../gvn/gvn-value.c:434
#, c-format
msgid "Attempting to compare invalid types: %s\n"
msgstr ""
-#: ../gvn/gvn-value.c:540
+#: ../gvn/gvn-value.c:543
msgid "Yes"
msgstr ""
-#: ../gvn/gvn-value.c:540
+#: ../gvn/gvn-value.c:543
msgid "No"
msgstr ""
@@ -126,19 +70,7 @@ msgstr ""
msgid "The character used for delimite the name of fields, tables..."
msgstr ""
-#: ../sql/sql-value.c:248 ../glade/glade-db-model.c:638
-msgid "Param"
-msgstr ""
-
-#: ../sql/sql-value.c:249
-msgid "The param which is linked"
-msgstr ""
-
-#: ../sql/sql-value.c:256
-msgid "The value"
-msgstr ""
-
-#: ../sql/sql-string.c:188 ../db/db-model.c:3315 ../db/db-request.c:449
+#: ../sql/sql-string.c:188 ../db/db-model.c:3337 ../db/db-request.c:449
msgid "SQL"
msgstr ""
@@ -322,101 +254,89 @@ msgstr ""
msgid "One of the possible options of #SqlSelectType"
msgstr ""
-#: ../plugin/mysql/db-mysql.c:68 ../plugin/pg/db-pg.c:111
+#: ../plugin/mysql/db-mysql.c:68 ../plugin/pg/db-pg.c:113
#, c-format
msgid "Can't allocate the needed memory"
msgstr ""
-#: ../db/db-iterator.c:1063
-msgid "The mode in which the iterator is working"
-msgstr ""
-
-#: ../db/db-iterator.c:1070
-msgid "Remember selection"
-msgstr ""
-
-#: ../db/db-iterator.c:1071
-msgid "Wether to rememeber the selection when model is refreshed"
-msgstr ""
-
-#: ../db/db-model.c:3289 ../db/db-request.c:442 ../vn/vn-gui.c:1472
+#: ../db/db-model.c:3311 ../db/db-request.c:442 ../vn/vn-gui.c:1408
#: ../vn/vn-form.c:245
msgid "Connection"
msgstr ""
-#: ../db/db-model.c:3290
+#: ../db/db-model.c:3312
msgid "The DbConn that manages the connection to the database"
msgstr ""
-#: ../db/db-model.c:3297
+#: ../db/db-model.c:3319
msgid "Statement"
msgstr ""
-#: ../db/db-model.c:3298
+#: ../db/db-model.c:3320
msgid "The statement which retrieves the data"
msgstr ""
-#: ../db/db-model.c:3305
+#: ../db/db-model.c:3327
msgid "Use file"
msgstr ""
-#: ../db/db-model.c:3306
+#: ../db/db-model.c:3328
msgid ""
"If this is set to TRUE, the \"sql\" property will hold the name of a file "
"containing a query, if set to FALSE, \"sql\" is used as an SQL string"
msgstr ""
-#: ../db/db-model.c:3316
+#: ../db/db-model.c:3338
msgid ""
"Depending on the \"use-file\" property this will be the path to a file with "
"queries for the model or a SQL string"
msgstr ""
-#: ../db/db-model.c:3325
+#: ../db/db-model.c:3347
msgid "Main Table"
msgstr ""
-#: ../db/db-model.c:3326
+#: ../db/db-model.c:3348
msgid "The main table of the model"
msgstr ""
-#: ../db/db-model.c:3333
+#: ../db/db-model.c:3355
msgid "Update flags"
msgstr ""
-#: ../db/db-model.c:3334
+#: ../db/db-model.c:3356
msgid "The flags that indicate how a model can be modified"
msgstr ""
-#: ../db/db-model.c:3342
+#: ../db/db-model.c:3364
msgid "Result position"
msgstr ""
-#: ../db/db-model.c:3343
+#: ../db/db-model.c:3365
msgid ""
"The position where the query that will fill the model will be placed in a "
"multi-query"
msgstr ""
-#: ../db/db-model.c:3353
+#: ../db/db-model.c:3375
msgid "Partial delete"
msgstr ""
-#: ../db/db-model.c:3354
+#: ../db/db-model.c:3376
msgid ""
"When a row is deleted set all the fields from the table to null rather than "
"delete it."
msgstr ""
-#: ../db/db-model.c:3362
+#: ../db/db-model.c:3384
msgid "Batch"
msgstr ""
-#: ../db/db-model.c:3363
+#: ../db/db-model.c:3385
msgid "The batch assigned to the model"
msgstr ""
-#: ../db/db-model-holder.c:71 ../db/db-calc.c:405
+#: ../db/db-model-holder.c:71 ../db/db-calc.c:480
msgid "Model"
msgstr ""
@@ -424,64 +344,64 @@ msgstr ""
msgid "The model used by the holder"
msgstr ""
-#: ../db/db-calc.c:406
+#: ../db/db-calc.c:481
msgid "The model where the operations will be applied"
msgstr ""
-#: ../db/db-calc.c:413
+#: ../db/db-calc.c:487
msgid "Operation type"
msgstr ""
-#: ../db/db-calc.c:414
+#: ../db/db-calc.c:488
msgid "The type of the operation applied over the function"
msgstr ""
-#: ../db/db-calc.c:422
+#: ../db/db-calc.c:495
msgid "Function"
msgstr ""
-#: ../db/db-calc.c:423
+#: ../db/db-calc.c:496
msgid "The function to execute"
msgstr ""
-#: ../db/db-calc.c:429
+#: ../db/db-calc.c:501
msgid "Data"
msgstr ""
-#: ../db/db-calc.c:430
+#: ../db/db-calc.c:502
msgid "The user provided data for the function"
msgstr ""
-#: ../db/db-calc.c:436 ../db/db-param.c:258 ../vn/vn-column.c:493
+#: ../db/db-calc.c:507 ../db/db-param.c:335 ../vn/vn-column.c:493
msgid "Column index"
msgstr ""
-#: ../db/db-calc.c:437
+#: ../db/db-calc.c:508
msgid "A column to apply the operations over it"
msgstr ""
-#: ../db/db-calc.c:446 ../db/db-param.c:265 ../vn/vn-field.c:597
+#: ../db/db-calc.c:516 ../db/db-param.c:342 ../vn/vn-field.c:583
#: ../vn/vn-column.c:500
msgid "Column name"
msgstr ""
-#: ../db/db-calc.c:447
+#: ../db/db-calc.c:517
msgid "A column name to apply the operations over it"
msgstr ""
-#: ../db/db-param.c:251 ../vn/vn-grid.c:421 ../vn/vn-field.c:590
+#: ../db/db-param.c:328 ../vn/vn-field.c:576
msgid "Iterator"
msgstr ""
-#: ../db/db-param.c:252
+#: ../db/db-param.c:329
msgid "The iterator owner of param"
msgstr ""
-#: ../db/db-param.c:259
+#: ../db/db-param.c:336
msgid "The referenced column index"
msgstr ""
-#: ../db/db-param.c:266 ../vn/vn-column.c:501
+#: ../db/db-param.c:343 ../vn/vn-column.c:501
msgid "The referenced column name"
msgstr ""
@@ -521,7 +441,7 @@ msgstr ""
msgid "The path where query files are located"
msgstr ""
-#: ../db/db-conn.c:1062 ../db/db-file-loader.c:716
+#: ../db/db-conn.c:1062 ../db/db-file-loader.c:719
#: ../vn/column/vn-column-image.c:498
msgid "Host"
msgstr ""
@@ -530,7 +450,7 @@ msgstr ""
msgid "The host name to connect to"
msgstr ""
-#: ../db/db-conn.c:1069
+#: ../db/db-conn.c:1069 ../vn/gui/login.glade.h:2
msgid "User"
msgstr ""
@@ -575,167 +495,163 @@ msgstr ""
msgid "The GError, if an error ocurred"
msgstr ""
-#: ../db/db-file-loader.c:330
+#: ../db/db-file-loader.c:333
#, c-format
msgid "%s not cached"
msgstr ""
-#: ../db/db-file-loader.c:426
+#: ../db/db-file-loader.c:429
#, c-format
msgid "Unknown content length of file %s"
msgstr ""
-#: ../db/db-file-loader.c:717 ../vn/column/vn-column-image.c:499
+#: ../db/db-file-loader.c:720 ../vn/column/vn-column-image.c:499
msgid "The host web server name to get the images"
msgstr ""
-#: ../db/db-file-loader.c:724 ../vn/column/vn-column-image.c:506
+#: ../db/db-file-loader.c:727 ../vn/column/vn-column-image.c:506
msgid "Path"
msgstr ""
-#: ../db/db-file-loader.c:725
+#: ../db/db-file-loader.c:728
msgid "The path of the directory to interact with"
msgstr ""
-#: ../db/db-file-loader.c:732
+#: ../db/db-file-loader.c:735
msgid "Cache directory"
msgstr ""
-#: ../db/db-file-loader.c:733
+#: ../db/db-file-loader.c:736
msgid ""
"The local directory where the downloaded files will be stored. The default "
"cache directory is 'hedera', under g_get_user_cache_dir()."
msgstr ""
-#: ../db/db-file-loader.c:741
+#: ../db/db-file-loader.c:744
msgid "Maximal cache size"
msgstr ""
-#: ../db/db-file-loader.c:742
+#: ../db/db-file-loader.c:745
msgid "The maximal size for the contents of the cache directory"
msgstr ""
-#: ../vn/vn-gui.c:545
+#: ../vn/vn-gui.c:530
msgid "Connection has been lost. Do you want to reconnect?"
msgstr ""
-#: ../vn/vn-gui.c:552
+#: ../vn/vn-gui.c:537
msgid "An error occurred in the connection."
msgstr ""
-#: ../vn/vn-gui.c:555
+#: ../vn/vn-gui.c:540
msgid "Database error"
msgstr ""
-#: ../vn/vn-gui.c:562
+#: ../vn/vn-gui.c:547
msgid "Unknown error"
msgstr ""
-#: ../vn/vn-gui.c:910
+#: ../vn/vn-gui.c:550
+msgid "Colse all"
+msgstr ""
+
+#: ../vn/vn-gui.c:909
msgid "Closing connection"
msgstr ""
-#: ../vn/vn-gui.c:912
+#: ../vn/vn-gui.c:911
msgid "Transaction started"
msgstr ""
-#: ../vn/vn-gui.c:914
+#: ../vn/vn-gui.c:913
msgid "Connecting"
msgstr ""
-#: ../vn/vn-gui.c:916
+#: ../vn/vn-gui.c:915
msgid "Connection lost"
msgstr ""
-#: ../vn/vn-gui.c:918
+#: ../vn/vn-gui.c:917
msgid "Connection closed"
msgstr ""
-#: ../vn/vn-gui.c:920 ../vn/field/vn-http-image.c:119
+#: ../vn/vn-gui.c:919 ../vn/field/vn-http-image.c:119
msgid "Loading"
msgstr ""
-#: ../vn/vn-gui.c:922
+#: ../vn/vn-gui.c:921
msgid "Ready"
msgstr ""
-#: ../vn/vn-gui.c:1473
+#: ../vn/vn-gui.c:1409
msgid "The connection used by Gui"
msgstr ""
-#: ../vn/vn-gui.c:1479
+#: ../vn/vn-gui.c:1415 ../vn/vn-login.c:611
msgid "Application"
msgstr ""
-#: ../vn/vn-gui.c:1480
+#: ../vn/vn-gui.c:1416
msgid "The application handler for the entire program"
msgstr ""
-#: ../vn/vn-grid.c:422
-msgid "The iterator used by VnGrid"
-msgstr ""
-
#: ../vn/vn-handler.c:74
msgid "Are you sure you want to delete the current selection?"
msgstr ""
-#: ../vn/vn-handler.c:82
-msgid "Are you sure you want to save the changes?"
-msgstr ""
-
-#: ../vn/vn-handler.c:88
+#: ../vn/vn-handler.c:85
msgid "Are you sure you want to undo all changes?"
msgstr ""
-#: ../vn/vn-handler.c:214
+#: ../vn/vn-handler.c:213
msgid "Undo changes"
msgstr ""
-#: ../vn/vn-handler.c:217
+#: ../vn/vn-handler.c:216
msgid "Save changes"
msgstr ""
-#: ../vn/vn-handler.c:220
+#: ../vn/vn-handler.c:219
msgid "Refresh data"
msgstr ""
-#: ../vn/vn-handler.c:223
+#: ../vn/vn-handler.c:222
msgid "Remove record"
msgstr ""
-#: ../vn/vn-handler.c:226
+#: ../vn/vn-handler.c:225
msgid "Add record"
msgstr ""
-#: ../vn/vn-handler.c:229
+#: ../vn/vn-handler.c:228
msgid "Move to the first row"
msgstr ""
-#: ../vn/vn-handler.c:232
+#: ../vn/vn-handler.c:231
msgid "Move to the previous row"
msgstr ""
-#: ../vn/vn-handler.c:235
+#: ../vn/vn-handler.c:234
msgid "Move to the next row"
msgstr ""
-#: ../vn/vn-handler.c:238
+#: ../vn/vn-handler.c:237
msgid "Move to the last row"
msgstr ""
-#: ../vn/vn-handler.c:531
+#: ../vn/vn-handler.c:534
msgid "Show flags"
msgstr ""
-#: ../vn/vn-handler.c:532
+#: ../vn/vn-handler.c:535
msgid "Sets the buttons that will be shown on the interface"
msgstr ""
-#: ../vn/vn-handler.c:539
+#: ../vn/vn-handler.c:542
msgid "Simple record"
msgstr ""
-#: ../vn/vn-handler.c:540
+#: ../vn/vn-handler.c:543
msgid "Sets if it is used to handle a iterator with a single record"
msgstr ""
@@ -763,100 +679,111 @@ msgstr ""
msgid "The module"
msgstr ""
-#: ../vn/vn-login.c:292 ../vn/vn-login.c:294
+#: ../vn/vn-login.c:396 ../vn/vn-login.c:398 ../vn/vn-login.c:490
msgid "Login error"
msgstr ""
-#: ../vn/vn-login.c:350
+#: ../vn/vn-login.c:456
#, c-format
msgid "Bad connection settings, please check it."
msgstr ""
-#: ../vn/vn-login.c:489
-msgid "Application id"
+#: ../vn/vn-login.c:488
+msgid "Please select a connection"
msgstr ""
-#: ../vn/vn-login.c:490
-msgid "The application identifier"
+#: ../vn/vn-login.c:612
+msgid "The application"
msgstr ""
#: ../vn/vn-field.c:577
-msgid "The current value of the field"
-msgstr ""
-
-#: ../vn/vn-field.c:583 ../glade/glade-db-iterator.c:71
-#: ../glade/glade-db-iterator.c:116 ../glade/glade-sql-batch.c:445
-msgid "Parameter"
-msgstr ""
-
-#: ../vn/vn-field.c:584
-msgid "The param where the field can read/write its value"
-msgstr ""
-
-#: ../vn/vn-field.c:591
msgid "The iterator used to get the field param"
msgstr ""
-#: ../vn/vn-field.c:598
+#: ../vn/vn-field.c:584
msgid "The column name on the iterator"
msgstr ""
-#: ../vn/vn-field.c:612
+#: ../vn/vn-field.c:590
+msgid "Glib Type"
+msgstr ""
+
+#: ../vn/vn-field.c:591
+msgid "The type of the value"
+msgstr ""
+
+#: ../vn/vn-field.c:597 ../vn/vn-column.c:507
+msgid "Editable"
+msgstr ""
+
+#: ../vn/vn-field.c:598
msgid "Whether the field value is user editable"
msgstr ""
-#: ../vn/vn-field.c:619 ../vn/vn-column.c:515
+#: ../vn/vn-field.c:604 ../vn/vn-column.c:514
+msgid "Null"
+msgstr ""
+
+#: ../vn/vn-field.c:605 ../vn/vn-column.c:515
msgid "Whether the field value can be of type GVN_TYPE_NULL"
msgstr ""
-#: ../vn/vn-field.c:632 ../vn/vn-column.c:528
+#: ../vn/vn-field.c:611
+msgid "Default Value"
+msgstr ""
+
+#: ../vn/vn-field.c:612
+msgid "The default value"
+msgstr ""
+
+#: ../vn/vn-field.c:618 ../vn/vn-column.c:528
msgid "Style function"
msgstr ""
-#: ../vn/vn-field.c:633
+#: ../vn/vn-field.c:619
msgid ""
"A VnFieldStyleFunc to set the properties of each field depending on its value"
msgstr ""
-#: ../vn/field/vn-entry.c:156 ../vn/field/vn-date-chooser.c:477
-#: ../vn/field/vn-label.c:115 ../vn/column/vn-column-entry.c:127
+#: ../vn/field/vn-entry.c:157 ../vn/field/vn-date-chooser.c:479
+#: ../vn/field/vn-label.c:116 ../vn/column/vn-column-entry.c:127
msgid "Format"
msgstr ""
-#: ../vn/field/vn-entry.c:157 ../vn/field/vn-label.c:116
+#: ../vn/field/vn-entry.c:158 ../vn/field/vn-label.c:117
#: ../vn/column/vn-column-entry.c:128
msgid "The format string describing the output of the entry."
msgstr ""
-#: ../vn/field/vn-spin.c:171 ../vn/column/vn-column-spin.c:201
+#: ../vn/field/vn-spin.c:174 ../vn/column/vn-column-spin.c:202
msgid "Digits"
msgstr ""
-#: ../vn/field/vn-spin.c:172 ../vn/column/vn-column-spin.c:202
+#: ../vn/field/vn-spin.c:175 ../vn/column/vn-column-spin.c:203
msgid "The number of decimal places to display."
msgstr ""
-#: ../vn/field/vn-combo.c:286 ../vn/column/vn-column-combo.c:340
+#: ../vn/field/vn-combo.c:298 ../vn/column/vn-column-combo.c:340
msgid "Index column"
msgstr ""
-#: ../vn/field/vn-combo.c:287 ../vn/column/vn-column-combo.c:341
+#: ../vn/field/vn-combo.c:299 ../vn/column/vn-column-combo.c:341
msgid "The column index of the model"
msgstr ""
-#: ../vn/field/vn-combo.c:293 ../vn/column/vn-column-combo.c:347
+#: ../vn/field/vn-combo.c:305 ../vn/column/vn-column-combo.c:347
msgid "Show column"
msgstr ""
-#: ../vn/field/vn-combo.c:294 ../vn/column/vn-column-combo.c:348
+#: ../vn/field/vn-combo.c:306 ../vn/column/vn-column-combo.c:348
msgid "The column of the model shown by combo"
msgstr ""
-#: ../vn/field/vn-completion.c:332
+#: ../vn/field/vn-completion.c:334
msgid "Field"
msgstr ""
-#: ../vn/field/vn-completion.c:333
+#: ../vn/field/vn-completion.c:335
msgid "The name of the field used for the search"
msgstr ""
@@ -864,30 +791,30 @@ msgstr ""
msgid "Change date"
msgstr ""
-#: ../vn/field/vn-date-chooser.c:478
+#: ../vn/field/vn-date-chooser.c:480
msgid "The date format string describing the order of the elements."
msgstr ""
-#: ../vn/field/vn-date-chooser.c:479
+#: ../vn/field/vn-date-chooser.c:481
msgctxt "Default date format string"
msgid "%a, %d %b %Y"
msgstr ""
-#: ../vn/field/vn-date-chooser.c:485
+#: ../vn/field/vn-date-chooser.c:487
msgid "Show time"
msgstr ""
-#: ../vn/field/vn-date-chooser.c:486
+#: ../vn/field/vn-date-chooser.c:488
msgid ""
"Whether to show the hour, minute and second fields to set the time of the "
"day in the popup."
msgstr ""
-#: ../vn/field/vn-date-chooser.c:494
+#: ../vn/field/vn-date-chooser.c:496
msgid "Show date"
msgstr ""
-#: ../vn/field/vn-date-chooser.c:495
+#: ../vn/field/vn-date-chooser.c:497
msgid "Whether to show the calendar to set the date in the popup."
msgstr ""
@@ -904,32 +831,32 @@ msgid "File loader already set"
msgstr ""
#. Se usará para subir imagenes y cambiar nombres, o abrir un menu contextual
-#. g_signal_connect (obj, "event", G_CALLBACK (vn_http_image_cb_event), obj);
+#. g_signal_connect (self, "event", G_CALLBACK (vn_http_image_on_event), self);
#: ../vn/field/vn-http-image.c:184
msgid "No image set"
msgstr ""
-#: ../vn/field/vn-http-image.c:211 ../vn/column/vn-column-image.c:536
+#: ../vn/field/vn-http-image.c:212 ../vn/column/vn-column-image.c:536
msgid "File loader"
msgstr ""
-#: ../vn/field/vn-http-image.c:212
+#: ../vn/field/vn-http-image.c:213
msgid "A DbFileLoader, used to download the files"
msgstr ""
-#: ../vn/field/vn-http-image.c:219
+#: ../vn/field/vn-http-image.c:220
msgid "File path"
msgstr ""
-#: ../vn/field/vn-http-image.c:220
+#: ../vn/field/vn-http-image.c:221
msgid "The relative path to the image from file loader path"
msgstr ""
-#: ../vn/field/vn-http-image.c:227
+#: ../vn/field/vn-http-image.c:228
msgid "Image bytes"
msgstr ""
-#: ../vn/field/vn-http-image.c:228
+#: ../vn/field/vn-http-image.c:229
msgid "A GBytes structure with the image data"
msgstr ""
@@ -994,16 +921,12 @@ msgstr ""
msgid "Access"
msgstr ""
-#: ../vn/gui/login.glade.h:2
-msgid "User:"
-msgstr ""
-
#: ../vn/gui/login.glade.h:3
-msgid "Password:"
+msgid "Show password"
msgstr ""
#: ../vn/gui/login.glade.h:4
-msgid "Press here to see the password"
+msgid "Password"
msgstr ""
#: ../vn/gui/login.glade.h:5
@@ -1015,11 +938,11 @@ msgid "Configuration"
msgstr ""
#: ../vn/gui/login.glade.h:7
-msgid "Plugin:"
+msgid "Connections"
msgstr ""
#: ../vn/gui/login.glade.h:8
-msgid "Host:"
+msgid "SSL CA:"
msgstr ""
#: ../vn/gui/login.glade.h:9
@@ -1027,15 +950,27 @@ msgid "Schema:"
msgstr ""
#: ../vn/gui/login.glade.h:10
-msgid "SSL CA:"
+msgid "Host:"
msgstr ""
#: ../vn/gui/login.glade.h:11
+msgid "Plugin:"
+msgstr ""
+
+#: ../vn/gui/login.glade.h:12
msgid ""
"Path to the file containing the CA certificate, if this is empty SSL won't "
"be used"
msgstr ""
+#: ../vn/gui/login.glade.h:13
+msgid "Name:"
+msgstr ""
+
+#: ../vn/gui/login.glade.h:14
+msgid "User:"
+msgstr ""
+
#: ../vn/gui/main.glade.h:1
msgid "Copyright - Verdnatura Levante S. L."
msgstr ""
@@ -1148,6 +1083,10 @@ msgstr ""
msgid "Column"
msgstr ""
+#: ../glade/glade-db-model.c:638
+msgid "Param"
+msgstr ""
+
#: ../glade/glade-db-model.c:646
msgctxt "Verb"
msgid "Link"
@@ -1177,33 +1116,38 @@ msgstr ""
msgid "Edit Model"
msgstr ""
-#: ../glade/glade-db-iterator.c:73
-msgid "Properties"
-msgstr ""
-
-#: ../glade/glade-db-iterator.c:124
-msgid "Iterator Editor"
-msgstr ""
-
-#: ../glade/glade-db-iterator.c:132
+#: ../glade/glade-db-iterator.c:99
msgid "The model must have \"SQL\" set and \"Use file\" set to 'No'."
msgstr ""
-#: ../glade/glade-db-iterator.c:144
+#: ../glade/glade-db-iterator.c:111
#, c-format
msgid "%s can't have children before automatic generation."
msgstr ""
-#: ../glade/glade-db-iterator.c:155
+#: ../glade/glade-db-iterator.c:121
#, c-format
msgid "%s must have \"Model\" set. %s"
msgstr ""
-#: ../glade/glade-db-iterator.c:180
+#: ../glade/glade-db-iterator.c:147
#, c-format
msgid "Automatic generation of params for %s"
msgstr ""
+#: ../glade/glade-db-iterator.c:198 ../glade/glade-db-iterator.c:220
+#: ../glade/glade-sql-batch.c:445
+msgid "Parameter"
+msgstr ""
+
+#: ../glade/glade-db-iterator.c:200
+msgid "Properties"
+msgstr ""
+
+#: ../glade/glade-db-iterator.c:228
+msgid "Iterator Editor"
+msgstr ""
+
#: ../glade/glade-sql-batch.c:79
msgid "List of items"
msgstr ""
@@ -1230,6 +1174,13 @@ msgstr ""
#: ../module/data/example.xml.h:5
msgid ""
"\n"
+"\t\t\tShelfs\n"
+"\t\t"
+msgstr ""
+
+#: ../module/data/example.xml.h:8
+msgid ""
+"\n"
"\t\t\tCustomer\n"
"\t\t"
msgstr ""
@@ -1239,6 +1190,10 @@ msgid "Consulter"
msgstr ""
#: ../module/data/example-menu.xml.h:2
+msgid "Shelfs"
+msgstr ""
+
+#: ../module/data/example-menu.xml.h:3
msgid "Customer"
msgstr ""
diff --git a/sql/sql-join.h b/sql/sql-join.h
index 3058d3d..487c62f 100644
--- a/sql/sql-join.h
+++ b/sql/sql-join.h
@@ -30,6 +30,10 @@
typedef struct _SqlJoin SqlJoin;
typedef struct _SqlJoinClass SqlJoinClass;
+/**
+ * SqlJoinType:
+ * All the JOIN types possible for a #SqlJoin.
+ **/
typedef enum
{
SQL_JOIN_TYPE_INNER
diff --git a/sql/sql-operation.h b/sql/sql-operation.h
index df0eca1..ee8fcfe 100644
--- a/sql/sql-operation.h
+++ b/sql/sql-operation.h
@@ -29,6 +29,10 @@
typedef struct _SqlOperation SqlOperation;
typedef struct _SqlOperationClass SqlOperationClass;
+/**
+ * SqlOperationType:
+ * All the operation types possible for a #SqlOperation.
+ **/
typedef enum
{
// Unary
diff --git a/sql/sql-value.c b/sql/sql-value.c
index 5c5d705..72a2bf7 100644
--- a/sql/sql-value.c
+++ b/sql/sql-value.c
@@ -133,7 +133,7 @@ static void sql_value_render (SqlValue * self, SqlRender * render)
switch (type)
{
case G_TYPE_BOOLEAN:
- sql_render_add_token (render, g_value_get_boolean (value) ? "1" : "0");
+ sql_render_add_token (render, g_value_get_boolean (value) ? "TRUE" : "FALSE");
break;
case G_TYPE_CHAR:
sql_render_printf (render, "'%c'", g_value_get_schar (value));
diff --git a/vapi/Db-1.0.metadata b/vapi/Db-1.0.metadata
index 26e0116..dab26ff 100644
--- a/vapi/Db-1.0.metadata
+++ b/vapi/Db-1.0.metadata
@@ -4,8 +4,6 @@ Calc.function#property type="Db.CalcFunc"
Conn.render.object#parameter type="GLib.Object"
-Iterator.params type="Db.Param"
-
Model.get skip=false name="get_values"
Model.set skip=false name="set_values"
Model.search skip=false
diff --git a/vn/column/vn-column-combo.c b/vn/column/vn-column-combo.c
index 0966947..614785c 100644
--- a/vn/column/vn-column-combo.c
+++ b/vn/column/vn-column-combo.c
@@ -333,7 +333,7 @@ static void vn_column_combo_class_init (VnColumnComboClass * klass)
VN_COLUMN_CLASS (klass)->set_null = (VnColumnSetNullFunc) vn_column_combo_set_null;
VN_COLUMN_CLASS (klass)->model_changed = (VnColumnModelChangedFunc) vn_column_combo_model_changed;
- g_object_class_override_property (k, PROP_MODEL, "model");
+ g_object_class_override_property (k, PROP_MODEL, "data-model");
g_object_class_install_property (k, PROP_INDEX_COLUMN,
g_param_spec_uint ("index-column"
diff --git a/vn/column/vn-column-spin.c b/vn/column/vn-column-spin.c
index 8980f43..9a46979 100644
--- a/vn/column/vn-column-spin.c
+++ b/vn/column/vn-column-spin.c
@@ -183,6 +183,7 @@ static void vn_column_spin_init (VnColumnSpin * obj)
static void vn_column_spin_finalize (VnColumnSpin * obj)
{
+ g_free (obj->format);
G_OBJECT_CLASS (vn_column_spin_parent_class)->finalize (G_OBJECT (obj));
}
diff --git a/vn/field/vn-check.c b/vn/field/vn-check.c
index 5f28acc..3a3083b 100644
--- a/vn/field/vn-check.c
+++ b/vn/field/vn-check.c
@@ -117,9 +117,9 @@ static void vn_check_set_value (VnCheck * self, const GValue * value)
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Class
static void vn_check_init (VnCheck * self)
-{
+{
self->button = GTK_TOGGLE_BUTTON (gtk_check_button_new ());
- gtk_button_set_use_underline (GTK_BUTTON (self->button), TRUE);
+ gtk_toggle_button_set_mode (self->button, TRUE);
g_object_connect (self->button
,"signal::toggled", vn_check_on_toggled, self
,"signal::button-release-event", vn_check_on_secondary_button, self
@@ -127,8 +127,7 @@ static void vn_check_init (VnCheck * self)
);
gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (self->button));
- VN_FIELD_GET_CLASS (self)->set_widget (VN_FIELD (self),
- GTK_WIDGET (self->button));
+ VN_FIELD_GET_CLASS (self)->set_widget (VN_FIELD (self), GTK_WIDGET (self->button));
}
static void vn_check_finalize (VnCheck * self)
diff --git a/vn/field/vn-combo.c b/vn/field/vn-combo.c
index a6c48ca..fff82c9 100644
--- a/vn/field/vn-combo.c
+++ b/vn/field/vn-combo.c
@@ -88,25 +88,35 @@ static void vn_combo_on_model_ready (VnCombo * self, const GValue * value)
vn_combo_on_changed, self);
}
-static void vn_combo_set_value (VnCombo * self, const GValue * value)
-{
- if (self->model && db_model_get_status (self->model) == DB_MODEL_STATUS_READY)
- vn_combo_on_model_ready (self, value);
-}
-
static void vn_combo_on_status_changed (DbModel * model, DbModelStatus status, VnCombo * self)
{
if (status == DB_MODEL_STATUS_READY)
{
gtk_combo_box_set_model (self->combo, self->tree);
+ self->tree_set = TRUE;
vn_combo_on_model_ready (self, gvn_param_get_value (GVN_PARAM (self)));
db_model_use_null_row (model, vn_field_get_null (VN_FIELD (self)));
}
else
+ {
gtk_combo_box_set_model (self->combo, NULL);
+ self->tree_set = FALSE;
+ }
}
+static void vn_combo_set_widget_value (VnCombo * self, const GValue * value)
+{
+ if (self->model && db_model_get_status (self->model) == DB_MODEL_STATUS_READY)
+ {
+ if (!self->tree_set)
+ vn_combo_on_status_changed (self->model, DB_MODEL_STATUS_READY, self);
+
+ vn_combo_on_model_ready (self, value);
+ }
+}
+
+//+++++++++++++++++++++++++++++++++++++++++++++++++++ DbModelHolder methods
static DbModel * vn_combo_get_model (VnCombo * self)
{
@@ -117,7 +127,7 @@ static void vn_combo_set_model (VnCombo * self, DbModel * model)
{
g_return_if_fail (VN_IS_COMBO (self));
g_return_if_fail (DB_IS_MODEL (model) || !model);
-
+
if (self->model)
{
g_signal_handlers_disconnect_by_func (self->model,
@@ -126,7 +136,7 @@ static void vn_combo_set_model (VnCombo * self, DbModel * model)
g_clear_object (&self->tree);
}
if (model)
- {
+ {
self->tree = GTK_TREE_MODEL (vn_grid_model_new (model));
self->model = g_object_ref (model);
g_signal_connect (model, "status-changed",
@@ -165,7 +175,7 @@ void vn_combo_set_index_column (VnCombo * self, guint column)
g_return_if_fail (VN_IS_COMBO (self));
self->index_column = column;
- vn_combo_set_value (self, gvn_param_get_value (GVN_PARAM (self)));
+ vn_combo_set_widget_value (self, gvn_param_get_value (GVN_PARAM (self)));
}
/**
@@ -252,6 +262,7 @@ static void vn_combo_get_property (VnCombo * self, guint property_id,
static void vn_combo_init (VnCombo * self)
{
self->tree = NULL;
+ self->tree_set = FALSE;
self->model = NULL;
self->combo = GTK_COMBO_BOX (gtk_combo_box_new ());
@@ -278,9 +289,9 @@ static void vn_combo_class_init (VnComboClass * klass)
k->finalize = (GObjectFinalizeFunc) vn_combo_finalize;
k->set_property = (GObjectSetPropertyFunc) vn_combo_set_property;
k->get_property = (GObjectGetPropertyFunc) vn_combo_get_property;
- VN_FIELD_CLASS (klass)->set_value = (VnFieldSetValueFunc) vn_combo_set_value;
+ VN_FIELD_CLASS (klass)->set_value = (VnFieldSetValueFunc) vn_combo_set_widget_value;
- g_object_class_override_property (k, PROP_MODEL, "model");
+ g_object_class_override_property (k, PROP_MODEL, "data-model");
g_object_class_install_property (k, PROP_INDEX_COLUMN,
g_param_spec_uint ("index-column"
diff --git a/vn/field/vn-combo.h b/vn/field/vn-combo.h
index 3efc5bc..26b569a 100644
--- a/vn/field/vn-combo.h
+++ b/vn/field/vn-combo.h
@@ -40,6 +40,7 @@ struct _VnCombo
GtkTreeModel * tree;
guint show_column;
guint index_column;
+ gboolean tree_set;
};
struct _VnComboClass
diff --git a/vn/field/vn-completion.c b/vn/field/vn-completion.c
index d8d0a01..e15fd56 100644
--- a/vn/field/vn-completion.c
+++ b/vn/field/vn-completion.c
@@ -327,7 +327,7 @@ static void vn_completion_class_init (VnCompletionClass * klass)
k->set_property = (GObjectSetPropertyFunc) vn_completion_set_property;
k->get_property = (GObjectGetPropertyFunc) vn_completion_get_property;
- g_object_class_override_property (k, PROP_MODEL, "model");
+ g_object_class_override_property (k, PROP_MODEL, "data-model");
g_object_class_install_property (k, PROP_FIELD,
g_param_spec_string ("field"
diff --git a/vn/field/vn-http-image.c b/vn/field/vn-http-image.c
index a4787a8..e90226f 100644
--- a/vn/field/vn-http-image.c
+++ b/vn/field/vn-http-image.c
@@ -113,7 +113,15 @@ static void vn_http_image_on_upload
*/
static void vn_http_image_set_value (VnHttpImage * self, const GValue * value)
{
- gchar * full_path = g_strconcat (self->priv->path, "/",
+ gchar * full_path;
+
+ if (gvn_value_is_null (value))
+ {
+ SET_ICON ("missing-image", _("No image set"));
+ return;
+ }
+
+ full_path = g_strconcat (self->priv->path, "/",
g_value_get_string (value), NULL);
SET_ICON ("view-refresh", _("Loading"));
diff --git a/vn/glade/vn-batch.c b/vn/glade/vn-batch.c
index 09df3cf..944ea47 100644
--- a/vn/glade/vn-batch.c
+++ b/vn/glade/vn-batch.c
@@ -122,13 +122,13 @@ static void vn_batch_buildable_interface_init (GtkBuildableIface * iface)
iface->custom_finished = vn_batch_buildable_custom_finished;
}
-static void vn_batch_init (VnBatch * obj)
+static void vn_batch_init (VnBatch * self)
{
}
-static void vn_batch_finalize (VnBatch * obj)
+static void vn_batch_finalize (VnBatch * self)
{
- G_OBJECT_CLASS (vn_batch_parent_class)->finalize (G_OBJECT (obj));
+ G_OBJECT_CLASS (vn_batch_parent_class)->finalize (G_OBJECT (self));
}
static void vn_batch_class_init (VnBatchClass * klass)
diff --git a/vn/glade/vn-iterator.c b/vn/glade/vn-iterator.c
index 2cf5524..be80eb1 100644
--- a/vn/glade/vn-iterator.c
+++ b/vn/glade/vn-iterator.c
@@ -19,58 +19,58 @@
static void vn_iterator_buildable_init (GtkBuildableIface * iface);
-G_DEFINE_TYPE_WITH_CODE (VnIterator, vn_iterator, DB_TYPE_ITERATOR,
+G_DEFINE_TYPE_WITH_CODE (VnIterator, vn_iterator, DB_TYPE_SIMPLE_ITERATOR,
G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
vn_iterator_buildable_init)
);
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Methods for Glade
-void vn_iterator_add_param (DbIterator * obj, DbParam * param)
+void vn_iterator_add_param (DbSimpleIterator * self, DbParam * param)
{
- VnIterator * i = (VnIterator *) obj;
- g_return_if_fail (DB_IS_ITERATOR (obj));
+ VnIterator * i = (VnIterator *) self;
+ g_return_if_fail (DB_IS_SIMPLE_ITERATOR (self));
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)
+void vn_iterator_remove_param (DbSimpleIterator * self, DbParam * param)
{
- VnIterator * i = (VnIterator *) obj;
- g_return_if_fail (DB_IS_ITERATOR (obj));
+ VnIterator * i = (VnIterator *) self;
+ g_return_if_fail (DB_IS_SIMPLE_ITERATOR (self));
g_return_if_fail (DB_IS_PARAM (param));
i->params = g_list_remove (i->params, param);
}
-GList * vn_iterator_get_params (DbIterator * obj)
+GList * vn_iterator_get_params (DbSimpleIterator * self)
{
- g_return_if_fail (DB_IS_ITERATOR (obj));
+ g_return_if_fail (DB_IS_SIMPLE_ITERATOR (self));
- return g_list_copy (((VnIterator *) obj)->params);
+ return g_list_copy (((VnIterator *) self)->params);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++ GtkBuildable
-static void vn_iterator_buildable_add_child (GtkBuildable * obj,
+static void vn_iterator_buildable_add_child (GtkBuildable * self,
GtkBuilder * builder, GObject * child, const gchar * type)
{
- db_iterator_add_param ((DbIterator *) obj, (DbParam *) child);
+ db_iterator_add_param (DB_ITERATOR (self), DB_PARAM (child));
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Class
-static void vn_iterator_init (VnIterator * obj)
+static void vn_iterator_init (VnIterator * self)
{
- obj->params = NULL;
+ self->params = NULL;
}
-static void vn_iterator_finalize (VnIterator * obj)
+static void vn_iterator_finalize (VnIterator * self)
{
- g_list_free_full (obj->params, g_object_unref);
+ g_list_free_full (self->params, g_object_unref);
- G_OBJECT_CLASS (vn_iterator_parent_class)->finalize (G_OBJECT (obj));
+ G_OBJECT_CLASS (vn_iterator_parent_class)->finalize (G_OBJECT (self));
}
static void vn_iterator_class_init (VnIteratorClass * klass)
diff --git a/vn/glade/vn-iterator.h b/vn/glade/vn-iterator.h
index 76bddd8..421e01c 100644
--- a/vn/glade/vn-iterator.h
+++ b/vn/glade/vn-iterator.h
@@ -22,30 +22,30 @@
#include
#define VN_TYPE_ITERATOR (vn_iterator_get_type ())
-#define VN_ITERATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST (obj, VN_TYPE_ITERATOR, VnIterator))
-#define VN_IS_ITERATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE (obj, VN_TYPE_ITERATOR))
+#define VN_ITERATOR(self) (G_TYPE_CHECK_INSTANCE_CAST (self, VN_TYPE_ITERATOR, VnIterator))
+#define VN_IS_ITERATOR(self) (G_TYPE_CHECK_INSTANCE_TYPE (self, VN_TYPE_ITERATOR))
#define VN_ITERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST (klass, VN_TYPE_ITERATOR, VnIteratorClass))
#define VN_IS_ITERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE (klass, VN_TYPE_ITERATOR))
-#define VN_ITERATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, VN_TYPE_ITERATOR, VnIteratorClass))
+#define VN_ITERATOR_GET_CLASS(self) (G_TYPE_INSTANCE_GET_CLASS (self, VN_TYPE_ITERATOR, VnIteratorClass))
typedef struct _VnIterator VnIterator;
typedef struct _VnIteratorClass VnIteratorClass;
struct _VnIterator
{
- DbIterator iterator;
+ DbSimpleIterator iterator;
GList * params;
};
struct _VnIteratorClass
{
- DbIteratorClass parent;
+ DbSimpleIteratorClass parent;
};
-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);
+void vn_iterator_add_param (DbSimpleIterator * self, DbParam * param);
+void vn_iterator_remove_param (DbSimpleIterator * self, DbParam * param);
+GList * vn_iterator_get_params (DbSimpleIterator * self);
#endif
diff --git a/vn/glade/vn-model.c b/vn/glade/vn-model.c
index 7c3dad3..a817c5a 100644
--- a/vn/glade/vn-model.c
+++ b/vn/glade/vn-model.c
@@ -150,12 +150,12 @@ static void vn_model_buildable_init (GtkBuildableIface * iface)
iface->custom_finished = vn_model_buildable_custom_finished;
}
-static void vn_model_init (VnModel * obj)
+static void vn_model_init (VnModel * self)
{}
-static void vn_model_finalize (VnModel * obj)
+static void vn_model_finalize (VnModel * self)
{
- G_OBJECT_CLASS (vn_model_parent_class)->finalize (G_OBJECT (obj));
+ G_OBJECT_CLASS (vn_model_parent_class)->finalize (G_OBJECT (self));
}
static void vn_model_class_init (VnModelClass * klass)
diff --git a/vn/glade/vn-model.h b/vn/glade/vn-model.h
index 0721c87..e97c1c2 100644
--- a/vn/glade/vn-model.h
+++ b/vn/glade/vn-model.h
@@ -22,11 +22,11 @@
#include
#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(self) (G_TYPE_CHECK_INSTANCE_CAST (self, VN_TYPE_MODEL, VnModel))
+#define VN_IS_MODEL(self) (G_TYPE_CHECK_INSTANCE_TYPE (self, 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))
+#define VN_MODEL_GET_CLASS(self) (G_TYPE_INSTANCE_GET_CLASS (self, VN_TYPE_MODEL, VnModelClass))
typedef struct _VnModel VnModel;
typedef struct _VnModelClass VnModelClass;
diff --git a/vn/gui/login.glade b/vn/gui/login.glade
index d40e4c7..11f99b6 100644
--- a/vn/gui/login.glade
+++ b/vn/gui/login.glade
@@ -6,8 +6,8 @@
-
- SELECT rowid, last_connection FROM config LIMIT 1
+
+ SELECT rowid, name, plugin, schema, host, ssl_ca, user, password FROM connection
DB_MODEL_INSERT | DB_MODEL_DELETE | DB_MODEL_UPDATE
@@ -22,36 +22,25 @@
-
- SELECT rowid, name, plugin, schema, host, ssl_ca, user, password FROM connection
+
+ SELECT rowid, last_connection FROM config LIMIT 1
DB_MODEL_INSERT | DB_MODEL_DELETE | DB_MODEL_UPDATE
-
-
- model-last-conn
- on-demand
-
-
-
- model-login
+ model-login
on-demand
-
- model-connections
- on-iter
-
-
- rowid
-
-
+
+ model-last-conn
+ on-demand
+
@@ -63,6 +52,7 @@
center
../image/icon.svg
+
True
@@ -96,12 +86,7 @@
iterator-last-conn
last_connection
False
- model-connections
-
-
- False
-
-
+ model-connections
False
@@ -135,6 +120,7 @@
True
False
edit-find-symbolic
+ Show password
Password
@@ -199,8 +185,8 @@
True
True
-
+
False
@@ -252,8 +238,8 @@
True
True
-
+
False
@@ -291,7 +277,8 @@
True
True
- iterator-connections
+ model-connections
+ on-iter
@@ -318,7 +305,7 @@
True
False
end
- iterator-connections
+ connections-grid
VN_HANDLER_SHOW_REMOVE | VN_HANDLER_SHOW_ADD
@@ -335,7 +322,7 @@
-
+
True
False
vertical
@@ -398,7 +385,7 @@
True
False
- iterator-connections
+ connections-grid
ssl_ca
@@ -419,7 +406,7 @@
True
False
- iterator-connections
+ connections-grid
schema
@@ -437,7 +424,7 @@
True
False
- iterator-connections
+ connections-grid
host
@@ -467,7 +454,7 @@
True
False
- iterator-connections
+ connections-grid
name
@@ -485,7 +472,7 @@
True
False
- iterator-connections
+ connections-grid
plugin
@@ -515,7 +502,7 @@
True
False
- iterator-connections
+ connections-grid
user
@@ -539,7 +526,7 @@
True
False
- iterator-connections
+ connections-grid
VN_HANDLER_SHOW_UNDO | VN_HANDLER_SHOW_SAVE
@@ -568,4 +555,12 @@
close
+
+
+
+ connections-grid
+ rowid
+
+
+
diff --git a/vn/gui/menu.glade b/vn/gui/menu.glade
index 7794221..1f48ce3 100644
--- a/vn/gui/menu.glade
+++ b/vn/gui/menu.glade
@@ -26,8 +26,6 @@
app.about
<Primary>h
-
-
-
Quit
app.quit
diff --git a/vn/vn-column.c b/vn/vn-column.c
index bae9023..84223c6 100644
--- a/vn/vn-column.c
+++ b/vn/vn-column.c
@@ -294,7 +294,7 @@ DbModel * vn_column_get_model (VnColumn * obj)
GTK_TREE_VIEW_COLUMN (obj));
if (grid)
- return vn_grid_get_model (VN_GRID (grid));
+ return db_model_holder_get_model (DB_MODEL_HOLDER (grid));
return NULL;
}
diff --git a/vn/vn-field.c b/vn/vn-field.c
index bec9320..8d582e2 100644
--- a/vn/vn-field.c
+++ b/vn/vn-field.c
@@ -261,6 +261,7 @@ static void vn_field_set_widget (VnField * self, GtkWidget * widget)
{
self->widget = widget;
vn_field_update_widget (self);
+ gtk_widget_show (widget);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Public
@@ -415,7 +416,7 @@ GtkWidget * vn_field_get_widget (VnField * self)
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Buildable
-static GtkBuildableIface *parent_buildable_iface;
+static GtkBuildableIface * parent_buildable_iface;
static GObject * vn_field_buildable_get_internal_child (GtkBuildable * buildable,
GtkBuilder * builder, const gchar * childname)
@@ -543,6 +544,7 @@ static void vn_field_init (VnField * self)
static void vn_field_dispose (VnField * self)
{
vn_field_set_master (self, NULL);
+ G_OBJECT_CLASS (vn_field_parent_class)->dispose (G_OBJECT (self));
}
static void vn_field_finalize (VnField * self)
diff --git a/vn/vn-grid-model.c b/vn/vn-grid-model.c
index fc26bc5..84c253a 100644
--- a/vn/vn-grid-model.c
+++ b/vn/vn-grid-model.c
@@ -24,6 +24,16 @@ typedef struct
}
GvnSignalInfo;
+/*
+ * gvn_object_link:
+ * @obj: instance
+ * @prop: property of @obj to be set to @prop_value
+ * @prop_value: the value to set on @prop
+ * @info: an array of GvnSignalInfo
+ *
+ * Connects the signals of an object passed on @prop_value to the callbacks
+ * listed in a GvnSignalInfo array.
+ */
void _gvn_object_link (gpointer obj, gpointer * prop, gpointer prop_value, GvnSignalInfo * info)
{
gint i;
@@ -54,7 +64,7 @@ void _gvn_object_link (gpointer obj, gpointer * prop, gpointer prop_value, GvnSi
*prop = NULL;
}
-#define gvn_object_link(obj, prop, prop_value, info) (_gvn_object_link (obj, (void**) prop, prop_value, info))
+#define gvn_object_link(obj, prop, prop_value, info) (_gvn_object_link (obj, (void**) prop, prop_value, info))
static void vn_grid_model_tree_model_init (GtkTreeModelIface * iface);
static void vn_grid_model_tree_sortable_init (GtkTreeSortableIface * iface);
@@ -386,6 +396,7 @@ typedef enum
}
VnGridModelProp;
+/*Experimental way to connect a property object signals using gvn_object_link*/
GvnSignalInfo signal_info[] =
{
{"line-updated.after", vn_grid_model_on_line_updated
diff --git a/vn/vn-grid.c b/vn/vn-grid.c
index e9265c3..240a35b 100644
--- a/vn/vn-grid.c
+++ b/vn/vn-grid.c
@@ -17,144 +17,53 @@
#include "vn-grid.h"
-G_DEFINE_TYPE (VnGrid, vn_grid, GTK_TYPE_TREE_VIEW);
+static void vn_grid_model_holder_init (DbModelHolderInterface * iface);
+static void vn_grid_iterator_init (DbIteratorInterface * iface);
+
+static void vn_grid_on_iter_changed (GtkTreeView * self);
+static void vn_grid_set_iter (VnGrid * self, DbIter * iter);
+static gboolean vn_grid_move_iter (VnGrid * self, DbIter * iter);
+
+/**
+ * SECTION: vn-grid
+ * @Short_description: a grid to display data
+ * @Title: VnGrid
+ *
+ * #VnGrid is used to show data from a #DbModel organized in #VnColumns.
+ */
+G_DEFINE_TYPE_WITH_CODE (VnGrid, vn_grid, GTK_TYPE_TREE_VIEW,
+ G_IMPLEMENT_INTERFACE (DB_TYPE_MODEL_HOLDER,
+ vn_grid_model_holder_init)
+ G_IMPLEMENT_INTERFACE (DB_TYPE_ITERATOR,
+ vn_grid_iterator_init)
+);
+
+/**
+ * VnGrid:
+ * @params: (element-type Db.Param):
+ **/
/**
* vn_grid_new:
+ * @model: a #DbModel
*
* Creates a new grid
*
- * Return value: #VnGrid created.
+ * Return value: (transfer full): #VnGrid created.
**/
-VnGrid * vn_grid_new ()
+VnGrid * vn_grid_new (DbModel * model)
{
- return g_object_new (VN_TYPE_GRID, "rules-hint", TRUE, NULL);
-}
-
-/**
- * vn_grid_new_with_iterator:
- * @iterator: #DbIterator where the grid will be created
- *
- * Creates a new grid into a iterator
- *
- * Return value: #VnGrid created.
- **/
-VnGrid * vn_grid_new_with_iterator (DbIterator * iterator)
-{
- VnGrid * obj = vn_grid_new ();
- g_object_set (obj, "iterator", iterator, NULL);
- return obj;
+ return g_object_new (VN_TYPE_GRID, "rules-hint", TRUE, "data-model", model, NULL);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Private
-static void vn_grid_on_iter_changed (DbIterator * iterator, GtkTreeView * obj);
-
-static void vn_grid_on_selection_changed (GtkTreeSelection * selection, GtkTreeView * obj)
+static void vn_grid_unref_param (VnGrid * self, DbParam * param)
{
- GtkTreeIter iter;
- GList * l, * list;
-
- if (gtk_tree_selection_count_selected_rows (selection) <= 1)
- return;
-
- list = gtk_tree_selection_get_selected_rows (selection, NULL);
-
- for (l = list; l; l = l->next)
- if (gtk_tree_model_get_iter (gtk_tree_view_get_model (obj), &iter, l->data))
- {
- DbIter dbiter;
- vn_gtk_tree_iter_to_db_iter (&iter, &dbiter);
- db_iterator_select_iter (VN_GRID (obj)->iterator, &dbiter);
- }
-
- g_list_free_full (list, (GDestroyNotify) gtk_tree_path_free);
+ self->params = g_list_remove (self->params, param);
}
-static void vn_grid_on_cursor_changed (GtkTreeView * tree_view, VnGrid * obj)
-{
- gint selected_rows;
-
- if (!db_iterator_is_ready (obj->iterator))
- return;
-
- selected_rows = gtk_tree_selection_count_selected_rows (gtk_tree_view_get_selection (tree_view));
-
- if (selected_rows == 1)
- {
- GtkTreeIter iter;
- GtkTreePath * path;
-
- gtk_tree_view_get_cursor (tree_view, &path, NULL);
-
- if (path && gtk_tree_model_get_iter (gtk_tree_view_get_model (tree_view), &iter, path))
- {
- DbIter dbiter;
- vn_gtk_tree_iter_to_db_iter (&iter, &dbiter);
-
- g_signal_handlers_block_by_func (obj->iterator, vn_grid_on_iter_changed, obj);
- db_iterator_move_iter (obj->iterator, &dbiter);
- g_signal_handlers_unblock_by_func (obj->iterator, vn_grid_on_iter_changed, obj);
- }
-
- gtk_tree_path_free (path);
- }
- else if (selected_rows == 0)
- db_iterator_move_iter (obj->iterator, NULL);
-}
-
-static void vn_grid_on_iter_changed (DbIterator * iterator, GtkTreeView * obj)
-{
- DbIter dbiter;
- GtkTreeSelection * selection = gtk_tree_view_get_selection (obj);
-
- if (db_iterator_get_iter (iterator, &dbiter) && gtk_tree_view_get_model (obj))
- {
- GtkTreeIter iter;
- GtkTreePath * path;
-
- vn_gtk_tree_iter_from_db_iter (&iter, &dbiter);
- path = gtk_tree_model_get_path (gtk_tree_view_get_model (obj), &iter);
-
- g_signal_handlers_block_by_func (obj, vn_grid_on_cursor_changed, iterator);
- gtk_tree_view_set_cursor (obj, path, NULL, FALSE);
- g_signal_handlers_unblock_by_func (obj, vn_grid_on_cursor_changed, iterator);
-
- gtk_tree_path_free (path);
- }
- else if (selection)
- gtk_tree_selection_unselect_all (selection);
-}
-
-static void vn_grid_on_model_changed (VnGrid * obj, GParamSpec * spec, gpointer data)
-{
- GList * n, * columns = gtk_tree_view_get_columns (GTK_TREE_VIEW (obj));
-
- for (n = columns; n; n = n->next)
- if (VN_IS_COLUMN (n->data))
- vn_column_model_changed (n->data);
-
- g_list_free (columns);
-}
-
-static void vn_grid_on_status_changed (DbIterator * iterator, gboolean ready, VnGrid * obj)
-{
- obj->model = db_model_holder_get_model (DB_MODEL_HOLDER (iterator));
- vn_grid_on_model_changed (obj, NULL, NULL);
-
- if (ready)
- {
- GtkTreeModel * tree_model = GTK_TREE_MODEL (vn_grid_model_new (obj->model));
- gtk_tree_view_set_model (GTK_TREE_VIEW (obj), tree_model);
- vn_grid_on_iter_changed (obj->iterator, GTK_TREE_VIEW (obj));
-
- g_object_unref (tree_model);
- }
- else
- gtk_tree_view_set_model (GTK_TREE_VIEW (obj), NULL);
-}
-
-static gboolean vn_grid_on_cursor_key_pressed (GtkTreeView * obj,
+static gboolean vn_grid_on_key_pressed (GtkTreeView * self,
GdkEventKey * event, gpointer data)
{
gboolean inverted, passed = FALSE;
@@ -167,13 +76,30 @@ static gboolean vn_grid_on_cursor_key_pressed (GtkTreeView * obj,
GtkCellArea * area;
GtkCellEditable * editable;
+ // Remove new not inserted row when Escape is pressed
+ if (event->type == GDK_KEY_PRESS
+ && event->keyval == GDK_KEY_Escape
+ && VN_GRID (self)->mode != DB_ITERATOR_MODE_ON_DEMAND)
+ {
+ db_iterator_reverse_operations (DB_ITERATOR (self));
+ return FALSE;
+ }
+
+ // Move cursor when pressing Tab, Shift + Tab or Keypad Enter
if (!(event->type == GDK_KEY_PRESS
&& (event->keyval == GDK_KEY_Tab
|| event->keyval == GDK_KEY_ISO_Left_Tab
|| event->keyval == GDK_KEY_KP_Enter)))
return FALSE;
- gtk_tree_view_get_cursor (obj, &path, &col);
+ gtk_tree_view_get_cursor (self, &path, &col);
+
+ if (!col || !path)
+ {
+ gtk_tree_path_free (path);
+ return FALSE;
+ }
+
selected = VN_COLUMN (col);
g_object_get (col, "cell-area", &area, NULL);
@@ -184,7 +110,7 @@ static gboolean vn_grid_on_cursor_key_pressed (GtkTreeView * obj,
g_object_unref (area);
- columns = gtk_tree_view_get_columns (obj);
+ columns = gtk_tree_view_get_columns (self);
inverted = event->keyval == GDK_KEY_ISO_Left_Tab ? TRUE : FALSE;
sel_tab_index = vn_column_get_tab_index (selected);
first = NULL;
@@ -230,7 +156,7 @@ static gboolean vn_grid_on_cursor_key_pressed (GtkTreeView * obj,
g_list_free (columns);
- if (!next)
+ if (!next && path)
{
gboolean leave = FALSE;
next = first ? first : selected;
@@ -241,19 +167,19 @@ static gboolean vn_grid_on_cursor_key_pressed (GtkTreeView * obj,
{
DbIter iter;
- if (db_model_get_iter (VN_GRID (obj)->model, &iter, gtk_tree_path_get_indices (path)[0])
- && db_model_get_row_operations (VN_GRID (obj)->model, &iter) == DB_MODEL_ROW_OP_INSERT)
+ if (db_model_get_iter (VN_GRID (self)->model, &iter, gtk_tree_path_get_indices (path)[0])
+ && db_model_get_row_operations (VN_GRID (self)->model, &iter) == DB_MODEL_ROW_OP_INSERT)
leave = TRUE;
else
{
gtk_tree_path_next (path);
if (gtk_tree_path_get_indices (path)[0] >=
- db_model_get_nrows (VN_GRID (obj)->model))
+ db_model_get_nrows (VN_GRID (self)->model))
{
- if (db_model_get_update_flags (VN_GRID (obj)->model) &
+ if (db_model_get_update_flags (VN_GRID (self)->model) &
DB_MODEL_INSERT)
- db_iterator_insert (VN_GRID (obj)->iterator);
+ db_iterator_insert (DB_ITERATOR (self));
else
leave = TRUE;
}
@@ -267,164 +193,448 @@ static gboolean vn_grid_on_cursor_key_pressed (GtkTreeView * obj,
}
}
- gtk_tree_view_set_cursor (obj, path, GTK_TREE_VIEW_COLUMN (next), TRUE);
+ gtk_tree_view_set_cursor (self, path, GTK_TREE_VIEW_COLUMN (next), TRUE);
gtk_tree_path_free (path);
return TRUE;
}
-static gboolean vn_grid_on_escape_pressed (VnGrid * obj,
- GdkEventKey * event, gpointer data)
+static void vn_grid_on_cursor_changed (GtkTreeView * self)
{
- if (event->type == GDK_KEY_PRESS
- && event->keyval == GDK_KEY_Escape
- && db_iterator_get_mode (obj->iterator) != DB_ITERATOR_MODE_ON_DEMAND)
- db_iterator_reverse_operations (obj->iterator);
+ GtkTreeIter iter;
+ GtkTreePath * path;
- return FALSE;
-}
+ if (gtk_tree_selection_count_selected_rows (gtk_tree_view_get_selection (self)) > 1)
+ return;
-//+++++++++++++++++++++++++++++++++++++++++++++++++++ Public
+ gtk_tree_view_get_cursor (self, &path, NULL);
-/**
- * vn_grid_get_iterator:
- * @obj: a #VnGrid
- *
- * Gets the iterator used by @obj.
- *
- * Return value: (transfer none): the #DbIterator
- **/
-DbIterator * vn_grid_get_iterator (VnGrid * obj)
-{
- g_return_val_if_fail (VN_IS_GRID (obj), NULL);
-
- return obj->iterator;
-}
-
-/**
- * vn_grid_set_iterator:
- * @obj: a #VnGrid
- * @iterator: the #DbIterator
- *
- * Sets the iterator handled by tree view.
- **/
-void vn_grid_set_iterator (VnGrid * obj, DbIterator * iterator)
-{
- g_return_if_fail (VN_IS_GRID (obj));
- g_return_if_fail (DB_IS_ITERATOR (iterator) || !iterator);
-
- if (obj->iterator)
+ if (path && gtk_tree_model_get_iter (gtk_tree_view_get_model (self), &iter, path))
{
- g_object_disconnect (obj->iterator
- ,"any-signal", vn_grid_on_iter_changed, obj
- ,"any-signal", vn_grid_on_status_changed, obj
- ,NULL
- );
- g_clear_object (&obj->iterator);
-
- obj->model = NULL;
+ DbIter dbiter;
+ vn_gtk_tree_iter_to_db_iter (&iter, &dbiter);
+ vn_grid_move_iter (VN_GRID (self), &dbiter);
}
- if (iterator)
- {
- obj->iterator = g_object_ref (iterator);
- g_object_connect (iterator
- ,"signal::iter-changed", vn_grid_on_iter_changed, obj
- ,"signal::status-changed", vn_grid_on_status_changed, obj
- ,NULL
- );
- vn_grid_on_status_changed (iterator,
- db_iterator_is_ready (iterator), obj);
+ gtk_tree_path_free (path);
+}
+
+static void vn_grid_on_iter_changed (GtkTreeView * self)
+{
+ GtkTreeSelection * selection = gtk_tree_view_get_selection (self);
+
+ if (VN_GRID (self)->iter && gtk_tree_view_get_model (self))
+ {
+ GtkTreeIter iter;
+ GtkTreePath * path;
+
+ vn_gtk_tree_iter_from_db_iter (&iter, VN_GRID (self)->iter);
+ path = gtk_tree_model_get_path (gtk_tree_view_get_model (self), &iter);
+
+ g_signal_handlers_block_by_func (self, vn_grid_on_cursor_changed, NULL);
+ gtk_tree_view_set_cursor (self, path, NULL, FALSE);
+ g_signal_handlers_unblock_by_func (self, vn_grid_on_cursor_changed, NULL);
+
+ gtk_tree_path_free (path);
+ }
+ else if (selection)
+ gtk_tree_selection_unselect_all (selection);
+}
+
+static void vn_grid_on_model_changed (VnGrid * self, GParamSpec * spec, gpointer data)
+{
+ GList * n, * columns = gtk_tree_view_get_columns (GTK_TREE_VIEW (self));
+
+ for (n = columns; n; n = n->next)
+ if (VN_IS_COLUMN (n->data))
+ vn_column_model_changed (n->data);
+
+ g_list_free (columns);
+}
+
+static void vn_grid_row_num_changed (VnGrid * self)
+{
+ if (self->iter)
+ self->row = db_model_get_path (self->model, self->iter);
+ else if (!self->remember_selection)
+ self->row = -1;
+
+ db_iterator_row_num_changed (DB_ITERATOR (self));
+}
+
+static void vn_grid_iter_changed (VnGrid * self)
+{
+ vn_grid_row_num_changed (self);
+ db_iterator_iter_changed (DB_ITERATOR (self));
+ vn_grid_on_iter_changed (GTK_TREE_VIEW (self));
+}
+
+//+++++++++++++++++++++++++++++++++++++++++++++++++++ DbModelHolder methods
+
+static void vn_grid_set_model_mode (VnGrid * self)
+{
+ if (!self->model)
+ return;
+
+ if (self->mode == DB_ITERATOR_MODE_ON_CHANGE)
+ db_model_set_mode (self->model, DB_MODEL_MODE_ON_CHANGE);
+ else
+ db_model_set_mode (self->model, DB_MODEL_MODE_ON_DEMAND);
+}
+
+static void vn_grid_on_model_line_inserted (DbModel * model, DbIter * iter, VnGrid * self)
+{
+ db_iterator_data_changed (DB_ITERATOR (self));
+}
+
+static void vn_grid_on_model_line_updated_after (DbModel * model, DbIter * iter, VnGrid * self)
+{
+ if (self->iter && db_iter_compare (iter, self->iter))
+ vn_grid_iter_changed (self);
+
+ db_iterator_data_changed (DB_ITERATOR (self));
+}
+
+static void vn_grid_on_model_line_deleted (DbModel * model, gint row, VnGrid * self)
+{
+ if (self->iter && row == self->row)
+ {
+ DbIter iter;
+
+ if (db_model_get_iter (model, &iter, row + 1)
+ || db_model_get_iter (model, &iter, row - 1))
+ vn_grid_set_iter (self, &iter);
+ else
+ vn_grid_set_iter (self, NULL);
}
}
-/**
- * vn_grid_get_model:
- * @obj: a #VnGrid
- *
- * Gets the model used by @obj.
- *
- * Return value: (transfer none): the #DbModel
- **/
-DbModel * vn_grid_get_model (VnGrid * obj)
+static void vn_grid_on_model_line_deleted_after (DbModel * model, gint row, VnGrid * self)
{
- g_return_val_if_fail (VN_IS_GRID (obj), NULL);
+ if (self->iter)
+ vn_grid_row_num_changed (self);
- return obj->model;
+ db_iterator_data_changed (DB_ITERATOR (self));
+}
+
+static void vn_grid_on_model_lines_reordered (DbModel * model, gint column, gint * new_order, VnGrid * self)
+{
+ if (self->iter)
+ vn_grid_row_num_changed (self);
+}
+
+static void vn_grid_on_model_status_changed (DbModel * model, DbModelStatus status, VnGrid * self)
+{
+ self->model = db_model_holder_get_model (DB_MODEL_HOLDER (self));
+ vn_grid_on_model_changed (self, NULL, NULL);
+
+ if (status == DB_MODEL_STATUS_READY)
+ {
+ DbIter iter;
+ GtkTreeModel * tree_model;
+
+ db_iterator_status_changed (DB_ITERATOR (self), TRUE);
+
+ tree_model = GTK_TREE_MODEL (vn_grid_model_new (self->model));
+ gtk_tree_view_set_model (GTK_TREE_VIEW (self), tree_model);
+ vn_grid_on_iter_changed (GTK_TREE_VIEW (self));
+
+ if (self->row >= 0 && self->row < db_model_get_nrows (self->model)
+ && db_model_get_iter (self->model, &iter, self->row))
+ vn_grid_set_iter (self, &iter);
+ else
+ vn_grid_set_iter (self, NULL);
+
+ g_object_unref (tree_model);
+ }
+ else
+ {
+ vn_grid_set_iter (self, NULL);
+ db_iterator_status_changed (DB_ITERATOR (self), FALSE);
+ gtk_tree_view_set_model (GTK_TREE_VIEW (self), NULL);
+ }
+}
+
+static void vn_grid_on_model_operations_done (DbModel * model, VnGrid * self)
+{
+ g_return_val_if_fail (VN_IS_GRID (self), NULL);
+
+ db_iterator_operations_done (DB_ITERATOR (self));
+}
+
+static DbModel * vn_grid_get_model (VnGrid * self)
+{
+ g_return_val_if_fail (VN_IS_GRID (self), NULL);
+
+ return self->model;
+}
+
+static void vn_grid_set_model (VnGrid * self, DbModel * model)
+{
+ g_return_if_fail (VN_IS_GRID (self));
+
+ if (!model)
+ return;
+
+ if (!self->model)
+ {
+ self->model = g_object_ref (model);
+ g_object_connect (model
+ ,"signal::line-inserted", vn_grid_on_model_line_inserted, self
+ ,"signal-after::line-updated", vn_grid_on_model_line_updated_after, self
+ ,"signal::line-deleted", vn_grid_on_model_line_deleted, self
+ ,"signal-after::line-deleted", vn_grid_on_model_line_deleted_after, self
+ ,"signal::lines-reordered", vn_grid_on_model_lines_reordered, self
+ ,"signal::status-changed", vn_grid_on_model_status_changed, self
+ ,"signal::operations-done", vn_grid_on_model_operations_done, self
+ ,NULL
+ );
+
+ vn_grid_set_model_mode (self);
+ vn_grid_on_model_status_changed (model,
+ db_model_get_status (model), self);
+ }
+ else
+ g_warning ("VnGrid: Can't reassign the 'data-model' property");
+}
+
+//+++++++++++++++++++++++++++++++++++++++++++++++++++ DbIterator methods
+
+static DbIteratorMode vn_grid_get_mode (VnGrid * self)
+{
+ g_return_val_if_fail (VN_IS_GRID (self), 0);
+
+ return self->mode;
+}
+
+static void vn_grid_set_mode (VnGrid * self, DbIteratorMode mode)
+{
+ g_return_if_fail (VN_IS_GRID (self));
+
+ self->mode = mode;
+ vn_grid_set_model_mode (self);
+}
+
+static gint vn_grid_get_row (VnGrid * self)
+{
+ g_return_val_if_fail (VN_IS_GRID (self), -1);
+
+ if (self->iter)
+ return self->row;
+ else
+ return -1;
+}
+
+static gboolean vn_grid_get_iter (VnGrid * self, DbIter ** iter)
+{
+ g_return_val_if_fail (VN_IS_GRID (self), NULL);
+
+ if (!self->iter)
+ return FALSE;
+
+ *iter = self->iter;
+ return TRUE;
+}
+
+static void vn_grid_set_iter (VnGrid * self, DbIter * iter)
+{
+ if (iter)
+ {
+ db_iter_free (self->iter);
+ self->iter = db_iter_copy (iter);
+ vn_grid_iter_changed (self);
+ }
+ else if (self->iter)
+ {
+ if (!self->remember_selection)
+ self->row = 0;
+
+ db_iter_free (self->iter);
+ self->iter = NULL;
+ vn_grid_iter_changed (self);
+ }
+}
+
+static gboolean vn_grid_move_iter (VnGrid * self, DbIter * iter)
+{
+ g_return_val_if_fail (VN_IS_GRID (self), FALSE);
+
+ if (self->iter && db_iter_compare (self->iter, iter))
+ return FALSE;
+
+ if (self->iter && self->mode != DB_ITERATOR_MODE_ON_DEMAND)
+ {
+ if (db_model_get_row_operations (self->model, self->iter) == DB_MODEL_ROW_OP_INSERT)
+ db_model_reverse_operations (self->model);
+
+ db_model_perform_operations (self->model, FALSE);
+ }
+
+ vn_grid_set_iter (self, iter);
+ return TRUE;
+}
+
+static GList * vn_grid_get_param_list (VnGrid * self)
+{
+ g_return_val_if_fail (VN_IS_GRID (self), NULL);
+
+ return self->params;
+}
+
+static void vn_grid_delete_selection (VnGrid * self)
+{
+ GtkTreeModel * tree_model;
+ GtkTreeSelection * selection;
+ GList * selected, * l;
+
+ g_return_val_if_fail (VN_IS_GRID (self), NULL);
+
+ if (!self->model)
+ return;
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (self));
+ selected = gtk_tree_selection_get_selected_rows (selection, NULL);
+ tree_model = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
+
+ for (l = selected; l; l = l->next)
+ {
+ DbIter iter;
+ GtkTreeIter tree_iter;
+
+ gtk_tree_model_get_iter (tree_model, &tree_iter, l->data);
+ vn_gtk_tree_iter_to_db_iter (&tree_iter, &iter);
+
+ db_model_delete (self->model, &iter);
+ }
+
+ g_list_free_full (selected, (GDestroyNotify) gtk_tree_path_free);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Properties
typedef enum
{
- PROP_ITERATOR = 1
+ PROP_MODEL = 1
+ ,PROP_MODE
+ ,PROP_REMEMBER_SELECTION
}
VnGridProp;
-static void vn_grid_set_property (VnGrid * obj, guint id,
+static void vn_grid_set_property (VnGrid * self, guint id,
const GValue * value, GParamSpec * pspec)
{
switch (id)
{
- case PROP_ITERATOR:
- vn_grid_set_iterator (obj, g_value_get_object (value));
+ case PROP_MODEL:
+ vn_grid_set_model (self, g_value_get_object (value));
+ break;
+ case PROP_MODE:
+ vn_grid_set_mode (self, g_value_get_enum (value));
+ break;
+ case PROP_REMEMBER_SELECTION:
+ self->remember_selection = g_value_get_boolean (value);
break;
default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, id, pspec);
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (self, id, pspec);
}
}
-static void vn_grid_get_property (VnGrid * obj, guint id,
+static void vn_grid_get_property (VnGrid * self, guint id,
GValue * value, GParamSpec * pspec)
{
switch (id)
{
- case PROP_ITERATOR:
- g_value_set_object (value, obj->iterator);
+ case PROP_MODEL:
+ g_value_set_object (value, self->model);
+ break;
+ case PROP_MODE:
+ g_value_set_enum (value, self->mode);
+ break;
+ case PROP_REMEMBER_SELECTION:
+ g_value_set_boolean (value, self->remember_selection);
break;
default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, id, pspec);
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (self, id, pspec);
}
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Class
-static void vn_grid_init (VnGrid * obj)
+static void vn_grid_init (VnGrid * self)
{
- GtkTreeSelection * selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (obj));
- obj->iterator = NULL;
- obj->model = NULL;
+ GtkTreeSelection * selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (self));
+ self->mode = 0;
+ self->iter = 0;
+ self->row = 0;
+ self->params = NULL;
+ self->model = NULL;
gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
- g_signal_connect (selection, "changed",
- G_CALLBACK (vn_grid_on_selection_changed), obj);
- g_object_connect (obj
- ,"signal::notify::model", vn_grid_on_model_changed, obj
- ,"signal::key-press-event", vn_grid_on_cursor_key_pressed, obj
- ,"signal::key-press-event", vn_grid_on_escape_pressed, obj
- ,"signal-after::cursor-changed", vn_grid_on_cursor_changed, obj
+ g_signal_connect (self, "notify::model", G_CALLBACK (vn_grid_on_model_changed), NULL);
+ g_object_connect (self
+ ,"signal-after::cursor-changed", vn_grid_on_cursor_changed, NULL
+ ,"signal::key-press-event", vn_grid_on_key_pressed, NULL
,NULL
);
}
-static void vn_grid_finalize (VnGrid * obj)
+static void vn_grid_finalize (VnGrid * self)
{
- vn_grid_set_iterator (obj, NULL);
+ GList * n;
- G_OBJECT_CLASS (vn_grid_parent_class)->finalize (G_OBJECT (obj));
+ for (n = self->params; n; n = n->next)
+ g_object_weak_unref (n->data,
+ (GWeakNotify) vn_grid_unref_param, self);
+
+ g_list_free (self->params);
+
+ db_iter_free (self->iter);
+ self->iter = NULL;
+
+ if (self->model)
+ {
+ g_object_disconnect (self->model
+ ,"any_signal", vn_grid_on_model_line_inserted, self
+ ,"any_signal", vn_grid_on_model_line_updated_after, self
+ ,"any_signal", vn_grid_on_model_line_deleted, self
+ ,"any_signal", vn_grid_on_model_line_deleted_after, self
+ ,"any_signal", vn_grid_on_model_lines_reordered, self
+ ,"any_signal", vn_grid_on_model_status_changed, self
+ ,"any_signal", vn_grid_on_model_operations_done, self
+ ,NULL
+ );
+ g_object_unref (self->model);
+ }
+
+ G_OBJECT_CLASS (vn_grid_parent_class)->finalize (G_OBJECT (self));
}
-static void vn_grid_class_init (VnGridClass * k)
+static void vn_grid_class_init (VnGridClass * klass)
{
- GObjectClass * klass = G_OBJECT_CLASS (k);
- klass->set_property = (GObjectSetPropertyFunc) vn_grid_set_property;
- klass->get_property = (GObjectGetPropertyFunc) vn_grid_get_property;
- klass->finalize = (GObjectFinalizeFunc) vn_grid_finalize;
+ GObjectClass * k = G_OBJECT_CLASS (klass);
+ k->set_property = (GObjectSetPropertyFunc) vn_grid_set_property;
+ k->get_property = (GObjectGetPropertyFunc) vn_grid_get_property;
+ k->finalize = (GObjectFinalizeFunc) vn_grid_finalize;
- g_object_class_install_property (klass, PROP_ITERATOR,
- g_param_spec_object ("iterator"
- ,_("Iterator")
- ,_("The iterator used by VnGrid")
- ,DB_TYPE_ITERATOR
- ,G_PARAM_READWRITE
- ));
-}
\ No newline at end of file
+ g_object_class_override_property (k, PROP_MODEL, "data-model");
+
+ g_object_class_override_property (k, PROP_MODE, "mode");
+ g_object_class_override_property (k, PROP_REMEMBER_SELECTION, "remember-selection");
+}
+
+static void vn_grid_model_holder_init (DbModelHolderInterface * iface)
+{
+ iface->get_model = (DbModelHolderGetModelFunc) vn_grid_get_model;
+ iface->set_model = (DbModelHolderSetModelFunc) vn_grid_set_model;
+}
+
+static void vn_grid_iterator_init (DbIteratorInterface * iface)
+{
+ iface->get_mode = (DbIteratorGetMode) vn_grid_get_mode;
+ iface->set_mode = (DbIteratorSetMode) vn_grid_set_mode;
+ iface->get_row = (DbIteratorGetRow) vn_grid_get_row;
+ iface->get_iter = (DbIteratorGetIter) vn_grid_get_iter;
+ iface->set_iter = (DbIteratorSetIter) vn_grid_set_iter;
+ iface->move_iter = (DbIteratorMoveIter) vn_grid_move_iter;
+ iface->get_param_list = (DbIteratorGetParamList) vn_grid_get_param_list;
+ iface->delete_selection = (DbIteratorDeleteSelection) vn_grid_delete_selection;
+}
diff --git a/vn/vn-grid.h b/vn/vn-grid.h
index 079c315..f4b5e3d 100644
--- a/vn/vn-grid.h
+++ b/vn/vn-grid.h
@@ -24,11 +24,11 @@
#include "vn-column.h"
#define VN_TYPE_GRID (vn_grid_get_type ())
-#define VN_GRID(obj) (G_TYPE_CHECK_INSTANCE_CAST (obj, VN_TYPE_GRID, VnGrid))
-#define VN_IS_GRID(obj) (G_TYPE_CHECK_INSTANCE_TYPE (obj, VN_TYPE_GRID))
+#define VN_GRID(self) (G_TYPE_CHECK_INSTANCE_CAST (self, VN_TYPE_GRID, VnGrid))
+#define VN_IS_GRID(self) (G_TYPE_CHECK_INSTANCE_TYPE (self, VN_TYPE_GRID))
#define VN_GRID_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST (klass, VN_TYPE_GRID, VnGridClass))
#define VN_IS_GRID_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE (klass, VN_TYPE_GRID))
-#define VN_GRID_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, VN_TYPE_GRID, VnGridClass))
+#define VN_GRID_GET_CLASS(self) (G_TYPE_INSTANCE_GET_CLASS (self, VN_TYPE_GRID, VnGridClass))
typedef struct _VnGrid VnGrid;
typedef struct _VnGridClass VnGridClass;
@@ -36,8 +36,12 @@ typedef struct _VnGridClass VnGridClass;
struct _VnGrid
{
GtkTreeView parent;
- DbIterator * iterator;
+ DbIter * iter;
+ gint row;
+ GList * params;
DbModel * model;
+ DbIteratorMode mode;
+ gboolean remember_selection;
};
struct _VnGridClass
@@ -46,11 +50,7 @@ struct _VnGridClass
GtkTreeViewClass parent;
};
-GType vn_grid_get_type ();
-VnGrid * vn_grid_new ();
-VnGrid * vn_grid_new_with_iterator (DbIterator * iterator);
-DbIterator * vn_grid_get_iterator (VnGrid * obj);
-void vn_grid_set_iterator (VnGrid * obj, DbIterator * iterator);
-DbModel * vn_grid_get_model (VnGrid * obj);
+GType vn_grid_get_type ();
+VnGrid * vn_grid_new ();
#endif
\ No newline at end of file
diff --git a/vn/vn-gui-private.h b/vn/vn-gui-private.h
index 9cf0169..63ffe8b 100644
--- a/vn/vn-gui-private.h
+++ b/vn/vn-gui-private.h
@@ -20,6 +20,8 @@
#include "vn-gui.h"
+// Window signal Callbacks
+
VnWindow * vn_gui_add_window (VnGui * obj, VnWindow * window);
gboolean vn_gui_on_last_window_deleted (GtkWidget * widget, GdkEvent * event, VnWindow * window);
@@ -31,4 +33,6 @@ void vn_gui_on_switch_page (GtkNotebook * notebook, VnForm * form, guint num, Vn
void vn_gui_on_page_removed (GtkNotebook * notebook, GtkWidget * page, guint num, VnWindow * window);
void vn_gui_on_page_added (GtkNotebook * notebook, GtkWidget * page, guint num, VnWindow * window);
+void vn_gui_logout (VnGui * obj, gboolean exit);
+
#endif
\ No newline at end of file
diff --git a/vn/vn-gui.c b/vn/vn-gui.c
index 61addd3..7fcfcca 100644
--- a/vn/vn-gui.c
+++ b/vn/vn-gui.c
@@ -36,24 +36,10 @@
* @Short_description: GUI manager
* @Title: VnGui
*
- * Manages most of the GUI operations.
+ * Manages most of the main GUI operations.
**/
G_DEFINE_TYPE (VnGui, vn_gui, G_TYPE_OBJECT);
-struct _VnWindow
-{
- VnGui * obj;
- GtkWindow * widget;
- GtkDialog * about;
- GtkHeaderBar * header;
- GtkWidget * menu_button;
- GtkWidget * spinner;
- GtkNotebook * notebook;
- VnForm * active_form;
- guint merge_id;
- gboolean maximized;
-};
-
enum {
COL_ICON
,COL_NAME
@@ -89,8 +75,6 @@ void vn_gui_on_open_form_activated (GSimpleAction * action, GVariant * v, gpoint
static void vn_gui_reconnect (VnGui * obj);
static void vn_gui_on_conn_error (DbConn * conn, const GError * error, VnGui * obj);
static void vn_gui_on_conn_status_changed (DbConn * conn, DbConnStatus status, VnGui * obj);
-void vn_gui_on_window_destroyed (GtkWindow * widget, VnWindow * window);
-void vn_gui_on_page_removed (GtkNotebook * notebook, GtkWidget * page, guint num, VnWindow * window);
static guint signals[LAST_SIGNAL] = {0};
@@ -455,12 +439,12 @@ static void vn_gui_set_menu_accels (VnGui * obj, GMenuModel * menu, gboolean ena
VnWindow * vn_gui_add_window (VnGui * obj, VnWindow * window)
{
+ gchar * user = db_conn_get_user (obj->conn);
GSList * n;
GtkWidget * button;
GtkWindow * widget = window->widget;
window->active_form = NULL;
- window->merge_id = 0;
obj->windows = g_slist_prepend (obj->windows, window);
@@ -473,8 +457,9 @@ VnWindow * vn_gui_add_window (VnGui * obj, VnWindow * window)
window->header = g_object_new (GTK_TYPE_HEADER_BAR
,"show-close-button", TRUE
,"title", obj->app_title
- ,"subtitle", db_conn_get_user (obj->conn)
+ ,"subtitle", user
,NULL);
+ g_free (user);
gtk_window_set_titlebar (widget, GTK_WIDGET (window->header));
button = gtk_menu_button_new ();
@@ -518,39 +503,77 @@ VnWindow * vn_gui_add_window (VnGui * obj, VnWindow * window)
/*
* Shows an error dialog.
*/
-static void vn_gui_show_error (VnGui * obj, const GError * error)
+static gboolean vn_gui_show_error_idle (VnGui * obj)
{
- GtkWidget * dialog;
- GtkWindow * window = obj->active_window ? obj->active_window->widget : NULL;
+ static gboolean stop;
+ GError * error = g_queue_pop_head (obj->errors);
- if (error && error->code == DB_CONN_ERROR_LOST)
- dialog = gtk_message_dialog_new (window
- ,GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT
- ,GTK_MESSAGE_QUESTION
- ,GTK_BUTTONS_YES_NO
- ,_("Connection has been lost. Do you want to reconnect?")
- );
- else
- dialog = gtk_message_dialog_new (window
- ,GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT
- ,GTK_MESSAGE_WARNING
- ,GTK_BUTTONS_CLOSE
- ,_("An error occurred in the connection.")
- );
+ if (!error)
+ {
+ obj->showing_error = FALSE;
+ stop = FALSE;
+ return G_SOURCE_REMOVE;
+ }
- gtk_window_set_title (GTK_WINDOW (dialog), _("Database error"));
-
- if (error)
- gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
- "%s", error->message);
- else
- gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
- _("Unknown error"));
+ if (!stop)
+ {
+ gint response_id;
+ GtkWidget * dialog;
+ GtkWindow * window = obj->active_window ?
+ obj->active_window->widget : NULL;
- if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_YES)
- vn_gui_reconnect (obj);
+ if (error && error->code == DB_CONN_ERROR_LOST)
+ dialog = gtk_message_dialog_new (window
+ ,GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT
+ ,GTK_MESSAGE_QUESTION
+ ,GTK_BUTTONS_YES_NO
+ ,_("Connection has been lost. Do you want to reconnect?")
+ );
+ else
+ dialog = gtk_message_dialog_new (window
+ ,GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT
+ ,GTK_MESSAGE_WARNING
+ ,GTK_BUTTONS_CLOSE
+ ,_("An error occurred in the connection.")
+ );
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_set_title (GTK_WINDOW (dialog), _("Database error"));
+
+ if (error)
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ "%s", error->message);
+ else
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ _("Unknown error"));
+
+ gtk_dialog_add_button (GTK_DIALOG (dialog)
+ ,_("Colse all")
+ ,GTK_RESPONSE_REJECT);
+
+ response_id = gtk_dialog_run (GTK_DIALOG (dialog));
+
+ if (response_id == GTK_RESPONSE_YES)
+ vn_gui_reconnect (obj);
+ else if (response_id == GTK_RESPONSE_REJECT)
+ stop = TRUE;
+
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+ }
+
+ g_error_free (error);
+ return G_SOURCE_CONTINUE;
+}
+
+static void vn_gui_collect_error (VnGui * obj, const GError * error)
+{
+ GError * e = g_error_copy (error);
+ g_queue_push_tail (obj->errors, e);
+
+ if (!obj->showing_error)
+ {
+ obj->showing_error = TRUE;
+ g_idle_add ((GSourceFunc) vn_gui_show_error_idle, obj);
+ }
}
/*
@@ -586,7 +609,7 @@ static void vn_gui_close (VnGui * obj)
static gboolean vn_gui_reconnect_idle (GuiData * gui_data)
{
if (!gui_data->aux)
- vn_gui_show_error (gui_data->obj, gui_data->error);
+ vn_gui_collect_error (gui_data->obj, gui_data->error);
return G_SOURCE_REMOVE;
}
@@ -630,7 +653,7 @@ static gboolean vn_gui_logout_idle (GuiData * gui_data)
}
/*
- * Thread function that tryes to close the connection asynchronously.
+ * Thread function that tries to close the connection asynchronously.
*/
static void vn_gui_logout_thread (GuiData * gui_data)
{
@@ -666,20 +689,14 @@ static void vn_gui_hide_form (VnWindow * window)
g_action_map_remove_action (G_ACTION_MAP (window->widget),
actions[i].name);
- if (menu)
- vn_gui_set_menu_accels (window->obj, menu, FALSE);
+ if (menu)
+ vn_gui_set_menu_accels (window->gui, menu, FALSE);
gtk_widget_hide (window->menu_button);
window->active_form = NULL;
}
}
-static void vn_gui_set_show_tabs (VnWindow * window)
-{
- gtk_notebook_set_show_tabs (window->notebook,
- gtk_notebook_get_n_pages (window->notebook) > 1);
-}
-
//--------------------------------------------------- Window handlers
/*
@@ -687,7 +704,7 @@ static void vn_gui_set_show_tabs (VnWindow * window)
*/
gboolean vn_gui_on_last_window_deleted (GtkWidget * widget, GdkEvent * event, VnWindow * window)
{
- VnGui * obj = window->obj;
+ VnGui * obj = window->gui;
if (obj->windows->next)
return FALSE;
@@ -711,7 +728,7 @@ void vn_gui_on_window_destroyed (GtkWindow * widget, VnWindow * window)
*/
gboolean vn_gui_on_window_focused (GtkWidget * widget, GdkEvent * event, VnWindow * window)
{
- window->obj->active_window = window;
+ window->gui->active_window = window;
return FALSE;
}
@@ -737,7 +754,7 @@ void vn_gui_on_switch_page (GtkNotebook * notebook, VnForm * form, guint num, Vn
{
GtkTreeIter * iter;
GMenuModel * menu;
- VnGui * obj = window->obj;
+ VnGui * obj = window->gui;
vn_gui_hide_form (window);
window->active_form = form;
@@ -780,16 +797,16 @@ void vn_gui_on_page_removed (GtkNotebook * notebook,
{
if (gtk_notebook_get_n_pages (notebook) < 1)
{
- if (!window->obj->windows->next)
+ if (!window->gui->windows->next)
{
vn_gui_hide_form (window);
- gtk_header_bar_set_title (window->header, window->obj->app_title);
+ gtk_header_bar_set_title (window->header, window->gui->app_title);
}
else
gtk_widget_destroy (GTK_WIDGET (window->widget));
}
- vn_gui_set_show_tabs (window);
+ vn_window_set_show_tabs (window);
}
/*
@@ -798,7 +815,7 @@ void vn_gui_on_page_removed (GtkNotebook * notebook,
void vn_gui_on_page_added (GtkNotebook * notebook, GtkWidget * page, guint num,
VnWindow * window)
{
- vn_gui_set_show_tabs (window);
+ vn_window_set_show_tabs (window);
}
//--------------------------------------------------- Action handlers
@@ -809,7 +826,7 @@ void vn_gui_on_page_added (GtkNotebook * notebook, GtkWidget * page, guint num,
void vn_gui_on_open_form_activated (GSimpleAction * a, GVariant * p, gpointer obj)
{
VnWindow * window = obj;
- vn_gui_open_form_at_window (window->obj, g_variant_get_string (p, NULL), window);
+ vn_gui_open_form_at_window (window->gui, g_variant_get_string (p, NULL), window);
}
/*
@@ -860,10 +877,10 @@ void vn_gui_on_exit_activated (GSimpleAction * a, GVariant * v, gpointer obj)
void vn_gui_on_close_tab_activated (GSimpleAction * a, GVariant * v, gpointer w)
{
VnWindow * window = w;
- VnGui * obj = window->obj;
+ VnGui * obj = window->gui;
if (window->active_form)
- vn_gui_close_form (window->obj, window->active_form);
+ vn_gui_close_form (window->gui, window->active_form);
else if (!obj->windows->next)
vn_gui_logout (obj, TRUE);
else
@@ -877,7 +894,7 @@ void vn_gui_on_close_tab_activated (GSimpleAction * a, GVariant * v, gpointer w)
*/
static void vn_gui_on_conn_error (DbConn * conn, const GError * error, VnGui * obj)
{
- vn_gui_show_error (obj, error);
+ vn_gui_collect_error (obj, error);
}
/*
@@ -961,8 +978,7 @@ void vn_gui_open (VnGui * obj)
if (mod_menu)
{
- g_menu_prepend_submenu (section,
- g_strdup (vn_mod_get_title (mod)), mod_menu);
+ g_menu_prepend_submenu (section, vn_mod_get_title (mod), mod_menu);
g_object_unref (mod_menu);
}
}
@@ -1108,12 +1124,8 @@ VnForm * vn_gui_open_form_at_window (VnGui * obj, const gchar * form_name, VnWin
gchar * title;
VnMod * module;
GType form_type;
- GtkBox * hbox;
GtkWidget * form;
- GtkWidget * widget;
- GtkWidget * button;
GtkTreeIter * iter;
- GtkNotebook * notebook = NULL;
g_return_val_if_fail (VN_IS_GUI (obj), NULL);
@@ -1141,34 +1153,11 @@ VnForm * vn_gui_open_form_at_window (VnGui * obj, const gchar * form_name, VnWin
);
vn_form_open (VN_FORM (form));
- hbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5));
-
- widget = gtk_image_new_from_icon_name (icon, GTK_ICON_SIZE_MENU);
- gtk_box_pack_start (hbox, widget, FALSE, FALSE, 0);
-
- widget = gtk_label_new (title);
- gtk_box_pack_start (hbox, widget, TRUE, TRUE, 0);
-
- button = gtk_button_new ();
- g_signal_connect (button, "clicked",
- G_CALLBACK (vn_gui_close_form), form);
- gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
- gtk_box_pack_start (hbox, button, FALSE, FALSE, 0);
-
- widget = gtk_image_new_from_icon_name ("window-close-symbolic", GTK_ICON_SIZE_MENU);
- gtk_button_set_image (GTK_BUTTON (button), widget);
-
if (!window)
window = obj->active_window;
- notebook = window->notebook;
- gtk_notebook_set_current_page (notebook,
- gtk_notebook_append_page (notebook, form, GTK_WIDGET (hbox)));
- gtk_notebook_set_tab_detachable (notebook, form, TRUE);
- gtk_notebook_set_tab_reorderable (notebook, form, TRUE);
- gtk_container_child_set (GTK_CONTAINER (notebook), form,
- "tab-expand", TRUE, NULL);
- gtk_widget_show_all (GTK_WIDGET (hbox));
+ vn_window_add_form (window, icon, title, form);
+
gtk_widget_show (form);
g_free (icon);
@@ -1371,6 +1360,10 @@ static void vn_gui_init (VnGui * obj)
,G_TYPE_GTYPE // COL_TYPE
,G_TYPE_OBJECT // COL_MODULE
);
+
+ obj->errors = g_queue_new ();
+ obj->showing_error = FALSE;
+// obj->err_handler = g_idle_add ((GSourceFunc) vn_gui_show_error_idle, obj);
}
static void vn_gui_finalize (VnGui * obj)
@@ -1387,6 +1380,10 @@ static void vn_gui_finalize (VnGui * obj)
g_strfreev (obj->data_dirs);
g_free (obj->config_file);
g_free (obj->app_title);
+
+ g_queue_free (obj->errors);
+ g_source_remove (obj->err_handler);
+
G_OBJECT_CLASS (vn_gui_parent_class)->finalize (G_OBJECT (obj));
}
diff --git a/vn/vn-gui.h b/vn/vn-gui.h
index e3e9e98..5f272c7 100644
--- a/vn/vn-gui.h
+++ b/vn/vn-gui.h
@@ -52,9 +52,13 @@ struct _VnGui
GtkTreeStore * tree;
GMenuModel * main_menu;
- GHashTable * forms;
GSList * windows;
GSList * modules;
+ GHashTable * forms;
+
+ GQueue * errors;
+ gboolean showing_error;
+ guint err_handler;
gchar * config_file;
gchar ** lib_dirs;
diff --git a/vn/vn-handler.c b/vn/vn-handler.c
index 505775b..bb070bb 100644
--- a/vn/vn-handler.c
+++ b/vn/vn-handler.c
@@ -126,7 +126,7 @@ static void vn_handler_refresh_scroll_status (VnHandler * obj)
{
gboolean enabled;
gint row = db_iterator_get_row (obj->iterator);
-
+
enabled = row > 0;
g_simple_action_set_enabled (obj->move_first, enabled);
g_simple_action_set_enabled (obj->move_previous, enabled);
@@ -181,6 +181,8 @@ static void action_group_set_enabled (GActionGroup * group, gboolean enabled)
GAction * a = g_action_map_lookup_action (G_ACTION_MAP (group), actions[i]);
g_simple_action_set_enabled (G_SIMPLE_ACTION (a), enabled);
}
+
+ g_strfreev (actions);
}
static void vn_handler_on_status_changed (DbIterator * iterator, gboolean ready, VnHandler * obj)
@@ -311,6 +313,8 @@ void vn_handler_set_show_flags (VnHandler * obj, VnHandlerShowFlags show_flags)
l = l->next;
}
+ g_list_free (list);
+
if (obj->show_flags & VN_HANDLER_SHOW_ADD)
obj->add = G_SIMPLE_ACTION (g_action_map_lookup_action (G_ACTION_MAP (obj->group), "add"));
@@ -360,7 +364,7 @@ void vn_handler_set_iterator (VnHandler * obj, DbIterator * iterator)
g_return_if_fail (DB_IS_ITERATOR (iterator) || !iterator);
if (obj->iterator)
- {
+ {
g_object_disconnect (obj->iterator
,"any-signal", vn_handler_on_status_changed, obj
,"any-signal", vn_handler_on_data_changed, obj
@@ -381,7 +385,7 @@ void vn_handler_set_iterator (VnHandler * obj, DbIterator * iterator)
,NULL
);
}
-
+
vn_handler_refresh_status (obj);
}
@@ -403,7 +407,7 @@ void vn_handler_set_simple_record (VnHandler * obj, gboolean simple)
enum
{
- PROP_FORM = 1
+ PROP_ITERATOR = 1
,PROP_SHOW_FLAGS
,PROP_SIMPLE_RECORD
};
@@ -413,7 +417,7 @@ static void vn_handler_set_property (VnHandler * obj, guint id,
{
switch (id)
{
- case PROP_FORM:
+ case PROP_ITERATOR:
vn_handler_set_iterator (obj, g_value_get_object (value));
break;
case PROP_SHOW_FLAGS:
@@ -432,7 +436,7 @@ static void vn_handler_get_property (VnHandler * obj, guint id,
{
switch (id)
{
- case PROP_FORM:
+ case PROP_ITERATOR:
g_value_set_object (value, obj->iterator);
break;
case PROP_SHOW_FLAGS:
@@ -506,6 +510,8 @@ static void vn_handler_init (VnHandler * obj)
static void vn_handler_finalize (VnHandler * obj)
{
vn_handler_set_iterator (obj, NULL);
+ g_object_unref (obj->group);
+
G_OBJECT_CLASS (vn_handler_parent_class)->finalize (G_OBJECT (obj));
}
@@ -516,7 +522,7 @@ static void vn_handler_class_init (VnHandlerClass * klass)
k->set_property = (GObjectSetPropertyFunc) vn_handler_set_property;
k->get_property = (GObjectGetPropertyFunc) vn_handler_get_property;
- g_object_class_install_property (k, PROP_FORM,
+ g_object_class_install_property (k, PROP_ITERATOR,
g_param_spec_object ("iterator"
,"Iterator"
,"The handled iterator"
diff --git a/vn/vn-login.c b/vn/vn-login.c
index 704dbb7..6e1846e 100644
--- a/vn/vn-login.c
+++ b/vn/vn-login.c
@@ -17,6 +17,8 @@
#include "vn-login.h"
#include "vn-set.h"
+#include "vn-gui-private.h"
+#include
#define LOGIN_UI _GUI_DIR"/login.glade"
#define CONFIG_DB _VN_CONFIG_DIR"/config.db"
@@ -37,6 +39,8 @@ ConnectData;
void vn_login_on_gui_logout (VnGui * gui, VnLogin * self);
void vn_login_on_gui_exit (VnGui * gui, VnLogin * self);
+static gboolean vn_login_on_signal (VnLogin * self);
+
G_DEFINE_TYPE (VnLogin, vn_login, G_TYPE_OBJECT);
/**
@@ -48,7 +52,13 @@ G_DEFINE_TYPE (VnLogin, vn_login, G_TYPE_OBJECT);
**/
VnLogin * vn_login_new (GtkApplication * application)
{
- return g_object_new (VN_TYPE_LOGIN, "application", application, NULL);
+ VnLogin * login = g_object_new (VN_TYPE_LOGIN, "application", application, NULL);
+
+ g_unix_signal_add (SIGINT, (GSourceFunc) vn_login_on_signal, login);
+ g_unix_signal_add (SIGTERM, (GSourceFunc) vn_login_on_signal, login);
+ g_unix_signal_add (SIGHUP, (GSourceFunc) vn_login_on_signal, login);
+
+ return login;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Private
@@ -122,7 +132,7 @@ static void vn_login_load (VnLogin * self)
self->settings_dialog = BUILDER_GET (self->builder, "settings-dialog");
self->login_data = BUILDER_GET (self->builder, "iterator-login");
self->last_conn = BUILDER_GET (self->builder, "iterator-last-conn");
- self->connections = BUILDER_GET (self->builder, "iterator-connections");
+ self->connections = BUILDER_GET (self->builder, "connections-grid");
self->settings_button = BUILDER_GET (self->builder, "settings-button");
gtk_builder_connect_signals (self->builder, self);
@@ -270,6 +280,38 @@ void vn_login_on_server_changed (DbIterator * iterator, VnLogin * self)
gtk_button_clicked (self->connect);
}
+/*
+ * Handles the SIGHUP, SIGTERM and SIGINT signals, closing normally.
+ */
+static gboolean vn_login_on_signal (VnLogin * self)
+{
+ g_warning ("Signal received.");
+
+ if (self->gui)
+ vn_gui_logout (self->gui, TRUE);
+ else
+ gtk_widget_destroy (GTK_WIDGET (self->window));
+
+ return G_SOURCE_REMOVE;
+}
+
+/*
+ * Closes the login window when Escape is pressed.
+ */
+gboolean vn_login_on_key_pressed (GtkWidget * window, GdkEventKey * event, VnLogin * self)
+{
+ if (event->type == GDK_KEY_PRESS
+ && (event->keyval == GDK_KEY_Escape
+ || ((event->keyval == GDK_KEY_q || event->keyval == GDK_KEY_Q)
+ && (event->state & GDK_CONTROL_MASK))))
+ {
+ gtk_widget_destroy (window);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
/*
* Closes the application when login window is destroyed.
*/
diff --git a/vn/vn-set.c b/vn/vn-set.c
index 5cbba4a..f244b87 100644
--- a/vn/vn-set.c
+++ b/vn/vn-set.c
@@ -74,7 +74,7 @@ void vn_set_remove (VnSet * obj, GObject * child)
* to do further use of the list of objects.
*
* Return value: (transfer container) (element-type GObject): a #GList with all
- * the objects, that must be freed with #g_list_free
+ * the objects which must be freed with #g_list_free
**/
GList * vn_set_get_objects_list (VnSet * obj)
{
@@ -90,7 +90,7 @@ GList * vn_set_get_objects_list (VnSet * obj)
* Returns all the #GObjects in @obj.
*
* Return value: (transfer none) (element-type GObject): a #GList with all
- * the objects, that must not be freed
+ * the objects which must not be freed
**/
const GList * vn_set_get_objects (VnSet * obj)
{
diff --git a/vn/vn-set.h b/vn/vn-set.h
index 45c0101..587abb4 100644
--- a/vn/vn-set.h
+++ b/vn/vn-set.h
@@ -50,11 +50,11 @@ struct _VnSetClass
GType vn_set_get_type ();
void vn_set_add (VnSet * obj
- ,GObject * child);
-void vn_set_remove (VnSet * obj
- ,GObject * child);
+ ,GObject * child);
+void vn_set_remove (VnSet * obj
+ ,GObject * child);
const GList * vn_set_get_objects (VnSet * obj);
GList * vn_set_get_objects_list (VnSet * obj);
-guint vn_set_get_length (VnSet * obj);
+guint vn_set_get_length (VnSet * obj);
#endif
\ No newline at end of file
diff --git a/vn/vn-window.c b/vn/vn-window.c
index f1034f5..b1aa5d0 100644
--- a/vn/vn-window.c
+++ b/vn/vn-window.c
@@ -75,6 +75,48 @@ VnWindow * vn_window_new (VnGui * gui, gint x, gint y)
return self;
}
+void vn_window_add_form (VnWindow * window, const gchar * icon, const gchar * title, GtkWidget * form)
+{
+ GtkBox * hbox;
+ GtkWidget * widget, * button;
+ GtkNotebook * notebook;
+
+ g_return_if_fail (VN_IS_WINDOW (window));
+
+ hbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5));
+
+ widget = gtk_image_new_from_icon_name (icon, GTK_ICON_SIZE_MENU);
+ gtk_box_pack_start (hbox, widget, FALSE, FALSE, 0);
+
+ widget = gtk_label_new (title);
+ gtk_box_pack_start (hbox, widget, TRUE, TRUE, 0);
+
+ button = gtk_button_new ();
+ g_signal_connect (button, "clicked",
+ G_CALLBACK (vn_gui_close_form), form);
+ gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
+ gtk_box_pack_start (hbox, button, FALSE, FALSE, 0);
+
+ widget = gtk_image_new_from_icon_name ("window-close-symbolic", GTK_ICON_SIZE_MENU);
+ gtk_button_set_image (GTK_BUTTON (button), widget);
+
+ notebook = window->notebook;
+ gtk_notebook_set_current_page (notebook,
+ gtk_notebook_append_page (notebook, form, GTK_WIDGET (hbox)));
+ gtk_notebook_set_tab_detachable (notebook, form, TRUE);
+ gtk_notebook_set_tab_reorderable (notebook, form, TRUE);
+ gtk_container_child_set (GTK_CONTAINER (notebook), form,
+ "tab-expand", TRUE, NULL);
+
+ gtk_widget_show_all (GTK_WIDGET (hbox));
+}
+
+void vn_window_set_show_tabs (VnWindow * window)
+{
+ gtk_notebook_set_show_tabs (window->notebook,
+ gtk_notebook_get_n_pages (window->notebook) > 1);
+}
+
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Class
static void vn_window_init (VnWindow * self)
diff --git a/vn/vn-window.h b/vn/vn-window.h
index 297ac5f..a36683c 100644
--- a/vn/vn-window.h
+++ b/vn/vn-window.h
@@ -54,6 +54,8 @@ struct _VnWindowClass
GType vn_window_get_type ();
-VnWindow * vn_window_new (VnGui * gui, gint x, gint y);
+VnWindow * vn_window_new (VnGui * gui, gint x, gint y);
+void vn_window_set_show_tabs (VnWindow * window);
+void vn_window_add_form (VnWindow * window, const gchar * icon, const gchar * title, GtkWidget * form);
#endif