[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