[Goodies-commits] r5486 - xfbib/branches/gobject/src

David Gustafsson tssj at xfce.org
Mon Sep 29 00:50:52 CEST 2008


Author: tssj
Date: 2008-09-28 22:50:52 +0000 (Sun, 28 Sep 2008)
New Revision: 5486

Modified:
   xfbib/branches/gobject/src/main.c
   xfbib/branches/gobject/src/xfbib-elements.c
   xfbib/branches/gobject/src/xfbib-elements.h
   xfbib/branches/gobject/src/xfbib-file-io.c
   xfbib/branches/gobject/src/xfbib-file-io.h
   xfbib/branches/gobject/src/xfbib-list-store.c
   xfbib/branches/gobject/src/xfbib-list-store.h
   xfbib/branches/gobject/src/xfbib-menu-bar.c
   xfbib/branches/gobject/src/xfbib-state.c
   xfbib/branches/gobject/src/xfbib-toolbar.c
   xfbib/branches/gobject/src/xfbib-tree-view.c
   xfbib/branches/gobject/src/xfbib-window.c
   xfbib/branches/gobject/src/xfbib-window.h
Log:
Changed the list store to only show bibtex entries + some changes to file-io when opening files.


Modified: xfbib/branches/gobject/src/main.c
===================================================================
--- xfbib/branches/gobject/src/main.c	2008-09-28 03:55:35 UTC (rev 5485)
+++ xfbib/branches/gobject/src/main.c	2008-09-28 22:50:52 UTC (rev 5486)
@@ -44,14 +44,18 @@
 	GtkWidget *window;
 	GError *error = NULL;
 	gtk_init(&argc, &argv);
-	
+
+	/**/
+//	g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL);
+	/**/
+
 	state = xfbib_state_new();
 	
 	elements = xfbib_elements_new();
 	xfbib_state_set_bibtex_elements(state, elements);
 
 	window = xfbib_window_new();
-  	gtk_window_set_title(GTK_WINDOW(window), PACKAGE_NAME);
+  	xfbib_window_set_title(XFBIB_WINDOW(window), NULL);
 	
         g_signal_connect (G_OBJECT(window), "destroy",
 			G_CALLBACK(cb_window_destroy_event), NULL);

Modified: xfbib/branches/gobject/src/xfbib-elements.c
===================================================================
--- xfbib/branches/gobject/src/xfbib-elements.c	2008-09-28 03:55:35 UTC (rev 5485)
+++ xfbib/branches/gobject/src/xfbib-elements.c	2008-09-28 22:50:52 UTC (rev 5486)
@@ -19,6 +19,7 @@
 {
 	GObject parent;
 	GList *list;
+	gint n_entries;
 };
 
 typedef struct _XfbibElementsClass
@@ -44,6 +45,7 @@
 xfbib_elements_init(XfbibElements *instance)
 {
 	instance->list = NULL;
+	instance->n_entries = 0;
 }
 
 static void
@@ -103,6 +105,7 @@
 		}
 		xfbib_strbuf_append_char(buf, str[(*i)]);
 	}
+	return TRUE;
 }
 
 
@@ -160,8 +163,10 @@
 				/* Entry */
 				if (parse_balanced_brackets(buf, str, &i)) {
 					obj = G_OBJECT(xfbib_entry_new());
-					if (xfbib_entry_parse(XFBIB_ENTRY(obj), xfbib_strbuf_get_str(buf)))
+					if (xfbib_entry_parse(XFBIB_ENTRY(obj), xfbib_strbuf_get_str(buf))) {
+						elements->n_entries++;
 						elements->list = g_list_append(elements->list, obj);
+					}
 				}
 				xfbib_strbuf_wipe(buf);
 			} else {
@@ -180,7 +185,7 @@
 
 
 GList *
-xfbib_elements_get(XfbibElements *elements)
+xfbib_elements_get_list(XfbibElements *elements)
 {
 	g_return_val_if_fail(XFBIB_IS_ELEMENTS(elements), NULL);
 	return elements->list;
@@ -192,3 +197,100 @@
 	g_return_val_if_fail(XFBIB_IS_ELEMENTS(elements), 0);
 	return g_list_length(elements->list);
 }
+
+
+gint
+xfbib_elements_get_n_entries(XfbibElements *elements)
+{
+	g_return_val_if_fail(XFBIB_IS_ELEMENTS(elements), 0);
+	return elements->n_entries;
+}
+
+
+XfbibEntry *
+xfbib_elements_get_nth_entry(XfbibElements *elements, gint n)
+{
+	GObject *obj;
+	gint i, len, found;
+	g_return_val_if_fail(XFBIB_IS_ELEMENTS(elements)
+			&& n < elements->n_entries, NULL);
+	
+	len = g_list_length(elements->list);
+	for (i = 0, found = -1; i < len; i++) {
+		obj = g_list_nth_data(elements->list, i);
+		if (XFBIB_IS_ENTRY(obj)) {
+			if (++found == n)
+				return XFBIB_ENTRY(obj);
+		}
+	}
+	return NULL;
+}
+
+
+gint
+xfbib_elements_get_entry_position(XfbibElements *elements, XfbibEntry *entry)
+{
+	GObject *obj;
+	gint i, len, n;
+	g_return_val_if_fail(XFBIB_IS_ELEMENTS(elements), -1);
+
+	len = g_list_length(elements->list);
+	for (i = 0, n = -1; i < len; i++) {
+		obj = g_list_nth_data(elements->list, i);
+		if (XFBIB_IS_ENTRY(obj)) {
+			n++;
+			if (XFBIB_ENTRY(obj) == entry)
+				return n;
+		}
+	}
+	return -1;
+}
+
+XfbibEntry *
+xfbib_elements_get_next_entry(XfbibElements *elements, XfbibEntry *entry)
+{
+	GObject *obj;
+	gint i, len;
+	g_return_val_if_fail(XFBIB_IS_ELEMENTS(elements), NULL);
+
+	len = g_list_length(elements->list);
+	for (i = 0; i < len; i++) {
+		obj = g_list_nth_data(elements->list, i);
+		if (obj == G_OBJECT(entry)) {
+			for (i++; i < len; i++) {
+				obj = g_list_nth_data(elements->list, i);
+				if (XFBIB_IS_ENTRY(obj))
+					return XFBIB_ENTRY(obj);
+			}
+		}
+	}
+	return NULL;
+}
+
+
+void
+xfbib_elements_remove(XfbibElements *elements, GObject *data)
+{
+	GObject *obj;
+	gint i, len;
+	g_return_if_fail(XFBIB_IS_ELEMENTS(elements));
+	
+	len = g_list_length(elements->list);
+	for (i = 0; i < len; i++) {
+		if ((obj = g_list_nth_data(elements->list, i)) == data) {
+			elements->list = g_list_remove(elements->list, obj);
+			if(XFBIB_IS_ENTRY(obj)) 
+				elements->n_entries--;
+			g_object_unref(obj);
+		}
+	}	
+}
+
+void
+xfbib_elements_remove_all(XfbibElements *elements)
+{
+	g_return_if_fail(XFBIB_IS_ELEMENTS(elements));
+	g_list_foreach (elements->list, (GFunc) g_object_unref, NULL);
+	g_list_free (elements->list);
+	elements->n_entries = 0;
+}

Modified: xfbib/branches/gobject/src/xfbib-elements.h
===================================================================
--- xfbib/branches/gobject/src/xfbib-elements.h	2008-09-28 03:55:35 UTC (rev 5485)
+++ xfbib/branches/gobject/src/xfbib-elements.h	2008-09-28 22:50:52 UTC (rev 5486)
@@ -2,6 +2,7 @@
 #define __XFBIB_ELEMENTS_H
 
 #include <glib-object.h>
+#include <xfbib-entry.h>
 
 #define XFBIB_TYPE_ELEMENTS             (xfbib_elements_get_type())
 #define XFBIB_ELEMENTS(obj)             (G_TYPE_CHECK_INSTANCE_CAST((obj), XFBIB_TYPE_ELEMENTS, XfbibElements))
@@ -18,8 +19,15 @@
 
 XfbibElements *xfbib_elements_new();
 gboolean xfbib_elements_parse(XfbibElements *, const gchar *);
-GList *xfbib_elements_get(XfbibElements *);
+GList *xfbib_elements_get_list(XfbibElements *);
 gint xfbib_elements_get_size(XfbibElements *);
+gint xfbib_elements_get_n_entries(XfbibElements *);
+XfbibEntry *xfbib_elements_get_nth_entry(XfbibElements *, gint);
+gint xfbib_elements_get_entry_position(XfbibElements *, XfbibEntry *);
+XfbibEntry *xfbib_elements_get_next_entry(XfbibElements *, XfbibEntry *);
+void xfbib_elements_remove(XfbibElements *, GObject *);
+void xfbib_elements_remove_all(XfbibElements *);
+
 G_END_DECLS
 
 #endif //__XFBIB_ELEMENTS_H

Modified: xfbib/branches/gobject/src/xfbib-file-io.c
===================================================================
--- xfbib/branches/gobject/src/xfbib-file-io.c	2008-09-28 03:55:35 UTC (rev 5485)
+++ xfbib/branches/gobject/src/xfbib-file-io.c	2008-09-28 22:50:52 UTC (rev 5486)
@@ -30,53 +30,8 @@
 #include "xfbib-window.h"
 #include "xfbib-list-store.h"
 
-struct _XfbibFileIo
-{
-	GObject parent;
-	XfbibStrbuf *filename;
-};
- 
-typedef struct _XfbibFileIoClass
-{
-	GObjectClass parent;
-} XfbibFileIoClass;
- 
-static void xfbib_file_io_class_init(XfbibFileIoClass *klass);
-
-static void xfbib_file_io_init(XfbibFileIo *instance);
-static void xfbib_file_io_finalize(GObject *obj);
-
-G_DEFINE_TYPE(XfbibFileIo, xfbib_file_io, G_TYPE_OBJECT)
-
-static void
-xfbib_file_io_class_init(XfbibFileIoClass *klass)
-{
-	GObjectClass *object_class = (GObjectClass *)klass;
-	object_class->finalize = xfbib_file_io_finalize;
-}
- 
-static void
-xfbib_file_io_init(XfbibFileIo *instance)
-{
-	instance->filename = xfbib_strbuf_new();
-}
- 
-static void
-xfbib_file_io_finalize(GObject *obj)
-{
-	G_OBJECT_CLASS(xfbib_file_io_parent_class)->finalize(obj);
-}
- 
-XfbibFileIo *
-xfbib_file_io_new()
-{
-	XfbibFileIo *file_io;
-	file_io = g_object_new(XFBIB_TYPE_FILE_IO, NULL);
-	return file_io;
-}
-
 gboolean
-xfbib_file_io_open(XfbibFileIo *file_io, XfbibWindow *window)
+xfbib_file_io_open(void)
 {
 	XfbibState *state;
 	XfbibElements *elements;
@@ -85,14 +40,14 @@
 	gsize length;
 	gint i;
 	GError *err = NULL;
-	GtkTreeIter iter;
-	GtkTreePath *path;
-	GtkWidget *dialog;
+	GtkWidget *dialog, *window;
 	
 	state = xfbib_state_new();
+	window = xfbib_state_get_window(state);
+	
 
-	dialog = gtk_file_chooser_dialog_new(_("Open BibTeX file"), 
-						GTK_WINDOW(xfbib_state_get_window(state)),
+	dialog = gtk_file_chooser_dialog_new("Open BibTeX file", 
+						GTK_WINDOW(window),
 						GTK_FILE_CHOOSER_ACTION_OPEN,
 						GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
 						GTK_STOCK_OPEN, GTK_RESPONSE_OK,
@@ -106,33 +61,25 @@
 			xfce_err("An error occured when opening the file: %s\n", err->message);
 			g_error_free(err);
 		} else {
-			/* Looking good, now parse the contents of the file */
-			xfbib_strbuf_wipe(file_io->filename);
-			xfbib_strbuf_append(file_io->filename, name);
+			/*
+			 * User pressed ok and the file has successfully been
+			 * opened. Save the filename and change the title on
+			 * the main window.
+			 */
+			xfbib_state_set_filename(state, name);
+			xfbib_window_set_title(XFBIB_WINDOW(window), name);
 
 			elements = xfbib_state_get_bibtex_elements(state);
 
-			list_store = gtk_tree_view_get_model(GTK_TREE_VIEW(xfbib_window_get_tree_view(window)));
+			list_store = gtk_tree_view_get_model(GTK_TREE_VIEW(xfbib_window_get_tree_view(XFBIB_WINDOW(window))));
 			
-			for (i = 0; i < xfbib_elements_get_size(elements); i++) {
-				path = gtk_tree_path_new();
-				gtk_tree_path_append_index(path, i);
-				gtk_tree_model_row_deleted(list_store, path);
-				gtk_tree_path_free(path);
-			}
 			
+			xfbib_list_store_clear(XFBIB_LIST_STORE(list_store));
+			
 			/* Parse the file and update the tree view */
 			if (xfbib_elements_parse(elements, contents)) {
-				for (i = 0; i < xfbib_elements_get_size(elements); i++) {
-					path = gtk_tree_path_new();
-					gtk_tree_path_append_index(path, i);
-					
-					gtk_tree_model_get_iter(list_store, &iter, path);
-
-					gtk_tree_model_row_inserted(list_store, path, &iter);
-
-					gtk_tree_path_free(path);
-				}
+				for (i = 0; i < xfbib_elements_get_n_entries(elements); i++)
+					xfbib_list_store_row_inserted(XFBIB_LIST_STORE(list_store), i);
 			}
 		}
 	}
@@ -143,14 +90,14 @@
 
 
 gboolean
-xfbib_file_io_save(XfbibFileIo *file_io, XfbibWindow *window)
+xfbib_file_io_save(void)
 {
 	/* TODO: Write the function */
 	return TRUE;
 }
 
 gboolean
-xfbib_file_io_save_as(XfbibFileIo *file_io, XfbibWindow *window)
+xfbib_file_io_save_as(void)
 {
 	/* TODO: Write the function */
 	return TRUE;

Modified: xfbib/branches/gobject/src/xfbib-file-io.h
===================================================================
--- xfbib/branches/gobject/src/xfbib-file-io.h	2008-09-28 03:55:35 UTC (rev 5485)
+++ xfbib/branches/gobject/src/xfbib-file-io.h	2008-09-28 22:50:52 UTC (rev 5486)
@@ -21,26 +21,13 @@
 #define __XFBIB_FILE_IO_H
 
 #include <glib-object.h>
-#include "xfbib-window.h"
 
-#define XFBIB_TYPE_FILE_IO             (xfbib_file_io_get_type())
-#define XFBIB_FILE_IO(obj)             (G_TYPE_CHECK_INSTANCE_CAST((obj), XFBIB_TYPE_FILE_IO, XfbibFileIo))
-#define XFBIB_IS_FILE_IO(obj)          (G_TYPE_CHECK_INSTANCE_TYPE((obj), XFBIB_TYPE_FILE_IO))
-#define XFBIB_FILE_IO_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST((klass), XFBIB_TYPE_FILE_IO, XfbibFileIoClass))
-#define XFBIB_IS_FILE_IO_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE((klass), XFBIB_TYPE_FILE_IO))
-#define XFBIB_FILE_IO_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS((obj), XFBIB_TYPE_FILE_IO, XfbibFileIoClass))
-
 G_BEGIN_DECLS
 
-typedef struct _XfbibFileIo         XfbibFileIo;
+gboolean xfbib_file_io_open(void);
+gboolean xfbib_file_io_save(void);
+gboolean xfbib_file_io_save_as(void);
 
-GType xfbib_file_io_get_type() G_GNUC_CONST;
-
-XfbibFileIo *xfbib_file_io_new();
-gboolean xfbib_file_io_open(XfbibFileIo *, XfbibWindow *);
-gboolean xfbib_file_io_save(XfbibFileIo *, XfbibWindow *);
-gboolean xfbib_file_io_save_as(XfbibFileIo *, XfbibWindow *);
-
 G_END_DECLS
 
 #endif //__XFBIB_FILE_IO_H

Modified: xfbib/branches/gobject/src/xfbib-list-store.c
===================================================================
--- xfbib/branches/gobject/src/xfbib-list-store.c	2008-09-28 03:55:35 UTC (rev 5485)
+++ xfbib/branches/gobject/src/xfbib-list-store.c	2008-09-28 22:50:52 UTC (rev 5486)
@@ -21,8 +21,10 @@
 #include <config.h>
 #endif
 #include <gtk/gtk.h>
+#include <libxfcegui4/libxfcegui4.h>
 
 #include "xfbib-list-store.h"
+#include "xfbib-state.h"
 #include "xfbib-elements.h"
 #include "xfbib-comment.h"
 #include "xfbib-entry.h"
@@ -30,12 +32,17 @@
 #include "xfbib-preamble.h"
 #include "xfbib-string.h"
 
+enum {
+	TYPE_ENTRY,
+};
 
+
 struct _XfbibListStore
 {
 	GtkListStore parent;
-	XfbibElements *elements;
+	XfbibState *state;
 	gint stamp;
+	gint type;
 };
 
 typedef struct _XfbibListStoreClass
@@ -43,6 +50,7 @@
 	GtkListStoreClass parent;
 } XfbibListStoreClass;
 
+
 static void xfbib_list_store_class_init(XfbibListStoreClass *klass);
 static void xfbib_list_store_tree_model_init (GtkTreeModelIface *iface);
 
@@ -127,7 +135,9 @@
 static void
 xfbib_list_store_init(XfbibListStore *instance)
 {
-	instance->stamp = g_random_int(); 
+	instance->stamp = g_random_int();
+	instance->state = xfbib_state_new();
+	instance->type = TYPE_ENTRY;
 }
 
 static void
@@ -146,42 +156,62 @@
 static gint
 xfbib_list_store_get_n_columns (GtkTreeModel *tree_model)
 {
+	XfbibListStore *list_store;
 	g_return_val_if_fail(XFBIB_IS_LIST_STORE(tree_model), 0);
 
-	return XFBIB_FIELD_N_FIELDS;
+	list_store = XFBIB_LIST_STORE(tree_model);
+
+	switch (list_store->type) {
+		case TYPE_ENTRY:
+			return XFBIB_FIELD_N_FIELDS;
+		default:
+			return 0;
+	}
 }
 
 static GType
 xfbib_list_store_get_column_type (GtkTreeModel *tree_model, gint index)
 {
-	g_return_val_if_fail(XFBIB_IS_LIST_STORE(tree_model), G_TYPE_INVALID);
-	g_return_val_if_fail(index > -1 && index < XFBIB_FIELD_N_FIELDS , G_TYPE_INVALID);
+	XfbibListStore *list_store;
+	g_return_val_if_fail((XFBIB_IS_LIST_STORE(tree_model) || index >= 0), G_TYPE_INVALID);
 	
-	/* Everything is strings */
-	return G_TYPE_STRING;
+	list_store = XFBIB_LIST_STORE(tree_model);
+	switch (list_store->type) {
+		case TYPE_ENTRY:
+			if (index >= XFBIB_FIELD_N_FIELDS) {
+				return G_TYPE_INVALID;
+			}
+			return G_TYPE_STRING;
+		default:
+			return G_TYPE_INVALID;
+	}	
 }
 
 static gboolean
 xfbib_list_store_get_iter (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreePath *path)
 {
 	XfbibListStore *list_store;
-	GList *list;
+	XfbibElements *elements;
 	gint n;
 
 	g_return_val_if_fail(XFBIB_IS_LIST_STORE(tree_model), FALSE);
 
 	list_store = XFBIB_LIST_STORE(tree_model);
+	elements = xfbib_state_get_bibtex_elements(list_store->state);
 
-	list = xfbib_elements_get(list_store->elements);
-
 	n = gtk_tree_path_get_indices(path)[0];
+	
+	switch (list_store->type) {
+		case TYPE_ENTRY:
+			if (n >= xfbib_elements_get_n_entries(elements))
+				return FALSE;
 
-	if (n >= g_list_length(list))
-		return FALSE;
-
-	iter->stamp = list_store->stamp;
-	iter->user_data = g_list_nth(list, n);
-
+			iter->stamp = list_store->stamp;
+			iter->user_data = xfbib_elements_get_nth_entry(elements, n);
+			break;
+		default:
+			return FALSE;
+	}
 	return TRUE;
 }
 
@@ -189,21 +219,29 @@
 xfbib_list_store_get_path (GtkTreeModel *tree_model, GtkTreeIter *iter)
 {
 	XfbibListStore *list_store;
+	XfbibElements *elements;
 	GtkTreePath *path;
-	GList *list;
 	gint n;
 
 	g_return_val_if_fail(XFBIB_IS_LIST_STORE(tree_model), NULL);
 
 	list_store = XFBIB_LIST_STORE(tree_model);
+	elements = xfbib_state_get_bibtex_elements(list_store->state);
 
-	g_return_val_if_fail(list_store->stamp == iter->stamp, NULL);
+	if (list_store->stamp != iter->stamp)
+		return NULL;
 
-	list = xfbib_elements_get(list_store->elements);
+	switch (list_store->type) {
+		case TYPE_ENTRY:
+			if ((n = xfbib_elements_get_entry_position(elements,
+							iter->user_data)) == -1) {
+				return NULL;
+			}
+		break;
+		default:
+			return NULL;
+	}
 
-	if ((n = g_list_position(list, iter->user_data)) == -1)
-		return NULL;
-
 	path = gtk_tree_path_new();
 	gtk_tree_path_append_index(path, n);
 
@@ -215,35 +253,28 @@
 {
 	XfbibListStore *list_store;
 	XfbibField *field;
-	GList *tmp;
 
 	g_return_if_fail(XFBIB_IS_LIST_STORE(tree_model));
-	g_return_if_fail(column < XFBIB_FIELD_N_FIELDS);
 	
 	list_store = XFBIB_LIST_STORE(tree_model);
 
-	g_return_if_fail(list_store->stamp == iter->stamp);
-
+	if (list_store->stamp != iter->stamp)
+		return;
+	
 	g_value_init (value, G_TYPE_STRING);
 
-	tmp = iter->user_data;
-	if (XFBIB_IS_COMMENT(tmp->data)) {
-		//g_printf("Comment\n");
-		g_value_set_string(value, "Comment");
-
-	} else if (XFBIB_IS_ENTRY(tmp->data)) {
-		field = xfbib_entry_get_field_by_column(XFBIB_ENTRY(tmp->data), column);
-		if (field == NULL)
-			return;
-		g_value_set_string(value, xfbib_field_get_value(field));
-	} else if (XFBIB_IS_PREAMBLE(tmp->data)) {
-		//g_printf("Preamble\n");
-		g_value_set_string(value, "Preamble");
-
-	} else if (XFBIB_IS_STRING(tmp->data)) {
-		//g_printf("String\n");
-		g_value_set_string(value, "String");
-
+	switch (list_store->type) {
+		case TYPE_ENTRY:
+			g_return_if_fail(column < XFBIB_FIELD_N_FIELDS
+					 && XFBIB_IS_ENTRY(iter->user_data));
+			
+			field = xfbib_entry_get_field_by_column(XFBIB_ENTRY(iter->user_data), column);
+			if (field == NULL)
+				return;
+			g_value_set_string(value, xfbib_field_get_value(field));
+			break;
+		default:
+			return;	
 	}
 }
 
@@ -251,20 +282,31 @@
 xfbib_list_store_iter_next (GtkTreeModel *tree_model, GtkTreeIter *iter)
 {
 	XfbibListStore *list_store;
-	GList *list, *next;
+	XfbibElements *elements;
+	XfbibEntry *next;
 
 	g_return_val_if_fail(XFBIB_IS_LIST_STORE(tree_model), FALSE);
 
 	list_store = XFBIB_LIST_STORE(tree_model);
+	elements = xfbib_state_get_bibtex_elements(list_store->state);
+
+	g_return_val_if_fail(list_store->stamp == iter->stamp, FALSE);
 	
-	g_return_val_if_fail(list_store->stamp == iter->stamp, FALSE);
-
-	list = xfbib_elements_get(list_store->elements);
-
-	if ((next = g_list_next(iter->user_data)) == NULL)
+	if (iter == NULL || iter->user_data == NULL)
 		return FALSE;
 
-	iter->user_data = next;
+	switch (list_store->type) {
+		case TYPE_ENTRY:
+			if ((next = xfbib_elements_get_next_entry(elements, iter->user_data)) == NULL) {
+				iter->stamp = 0;
+				return FALSE;
+			}
+			iter->stamp = list_store->stamp;
+			iter->user_data = next;
+			break;
+		default:
+			return FALSE;	
+	}
 	return TRUE;
 }
 
@@ -272,23 +314,29 @@
 xfbib_list_store_iter_children (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent)
 {
 	XfbibListStore *list_store;
-	GList *list;
+	XfbibElements *elements;
+
 	g_return_val_if_fail(XFBIB_IS_LIST_STORE(tree_model), FALSE);
 
 	list_store = XFBIB_LIST_STORE(tree_model);
+	elements = xfbib_state_get_bibtex_elements(list_store->state);
 
 	/* This is only a list and therefore nodes have have no children */
 	if (parent != NULL)
 		return FALSE;
 
-	list = xfbib_elements_get(list_store->elements);
-
-	if (g_list_length(list) == 0)
-		return FALSE;
-
-	iter->stamp = list_store->stamp;
-	if ((iter->user_data = g_list_nth(list, 0)) == NULL)
-		return FALSE;
+	switch (list_store->type) {
+		case TYPE_ENTRY:
+			if (xfbib_elements_get_n_entries(elements) == 0)
+				return FALSE;
+			
+			iter->stamp = list_store->stamp;
+			if ((iter->user_data = xfbib_elements_get_nth_entry(elements, 0)) == NULL)
+				return FALSE;
+			break;
+		default:
+			return FALSE;	
+	}	
 	return TRUE;
 }
 
@@ -302,18 +350,21 @@
 xfbib_list_store_iter_n_children (GtkTreeModel *tree_model, GtkTreeIter *iter)
 {
 	XfbibListStore *list_store;
-	GList *list;
+	XfbibElements *elements;
+	
 	g_return_val_if_fail(XFBIB_IS_LIST_STORE(tree_model), -1);
 
 	list_store = XFBIB_LIST_STORE(tree_model);
+	elements = xfbib_state_get_bibtex_elements(list_store->state);
 
-	if (iter == NULL) {
-		list = xfbib_elements_get(list_store->elements);
-		return g_list_length(list);
+	switch (list_store->type) {
+		case TYPE_ENTRY:
+			if (iter == NULL)
+				return xfbib_elements_get_n_entries(elements);
+			break;
+		default:
+			return -1;	
 	}
-
-	g_return_val_if_fail(list_store->stamp == iter->stamp, -1);
-
 	return 0;
 }
 
@@ -321,23 +372,29 @@
 xfbib_list_store_iter_nth_child (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent, gint n)
 {
 	XfbibListStore *list_store;
-	GList *list;
+	XfbibElements *elements;
+
 	g_return_val_if_fail(XFBIB_IS_LIST_STORE(tree_model), FALSE);
 
 	list_store = XFBIB_LIST_STORE(tree_model);
+	elements = xfbib_state_get_bibtex_elements(list_store->state);
 
 	/* This is only a list and therefore nodes have have no children */
 	if (parent != NULL)
 		return FALSE;
 
-	list = xfbib_elements_get(list_store->elements);
-
-	if (n >= g_list_length(list))
-		return FALSE;
-
-	iter->stamp = list_store->stamp;
-	if ((iter->user_data = g_list_nth(list, n)) == NULL)
-		return FALSE;
+	switch (list_store->type) {
+		case TYPE_ENTRY:
+			if (n >= xfbib_elements_get_n_entries(elements))
+				return FALSE;
+			
+			iter->stamp = list_store->stamp;
+			if ((iter->user_data = xfbib_elements_get_nth_entry(elements, n)) == NULL)
+				return FALSE;
+			break;
+		default:
+			return FALSE;	
+	}
 	return TRUE;
 }
 
@@ -348,11 +405,155 @@
 }
 
 XfbibListStore *
-xfbib_list_store_new(XfbibElements *elements)
+xfbib_list_store_new()
 {
 	XfbibListStore *list_store;
 	list_store = g_object_new(XFBIB_TYPE_LIST_STORE, NULL);
-	list_store->elements = elements;
 	return list_store;
 }
 
+#if 0
+/**
+ * gtk_list_store_remove:
+ * @list_store: A #GtkListStore
+ * @iter: A valid #GtkTreeIter
+ *
+ * Removes the given row from the list store.  After being removed, 
+ * @iter is set to be the next valid row, or invalidated if it pointed 
+ * to the last row in @list_store.
+ *
+ * Return value: %TRUE if @iter is valid, %FALSE if not.
+ **/
+gboolean
+gtk_list_store_remove (GtkListStore *list_store,
+		       GtkTreeIter  *iter)
+{
+	GtkTreePath *path;
+	GSequenceIter *ptr, *next;
+
+	g_return_val_if_fail (GTK_IS_LIST_STORE (list_store), FALSE);
+	g_return_val_if_fail (VALID_ITER (iter, list_store), FALSE);
+
+	path = gtk_list_store_get_path (GTK_TREE_MODEL (list_store), iter);
+
+	ptr = iter->user_data;
+	next = g_sequence_iter_next (ptr);
+
+	_gtk_tree_data_list_free (g_sequence_get (ptr), list_store->column_headers);
+	g_sequence_remove (iter->user_data);
+
+	list_store->length--;
+
+	gtk_tree_model_row_deleted (GTK_TREE_MODEL (list_store), path);
+	gtk_tree_path_free (path);
+
+	if (g_sequence_iter_is_end (next)) {
+		iter->stamp = 0;
+		return FALSE;
+	} else {
+		iter->stamp = list_store->stamp;
+		iter->user_data = next;
+		return TRUE;
+	}
+}
+#endif
+
+gboolean
+xfbib_list_store_remove(XfbibListStore *list_store, GtkTreeIter *iter)
+{
+	XfbibElements *elements;
+	GtkTreePath *path;
+	GtkTreeIter next;
+	gboolean more;
+
+	g_return_val_if_fail(XFBIB_IS_LIST_STORE (list_store), FALSE);
+	g_return_val_if_fail(list_store->stamp == iter->stamp, FALSE);
+	g_return_val_if_fail(iter->user_data != NULL, FALSE);
+
+	path = xfbib_list_store_get_path(GTK_TREE_MODEL(list_store), iter);
+
+	next.stamp = iter->stamp;
+	next.user_data = iter->user_data;
+	more = xfbib_list_store_iter_next(GTK_TREE_MODEL(list_store), &next);
+
+	elements = xfbib_state_get_bibtex_elements(list_store->state);
+	xfbib_elements_remove(elements, iter->user_data);
+
+	gtk_tree_model_row_deleted (GTK_TREE_MODEL (list_store), path);
+	gtk_tree_path_free (path);
+
+	if (more == FALSE) {
+		iter->stamp = 0;
+		return FALSE;
+	}
+
+	iter->stamp = list_store->stamp;
+	iter->user_data = next.user_data;
+	return TRUE;
+}
+
+
+#if 0
+/**
+ * gtk_list_store_clear:
+ * @list_store: a #GtkListStore.
+ *
+ * Removes all rows from the list store.  
+ *
+ **/
+void
+gtk_list_store_clear (GtkListStore *list_store)
+{
+  GtkTreeIter iter;
+  g_return_if_fail (GTK_IS_LIST_STORE (list_store));
+
+  while (g_sequence_get_length (list_store->seq) > 0)
+    {
+      iter.stamp = list_store->stamp;
+      iter.user_data = g_sequence_get_begin_iter (list_store->seq);
+      gtk_list_store_remove (list_store, &iter);
+    }
+
+  gtk_list_store_increment_stamp (list_store);
+}
+#endif
+void
+xfbib_list_store_clear(XfbibListStore *list_store)
+{
+	XfbibElements *elements;
+	GtkTreeIter iter;
+	g_return_if_fail(XFBIB_IS_LIST_STORE(list_store));
+
+
+	elements = xfbib_state_get_bibtex_elements(list_store->state);
+	
+	while (xfbib_elements_get_n_entries(elements) > 0) {
+		iter.stamp = list_store->stamp;
+		iter.user_data = xfbib_elements_get_nth_entry(elements, 0);
+		xfbib_list_store_remove(list_store, &iter);
+	}
+
+	xfbib_elements_remove_all(elements);
+
+	/* Old iters are not valid any more so change the stamp */
+	list_store->stamp = g_random_int();
+}
+
+
+void
+xfbib_list_store_row_inserted(XfbibListStore *list_store, gint pos)
+{
+	GtkTreePath *path;
+	GtkTreeIter iter;
+	g_return_if_fail(XFBIB_IS_LIST_STORE(list_store));
+
+	path = gtk_tree_path_new();
+	gtk_tree_path_append_index(path, pos);
+
+	gtk_tree_model_get_iter(GTK_TREE_MODEL(list_store), &iter, path);
+
+	gtk_tree_model_row_inserted(GTK_TREE_MODEL(list_store), path, &iter);
+
+	gtk_tree_path_free(path);
+}
+

Modified: xfbib/branches/gobject/src/xfbib-list-store.h
===================================================================
--- xfbib/branches/gobject/src/xfbib-list-store.h	2008-09-28 03:55:35 UTC (rev 5485)
+++ xfbib/branches/gobject/src/xfbib-list-store.h	2008-09-28 22:50:52 UTC (rev 5486)
@@ -21,7 +21,6 @@
 #define __XFBIB_LIST_STORE_H
 
 #include <gtk/gtk.h>
-#include "xfbib-elements.h"
 
 #define XFBIB_TYPE_LIST_STORE             (xfbib_list_store_get_type())
 #define XFBIB_LIST_STORE(obj)             (G_TYPE_CHECK_INSTANCE_CAST((obj), XFBIB_TYPE_LIST_STORE, XfbibListStore))
@@ -36,8 +35,12 @@
 
 GType xfbib_list_store_get_type() G_GNUC_CONST;
 
-XfbibListStore *xfbib_list_store_new(XfbibElements *);
+XfbibListStore *xfbib_list_store_new();
+gboolean xfbib_list_store_remove(XfbibListStore *, GtkTreeIter  *);
+void xfbib_list_store_clear(XfbibListStore *);
+void xfbib_list_store_row_inserted(XfbibListStore *, gint);
 
+
 G_END_DECLS
 
 #endif //__XFBIB_LIST_STORE_H

Modified: xfbib/branches/gobject/src/xfbib-menu-bar.c
===================================================================
--- xfbib/branches/gobject/src/xfbib-menu-bar.c	2008-09-28 03:55:35 UTC (rev 5485)
+++ xfbib/branches/gobject/src/xfbib-menu-bar.c	2008-09-28 22:50:52 UTC (rev 5486)
@@ -67,17 +67,16 @@
 cb_file_open_activate (GtkMenuItem *menuitem, gpointer user_data)
 {
 	g_printf("File/Open\n");
-
-	XfbibFileIo *file_io;
-	file_io = xfbib_file_io_new();
-	
-	if (xfbib_file_io_open(file_io, window))
+	xfbib_file_io_open();
+	/*
+	if (xfbib_file_io_open())
 	{
 		//TODO: What happens to the previous FileIo object?
 		//TODO: Should these two lines be located here or in xfbib-file-io.c ?
 		xfbib_window_set_file_io(window, file_io);
 		//xfbib_window_set_title(window, filename;
 	}
+	*/
 }
 
 static void
@@ -95,7 +94,7 @@
 static void
 cb_file_quit_activate (GtkMenuItem *menuitem, gpointer user_data)
 {
-	gtk_widget_destroy(window);
+	gtk_widget_destroy(GTK_WIDGET(window));
 }
 
 static void

Modified: xfbib/branches/gobject/src/xfbib-state.c
===================================================================
--- xfbib/branches/gobject/src/xfbib-state.c	2008-09-28 03:55:35 UTC (rev 5485)
+++ xfbib/branches/gobject/src/xfbib-state.c	2008-09-28 22:50:52 UTC (rev 5486)
@@ -37,6 +37,9 @@
 static void
 xfbib_state_init(XfbibState *instance)
 {
+	instance->elements = NULL;
+	instance->filename = NULL;
+	instance->window = NULL;
 }
 
 static void
@@ -63,6 +66,7 @@
 void xfbib_state_set_filename(XfbibState *state, gchar *filename)
 {
 	g_return_if_fail(XFBIB_IS_STATE(state));
+	g_free(state->filename);
 	state->filename = g_strdup(filename);
 }
 

Modified: xfbib/branches/gobject/src/xfbib-toolbar.c
===================================================================
--- xfbib/branches/gobject/src/xfbib-toolbar.c	2008-09-28 03:55:35 UTC (rev 5485)
+++ xfbib/branches/gobject/src/xfbib-toolbar.c	2008-09-28 22:50:52 UTC (rev 5486)
@@ -52,9 +52,8 @@
 {
 	g_printf("Toolbar_Open\n");
 
-	XfbibFileIo *file_io;
-	file_io = xfbib_file_io_new();
-	
+	xfbib_file_io_open();
+	/*
 	if (xfbib_file_io_open(file_io, window))
 	{
 		//TODO: What happens to the previous FileIo object?
@@ -62,6 +61,7 @@
 		xfbib_window_set_file_io(window, file_io);
 		//xfbib_window_set_title(window, filename;
 	}
+	*/
 }
 
 GType

Modified: xfbib/branches/gobject/src/xfbib-tree-view.c
===================================================================
--- xfbib/branches/gobject/src/xfbib-tree-view.c	2008-09-28 03:55:35 UTC (rev 5485)
+++ xfbib/branches/gobject/src/xfbib-tree-view.c	2008-09-28 22:50:52 UTC (rev 5486)
@@ -22,6 +22,7 @@
 #endif
 #include <gtk/gtk.h>
 
+#include "xfbib-list-store.h"
 #include "xfbib-tree-view.h"
 #include "xfbib-elements.h"
 #include "xfbib-state.h"
@@ -115,8 +116,6 @@
 	GtkTreeViewColumn *column;
 	GtkCellRenderer *renderer;
 	GtkTreeModel *model;
-	XfbibEntry *entry;
-	gchar *str;
 	gint i;
 
 	for (i = 0; i < XFBIB_FIELD_N_FIELDS; i++) {
@@ -167,7 +166,7 @@
 
 	state = xfbib_state_new();
 
-	model = GTK_TREE_MODEL(xfbib_list_store_new(xfbib_state_get_bibtex_elements(state)));
+	model = GTK_TREE_MODEL(xfbib_list_store_new());
 	gtk_tree_view_set_model(GTK_TREE_VIEW(instance), model);
 	g_object_unref(model); /* destroy model automatically with view */
 }

Modified: xfbib/branches/gobject/src/xfbib-window.c
===================================================================
--- xfbib/branches/gobject/src/xfbib-window.c	2008-09-28 03:55:35 UTC (rev 5485)
+++ xfbib/branches/gobject/src/xfbib-window.c	2008-09-28 22:50:52 UTC (rev 5486)
@@ -34,11 +34,11 @@
 {
 	GtkWindow parent;
 	GtkWidget *vbox;
+	GtkWidget *scrolled_window;
 	GtkWidget *menu_bar;
 	GtkWidget *toolbar;
 	GtkWidget *tree_view;
 	GtkWidget *status_bar;
-	GtkWidget *file_io;
 };
 	
 typedef struct _XfbibWindowClass
@@ -97,14 +97,18 @@
 	instance->toolbar = xfbib_toolbar_new(instance);
 	gtk_box_pack_start(GTK_BOX(instance->vbox), instance->toolbar, FALSE, FALSE, 0);
 	
+	instance->scrolled_window = gtk_scrolled_window_new(NULL, NULL);
+	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (instance->scrolled_window),
+			GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+	gtk_box_pack_start(GTK_BOX(instance->vbox), instance->scrolled_window, TRUE , TRUE, 0);
+
 	instance->tree_view = xfbib_tree_view_new();
-	gtk_box_pack_start(GTK_BOX(instance->vbox), instance->tree_view, TRUE , TRUE, 0);
+	gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW(instance->scrolled_window),
+			instance->tree_view);
 
 	instance->status_bar = xfbib_statusbar_new();
 	gtk_box_pack_end(GTK_BOX(instance->vbox), instance->status_bar, FALSE, FALSE, 0);
 
-	instance->file_io = NULL;
-
 	gtk_window_set_icon_name(GTK_WINDOW(instance), "xfbib");
 }
 
@@ -123,17 +127,15 @@
 }
 
 void
-xfbib_window_set_title(XfbibWindow *window, XfbibStrbuf *title)
+xfbib_window_set_title(XfbibWindow *window, gchar *name)
 {
-	gtk_window_set_title(GTK_WINDOW(window), xfbib_strbuf_get_str(title));
+	char *str;
+	g_return_if_fail(XFBIB_IS_WINDOW(window));
+	str = g_strdup_printf("%s - %s", (name == NULL) ? "(Untitled)" : name, PACKAGE_NAME);
+	gtk_window_set_title(GTK_WINDOW(window), str);
+	g_free(str);
 }
 
-void
-xfbib_window_set_file_io(XfbibWindow *window, XfbibFileIo *file_io)
-{
-	window->file_io = file_io;
-}
-
 GtkWidget *
 xfbib_window_get_tree_view(XfbibWindow *window)
 {

Modified: xfbib/branches/gobject/src/xfbib-window.h
===================================================================
--- xfbib/branches/gobject/src/xfbib-window.h	2008-09-28 03:55:35 UTC (rev 5485)
+++ xfbib/branches/gobject/src/xfbib-window.h	2008-09-28 22:50:52 UTC (rev 5486)
@@ -38,7 +38,7 @@
 GType xfbib_window_get_type() G_GNUC_CONST;
 
 GtkWidget *xfbib_window_new();
-void xfbib_window_set_title(XfbibWindow *, XfbibStrbuf *);
+void xfbib_window_set_title(XfbibWindow *, gchar *);
 XfbibElements *xfbib_window_get_elements(XfbibWindow *);
 GtkWidget *xfbib_window_get_tree_view(XfbibWindow *);
 




More information about the Goodies-commits mailing list