gtranslator r3475 - in branches/GOBJECT_WORK: . src
- From: icq svn gnome org
- To: svn-commits-list gnome org
- Subject: gtranslator r3475 - in branches/GOBJECT_WORK: . src
- Date: Sun, 3 Feb 2008 14:07:12 +0000 (GMT)
Author: icq
Date: Sun Feb 3 14:07:11 2008
New Revision: 3475
URL: http://svn.gnome.org/viewvc/gtranslator?rev=3475&view=rev
Log:
2008-02-03 Ignacio Casal Quinteiro <nacho resa gmail com>
* src/message-table-model.ch:
Object that implements our own GtkTreeModel.
Added:
branches/GOBJECT_WORK/src/message-table-model.c
branches/GOBJECT_WORK/src/message-table-model.h
Modified:
branches/GOBJECT_WORK/ChangeLog
Added: branches/GOBJECT_WORK/src/message-table-model.c
==============================================================================
--- (empty file)
+++ branches/GOBJECT_WORK/src/message-table-model.c Sun Feb 3 14:07:11 2008
@@ -0,0 +1,389 @@
+/*
+ * Copyright (C) 2007 Ignacio Casal Quinteiro <nacho resa gmail com>
+ *
+ * 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
+ * MERCHANMsgILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "message-table-model.h"
+#include "msg.h"
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include <gtk/gtktreemodel.h>
+
+#define G_LIST(x) ((GList *) x)
+
+#define TABLE_FUZZY_ICON "gtk-dialog-warning"
+#define TABLE_UNTRANSLATED_ICON "gtk-dialog-error"
+#define TABLE_TRANSLATED_ICON NULL
+
+static GObjectClass *parent_class;
+
+static guint
+gtranslator_message_table_model_get_flags (GtkTreeModel *self)
+{
+ return 0;
+}
+
+static gint
+gtranslator_message_table_model_get_n_columns (GtkTreeModel *self)
+{
+ return GTR_MESSAGE_TABLE_MODEL_N_COLUMNS;
+}
+
+static GType
+gtranslator_message_table_model_get_column_type (GtkTreeModel *self,
+ gint column)
+{
+ GType retval;
+
+ switch (column)
+ {
+ case GTR_MESSAGE_TABLE_MODEL_ICON_COLUMN:
+ case GTR_MESSAGE_TABLE_MODEL_ORIGINAL_COLUMN:
+ case GTR_MESSAGE_TABLE_MODEL_TRANSLATION_COLUMN:
+ retval = G_TYPE_STRING;
+ break;
+ case GTR_MESSAGE_TABLE_MODEL_POINTER_COLUMN:
+ retval = G_TYPE_POINTER;
+ break;
+ case GTR_MESSAGE_TABLE_MODEL_ID_COLUMN:
+ case GTR_MESSAGE_TABLE_MODEL_STATUS_COLUMN:
+ retval = G_TYPE_INT;
+ break;
+ default:
+ retval = G_TYPE_INVALID;
+ break;
+ }
+
+
+ return retval;
+}
+
+static gboolean
+gtranslator_message_table_model_get_iter (GtkTreeModel *self,
+ GtkTreeIter *iter,
+ GtkTreePath *path)
+{
+ GtranslatorMessageTableModel *list_model = GTR_MESSAGE_TABLE_MODEL (self);
+ gint i;
+ GList *list;
+
+ g_return_val_if_fail (gtk_tree_path_get_depth (path) > 0, FALSE);
+
+ /* Fill a GtkTreeIter using a path */
+
+ i = gtk_tree_path_get_indices (path)[0];
+
+ if (G_UNLIKELY (i >= list_model->length))
+ return FALSE;
+
+ list = g_list_nth (list_model->values, i);
+
+ iter->stamp = list_model->stamp;
+ iter->user_data = list;
+
+ return TRUE;
+}
+
+static GtkTreePath *
+gtranslator_message_table_model_get_path (GtkTreeModel *tree_model,
+ GtkTreeIter *iter)
+{
+ GList *list;
+ GtkTreePath *tree_path;
+ gint i = 0;
+
+ g_return_val_if_fail (iter->stamp == GTR_MESSAGE_TABLE_MODEL (tree_model)->stamp, NULL);
+
+ for (list = GTR_MESSAGE_TABLE_MODEL (tree_model)->values; list; list = list->next) {
+ if (list == iter->user_data)
+ break;
+ i++;
+ }
+ if (list == NULL)
+ return NULL;
+
+ tree_path = gtk_tree_path_new ();
+ gtk_tree_path_append_index (tree_path, i);
+
+ return tree_path;
+}
+
+static void
+gtranslator_message_table_model_get_value (GtkTreeModel *self,
+ GtkTreeIter *iter,
+ gint column,
+ GValue *value)
+{
+ GtranslatorMessageTableModel *model = GTR_MESSAGE_TABLE_MODEL (self);
+ GtranslatorMsg *msg;
+ gchar *text;
+ GtranslatorMsgStatus status;
+ gint i;
+ GList *list;
+
+ g_return_if_fail (iter->stamp == GTR_MESSAGE_TABLE_MODEL (self)->stamp);
+
+ list = G_LIST (iter->user_data);
+ msg = GTR_MSG (list->data);
+
+ switch (column) {
+ case GTR_MESSAGE_TABLE_MODEL_ICON_COLUMN:
+ g_value_init (value, G_TYPE_STRING);
+
+ status = gtranslator_msg_get_status (msg);
+
+ if (status == GTR_MSG_STATUS_UNTRANSLATED)
+ text = TABLE_UNTRANSLATED_ICON;
+ else if (status == GTR_MSG_STATUS_FUZZY)
+ text = TABLE_FUZZY_ICON;
+ else text = TABLE_TRANSLATED_ICON;
+
+ g_value_set_string (value, text);
+ break;
+
+ case GTR_MESSAGE_TABLE_MODEL_ID_COLUMN:
+ g_value_init (value, G_TYPE_INT);
+
+ i = g_list_position (model->values, list);
+ g_value_set_int (value, i+1);
+ break;
+
+ case GTR_MESSAGE_TABLE_MODEL_ORIGINAL_COLUMN:
+ g_value_init (value, G_TYPE_STRING);
+
+ text = g_strdup (gtranslator_msg_get_msgid (msg));
+ g_value_set_string (value, text);
+ g_free (text);
+ break;
+
+ case GTR_MESSAGE_TABLE_MODEL_TRANSLATION_COLUMN:
+ g_value_init (value, G_TYPE_STRING);
+
+ text = g_strdup (gtranslator_msg_get_msgstr (msg));
+ g_value_set_string (value, text);
+ g_free (text);
+ break;
+
+ case GTR_MESSAGE_TABLE_MODEL_STATUS_COLUMN:
+ g_value_init (value, G_TYPE_INT);
+
+ status = gtranslator_msg_get_status (msg);
+ g_value_set_int (value, status);
+ break;
+
+ case GTR_MESSAGE_TABLE_MODEL_POINTER_COLUMN:
+ g_value_init (value, G_TYPE_POINTER);
+
+ g_value_set_pointer (value, iter->user_data);
+ break;
+
+ default:
+ break;
+ }
+
+}
+
+static gboolean
+gtranslator_message_table_model_iter_next (GtkTreeModel *tree_model,
+ GtkTreeIter *iter)
+{
+ g_return_val_if_fail (iter->stamp == GTR_MESSAGE_TABLE_MODEL (tree_model)->stamp, FALSE);
+
+ iter->user_data = G_LIST (iter->user_data)->next;
+
+ return (iter->user_data != NULL);
+}
+
+static gboolean
+gtranslator_message_table_model_iter_has_child (GtkTreeModel *tree_model,
+ GtkTreeIter *iter)
+{
+ return FALSE;
+}
+
+static gint
+gtranslator_message_table_model_iter_n_children (GtkTreeModel *tree_model,
+ GtkTreeIter *iter)
+{
+ /* it should ask for the root node, because we're a list */
+ if (!iter)
+ return g_list_length (GTR_MESSAGE_TABLE_MODEL (tree_model)->values);
+
+ return -1;
+}
+
+static gboolean
+gtranslator_message_table_model_iter_nth_child (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ GtkTreeIter *parent,
+ gint n)
+{
+ GList *child;
+
+ if (parent)
+ return FALSE;
+
+ child = g_list_nth (GTR_MESSAGE_TABLE_MODEL (tree_model)->values, n);
+
+ if (child) {
+ iter->stamp = GTR_MESSAGE_TABLE_MODEL (tree_model)->stamp;
+ iter->user_data = child;
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+static void
+gtranslator_message_table_model_tree_model_init (GtkTreeModelIface *iface)
+{
+ iface->get_flags = gtranslator_message_table_model_get_flags;
+ iface->get_n_columns = gtranslator_message_table_model_get_n_columns;
+ iface->get_column_type = gtranslator_message_table_model_get_column_type;
+ iface->get_iter = gtranslator_message_table_model_get_iter;
+ iface->get_path = gtranslator_message_table_model_get_path;
+ iface->get_value = gtranslator_message_table_model_get_value;
+ iface->iter_next = gtranslator_message_table_model_iter_next;
+ iface->iter_has_child = gtranslator_message_table_model_iter_has_child;
+ iface->iter_n_children = gtranslator_message_table_model_iter_n_children;
+ iface->iter_nth_child = gtranslator_message_table_model_iter_nth_child;
+}
+
+static void
+gtranslator_message_table_model_init (GtranslatorMessageTableModel *model)
+{
+ model->length = 0;
+ model->stamp = g_random_int ();
+}
+
+static void
+gtranslator_message_table_model_finalize (GObject *object)
+{
+ parent_class->finalize (object);
+}
+
+static void
+gtranslator_message_table_model_class_init (GtranslatorMessageTableModelClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->finalize = gtranslator_message_table_model_finalize;
+
+ parent_class = g_type_class_peek_parent (klass);
+}
+
+/***************************** Public funcs ***********************************/
+
+/**
+ * gtranslator_message_table_model_new:
+ *
+ * Return value: a new #GtranslatorMessageTableModel object
+ **/
+GtranslatorMessageTableModel *
+gtranslator_message_table_model_new (void)
+{
+ GtranslatorMessageTableModel *model;
+
+ model = g_object_new (GTR_TYPE_MESSAGE_TABLE_MODEL, NULL);
+
+ return model;
+}
+
+void
+gtranslator_message_table_model_set_list (GtranslatorMessageTableModel *model,
+ GList *messages)
+{
+ GList *list;
+ GtkTreeIter iter;
+ GtkTreePath *path;
+ GtkTreeRowReference *row;
+
+ for (list = messages; list; list = list->next) {
+
+ model->values = g_list_append (model->values, list->data);
+ model->length++;
+
+ model->stamp++;
+
+ iter.stamp = model->stamp;
+ iter.user_data = g_list_last (model->values);
+
+ path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter);
+ gtk_tree_model_row_inserted (GTK_TREE_MODEL (model), path, &iter);
+ row = gtk_tree_row_reference_new (GTK_TREE_MODEL (model), path);
+ gtk_tree_path_free (path);
+
+ gtranslator_msg_set_row_reference (GTR_MSG (list->data), row);
+ }
+}
+
+void
+gtranslator_message_table_model_update_row (GtranslatorMessageTableModel *model,
+ GtkTreePath *path)
+{
+ GtkTreeIter iter;
+
+ gtranslator_message_table_model_get_iter (GTK_TREE_MODEL (model),
+ &iter, path);
+
+ gtk_tree_model_row_changed (GTK_TREE_MODEL (model),
+ path, &iter);
+}
+
+GType
+gtranslator_message_table_model_get_type (void)
+{
+ static GType object_type = 0;
+
+ if (G_UNLIKELY(object_type == 0))
+ {
+ static const GTypeInfo object_info =
+ {
+ sizeof (GtranslatorMessageTableModelClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) gtranslator_message_table_model_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (GtranslatorMessageTableModel),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) gtranslator_message_table_model_init,
+ NULL
+ };
+
+ static const GInterfaceInfo tree_model_info = {
+ (GInterfaceInitFunc) gtranslator_message_table_model_tree_model_init,
+ NULL,
+ NULL
+ };
+
+ object_type = g_type_register_static (G_TYPE_OBJECT,
+ "GtranslatorMessageTableModel", &object_info, 0);
+
+ g_type_add_interface_static (object_type, GTK_TYPE_TREE_MODEL,
+ &tree_model_info);
+
+ }
+
+ return object_type;
+}
+
Added: branches/GOBJECT_WORK/src/message-table-model.h
==============================================================================
--- (empty file)
+++ branches/GOBJECT_WORK/src/message-table-model.h Sun Feb 3 14:07:11 2008
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2007 Ignacio Casal Quinteiro <nacho resa gmail com>
+ *
+ * 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
+ * MERCHANMSGILITY or FITNESS FOR A PARTICULAR PURMSGSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef __MESSAGE_TABLE_MODEL_H__
+#define __MESSAGE_TABLE_MODEL_H__
+
+#include <glib.h>
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+/*
+ * Type checking and casting macros
+ */
+#define GTR_TYPE_MESSAGE_TABLE_MODEL (gtranslator_message_table_model_get_type ())
+#define GTR_MESSAGE_TABLE_MODEL(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GTR_TYPE_MESSAGE_TABLE_MODEL, GtranslatorMessageTableModel))
+#define GTR_MESSAGE_TABLE_MODEL_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GTR_TYPE_MESSAGE_TABLE_MODEL, GtranslatorMessageTableModelClass))
+#define GTR_IS_MESSAGE_TABLE_MODEL(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GTR_TYPE_MESSAGE_TABLE_MODEL))
+#define GTR_IS_MESSAGE_TABLE_MODEL_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GTR_TYPE_MESSAGE_TABLE_MODEL))
+#define GTR_MESSAGE_TABLE_MODEL_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GTR_TYPE_MESSAGE_TABLE_MODEL, GtranslatorMessageTableModelClass))
+
+/* Private structure type */
+typedef struct _GtranslatorMessageTableModelPrivate GtranslatorMessageTableModelPrivate;
+
+/*
+ * Main object structure
+ */
+typedef struct _GtranslatorMessageTableModel GtranslatorMessageTableModel;
+
+struct _GtranslatorMessageTableModel
+{
+ GObject parent_instance;
+
+ GList *values;
+ gint stamp;
+ gint length;
+};
+
+/*
+ * Class definition
+ */
+typedef struct _GtranslatorMessageTableModelClass GtranslatorMessageTableModelClass;
+
+struct _GtranslatorMessageTableModelClass
+{
+ GObjectClass parent_class;
+};
+
+typedef enum _GtranslatorMessageTableModelColumn GtranslatorMessageTableModelColumn;
+
+enum _GtranslatorMessageTableModelColumn
+{
+ GTR_MESSAGE_TABLE_MODEL_ICON_COLUMN,
+ GTR_MESSAGE_TABLE_MODEL_ID_COLUMN,
+ GTR_MESSAGE_TABLE_MODEL_ORIGINAL_COLUMN,
+ GTR_MESSAGE_TABLE_MODEL_TRANSLATION_COLUMN,
+ GTR_MESSAGE_TABLE_MODEL_STATUS_COLUMN,
+ GTR_MESSAGE_TABLE_MODEL_POINTER_COLUMN,
+ GTR_MESSAGE_TABLE_MODEL_N_COLUMNS
+};
+
+/*
+ * Public methods
+ */
+GType gtranslator_message_table_model_get_type (void) G_GNUC_CONST;
+
+GType gtranslator_message_table_model_register_type (GTypeModule * module);
+
+GtranslatorMessageTableModel
+ *gtranslator_message_table_model_new (void);
+
+void gtranslator_message_table_model_set_list (GtranslatorMessageTableModel *model,
+ GList *messages);
+
+G_END_DECLS
+
+#endif /* __MESSAGE_TABLE_MODEL_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]