/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* e-categories-master-list.c: the master list of categories.
*
* Authors:
* Chris Lahey <clahey@ximian.com>
*
* (C) 1999, 2000 Ximian, Inc.
*/
#include <config.h>
#include "e-categories-master-list-wombat.h"
#include "e-categories-config.h"
#include "e-config-listener.h"
#include <libxml/tree.h>
#include <libxml/parser.h>
#define PARENT_TYPE e_categories_master_list_array_get_type ()
#define d(x)
struct _ECategoriesMasterListWombatPriv {
EConfigListener *listener;
guint listener_id;
};
static ECategoriesMasterListArrayClass *parent_class;
static void
ecmlw_load (ECategoriesMasterListWombat *ecmlw)
{
char *string;
gboolean def;
string = e_config_listener_get_string_with_default (ecmlw->priv->listener,
"/apps/evolution/general/category_master_list",
NULL,
&def);
/* parse the XML string */
if (!def) {
e_categories_master_list_array_from_string (E_CATEGORIES_MASTER_LIST_ARRAY (ecmlw),
string);
}
d(g_print ("load: %s\n", string?string:"(nil)"));
g_free (string);
}
static void
ecmlw_save (ECategoriesMasterListWombat *ecmlw)
{
char *string;
string = e_categories_master_list_array_to_string (E_CATEGORIES_MASTER_LIST_ARRAY (ecmlw));
d(g_print ("save: %s\n", string));
e_config_listener_set_string (ecmlw->priv->listener,
"/apps/evolution/general/category_master_list",
string);
g_free (string);
}
/**
* ecmlw_commit:
* @ecml: the master list to remove from.
*/
static void
ecmlw_commit (ECategoriesMasterList *ecml)
{
ECategoriesMasterListWombat *ecmlw = E_CATEGORIES_MASTER_LIST_WOMBAT (ecml);
((ECategoriesMasterListClass *) parent_class)->commit (ecml);
ecmlw_save (ecmlw);
}
/**
* ecmlw_reset:
* @ecml: the master list to reset.
*/
static void
ecmlw_reset (ECategoriesMasterList *ecml)
{
ECategoriesMasterListWombat *ecmlw = E_CATEGORIES_MASTER_LIST_WOMBAT (ecml);
((ECategoriesMasterListClass *) parent_class)->reset (ecml);
ecmlw_save (ecmlw);
}
static void
ecmlw_dispose (GObject *object)
{
ECategoriesMasterListWombat *ecmlw = E_CATEGORIES_MASTER_LIST_WOMBAT (object);
if (ecmlw->priv) {
/* remove the listener */
g_signal_handler_disconnect (ecmlw->priv->listener,
ecmlw->priv->listener_id);
g_object_unref (ecmlw->priv->listener);
g_free (ecmlw->priv);
ecmlw->priv = NULL;
}
if (G_OBJECT_CLASS (parent_class)->dispose)
(* G_OBJECT_CLASS (parent_class)->dispose) (object);
}
static void
ecmlw_class_init (GObjectClass *object_class)
{
ECategoriesMasterListClass *ecml_class = E_CATEGORIES_MASTER_LIST_CLASS(object_class);
parent_class = g_type_class_ref (PARENT_TYPE);
ecml_class->commit = ecmlw_commit;
ecml_class->reset = ecmlw_reset ;
object_class->dispose = ecmlw_dispose;
}
static void
property_change_cb (EConfigListener *listener,
char *key,
gpointer user_data)
{
ecmlw_load (user_data);
}
static void
ecmlw_init (ECategoriesMasterListWombat *ecmlw)
{
ecmlw->priv = g_new (ECategoriesMasterListWombatPriv, 1);
ecmlw->priv->listener = e_config_listener_new ();
/* add a listener */
ecmlw->priv->listener_id =
g_signal_connect (ecmlw->priv->listener,
"key_changed",
G_CALLBACK (property_change_cb),
ecmlw);
ecmlw_load (ecmlw);
}
GType
e_categories_master_list_wombat_get_type (void)
{
static GType type = 0;
if (!type) {
static const GTypeInfo info = {
sizeof (ECategoriesMasterListWombatClass),
NULL, /* base_init */
NULL, /* base_finalize */
(GClassInitFunc) ecmlw_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (ECategoriesMasterListWombat),
0, /* n_preallocs */
(GInstanceInitFunc) ecmlw_init,
};
type = g_type_register_static (PARENT_TYPE, "ECategoriesMasterListWombat", &info, 0);
}
return type;
}
ECategoriesMasterList *
e_categories_master_list_wombat_new (void)
{
return E_CATEGORIES_MASTER_LIST (g_object_new (E_TYPE_CATEGORIES_MASTER_LIST_WOMBAT, NULL));
}