plover-gtk/packagefilestore.c
author J. Ali Harlow <ali@juiblex.co.uk>
Fri Apr 30 20:37:08 2010 +0100 (2010-04-30)
changeset 10 8b50be3e2998
parent 9 8d3b1ddf789c
child 12 1d18b9c34d26
permissions -rw-r--r--
Port applications manager to win32
ali@9
     1
/*
ali@9
     2
 * Copyright (C) 2000  Red Hat, Inc.,  Jonathan Blandford <jrb@redhat.com>
ali@9
     3
 * Copyright (C) 2010  J. Ali Harlow <ali@juiblex.co.uk>
ali@9
     4
 *
ali@9
     5
 * This program is free software; you can redistribute it and/or modify
ali@9
     6
 * it under the terms of the GNU General Public License as published by
ali@9
     7
 * the Free Software Foundation; either version 2 of the License, or
ali@9
     8
 * (at your option) any later version.
ali@9
     9
 *
ali@9
    10
 * This program is distributed in the hope that it will be useful,
ali@9
    11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ali@9
    12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
ali@9
    13
 * GNU General Public License for more details.
ali@9
    14
 *
ali@9
    15
 * You should have received a copy of the GNU General Public License along
ali@9
    16
 * with this program; if not, write to the Free Software Foundation, Inc.,
ali@9
    17
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
ali@9
    18
 */
ali@9
    19
ali@9
    20
#include "config.h"
ali@9
    21
#include <stdlib.h>
ali@9
    22
#include <string.h>
ali@9
    23
#include <glib-object.h>
ali@9
    24
#include <gtk/gtk.h>
ali@9
    25
#include "plover-gtk/packagefilestore.h"
ali@9
    26
ali@9
    27
#define VALID_ITER(iter,store) ((iter) && (iter)->user_data && \
ali@9
    28
	PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(store)->stamp==(iter)->stamp && \
ali@9
    29
	!g_sequence_iter_is_end((iter)->user_data) && \
ali@9
    30
	g_sequence_iter_get_sequence((iter)->user_data)== \
ali@9
    31
	PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(store)->seq)
ali@9
    32
ali@9
    33
static GType column_types[PLOVER_PACKAGE_FILE_STORE_NO_COLUMNS];
ali@9
    34
ali@9
    35
static void plover_package_file_store_tree_model_init(GtkTreeModelIface *iface);
ali@9
    36
ali@9
    37
G_DEFINE_TYPE_WITH_CODE(PloverPackageFileStore,plover_package_file_store,
ali@9
    38
  G_TYPE_OBJECT,G_IMPLEMENT_INTERFACE(GTK_TYPE_TREE_MODEL,
ali@9
    39
  plover_package_file_store_tree_model_init));
ali@9
    40
ali@9
    41
typedef struct _PloverPackageFileStorePrivate {
ali@9
    42
    GSequence *seq;
ali@9
    43
    int stamp;
ali@9
    44
} PloverPackageFileStorePrivate;
ali@9
    45
ali@9
    46
#define PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(obj)\
ali@9
    47
				G_TYPE_INSTANCE_GET_PRIVATE(obj,\
ali@9
    48
				  PLOVER_TYPE_PACKAGE_FILE_STORE,\
ali@9
    49
				  PloverPackageFileStorePrivate)
ali@9
    50
ali@9
    51
static void plover_package_file_store_finalize(GObject *obj)
ali@9
    52
{
ali@9
    53
    PloverPackageFileStorePrivate *priv=
ali@9
    54
      PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(obj);
ali@9
    55
    g_sequence_free(priv->seq);
ali@9
    56
    if (G_OBJECT_CLASS(plover_package_file_store_parent_class)->finalize)
ali@9
    57
	G_OBJECT_CLASS(plover_package_file_store_parent_class)->finalize(obj);
ali@9
    58
}
ali@9
    59
ali@9
    60
static void
ali@9
    61
  plover_package_file_store_class_init(PloverPackageFileStoreClass *klass)
ali@9
    62
{
ali@9
    63
    GObjectClass *oclass=G_OBJECT_CLASS(klass);
ali@9
    64
    oclass->finalize=plover_package_file_store_finalize;
ali@9
    65
    g_type_class_add_private(klass,sizeof(PloverPackageFileStorePrivate));
ali@9
    66
    column_types[PLOVER_PACKAGE_FILE_STORE_NAME_COLUMN]=G_TYPE_STRING;
ali@9
    67
}
ali@9
    68
ali@9
    69
static GtkTreeModelFlags
ali@9
    70
plover_package_file_store_get_flags(GtkTreeModel *tree_model)
ali@9
    71
{
ali@9
    72
    return GTK_TREE_MODEL_ITERS_PERSIST|GTK_TREE_MODEL_LIST_ONLY;
ali@9
    73
}
ali@9
    74
ali@9
    75
static gint plover_package_file_store_get_n_columns(GtkTreeModel *tree_model)
ali@9
    76
{
ali@9
    77
    return PLOVER_PACKAGE_FILE_STORE_NO_COLUMNS;
ali@9
    78
}
ali@9
    79
ali@9
    80
static GType
ali@9
    81
  plover_package_file_store_get_column_type(GtkTreeModel *tree_model,gint indx)
ali@9
    82
{
ali@9
    83
    PloverPackageFileStore *store=(PloverPackageFileStore *)tree_model;
ali@9
    84
    g_return_val_if_fail(indx>=0 && indx<PLOVER_PACKAGE_FILE_STORE_NO_COLUMNS,
ali@9
    85
      G_TYPE_INVALID);
ali@9
    86
    return column_types[indx];
ali@9
    87
}
ali@9
    88
ali@9
    89
static gboolean plover_package_file_store_get_iter(GtkTreeModel *tree_model,
ali@9
    90
  GtkTreeIter *iter,GtkTreePath *path)
ali@9
    91
{
ali@9
    92
    int i;
ali@9
    93
    PloverPackageFileStorePrivate *priv;
ali@9
    94
    PloverPackageFileStore *store=(PloverPackageFileStore *)tree_model;
ali@9
    95
    priv=PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(store);
ali@9
    96
    i=gtk_tree_path_get_indices(path)[0];
ali@9
    97
    if (i>=g_sequence_get_length(priv->seq))
ali@9
    98
	return FALSE;
ali@9
    99
    iter->stamp=priv->stamp;
ali@9
   100
    iter->user_data=g_sequence_get_iter_at_pos(priv->seq,i);
ali@9
   101
    return TRUE;
ali@9
   102
}
ali@9
   103
ali@9
   104
static GtkTreePath *
ali@9
   105
  plover_package_file_store_get_path(GtkTreeModel *tree_model,GtkTreeIter *iter)
ali@9
   106
{
ali@9
   107
    GtkTreePath *path;
ali@9
   108
    g_return_val_if_fail(VALID_ITER(iter,tree_model),NULL);
ali@9
   109
    if (g_sequence_iter_is_end(iter->user_data))
ali@9
   110
	return NULL;
ali@9
   111
    path=gtk_tree_path_new();
ali@9
   112
    gtk_tree_path_append_index(path,
ali@9
   113
      g_sequence_iter_get_position(iter->user_data));
ali@9
   114
    return path;
ali@9
   115
}
ali@9
   116
ali@9
   117
static void plover_package_file_store_get_value(GtkTreeModel *tree_model,
ali@9
   118
  GtkTreeIter *iter,gint column,GValue *value)
ali@9
   119
{
ali@9
   120
    PloverPackageFileStore *store=(PloverPackageFileStore *)tree_model;
ali@9
   121
    char *name;
ali@9
   122
    g_return_if_fail(column>=0 && column<PLOVER_PACKAGE_FILE_STORE_NO_COLUMNS);
ali@9
   123
    g_return_if_fail(VALID_ITER(iter,store));
ali@9
   124
    name=g_sequence_get(iter->user_data);
ali@9
   125
    g_value_init(value,column_types[column]);
ali@9
   126
    switch((PloverPackageFileStoreColumn)column)
ali@9
   127
    {
ali@9
   128
	case PLOVER_PACKAGE_FILE_STORE_NAME_COLUMN:
ali@9
   129
	    g_value_set_string(value,name);
ali@9
   130
	    break;
ali@9
   131
    }
ali@9
   132
}
ali@9
   133
ali@9
   134
static gboolean plover_package_file_store_iter_next(GtkTreeModel *tree_model,
ali@9
   135
  GtkTreeIter *iter)
ali@9
   136
{
ali@9
   137
    g_return_val_if_fail(VALID_ITER(iter,tree_model),FALSE);
ali@9
   138
    iter->user_data=g_sequence_iter_next(iter->user_data);
ali@9
   139
    return !g_sequence_iter_is_end(iter->user_data);
ali@9
   140
}
ali@9
   141
ali@9
   142
static gboolean
ali@9
   143
  plover_package_file_store_iter_children(GtkTreeModel *tree_model,
ali@9
   144
  GtkTreeIter *iter,GtkTreeIter *parent)
ali@9
   145
{
ali@9
   146
    PloverPackageFileStorePrivate *priv;
ali@9
   147
    PloverPackageFileStore *store=(PloverPackageFileStore *)tree_model;
ali@9
   148
    priv=PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(tree_model);
ali@9
   149
    /* this is a list, nodes have no children */
ali@9
   150
    if (parent)
ali@9
   151
	return FALSE;
ali@9
   152
    if (g_sequence_get_length(priv->seq)>0)
ali@9
   153
    {
ali@9
   154
	iter->stamp=priv->stamp;
ali@9
   155
	iter->user_data=g_sequence_get_begin_iter(priv->seq);
ali@9
   156
	return TRUE;
ali@9
   157
    }
ali@9
   158
    else
ali@9
   159
	return FALSE;
ali@9
   160
}
ali@9
   161
ali@9
   162
static gboolean
ali@9
   163
  plover_package_file_store_iter_has_child(GtkTreeModel *tree_model,
ali@9
   164
  GtkTreeIter *iter)
ali@9
   165
{
ali@9
   166
    return FALSE;
ali@9
   167
}
ali@9
   168
ali@9
   169
static gint plover_package_file_store_iter_n_children(GtkTreeModel *tree_model,
ali@9
   170
  GtkTreeIter *iter)
ali@9
   171
{
ali@9
   172
    PloverPackageFileStorePrivate *priv;
ali@9
   173
    PloverPackageFileStore *store=(PloverPackageFileStore *)tree_model;
ali@9
   174
    priv=PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(tree_model);
ali@9
   175
    if (!iter)
ali@9
   176
	return g_sequence_get_length(priv->seq);
ali@9
   177
    g_return_val_if_fail(VALID_ITER(iter,tree_model),-1);
ali@9
   178
    return 0;
ali@9
   179
}
ali@9
   180
ali@9
   181
static gboolean
ali@9
   182
  plover_package_file_store_iter_nth_child(GtkTreeModel *tree_model,
ali@9
   183
  GtkTreeIter *iter,GtkTreeIter *parent,gint n)
ali@9
   184
{
ali@9
   185
    PloverPackageFileStorePrivate *priv;
ali@9
   186
    PloverPackageFileStore *store=(PloverPackageFileStore *)tree_model;
ali@9
   187
    priv=PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(tree_model);
ali@9
   188
    GSequenceIter *child;
ali@9
   189
    if (parent)
ali@9
   190
	return FALSE;
ali@9
   191
    child=g_sequence_get_iter_at_pos(priv->seq,n);
ali@9
   192
    if (g_sequence_iter_is_end(child))
ali@9
   193
	return FALSE;
ali@9
   194
    iter->stamp=priv->stamp;
ali@9
   195
    iter->user_data=child;
ali@9
   196
    return TRUE;
ali@9
   197
}
ali@9
   198
ali@9
   199
static gboolean plover_package_file_store_iter_parent(GtkTreeModel *tree_model,
ali@9
   200
  GtkTreeIter *iter,GtkTreeIter *child)
ali@9
   201
{
ali@9
   202
    return FALSE;
ali@9
   203
}
ali@9
   204
ali@9
   205
static void plover_package_file_store_tree_model_init(GtkTreeModelIface *iface)
ali@9
   206
{
ali@9
   207
    iface->get_flags=plover_package_file_store_get_flags;
ali@9
   208
    iface->get_n_columns=plover_package_file_store_get_n_columns;
ali@9
   209
    iface->get_column_type=plover_package_file_store_get_column_type;
ali@9
   210
    iface->get_iter=plover_package_file_store_get_iter;
ali@9
   211
    iface->get_path=plover_package_file_store_get_path;
ali@9
   212
    iface->get_value=plover_package_file_store_get_value;
ali@9
   213
    iface->iter_next=plover_package_file_store_iter_next;
ali@9
   214
    iface->iter_children=plover_package_file_store_iter_children;
ali@9
   215
    iface->iter_has_child=plover_package_file_store_iter_has_child;
ali@9
   216
    iface->iter_n_children=plover_package_file_store_iter_n_children;
ali@9
   217
    iface->iter_nth_child=plover_package_file_store_iter_nth_child;
ali@9
   218
    iface->iter_parent=plover_package_file_store_iter_parent;
ali@9
   219
}
ali@9
   220
ali@9
   221
static void plover_package_file_store_init(PloverPackageFileStore *store)
ali@9
   222
{
ali@9
   223
    PloverPackageFileStorePrivate *priv;
ali@9
   224
    priv=PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(store);
ali@9
   225
    priv->seq=g_sequence_new(g_free);
ali@9
   226
    priv->stamp=g_random_int();
ali@9
   227
}
ali@9
   228
ali@9
   229
PloverPackageFileStore *
ali@9
   230
  plover_package_file_store_new(struct razor_file_iterator *files)
ali@9
   231
{
ali@9
   232
    const char *name;
ali@10
   233
    char *s;
ali@9
   234
    GSequenceIter *si;
ali@9
   235
    GtkTreeIter ti;
ali@9
   236
    GtkTreePath *path;
ali@9
   237
    gint *indices;
ali@9
   238
    PloverPackageFileStore *store;
ali@9
   239
    PloverPackageFileStorePrivate *priv;
ali@9
   240
    store=g_object_new(PLOVER_TYPE_PACKAGE_FILE_STORE,NULL);
ali@9
   241
    priv=PLOVER_PACKAGE_FILE_STORE_GET_PRIVATE(store);
ali@9
   242
    path=gtk_tree_path_new();
ali@9
   243
    gtk_tree_path_append_index(path,0);
ali@9
   244
    indices=gtk_tree_path_get_indices(path);
ali@9
   245
    while(razor_file_iterator_next(files,&name))
ali@9
   246
    {
ali@10
   247
	s=g_strdup(name);
ali@10
   248
#ifdef WIN32
ali@10
   249
	s=g_strdelimit(s,"/",'\\');
ali@10
   250
#endif
ali@10
   251
	si=g_sequence_insert_sorted(priv->seq,s,g_strcmp0,NULL);
ali@9
   252
	*indices=g_sequence_iter_get_position(si);
ali@9
   253
	ti.stamp=priv->stamp;
ali@9
   254
	ti.user_data=si;
ali@9
   255
	gtk_tree_model_row_inserted(GTK_TREE_MODEL(store),path,&ti);
ali@9
   256
    }
ali@9
   257
    gtk_tree_path_free(path);
ali@9
   258
    return store;
ali@9
   259
}