diff -r 000000000000 -r 8d3b1ddf789c plover-gtk/packagefilestore.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plover-gtk/packagefilestore.c Sat Feb 20 12:11:02 2010 +0000 @@ -0,0 +1,254 @@ +/* + * Copyright (C) 2000 Red Hat, Inc., Jonathan Blandford + * Copyright (C) 2010 J. Ali Harlow + * + * 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 2 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "config.h" +#include +#include +#include +#include +#include "plover-gtk/packagefilestore.h" + +#define VALID_ITER(iter,store) ((iter) && (iter)->user_data && \ + PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(store)->stamp==(iter)->stamp && \ + !g_sequence_iter_is_end((iter)->user_data) && \ + g_sequence_iter_get_sequence((iter)->user_data)== \ + PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(store)->seq) + +static GType column_types[PLOVER_PACKAGE_FILE_STORE_NO_COLUMNS]; + +static void plover_package_file_store_tree_model_init(GtkTreeModelIface *iface); + +G_DEFINE_TYPE_WITH_CODE(PloverPackageFileStore,plover_package_file_store, + G_TYPE_OBJECT,G_IMPLEMENT_INTERFACE(GTK_TYPE_TREE_MODEL, + plover_package_file_store_tree_model_init)); + +typedef struct _PloverPackageFileStorePrivate { + GSequence *seq; + int stamp; +} PloverPackageFileStorePrivate; + +#define PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(obj)\ + G_TYPE_INSTANCE_GET_PRIVATE(obj,\ + PLOVER_TYPE_PACKAGE_FILE_STORE,\ + PloverPackageFileStorePrivate) + +static void plover_package_file_store_finalize(GObject *obj) +{ + PloverPackageFileStorePrivate *priv= + PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(obj); + g_sequence_free(priv->seq); + if (G_OBJECT_CLASS(plover_package_file_store_parent_class)->finalize) + G_OBJECT_CLASS(plover_package_file_store_parent_class)->finalize(obj); +} + +static void + plover_package_file_store_class_init(PloverPackageFileStoreClass *klass) +{ + GObjectClass *oclass=G_OBJECT_CLASS(klass); + oclass->finalize=plover_package_file_store_finalize; + g_type_class_add_private(klass,sizeof(PloverPackageFileStorePrivate)); + column_types[PLOVER_PACKAGE_FILE_STORE_NAME_COLUMN]=G_TYPE_STRING; +} + +static GtkTreeModelFlags +plover_package_file_store_get_flags(GtkTreeModel *tree_model) +{ + return GTK_TREE_MODEL_ITERS_PERSIST|GTK_TREE_MODEL_LIST_ONLY; +} + +static gint plover_package_file_store_get_n_columns(GtkTreeModel *tree_model) +{ + return PLOVER_PACKAGE_FILE_STORE_NO_COLUMNS; +} + +static GType + plover_package_file_store_get_column_type(GtkTreeModel *tree_model,gint indx) +{ + PloverPackageFileStore *store=(PloverPackageFileStore *)tree_model; + g_return_val_if_fail(indx>=0 && indx=g_sequence_get_length(priv->seq)) + return FALSE; + iter->stamp=priv->stamp; + iter->user_data=g_sequence_get_iter_at_pos(priv->seq,i); + return TRUE; +} + +static GtkTreePath * + plover_package_file_store_get_path(GtkTreeModel *tree_model,GtkTreeIter *iter) +{ + GtkTreePath *path; + g_return_val_if_fail(VALID_ITER(iter,tree_model),NULL); + if (g_sequence_iter_is_end(iter->user_data)) + return NULL; + path=gtk_tree_path_new(); + gtk_tree_path_append_index(path, + g_sequence_iter_get_position(iter->user_data)); + return path; +} + +static void plover_package_file_store_get_value(GtkTreeModel *tree_model, + GtkTreeIter *iter,gint column,GValue *value) +{ + PloverPackageFileStore *store=(PloverPackageFileStore *)tree_model; + char *name; + g_return_if_fail(column>=0 && columnuser_data); + g_value_init(value,column_types[column]); + switch((PloverPackageFileStoreColumn)column) + { + case PLOVER_PACKAGE_FILE_STORE_NAME_COLUMN: + g_value_set_string(value,name); + break; + } +} + +static gboolean plover_package_file_store_iter_next(GtkTreeModel *tree_model, + GtkTreeIter *iter) +{ + g_return_val_if_fail(VALID_ITER(iter,tree_model),FALSE); + iter->user_data=g_sequence_iter_next(iter->user_data); + return !g_sequence_iter_is_end(iter->user_data); +} + +static gboolean + plover_package_file_store_iter_children(GtkTreeModel *tree_model, + GtkTreeIter *iter,GtkTreeIter *parent) +{ + PloverPackageFileStorePrivate *priv; + PloverPackageFileStore *store=(PloverPackageFileStore *)tree_model; + priv=PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(tree_model); + /* this is a list, nodes have no children */ + if (parent) + return FALSE; + if (g_sequence_get_length(priv->seq)>0) + { + iter->stamp=priv->stamp; + iter->user_data=g_sequence_get_begin_iter(priv->seq); + return TRUE; + } + else + return FALSE; +} + +static gboolean + plover_package_file_store_iter_has_child(GtkTreeModel *tree_model, + GtkTreeIter *iter) +{ + return FALSE; +} + +static gint plover_package_file_store_iter_n_children(GtkTreeModel *tree_model, + GtkTreeIter *iter) +{ + PloverPackageFileStorePrivate *priv; + PloverPackageFileStore *store=(PloverPackageFileStore *)tree_model; + priv=PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(tree_model); + if (!iter) + return g_sequence_get_length(priv->seq); + g_return_val_if_fail(VALID_ITER(iter,tree_model),-1); + return 0; +} + +static gboolean + plover_package_file_store_iter_nth_child(GtkTreeModel *tree_model, + GtkTreeIter *iter,GtkTreeIter *parent,gint n) +{ + PloverPackageFileStorePrivate *priv; + PloverPackageFileStore *store=(PloverPackageFileStore *)tree_model; + priv=PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(tree_model); + GSequenceIter *child; + if (parent) + return FALSE; + child=g_sequence_get_iter_at_pos(priv->seq,n); + if (g_sequence_iter_is_end(child)) + return FALSE; + iter->stamp=priv->stamp; + iter->user_data=child; + return TRUE; +} + +static gboolean plover_package_file_store_iter_parent(GtkTreeModel *tree_model, + GtkTreeIter *iter,GtkTreeIter *child) +{ + return FALSE; +} + +static void plover_package_file_store_tree_model_init(GtkTreeModelIface *iface) +{ + iface->get_flags=plover_package_file_store_get_flags; + iface->get_n_columns=plover_package_file_store_get_n_columns; + iface->get_column_type=plover_package_file_store_get_column_type; + iface->get_iter=plover_package_file_store_get_iter; + iface->get_path=plover_package_file_store_get_path; + iface->get_value=plover_package_file_store_get_value; + iface->iter_next=plover_package_file_store_iter_next; + iface->iter_children=plover_package_file_store_iter_children; + iface->iter_has_child=plover_package_file_store_iter_has_child; + iface->iter_n_children=plover_package_file_store_iter_n_children; + iface->iter_nth_child=plover_package_file_store_iter_nth_child; + iface->iter_parent=plover_package_file_store_iter_parent; +} + +static void plover_package_file_store_init(PloverPackageFileStore *store) +{ + PloverPackageFileStorePrivate *priv; + priv=PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(store); + priv->seq=g_sequence_new(g_free); + priv->stamp=g_random_int(); +} + +PloverPackageFileStore * + plover_package_file_store_new(struct razor_file_iterator *files) +{ + const char *name; + GSequenceIter *si; + GtkTreeIter ti; + GtkTreePath *path; + gint *indices; + PloverPackageFileStore *store; + PloverPackageFileStorePrivate *priv; + store=g_object_new(PLOVER_TYPE_PACKAGE_FILE_STORE,NULL); + priv=PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(store); + path=gtk_tree_path_new(); + gtk_tree_path_append_index(path,0); + indices=gtk_tree_path_get_indices(path); + while(razor_file_iterator_next(files,&name)) + { + si=g_sequence_insert_sorted(priv->seq,g_strdup(name),g_strcmp0,NULL); + *indices=g_sequence_iter_get_position(si); + ti.stamp=priv->stamp; + ti.user_data=si; + gtk_tree_model_row_inserted(GTK_TREE_MODEL(store),path,&ti); + } + gtk_tree_path_free(path); + return store; +}