2 * Copyright (C) 2000 Red Hat, Inc., Jonathan Blandford <jrb@redhat.com>
3 * Copyright (C) 2010 J. Ali Harlow <ali@juiblex.co.uk>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23 #include <glib-object.h>
25 #include "plover-gtk/packagefilestore.h"
27 #define VALID_ITER(iter,store) ((iter) && (iter)->user_data && \
28 PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(store)->stamp==(iter)->stamp && \
29 !g_sequence_iter_is_end((iter)->user_data) && \
30 g_sequence_iter_get_sequence((iter)->user_data)== \
31 PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(store)->seq)
33 static GType column_types[PLOVER_PACKAGE_FILE_STORE_NO_COLUMNS];
35 static void plover_package_file_store_tree_model_init(GtkTreeModelIface *iface);
37 G_DEFINE_TYPE_WITH_CODE(PloverPackageFileStore,plover_package_file_store,
38 G_TYPE_OBJECT,G_IMPLEMENT_INTERFACE(GTK_TYPE_TREE_MODEL,
39 plover_package_file_store_tree_model_init));
41 typedef struct _PloverPackageFileStorePrivate {
44 } PloverPackageFileStorePrivate;
46 #define PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(obj)\
47 G_TYPE_INSTANCE_GET_PRIVATE(obj,\
48 PLOVER_TYPE_PACKAGE_FILE_STORE,\
49 PloverPackageFileStorePrivate)
51 static void plover_package_file_store_finalize(GObject *obj)
53 PloverPackageFileStorePrivate *priv=
54 PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(obj);
55 g_sequence_free(priv->seq);
56 if (G_OBJECT_CLASS(plover_package_file_store_parent_class)->finalize)
57 G_OBJECT_CLASS(plover_package_file_store_parent_class)->finalize(obj);
61 plover_package_file_store_class_init(PloverPackageFileStoreClass *klass)
63 GObjectClass *oclass=G_OBJECT_CLASS(klass);
64 oclass->finalize=plover_package_file_store_finalize;
65 g_type_class_add_private(klass,sizeof(PloverPackageFileStorePrivate));
66 column_types[PLOVER_PACKAGE_FILE_STORE_NAME_COLUMN]=G_TYPE_STRING;
69 static GtkTreeModelFlags
70 plover_package_file_store_get_flags(GtkTreeModel *tree_model)
72 return GTK_TREE_MODEL_ITERS_PERSIST|GTK_TREE_MODEL_LIST_ONLY;
75 static gint plover_package_file_store_get_n_columns(GtkTreeModel *tree_model)
77 return PLOVER_PACKAGE_FILE_STORE_NO_COLUMNS;
81 plover_package_file_store_get_column_type(GtkTreeModel *tree_model,gint indx)
83 g_return_val_if_fail(indx>=0 && indx<PLOVER_PACKAGE_FILE_STORE_NO_COLUMNS,
85 return column_types[indx];
88 static gboolean plover_package_file_store_get_iter(GtkTreeModel *tree_model,
89 GtkTreeIter *iter,GtkTreePath *path)
92 PloverPackageFileStorePrivate *priv;
93 PloverPackageFileStore *store=(PloverPackageFileStore *)tree_model;
94 priv=PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(store);
95 i=gtk_tree_path_get_indices(path)[0];
96 if (i>=g_sequence_get_length(priv->seq))
98 iter->stamp=priv->stamp;
99 iter->user_data=g_sequence_get_iter_at_pos(priv->seq,i);
104 plover_package_file_store_get_path(GtkTreeModel *tree_model,GtkTreeIter *iter)
107 g_return_val_if_fail(VALID_ITER(iter,tree_model),NULL);
108 if (g_sequence_iter_is_end(iter->user_data))
110 path=gtk_tree_path_new();
111 gtk_tree_path_append_index(path,
112 g_sequence_iter_get_position(iter->user_data));
116 static void plover_package_file_store_get_value(GtkTreeModel *tree_model,
117 GtkTreeIter *iter,gint column,GValue *value)
119 PloverPackageFileStore *store=(PloverPackageFileStore *)tree_model;
121 g_return_if_fail(column>=0 && column<PLOVER_PACKAGE_FILE_STORE_NO_COLUMNS);
122 g_return_if_fail(VALID_ITER(iter,store));
123 name=g_sequence_get(iter->user_data);
124 g_value_init(value,column_types[column]);
125 switch((PloverPackageFileStoreColumn)column)
127 case PLOVER_PACKAGE_FILE_STORE_NAME_COLUMN:
128 g_value_set_string(value,name);
130 case PLOVER_PACKAGE_FILE_STORE_NO_COLUMNS:
131 /* Quieten compiler warning */
136 static gboolean plover_package_file_store_iter_next(GtkTreeModel *tree_model,
139 g_return_val_if_fail(VALID_ITER(iter,tree_model),FALSE);
140 iter->user_data=g_sequence_iter_next(iter->user_data);
141 return !g_sequence_iter_is_end(iter->user_data);
145 plover_package_file_store_iter_children(GtkTreeModel *tree_model,
146 GtkTreeIter *iter,GtkTreeIter *parent)
148 PloverPackageFileStorePrivate *priv;
149 priv=PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(tree_model);
150 /* this is a list, nodes have no children */
153 if (g_sequence_get_length(priv->seq)>0)
155 iter->stamp=priv->stamp;
156 iter->user_data=g_sequence_get_begin_iter(priv->seq);
164 plover_package_file_store_iter_has_child(GtkTreeModel *tree_model,
170 static gint plover_package_file_store_iter_n_children(GtkTreeModel *tree_model,
173 PloverPackageFileStorePrivate *priv;
174 priv=PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(tree_model);
176 return g_sequence_get_length(priv->seq);
177 g_return_val_if_fail(VALID_ITER(iter,tree_model),-1);
182 plover_package_file_store_iter_nth_child(GtkTreeModel *tree_model,
183 GtkTreeIter *iter,GtkTreeIter *parent,gint n)
185 PloverPackageFileStorePrivate *priv;
186 priv=PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(tree_model);
187 GSequenceIter *child;
190 child=g_sequence_get_iter_at_pos(priv->seq,n);
191 if (g_sequence_iter_is_end(child))
193 iter->stamp=priv->stamp;
194 iter->user_data=child;
198 static gboolean plover_package_file_store_iter_parent(GtkTreeModel *tree_model,
199 GtkTreeIter *iter,GtkTreeIter *child)
204 static void plover_package_file_store_tree_model_init(GtkTreeModelIface *iface)
206 iface->get_flags=plover_package_file_store_get_flags;
207 iface->get_n_columns=plover_package_file_store_get_n_columns;
208 iface->get_column_type=plover_package_file_store_get_column_type;
209 iface->get_iter=plover_package_file_store_get_iter;
210 iface->get_path=plover_package_file_store_get_path;
211 iface->get_value=plover_package_file_store_get_value;
212 iface->iter_next=plover_package_file_store_iter_next;
213 iface->iter_children=plover_package_file_store_iter_children;
214 iface->iter_has_child=plover_package_file_store_iter_has_child;
215 iface->iter_n_children=plover_package_file_store_iter_n_children;
216 iface->iter_nth_child=plover_package_file_store_iter_nth_child;
217 iface->iter_parent=plover_package_file_store_iter_parent;
220 static void plover_package_file_store_init(PloverPackageFileStore *store)
222 PloverPackageFileStorePrivate *priv;
223 priv=PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(store);
224 priv->seq=g_sequence_new(g_free);
225 priv->stamp=g_random_int();
228 PloverPackageFileStore *
229 plover_package_file_store_new(struct razor_file_iterator *files)
237 PloverPackageFileStore *store;
238 PloverPackageFileStorePrivate *priv;
239 store=g_object_new(PLOVER_TYPE_PACKAGE_FILE_STORE,NULL);
240 priv=PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(store);
241 path=gtk_tree_path_new();
242 gtk_tree_path_append_index(path,0);
243 indices=gtk_tree_path_get_indices(path);
244 while(razor_file_iterator_next(files,&name))
248 s=g_strdelimit(s,"/",'\\');
250 si=g_sequence_insert_sorted(priv->seq,s,(GCompareDataFunc)g_strcmp0,
252 *indices=g_sequence_iter_get_position(si);
253 ti.stamp=priv->stamp;
255 gtk_tree_model_row_inserted(GTK_TREE_MODEL(store),path,&ti);
257 gtk_tree_path_free(path);
261 PloverPackageFileStore *
262 plover_package_file_store_new_from_package(PloverPackage *package)
264 PloverPackageFileStore *store;
265 g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
266 struct razor_file_iterator *iter;
267 iter=plover_package_file_iterator_create(package,FALSE);
268 store=GTK_TREE_MODEL(plover_package_file_store_new(iter));
269 razor_file_iterator_destroy(iter);