1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/plover-gtk/packagefilestore.c Sat Feb 20 12:11:02 2010 +0000
1.3 @@ -0,0 +1,254 @@
1.4 +/*
1.5 + * Copyright (C) 2000 Red Hat, Inc., Jonathan Blandford <jrb@redhat.com>
1.6 + * Copyright (C) 2010 J. Ali Harlow <ali@juiblex.co.uk>
1.7 + *
1.8 + * This program is free software; you can redistribute it and/or modify
1.9 + * it under the terms of the GNU General Public License as published by
1.10 + * the Free Software Foundation; either version 2 of the License, or
1.11 + * (at your option) any later version.
1.12 + *
1.13 + * This program is distributed in the hope that it will be useful,
1.14 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
1.15 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1.16 + * GNU General Public License for more details.
1.17 + *
1.18 + * You should have received a copy of the GNU General Public License along
1.19 + * with this program; if not, write to the Free Software Foundation, Inc.,
1.20 + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1.21 + */
1.22 +
1.23 +#include "config.h"
1.24 +#include <stdlib.h>
1.25 +#include <string.h>
1.26 +#include <glib-object.h>
1.27 +#include <gtk/gtk.h>
1.28 +#include "plover-gtk/packagefilestore.h"
1.29 +
1.30 +#define VALID_ITER(iter,store) ((iter) && (iter)->user_data && \
1.31 + PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(store)->stamp==(iter)->stamp && \
1.32 + !g_sequence_iter_is_end((iter)->user_data) && \
1.33 + g_sequence_iter_get_sequence((iter)->user_data)== \
1.34 + PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(store)->seq)
1.35 +
1.36 +static GType column_types[PLOVER_PACKAGE_FILE_STORE_NO_COLUMNS];
1.37 +
1.38 +static void plover_package_file_store_tree_model_init(GtkTreeModelIface *iface);
1.39 +
1.40 +G_DEFINE_TYPE_WITH_CODE(PloverPackageFileStore,plover_package_file_store,
1.41 + G_TYPE_OBJECT,G_IMPLEMENT_INTERFACE(GTK_TYPE_TREE_MODEL,
1.42 + plover_package_file_store_tree_model_init));
1.43 +
1.44 +typedef struct _PloverPackageFileStorePrivate {
1.45 + GSequence *seq;
1.46 + int stamp;
1.47 +} PloverPackageFileStorePrivate;
1.48 +
1.49 +#define PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(obj)\
1.50 + G_TYPE_INSTANCE_GET_PRIVATE(obj,\
1.51 + PLOVER_TYPE_PACKAGE_FILE_STORE,\
1.52 + PloverPackageFileStorePrivate)
1.53 +
1.54 +static void plover_package_file_store_finalize(GObject *obj)
1.55 +{
1.56 + PloverPackageFileStorePrivate *priv=
1.57 + PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(obj);
1.58 + g_sequence_free(priv->seq);
1.59 + if (G_OBJECT_CLASS(plover_package_file_store_parent_class)->finalize)
1.60 + G_OBJECT_CLASS(plover_package_file_store_parent_class)->finalize(obj);
1.61 +}
1.62 +
1.63 +static void
1.64 + plover_package_file_store_class_init(PloverPackageFileStoreClass *klass)
1.65 +{
1.66 + GObjectClass *oclass=G_OBJECT_CLASS(klass);
1.67 + oclass->finalize=plover_package_file_store_finalize;
1.68 + g_type_class_add_private(klass,sizeof(PloverPackageFileStorePrivate));
1.69 + column_types[PLOVER_PACKAGE_FILE_STORE_NAME_COLUMN]=G_TYPE_STRING;
1.70 +}
1.71 +
1.72 +static GtkTreeModelFlags
1.73 +plover_package_file_store_get_flags(GtkTreeModel *tree_model)
1.74 +{
1.75 + return GTK_TREE_MODEL_ITERS_PERSIST|GTK_TREE_MODEL_LIST_ONLY;
1.76 +}
1.77 +
1.78 +static gint plover_package_file_store_get_n_columns(GtkTreeModel *tree_model)
1.79 +{
1.80 + return PLOVER_PACKAGE_FILE_STORE_NO_COLUMNS;
1.81 +}
1.82 +
1.83 +static GType
1.84 + plover_package_file_store_get_column_type(GtkTreeModel *tree_model,gint indx)
1.85 +{
1.86 + PloverPackageFileStore *store=(PloverPackageFileStore *)tree_model;
1.87 + g_return_val_if_fail(indx>=0 && indx<PLOVER_PACKAGE_FILE_STORE_NO_COLUMNS,
1.88 + G_TYPE_INVALID);
1.89 + return column_types[indx];
1.90 +}
1.91 +
1.92 +static gboolean plover_package_file_store_get_iter(GtkTreeModel *tree_model,
1.93 + GtkTreeIter *iter,GtkTreePath *path)
1.94 +{
1.95 + int i;
1.96 + PloverPackageFileStorePrivate *priv;
1.97 + PloverPackageFileStore *store=(PloverPackageFileStore *)tree_model;
1.98 + priv=PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(store);
1.99 + i=gtk_tree_path_get_indices(path)[0];
1.100 + if (i>=g_sequence_get_length(priv->seq))
1.101 + return FALSE;
1.102 + iter->stamp=priv->stamp;
1.103 + iter->user_data=g_sequence_get_iter_at_pos(priv->seq,i);
1.104 + return TRUE;
1.105 +}
1.106 +
1.107 +static GtkTreePath *
1.108 + plover_package_file_store_get_path(GtkTreeModel *tree_model,GtkTreeIter *iter)
1.109 +{
1.110 + GtkTreePath *path;
1.111 + g_return_val_if_fail(VALID_ITER(iter,tree_model),NULL);
1.112 + if (g_sequence_iter_is_end(iter->user_data))
1.113 + return NULL;
1.114 + path=gtk_tree_path_new();
1.115 + gtk_tree_path_append_index(path,
1.116 + g_sequence_iter_get_position(iter->user_data));
1.117 + return path;
1.118 +}
1.119 +
1.120 +static void plover_package_file_store_get_value(GtkTreeModel *tree_model,
1.121 + GtkTreeIter *iter,gint column,GValue *value)
1.122 +{
1.123 + PloverPackageFileStore *store=(PloverPackageFileStore *)tree_model;
1.124 + char *name;
1.125 + g_return_if_fail(column>=0 && column<PLOVER_PACKAGE_FILE_STORE_NO_COLUMNS);
1.126 + g_return_if_fail(VALID_ITER(iter,store));
1.127 + name=g_sequence_get(iter->user_data);
1.128 + g_value_init(value,column_types[column]);
1.129 + switch((PloverPackageFileStoreColumn)column)
1.130 + {
1.131 + case PLOVER_PACKAGE_FILE_STORE_NAME_COLUMN:
1.132 + g_value_set_string(value,name);
1.133 + break;
1.134 + }
1.135 +}
1.136 +
1.137 +static gboolean plover_package_file_store_iter_next(GtkTreeModel *tree_model,
1.138 + GtkTreeIter *iter)
1.139 +{
1.140 + g_return_val_if_fail(VALID_ITER(iter,tree_model),FALSE);
1.141 + iter->user_data=g_sequence_iter_next(iter->user_data);
1.142 + return !g_sequence_iter_is_end(iter->user_data);
1.143 +}
1.144 +
1.145 +static gboolean
1.146 + plover_package_file_store_iter_children(GtkTreeModel *tree_model,
1.147 + GtkTreeIter *iter,GtkTreeIter *parent)
1.148 +{
1.149 + PloverPackageFileStorePrivate *priv;
1.150 + PloverPackageFileStore *store=(PloverPackageFileStore *)tree_model;
1.151 + priv=PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(tree_model);
1.152 + /* this is a list, nodes have no children */
1.153 + if (parent)
1.154 + return FALSE;
1.155 + if (g_sequence_get_length(priv->seq)>0)
1.156 + {
1.157 + iter->stamp=priv->stamp;
1.158 + iter->user_data=g_sequence_get_begin_iter(priv->seq);
1.159 + return TRUE;
1.160 + }
1.161 + else
1.162 + return FALSE;
1.163 +}
1.164 +
1.165 +static gboolean
1.166 + plover_package_file_store_iter_has_child(GtkTreeModel *tree_model,
1.167 + GtkTreeIter *iter)
1.168 +{
1.169 + return FALSE;
1.170 +}
1.171 +
1.172 +static gint plover_package_file_store_iter_n_children(GtkTreeModel *tree_model,
1.173 + GtkTreeIter *iter)
1.174 +{
1.175 + PloverPackageFileStorePrivate *priv;
1.176 + PloverPackageFileStore *store=(PloverPackageFileStore *)tree_model;
1.177 + priv=PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(tree_model);
1.178 + if (!iter)
1.179 + return g_sequence_get_length(priv->seq);
1.180 + g_return_val_if_fail(VALID_ITER(iter,tree_model),-1);
1.181 + return 0;
1.182 +}
1.183 +
1.184 +static gboolean
1.185 + plover_package_file_store_iter_nth_child(GtkTreeModel *tree_model,
1.186 + GtkTreeIter *iter,GtkTreeIter *parent,gint n)
1.187 +{
1.188 + PloverPackageFileStorePrivate *priv;
1.189 + PloverPackageFileStore *store=(PloverPackageFileStore *)tree_model;
1.190 + priv=PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(tree_model);
1.191 + GSequenceIter *child;
1.192 + if (parent)
1.193 + return FALSE;
1.194 + child=g_sequence_get_iter_at_pos(priv->seq,n);
1.195 + if (g_sequence_iter_is_end(child))
1.196 + return FALSE;
1.197 + iter->stamp=priv->stamp;
1.198 + iter->user_data=child;
1.199 + return TRUE;
1.200 +}
1.201 +
1.202 +static gboolean plover_package_file_store_iter_parent(GtkTreeModel *tree_model,
1.203 + GtkTreeIter *iter,GtkTreeIter *child)
1.204 +{
1.205 + return FALSE;
1.206 +}
1.207 +
1.208 +static void plover_package_file_store_tree_model_init(GtkTreeModelIface *iface)
1.209 +{
1.210 + iface->get_flags=plover_package_file_store_get_flags;
1.211 + iface->get_n_columns=plover_package_file_store_get_n_columns;
1.212 + iface->get_column_type=plover_package_file_store_get_column_type;
1.213 + iface->get_iter=plover_package_file_store_get_iter;
1.214 + iface->get_path=plover_package_file_store_get_path;
1.215 + iface->get_value=plover_package_file_store_get_value;
1.216 + iface->iter_next=plover_package_file_store_iter_next;
1.217 + iface->iter_children=plover_package_file_store_iter_children;
1.218 + iface->iter_has_child=plover_package_file_store_iter_has_child;
1.219 + iface->iter_n_children=plover_package_file_store_iter_n_children;
1.220 + iface->iter_nth_child=plover_package_file_store_iter_nth_child;
1.221 + iface->iter_parent=plover_package_file_store_iter_parent;
1.222 +}
1.223 +
1.224 +static void plover_package_file_store_init(PloverPackageFileStore *store)
1.225 +{
1.226 + PloverPackageFileStorePrivate *priv;
1.227 + priv=PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(store);
1.228 + priv->seq=g_sequence_new(g_free);
1.229 + priv->stamp=g_random_int();
1.230 +}
1.231 +
1.232 +PloverPackageFileStore *
1.233 + plover_package_file_store_new(struct razor_file_iterator *files)
1.234 +{
1.235 + const char *name;
1.236 + GSequenceIter *si;
1.237 + GtkTreeIter ti;
1.238 + GtkTreePath *path;
1.239 + gint *indices;
1.240 + PloverPackageFileStore *store;
1.241 + PloverPackageFileStorePrivate *priv;
1.242 + store=g_object_new(PLOVER_TYPE_PACKAGE_FILE_STORE,NULL);
1.243 + priv=PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(store);
1.244 + path=gtk_tree_path_new();
1.245 + gtk_tree_path_append_index(path,0);
1.246 + indices=gtk_tree_path_get_indices(path);
1.247 + while(razor_file_iterator_next(files,&name))
1.248 + {
1.249 + si=g_sequence_insert_sorted(priv->seq,g_strdup(name),g_strcmp0,NULL);
1.250 + *indices=g_sequence_iter_get_position(si);
1.251 + ti.stamp=priv->stamp;
1.252 + ti.user_data=si;
1.253 + gtk_tree_model_row_inserted(GTK_TREE_MODEL(store),path,&ti);
1.254 + }
1.255 + gtk_tree_path_free(path);
1.256 + return store;
1.257 +}