aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/menus/gal-view-collection.c
diff options
context:
space:
mode:
authorChristopher James Lahey <clahey@helixcode.com>2001-01-21 14:00:04 +0800
committerChris Lahey <clahey@src.gnome.org>2001-01-21 14:00:04 +0800
commit9348acc44109d5fc54a70393131c1c5f30d181df (patch)
tree76d069c1c7082cd512b01ba38e61a3600ed2fae1 /widgets/menus/gal-view-collection.c
parentac6ce9637e4abaa35ede7aecf4ca1126dc57809c (diff)
downloadgsoc2013-evolution-9348acc44109d5fc54a70393131c1c5f30d181df.tar.gz
gsoc2013-evolution-9348acc44109d5fc54a70393131c1c5f30d181df.tar.zst
gsoc2013-evolution-9348acc44109d5fc54a70393131c1c5f30d181df.zip
Use the new gal_view_set_title function.
2001-01-21 Christopher James Lahey <clahey@helixcode.com> * gal-define-views-model.c (gdvm_set_value_at): Use the new gal_view_set_title function. * gal-view-collection.c, gal-view-collection.h: Implemented this. Added gal_view_collection_save and gal_view_collection_load. * gal-view-etable.c: Implemented save, load, and set_title methods for this class. * gal-view-factory.c: Implemented gal_view_factory_get_type_code. * gal-view.c, gal-view.h: Replaced gal_view_save_to_node with gal_view_save. Replaced gal_view_load_from_node with gal_view_load. Added gal_view_set_title. svn path=/trunk/; revision=7676
Diffstat (limited to 'widgets/menus/gal-view-collection.c')
-rw-r--r--widgets/menus/gal-view-collection.c206
1 files changed, 201 insertions, 5 deletions
diff --git a/widgets/menus/gal-view-collection.c b/widgets/menus/gal-view-collection.c
index 30652f064f..1ac4215f93 100644
--- a/widgets/menus/gal-view-collection.c
+++ b/widgets/menus/gal-view-collection.c
@@ -10,12 +10,25 @@
#include <config.h>
#include <gtk/gtksignal.h>
#include <gal/util/e-util.h>
+#include <gal/util/e-xml-utils.h>
+#include <gnome-xml/parser.h>
#include "gal-view-collection.h"
#define GVC_CLASS(e) ((GalViewCollectionClass *)((GtkObject *)e)->klass)
#define PARENT_TYPE gtk_object_get_type ()
+struct _GalViewCollectionItem {
+ GalView *view;
+ char *id;
+ gboolean changed;
+ gboolean ever_changed;
+ gboolean built_in;
+ char *filename;
+ char *title;
+ char *type;
+};
+
static GtkObjectClass *gal_view_collection_parent_class;
enum {
@@ -44,13 +57,34 @@ gal_view_collection_display_view (GalViewCollection *collection,
}
static void
+gal_view_collection_item_free (GalViewCollectionItem *item)
+{
+ g_free(item->id);
+ if (item->view)
+ gtk_object_unref(GTK_OBJECT(item->view));
+ g_free(item);
+}
+
+static void
gal_view_collection_destroy (GtkObject *object)
{
GalViewCollection *collection = GAL_VIEW_COLLECTION(object);
+ int i;
- e_free_object_list(collection->view_list);
+ for (i = 0; i < collection->view_count; i++) {
+ gal_view_collection_item_free (collection->view_data[i]);
+ }
+ g_free(collection->view_data);
e_free_object_list(collection->factory_list);
+ for (i = 0; i < collection->removed_view_count; i++) {
+ gal_view_collection_item_free (collection->removed_view_data[i]);
+ }
+ g_free(collection->removed_view_data);
+
+ g_free(collection->system_dir);
+ g_free(collection->local_dir);
+
if (gal_view_collection_parent_class->destroy)
(*gal_view_collection_parent_class->destroy)(object);
}
@@ -79,8 +113,15 @@ gal_view_collection_class_init (GtkObjectClass *object_class)
static void
gal_view_collection_init (GalViewCollection *collection)
{
- collection->view_list = NULL;
- collection->factory_list = NULL;
+ collection->view_data = NULL;
+ collection->view_count = 0;
+ collection->factory_list = NULL;
+
+ collection->removed_view_data = NULL;
+ collection->removed_view_count = 0;
+
+ collection->system_dir = NULL;
+ collection->local_dir = NULL;
}
/**
@@ -133,9 +174,14 @@ gal_view_collection_new (void)
*/
void
gal_view_collection_set_storage_directories (GalViewCollection *collection,
- char *system_dir,
- char *local_dir)
+ const char *system_dir,
+ const char *local_dir)
{
+ g_free(collection->system_dir);
+ g_free(collection->local_dir);
+
+ collection->system_dir = g_strdup(system_dir);
+ collection->local_dir = g_strdup(local_dir);
}
/**
@@ -154,3 +200,153 @@ gal_view_collection_add_factory (GalViewCollection *collection,
gtk_object_ref(GTK_OBJECT(factory));
collection->factory_list = g_list_prepend(collection->factory_list, factory);
}
+
+static GalViewCollectionItem *
+load_single_file (GalViewCollection *collection,
+ gchar *dir,
+ gboolean local,
+ xmlNode *node)
+{
+ GalViewCollectionItem *item;
+ item = g_new(GalViewCollectionItem, 1);
+ item->ever_changed = local;
+ item->changed = FALSE;
+ item->built_in = !local;
+ item->id = e_xml_get_string_prop_by_name(node, "id");
+ item->title = e_xml_get_string_prop_by_name(node, "title");
+ item->filename = e_xml_get_string_prop_by_name(node, "filename");
+ item->type = e_xml_get_string_prop_by_name(node, "type");
+ if (item->filename) {
+ GalViewFactory *factory;
+ char *temp;
+ GList *factories;
+
+ temp = g_concat_dir_and_file(dir, item->filename);
+ g_free(item->filename);
+ item->filename = temp;
+
+ factory = NULL;
+ for (factories = collection->factory_list; factories; factories = factories->next) {
+ if (!strcmp(gal_view_factory_get_type_code(factories->data), item->type)) {
+ factory = factories->data;
+ break;
+ }
+ }
+ if (factory) {
+ item->view = gal_view_factory_new_view (factory, item->filename);
+ gal_view_load(item->view, item->filename);
+ }
+ }
+ return item;
+}
+
+static void
+load_single_dir (GalViewCollection *collection,
+ char *dir,
+ gboolean local)
+{
+ xmlDoc *doc;
+ xmlNode *root;
+ xmlNode *child;
+ char *filename = g_concat_dir_and_file(dir, "galview.xml");
+
+ doc = xmlParseFile(filename);
+ root = xmlDocGetRootElement(doc);
+ for (child = root->xmlChildrenNode; child; child = child->next) {
+ gchar *id = e_xml_get_string_prop_by_name(child, "id");
+ gboolean found = FALSE;
+ int i;
+
+ for (i = 0; i < collection->view_count; i++) {
+ if (!strcmp(id, collection->view_data[i]->id))
+ if (!local)
+ collection->view_data[i]->built_in = TRUE;
+ found = TRUE;
+ break;
+ }
+ if (!found) {
+ for (i = 0; i < collection->removed_view_count; i++) {
+ if (!strcmp(id, collection->removed_view_data[i]->id))
+ if (!local)
+ collection->removed_view_data[i]->built_in = TRUE;
+ found = TRUE;
+ break;
+ }
+ }
+
+ if (!found) {
+ GalViewCollectionItem *item = load_single_file (collection, dir, local, child);
+ if (item->filename) {
+ collection->view_data = g_renew(GalViewCollectionItem *, collection->view_data, collection->view_count + 1);
+ collection->view_data[collection->view_count] = item;
+ collection->view_count ++;
+ } else {
+ collection->removed_view_data = g_renew(GalViewCollectionItem *, collection->removed_view_data, collection->removed_view_count + 1);
+ collection->removed_view_data[collection->removed_view_count] = item;
+ collection->removed_view_count ++;
+ }
+ }
+ g_free(id);
+ }
+
+ g_free(filename);
+}
+
+/**
+ * gal_view_collection_load
+ * @collection: The view collection to load information for
+ *
+ * Loads the data from the system and user directories specified in
+ * set storage directories. This is primarily for internal use by
+ * other parts of gal_view.
+ */
+void
+gal_view_collection_load (GalViewCollection *collection)
+{
+ load_single_dir(collection, collection->local_dir, TRUE);
+ load_single_dir(collection, collection->system_dir, FALSE);
+}
+
+/**
+ * gal_view_collection_save
+ * @collection: The view collection to save information for
+ *
+ * Saves the data to the user directory specified in set storage
+ * directories. This is primarily for internal use by other parts of
+ * gal_view.
+ */
+void
+gal_view_collection_save (GalViewCollection *collection)
+{
+ int i;
+ xmlDoc *doc;
+ xmlNode *root;
+ char *filename;
+
+ doc = xmlNewDoc("1.0");
+ root = xmlNewNode(NULL, "GalViewCollection");
+ xmlDocSetRootElement(doc, root);
+ for (i = 0; i < collection->view_count; i++) {
+ xmlNode *child;
+ GalViewCollectionItem *item;
+
+ item = collection->view_data[i];
+ if (item->ever_changed) {
+ child = xmlNewChild(root, NULL, "GalView", NULL);
+ e_xml_set_string_prop_by_name(child, "id", item->id);
+ e_xml_set_string_prop_by_name(child, "title", item->title);
+ e_xml_set_string_prop_by_name(child, "filename", item->filename);
+ e_xml_set_string_prop_by_name(child, "type", item->type);
+
+ if (item->changed) {
+ filename = g_concat_dir_and_file(collection->local_dir, item->filename);
+ gal_view_save(item->view, filename);
+ g_free(filename);
+ }
+ }
+ }
+ filename = g_concat_dir_and_file(collection->local_dir, "galview.xml");
+ xmlSaveFile(filename, doc);
+ xmlFreeDoc(doc);
+ g_free(filename);
+}