2002-01-08 21:25:33 +00:00
|
|
|
|
/* -*- mode: c; style: linux -*- */
|
|
|
|
|
|
|
|
|
|
/* mime-types-model.c
|
2002-01-25 16:12:01 +00:00
|
|
|
|
* Copyright (C) 2000 Red Hat, Inc.,
|
|
|
|
|
* (C) 2002 Ximian, Inc.
|
2002-01-08 21:25:33 +00:00
|
|
|
|
*
|
|
|
|
|
* Written by Bradford Hovinen <hovinen@ximian.com>
|
2002-01-25 16:12:01 +00:00
|
|
|
|
* Based on code by Jonathan Blandford <jrb@redhat.com>
|
2002-01-08 21:25:33 +00:00
|
|
|
|
*
|
2002-01-25 16:12:01 +00:00
|
|
|
|
* 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, or (at your option)
|
|
|
|
|
* any later version.
|
2002-01-08 21:25:33 +00:00
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
2002-01-25 16:12:01 +00:00
|
|
|
|
* 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., 59 Temple Place - Suite 330, Boston, MA
|
|
|
|
|
* 02111-1307, USA.
|
2002-01-08 21:25:33 +00:00
|
|
|
|
*
|
2002-01-25 16:12:01 +00:00
|
|
|
|
* The model-related bootstrapping is lifted from gtk+/gtk/gtktreestore.c
|
2002-01-08 21:25:33 +00:00
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
2002-01-25 16:12:01 +00:00
|
|
|
|
# include "config.h"
|
2002-01-08 21:25:33 +00:00
|
|
|
|
#endif
|
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
#include "mime-types-model.h"
|
|
|
|
|
#include "mime-type-info.h"
|
|
|
|
|
#include "service-info.h"
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
#define IS_CATEGORY(entry) (entry->type == MODEL_ENTRY_CATEGORY)
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
enum {
|
|
|
|
|
PROP_0,
|
|
|
|
|
PROP_CATEGORY_ONLY
|
|
|
|
|
};
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
struct _MimeTypesModelPrivate
|
|
|
|
|
{
|
|
|
|
|
gint stamp;
|
|
|
|
|
gboolean category_only;
|
2002-01-08 21:25:33 +00:00
|
|
|
|
};
|
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
static GObjectClass *parent_class;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void mime_types_model_init (MimeTypesModel *mime_types_model,
|
|
|
|
|
MimeTypesModelClass *class);
|
|
|
|
|
static void mime_types_model_class_init (MimeTypesModelClass *class);
|
|
|
|
|
static void mime_types_model_base_init (MimeTypesModelClass *class);
|
|
|
|
|
|
|
|
|
|
static void mime_types_model_tree_model_init (GtkTreeModelIface *iface);
|
|
|
|
|
|
|
|
|
|
static void mime_types_model_set_prop (GObject *object,
|
|
|
|
|
guint prop_id,
|
|
|
|
|
const GValue *value,
|
|
|
|
|
GParamSpec *pspec);
|
|
|
|
|
static void mime_types_model_get_prop (GObject *object,
|
|
|
|
|
guint prop_id,
|
|
|
|
|
GValue *value,
|
|
|
|
|
GParamSpec *pspec);
|
|
|
|
|
|
|
|
|
|
static void mime_types_model_finalize (GObject *object);
|
|
|
|
|
|
|
|
|
|
static guint mime_types_model_get_flags (GtkTreeModel *tree_model);
|
|
|
|
|
static gint mime_types_model_get_n_columns (GtkTreeModel *tree_model);
|
|
|
|
|
static GType mime_types_model_get_column_type (GtkTreeModel *tree_model,
|
|
|
|
|
gint index);
|
|
|
|
|
static gboolean mime_types_model_get_iter (GtkTreeModel *tree_model,
|
|
|
|
|
GtkTreeIter *iter,
|
|
|
|
|
GtkTreePath *path);
|
|
|
|
|
static GtkTreePath *mime_types_model_get_path (GtkTreeModel *tree_model,
|
|
|
|
|
GtkTreeIter *iter);
|
|
|
|
|
static void mime_types_model_get_value (GtkTreeModel *tree_model,
|
|
|
|
|
GtkTreeIter *iter,
|
|
|
|
|
gint column,
|
|
|
|
|
GValue *value);
|
|
|
|
|
static gboolean mime_types_model_iter_next (GtkTreeModel *tree_model,
|
|
|
|
|
GtkTreeIter *iter);
|
|
|
|
|
static gboolean mime_types_model_iter_children (GtkTreeModel *tree_model,
|
|
|
|
|
GtkTreeIter *iter,
|
|
|
|
|
GtkTreeIter *parent);
|
|
|
|
|
static gboolean mime_types_model_iter_has_child (GtkTreeModel *tree_model,
|
|
|
|
|
GtkTreeIter *iter);
|
|
|
|
|
static gint mime_types_model_iter_n_children (GtkTreeModel *tree_model,
|
|
|
|
|
GtkTreeIter *iter);
|
|
|
|
|
static gboolean mime_types_model_iter_nth_child (GtkTreeModel *tree_model,
|
|
|
|
|
GtkTreeIter *iter,
|
|
|
|
|
GtkTreeIter *parent,
|
|
|
|
|
gint n);
|
|
|
|
|
static gboolean mime_types_model_iter_parent (GtkTreeModel *tree_model,
|
|
|
|
|
GtkTreeIter *iter,
|
|
|
|
|
GtkTreeIter *child);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GType
|
|
|
|
|
mime_types_model_get_type (void)
|
|
|
|
|
{
|
|
|
|
|
static GType mime_types_model_type = 0;
|
|
|
|
|
|
|
|
|
|
if (!mime_types_model_type) {
|
|
|
|
|
static const GTypeInfo mime_types_model_info = {
|
|
|
|
|
sizeof (MimeTypesModelClass),
|
|
|
|
|
(GBaseInitFunc) mime_types_model_base_init,
|
|
|
|
|
NULL, /* GBaseFinalizeFunc */
|
|
|
|
|
(GClassInitFunc) mime_types_model_class_init,
|
|
|
|
|
NULL, /* GClassFinalizeFunc */
|
|
|
|
|
NULL, /* user-supplied data */
|
|
|
|
|
sizeof (MimeTypesModel),
|
|
|
|
|
0, /* n_preallocs */
|
|
|
|
|
(GInstanceInitFunc) mime_types_model_init,
|
|
|
|
|
NULL
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const GInterfaceInfo tree_model_info = {
|
|
|
|
|
(GInterfaceInitFunc) mime_types_model_tree_model_init,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
mime_types_model_type =
|
|
|
|
|
g_type_register_static (G_TYPE_OBJECT,
|
|
|
|
|
"MimeTypesModel",
|
|
|
|
|
&mime_types_model_info, 0);
|
|
|
|
|
|
|
|
|
|
g_type_add_interface_static (mime_types_model_type,
|
|
|
|
|
GTK_TYPE_TREE_MODEL,
|
|
|
|
|
&tree_model_info);
|
|
|
|
|
}
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
return mime_types_model_type;
|
|
|
|
|
}
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
static void
|
|
|
|
|
mime_types_model_init (MimeTypesModel *mime_types_model, MimeTypesModelClass *class)
|
2002-01-08 21:25:33 +00:00
|
|
|
|
{
|
2002-01-25 16:12:01 +00:00
|
|
|
|
mime_types_model->p = g_new0 (MimeTypesModelPrivate, 1);
|
|
|
|
|
mime_types_model->p->stamp = g_random_int ();
|
2002-01-08 21:25:33 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
2002-01-25 16:12:01 +00:00
|
|
|
|
mime_types_model_base_init (MimeTypesModelClass *class)
|
2002-01-08 21:25:33 +00:00
|
|
|
|
{
|
2002-01-25 16:12:01 +00:00
|
|
|
|
}
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
static void
|
|
|
|
|
mime_types_model_class_init (MimeTypesModelClass *class)
|
|
|
|
|
{
|
|
|
|
|
GObjectClass *object_class;
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
object_class = G_OBJECT_CLASS (class);
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
object_class->finalize = mime_types_model_finalize;
|
|
|
|
|
object_class->set_property = mime_types_model_set_prop;
|
|
|
|
|
object_class->get_property = mime_types_model_get_prop;
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
g_object_class_install_property
|
|
|
|
|
(object_class, PROP_CATEGORY_ONLY,
|
|
|
|
|
g_param_spec_boolean ("category-only",
|
|
|
|
|
_("Model for categories only"),
|
|
|
|
|
_("Model for categories only"),
|
|
|
|
|
FALSE,
|
|
|
|
|
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
parent_class = G_OBJECT_CLASS
|
|
|
|
|
(g_type_class_ref (G_TYPE_OBJECT));
|
|
|
|
|
}
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
static void
|
|
|
|
|
mime_types_model_tree_model_init (GtkTreeModelIface *iface)
|
|
|
|
|
{
|
|
|
|
|
iface->get_flags = mime_types_model_get_flags;
|
|
|
|
|
iface->get_n_columns = mime_types_model_get_n_columns;
|
|
|
|
|
iface->get_column_type = mime_types_model_get_column_type;
|
|
|
|
|
iface->get_iter = mime_types_model_get_iter;
|
|
|
|
|
iface->get_path = mime_types_model_get_path;
|
|
|
|
|
iface->get_value = mime_types_model_get_value;
|
|
|
|
|
iface->iter_next = mime_types_model_iter_next;
|
|
|
|
|
iface->iter_children = mime_types_model_iter_children;
|
|
|
|
|
iface->iter_has_child = mime_types_model_iter_has_child;
|
|
|
|
|
iface->iter_n_children = mime_types_model_iter_n_children;
|
|
|
|
|
iface->iter_nth_child = mime_types_model_iter_nth_child;
|
|
|
|
|
iface->iter_parent = mime_types_model_iter_parent;
|
|
|
|
|
}
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
static void
|
|
|
|
|
mime_types_model_set_prop (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
|
|
|
|
|
{
|
|
|
|
|
MimeTypesModel *mime_types_model;
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
g_return_if_fail (object != NULL);
|
|
|
|
|
g_return_if_fail (IS_MIME_TYPES_MODEL (object));
|
|
|
|
|
|
|
|
|
|
mime_types_model = MIME_TYPES_MODEL (object);
|
|
|
|
|
|
|
|
|
|
switch (prop_id) {
|
|
|
|
|
case PROP_CATEGORY_ONLY:
|
|
|
|
|
mime_types_model->p->category_only = g_value_get_boolean (value);
|
|
|
|
|
break;
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
default:
|
|
|
|
|
g_warning ("Bad property set");
|
|
|
|
|
break;
|
|
|
|
|
}
|
2002-01-08 21:25:33 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
static void
|
|
|
|
|
mime_types_model_get_prop (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
|
2002-01-08 21:25:33 +00:00
|
|
|
|
{
|
2002-01-25 16:12:01 +00:00
|
|
|
|
MimeTypesModel *mime_types_model;
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
g_return_if_fail (object != NULL);
|
|
|
|
|
g_return_if_fail (IS_MIME_TYPES_MODEL (object));
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
mime_types_model = MIME_TYPES_MODEL (object);
|
|
|
|
|
|
|
|
|
|
switch (prop_id) {
|
|
|
|
|
case PROP_CATEGORY_ONLY:
|
|
|
|
|
g_value_set_boolean (value, mime_types_model->p->category_only);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
g_warning ("Bad property get");
|
|
|
|
|
break;
|
|
|
|
|
}
|
2002-01-08 21:25:33 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-01-14 16:35:16 +00:00
|
|
|
|
static void
|
2002-01-25 16:12:01 +00:00
|
|
|
|
mime_types_model_finalize (GObject *object)
|
2002-01-14 16:35:16 +00:00
|
|
|
|
{
|
2002-01-25 16:12:01 +00:00
|
|
|
|
MimeTypesModel *mime_types_model;
|
2002-01-14 16:35:16 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
g_return_if_fail (object != NULL);
|
|
|
|
|
g_return_if_fail (IS_MIME_TYPES_MODEL (object));
|
2002-01-14 16:35:16 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
mime_types_model = MIME_TYPES_MODEL (object);
|
2002-01-14 16:35:16 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
g_free (mime_types_model->p);
|
2002-01-14 16:35:16 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
G_OBJECT_CLASS (parent_class)->finalize (object);
|
|
|
|
|
}
|
2002-01-14 16:35:16 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
|
2002-01-14 16:35:16 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
GObject *
|
|
|
|
|
mime_types_model_new (gboolean category_only)
|
|
|
|
|
{
|
|
|
|
|
return g_object_new (mime_types_model_get_type (),
|
|
|
|
|
"category-only", category_only,
|
|
|
|
|
NULL);
|
2002-01-14 16:35:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
void
|
|
|
|
|
mime_types_model_construct_iter (MimeTypesModel *model, ModelEntry *entry, GtkTreeIter *iter)
|
2002-01-08 21:25:33 +00:00
|
|
|
|
{
|
2002-01-25 16:12:01 +00:00
|
|
|
|
g_return_if_fail (model != NULL);
|
|
|
|
|
g_return_if_fail (IS_MIME_TYPES_MODEL (model));
|
|
|
|
|
g_return_if_fail (iter != NULL);
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
iter->stamp = model->p->stamp;
|
|
|
|
|
iter->user_data = entry;
|
|
|
|
|
}
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
static guint
|
|
|
|
|
mime_types_model_get_flags (GtkTreeModel *tree_model)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (tree_model != NULL, 0);
|
|
|
|
|
g_return_val_if_fail (IS_MIME_TYPES_MODEL (tree_model), 0);
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
return GTK_TREE_MODEL_ITERS_PERSIST;
|
|
|
|
|
}
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
static gint
|
|
|
|
|
mime_types_model_get_n_columns (GtkTreeModel *tree_model)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (tree_model != NULL, 0);
|
|
|
|
|
g_return_val_if_fail (IS_MIME_TYPES_MODEL (tree_model), 0);
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
return MODEL_LAST_COLUMN;
|
|
|
|
|
}
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
static GType
|
|
|
|
|
mime_types_model_get_column_type (GtkTreeModel *tree_model, gint index)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (tree_model != NULL, G_TYPE_INVALID);
|
|
|
|
|
g_return_val_if_fail (IS_MIME_TYPES_MODEL (tree_model), G_TYPE_INVALID);
|
|
|
|
|
|
|
|
|
|
switch (index) {
|
|
|
|
|
case MODEL_COLUMN_MIME_TYPE:
|
|
|
|
|
case MODEL_COLUMN_DESCRIPTION:
|
|
|
|
|
case MODEL_COLUMN_FILE_EXT:
|
|
|
|
|
return G_TYPE_STRING;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case MODEL_COLUMN_ICON:
|
|
|
|
|
return GDK_TYPE_PIXBUF;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
return G_TYPE_INVALID;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
/* Adapted from gtk+/gtk/gtktreestore.c, gtk_tree_store_get_iter */
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
static gboolean
|
|
|
|
|
mime_types_model_get_iter (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreePath *path)
|
|
|
|
|
{
|
|
|
|
|
MimeTypesModel *model;
|
|
|
|
|
gint *indices, depth, i;
|
|
|
|
|
GtkTreeIter parent;
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
g_return_val_if_fail (tree_model != NULL, FALSE);
|
|
|
|
|
g_return_val_if_fail (IS_MIME_TYPES_MODEL (tree_model), FALSE);
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
model = MIME_TYPES_MODEL (tree_model);
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
indices = gtk_tree_path_get_indices (path);
|
|
|
|
|
depth = gtk_tree_path_get_depth (path);
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
g_return_val_if_fail (depth > 0, FALSE);
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
parent.stamp = model->p->stamp;
|
2002-01-27 16:18:36 +00:00
|
|
|
|
parent.user_data = get_model_entries (tree_model);
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
if (!gtk_tree_model_iter_nth_child (tree_model, iter, &parent, indices[0]))
|
|
|
|
|
return FALSE;
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
for (i = 1; i < depth; i++) {
|
|
|
|
|
parent = *iter;
|
|
|
|
|
if (!gtk_tree_model_iter_nth_child (tree_model, iter, &parent, indices[i]))
|
|
|
|
|
return FALSE;
|
2002-01-08 21:25:33 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
return TRUE;
|
2002-01-08 21:25:33 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
static GtkTreePath *
|
|
|
|
|
mime_types_model_get_path (GtkTreeModel *tree_model, GtkTreeIter *iter)
|
2002-01-11 15:32:10 +00:00
|
|
|
|
{
|
2002-01-25 16:12:01 +00:00
|
|
|
|
MimeTypesModel *model;
|
|
|
|
|
ModelEntry *entry;
|
|
|
|
|
GtkTreePath *path;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (tree_model != NULL, NULL);
|
|
|
|
|
g_return_val_if_fail (IS_MIME_TYPES_MODEL (tree_model), NULL);
|
|
|
|
|
|
|
|
|
|
model = MIME_TYPES_MODEL (tree_model);
|
|
|
|
|
|
|
|
|
|
path = gtk_tree_path_new ();
|
|
|
|
|
entry = iter->user_data;
|
|
|
|
|
|
|
|
|
|
while (entry->parent != NULL) {
|
|
|
|
|
gtk_tree_path_prepend_index (path, model_entry_get_index (entry->parent, entry));
|
|
|
|
|
entry = entry->parent;
|
|
|
|
|
}
|
2002-01-11 15:32:10 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
return path;
|
|
|
|
|
}
|
2002-01-11 15:32:10 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
static void
|
|
|
|
|
mime_types_model_get_value (GtkTreeModel *tree_model, GtkTreeIter *iter, gint column, GValue *value)
|
|
|
|
|
{
|
|
|
|
|
MimeTypesModel *model;
|
|
|
|
|
ModelEntry *entry;
|
2002-01-11 15:32:10 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
g_return_if_fail (tree_model != NULL);
|
|
|
|
|
g_return_if_fail (IS_MIME_TYPES_MODEL (tree_model));
|
2002-01-11 15:32:10 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
model = MIME_TYPES_MODEL (tree_model);
|
|
|
|
|
entry = iter->user_data;
|
2002-01-11 15:32:10 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
switch (column) {
|
|
|
|
|
case MODEL_COLUMN_MIME_TYPE:
|
|
|
|
|
g_value_init (value, G_TYPE_STRING);
|
2002-01-11 15:32:10 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
switch (entry->type) {
|
|
|
|
|
case MODEL_ENTRY_MIME_TYPE:
|
|
|
|
|
g_value_set_static_string (value, MIME_TYPE_INFO (entry)->mime_type);
|
|
|
|
|
break;
|
2002-01-11 15:32:10 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
case MODEL_ENTRY_SERVICE:
|
|
|
|
|
g_value_set_static_string (value, SERVICE_INFO (entry)->protocol);
|
|
|
|
|
break;
|
2002-01-11 15:32:10 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
default:
|
|
|
|
|
g_value_set_string (value, NULL);
|
|
|
|
|
break;
|
2002-01-11 15:32:10 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
break;
|
2002-01-11 15:32:10 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
case MODEL_COLUMN_DESCRIPTION:
|
|
|
|
|
g_value_init (value, G_TYPE_STRING);
|
2002-01-11 15:32:10 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
switch (entry->type) {
|
|
|
|
|
case MODEL_ENTRY_MIME_TYPE:
|
|
|
|
|
g_value_set_static_string (value, mime_type_info_get_description (MIME_TYPE_INFO (entry)));
|
|
|
|
|
break;
|
2002-01-11 15:32:10 +00:00
|
|
|
|
|
2002-01-26 16:24:45 +00:00
|
|
|
|
case MODEL_ENTRY_CATEGORY:
|
2002-01-27 20:07:30 +00:00
|
|
|
|
g_value_set_static_string (value, _(MIME_CATEGORY_INFO (entry)->name));
|
2002-01-26 16:24:45 +00:00
|
|
|
|
break;
|
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
case MODEL_ENTRY_SERVICE:
|
|
|
|
|
g_value_set_static_string (value, service_info_get_description (SERVICE_INFO (entry)));
|
|
|
|
|
break;
|
2002-01-11 15:32:10 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
case MODEL_ENTRY_SERVICES_CATEGORY:
|
|
|
|
|
g_value_set_static_string (value, _("Internet Services"));
|
|
|
|
|
break;
|
2002-01-11 15:32:10 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
default:
|
|
|
|
|
g_value_set_string (value, NULL);
|
|
|
|
|
break;
|
|
|
|
|
}
|
2002-01-11 15:32:10 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
break;
|
2002-01-11 15:32:10 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
case MODEL_COLUMN_ICON:
|
|
|
|
|
g_value_init (value, GDK_TYPE_PIXBUF);
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
switch (entry->type) {
|
|
|
|
|
case MODEL_ENTRY_MIME_TYPE:
|
|
|
|
|
g_value_set_object (value, G_OBJECT (mime_type_info_get_icon (MIME_TYPE_INFO (entry))));
|
|
|
|
|
break;
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
default:
|
|
|
|
|
g_value_set_object (value, NULL);
|
|
|
|
|
break;
|
|
|
|
|
}
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
break;
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
case MODEL_COLUMN_FILE_EXT:
|
|
|
|
|
g_value_init (value, G_TYPE_STRING);
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
switch (entry->type) {
|
|
|
|
|
case MODEL_ENTRY_MIME_TYPE:
|
|
|
|
|
g_value_set_string (value, mime_type_info_get_file_extensions_pretty_string (MIME_TYPE_INFO (entry)));
|
|
|
|
|
break;
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
case MODEL_ENTRY_SERVICE:
|
|
|
|
|
g_value_set_static_string (value, SERVICE_INFO (entry)->protocol);
|
|
|
|
|
break;
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
default:
|
|
|
|
|
g_value_set_string (value, NULL);
|
|
|
|
|
break;
|
|
|
|
|
}
|
2002-01-08 21:25:33 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
break;
|
|
|
|
|
}
|
2002-01-08 21:25:33 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
static gboolean
|
|
|
|
|
mime_types_model_iter_next (GtkTreeModel *tree_model, GtkTreeIter *iter)
|
2002-01-14 15:28:36 +00:00
|
|
|
|
{
|
2002-01-25 16:12:01 +00:00
|
|
|
|
MimeTypesModel *model;
|
|
|
|
|
ModelEntry *entry;
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
g_return_val_if_fail (tree_model != NULL, FALSE);
|
|
|
|
|
g_return_val_if_fail (IS_MIME_TYPES_MODEL (tree_model), FALSE);
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
model = MIME_TYPES_MODEL (tree_model);
|
|
|
|
|
entry = iter->user_data;
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
if (entry != NULL)
|
|
|
|
|
iter->user_data = entry->next;
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
if (model->p->category_only)
|
|
|
|
|
while (iter->user_data != NULL && !IS_CATEGORY (MODEL_ENTRY (iter->user_data)))
|
|
|
|
|
iter->user_data = MODEL_ENTRY (iter->user_data)->next;
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
return iter->user_data != NULL;
|
2002-01-14 15:28:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
static gboolean
|
|
|
|
|
mime_types_model_iter_children (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent)
|
2002-01-14 15:28:36 +00:00
|
|
|
|
{
|
2002-01-25 16:12:01 +00:00
|
|
|
|
MimeTypesModel *model;
|
|
|
|
|
ModelEntry *entry;
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
g_return_val_if_fail (tree_model != NULL, FALSE);
|
|
|
|
|
g_return_val_if_fail (IS_MIME_TYPES_MODEL (tree_model), FALSE);
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
model = MIME_TYPES_MODEL (tree_model);
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
if (parent != NULL)
|
|
|
|
|
entry = parent->user_data;
|
|
|
|
|
else
|
|
|
|
|
entry = NULL;
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
if (entry == NULL)
|
2002-01-27 16:18:36 +00:00
|
|
|
|
iter->user_data = get_model_entries (tree_model);
|
2002-01-14 15:28:36 +00:00
|
|
|
|
else
|
2002-01-25 16:12:01 +00:00
|
|
|
|
iter->user_data = entry->first_child;
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
if (model->p->category_only)
|
|
|
|
|
while (iter->user_data != NULL && !IS_CATEGORY (MODEL_ENTRY (iter->user_data)))
|
|
|
|
|
iter->user_data = MODEL_ENTRY (iter->user_data)->next;
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
return iter->user_data != NULL;
|
2002-01-14 15:28:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
static gboolean
|
|
|
|
|
mime_types_model_iter_has_child (GtkTreeModel *tree_model, GtkTreeIter *iter)
|
2002-01-14 15:28:36 +00:00
|
|
|
|
{
|
2002-01-25 16:12:01 +00:00
|
|
|
|
MimeTypesModel *model;
|
|
|
|
|
ModelEntry *entry;
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
g_return_val_if_fail (tree_model != NULL, FALSE);
|
|
|
|
|
g_return_val_if_fail (IS_MIME_TYPES_MODEL (tree_model), FALSE);
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
model = MIME_TYPES_MODEL (tree_model);
|
|
|
|
|
entry = iter->user_data;
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
if (entry == NULL)
|
2002-01-27 16:18:36 +00:00
|
|
|
|
return get_model_entries (tree_model)->first_child != NULL;
|
2002-01-25 16:12:01 +00:00
|
|
|
|
else if (!model->p->category_only || IS_CATEGORY (entry->first_child))
|
|
|
|
|
return entry->first_child != NULL;
|
|
|
|
|
else {
|
|
|
|
|
for (entry = entry->first_child; entry != NULL; entry = entry->next)
|
|
|
|
|
if (IS_CATEGORY (entry))
|
|
|
|
|
return TRUE;
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
2002-01-14 15:28:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
static gint
|
|
|
|
|
mime_types_model_iter_n_children (GtkTreeModel *tree_model, GtkTreeIter *iter)
|
2002-01-14 15:28:36 +00:00
|
|
|
|
{
|
2002-01-25 16:12:01 +00:00
|
|
|
|
MimeTypesModel *model;
|
|
|
|
|
ModelEntry *entry, *tmp;
|
|
|
|
|
gint count = 0;
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
g_return_val_if_fail (tree_model != NULL, 0);
|
|
|
|
|
g_return_val_if_fail (IS_MIME_TYPES_MODEL (tree_model), 0);
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
model = MIME_TYPES_MODEL (tree_model);
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
if (iter != NULL)
|
|
|
|
|
entry = iter->user_data;
|
|
|
|
|
else
|
|
|
|
|
entry = NULL;
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
if (entry == NULL)
|
2002-01-27 16:18:36 +00:00
|
|
|
|
entry = get_model_entries (tree_model);
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
if (model->p->category_only) {
|
|
|
|
|
for (tmp = entry->first_child; tmp != NULL; tmp = tmp->next) {
|
|
|
|
|
if (tmp->type == MODEL_ENTRY_CATEGORY)
|
|
|
|
|
count++;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
for (tmp = entry->first_child; tmp != NULL; tmp = tmp->next)
|
|
|
|
|
count++;
|
2002-01-14 15:28:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
return count;
|
2002-01-14 15:28:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
static gboolean
|
|
|
|
|
mime_types_model_iter_nth_child (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent, gint n)
|
2002-01-14 15:28:36 +00:00
|
|
|
|
{
|
2002-01-25 16:12:01 +00:00
|
|
|
|
MimeTypesModel *model;
|
|
|
|
|
ModelEntry *entry;
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
g_return_val_if_fail (tree_model != NULL, FALSE);
|
|
|
|
|
g_return_val_if_fail (IS_MIME_TYPES_MODEL (tree_model), FALSE);
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
model = MIME_TYPES_MODEL (tree_model);
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
if (parent != NULL)
|
|
|
|
|
entry = parent->user_data;
|
|
|
|
|
else
|
|
|
|
|
entry = NULL;
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
if (entry == NULL)
|
2002-01-27 16:18:36 +00:00
|
|
|
|
iter->user_data = model_entry_get_nth_child (get_model_entries (tree_model), n, model->p->category_only);
|
2002-01-25 16:12:01 +00:00
|
|
|
|
else
|
|
|
|
|
iter->user_data = model_entry_get_nth_child (entry, n, model->p->category_only);
|
|
|
|
|
|
|
|
|
|
return iter->user_data != NULL;
|
2002-01-14 15:28:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
static gboolean
|
|
|
|
|
mime_types_model_iter_parent (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *child)
|
2002-01-14 15:28:36 +00:00
|
|
|
|
{
|
2002-01-25 16:12:01 +00:00
|
|
|
|
MimeTypesModel *model;
|
|
|
|
|
ModelEntry *entry;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (tree_model != NULL, FALSE);
|
|
|
|
|
g_return_val_if_fail (IS_MIME_TYPES_MODEL (tree_model), FALSE);
|
|
|
|
|
|
|
|
|
|
model = MIME_TYPES_MODEL (tree_model);
|
|
|
|
|
entry = iter->user_data;
|
|
|
|
|
|
2002-01-27 16:18:36 +00:00
|
|
|
|
if (entry != NULL && entry->parent->type != MODEL_ENTRY_NONE)
|
2002-01-25 16:12:01 +00:00
|
|
|
|
iter->user_data = entry->parent;
|
2002-01-27 16:18:36 +00:00
|
|
|
|
else
|
|
|
|
|
iter->user_data = NULL;
|
2002-01-14 15:28:36 +00:00
|
|
|
|
|
2002-01-25 16:12:01 +00:00
|
|
|
|
return iter->user_data != NULL;
|
2002-01-14 15:28:36 +00:00
|
|
|
|
}
|
|
|
|
|
|