/* * 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; char *s; 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)) { s=g_strdup(name); #ifdef WIN32 s=g_strdelimit(s,"/",'\\'); #endif si=g_sequence_insert_sorted(priv->seq,s,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; }