aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--widgets/menus/gal-define-views-dialog.c16
-rw-r--r--widgets/menus/gal-define-views-dialog.h3
-rw-r--r--widgets/menus/gal-define-views-model.c15
-rw-r--r--widgets/menus/gal-define-views.glade41
-rw-r--r--widgets/menus/gal-view-collection.c128
-rw-r--r--widgets/menus/gal-view-collection.h47
-rw-r--r--widgets/menus/gal-view-etable.c115
-rw-r--r--widgets/menus/gal-view-etable.h34
-rw-r--r--widgets/menus/gal-view-factory-etable.c101
-rw-r--r--widgets/menus/gal-view-factory-etable.h31
-rw-r--r--widgets/menus/gal-view-factory.c93
-rw-r--r--widgets/menus/gal-view-factory.h47
-rw-r--r--widgets/menus/gal-view-new-dialog.c89
-rw-r--r--widgets/menus/gal-view-new-dialog.glade78
-rw-r--r--widgets/menus/gal-view-new-dialog.h11
-rw-r--r--widgets/menus/gal-view.c148
-rw-r--r--widgets/menus/gal-view.h28
17 files changed, 868 insertions, 157 deletions
diff --git a/widgets/menus/gal-define-views-dialog.c b/widgets/menus/gal-define-views-dialog.c
index 97cf0eb5f2..f92f1520c7 100644
--- a/widgets/menus/gal-define-views-dialog.c
+++ b/widgets/menus/gal-define-views-dialog.c
@@ -111,17 +111,19 @@ gdvd_button_new_dialog_callback(GtkWidget *widget, int button, GalDefineViewsDia
{
gchar *name;
GalView *view;
+ GalViewFactory *factory;
switch (button) {
case 0:
gtk_object_get(GTK_OBJECT(widget),
"name", &name,
+ "factory", &factory,
NULL);
- view = gal_view_new();
- gtk_object_set(GTK_OBJECT(view),
- "name", name,
- NULL);
- gal_define_views_model_append(GAL_DEFINE_VIEWS_MODEL(dialog->model), view);
- gtk_object_unref(GTK_OBJECT(view));
+ if (name && factory) {
+ view = gal_view_factory_new_view(factory,
+ name);
+ gal_define_views_model_append(GAL_DEFINE_VIEWS_MODEL(dialog->model), view);
+ gtk_object_unref(GTK_OBJECT(view));
+ }
break;
}
gnome_dialog_close(GNOME_DIALOG(widget));
@@ -130,7 +132,7 @@ gdvd_button_new_dialog_callback(GtkWidget *widget, int button, GalDefineViewsDia
static void
gdvd_button_new_callback(GtkWidget *widget, GalDefineViewsDialog *dialog)
{
- GtkWidget *view_new_dialog = gal_view_new_dialog_new();
+ GtkWidget *view_new_dialog = gal_view_new_dialog_new(dialog->collection);
gtk_signal_connect(GTK_OBJECT(view_new_dialog), "clicked",
GTK_SIGNAL_FUNC(gdvd_button_new_dialog_callback), dialog);
gtk_widget_show(GTK_WIDGET(view_new_dialog));
diff --git a/widgets/menus/gal-define-views-dialog.h b/widgets/menus/gal-define-views-dialog.h
index 7979d5042e..11daec5897 100644
--- a/widgets/menus/gal-define-views-dialog.h
+++ b/widgets/menus/gal-define-views-dialog.h
@@ -24,6 +24,7 @@
#include <gnome.h>
#include <glade/glade.h>
#include <gal/e-table/e-table-model.h>
+#include <gal/menus/gal-view-collection.h>
#ifdef __cplusplus
extern "C" {
@@ -54,6 +55,8 @@ struct _GalDefineViewsDialog
/* item specific fields */
GladeXML *gui;
ETableModel *model;
+
+ GalViewCollection *collection;
};
struct _GalDefineViewsDialogClass
diff --git a/widgets/menus/gal-define-views-model.c b/widgets/menus/gal-define-views-model.c
index 1e64857faf..79fbf56c4a 100644
--- a/widgets/menus/gal-define-views-model.c
+++ b/widgets/menus/gal-define-views-model.c
@@ -66,7 +66,7 @@ gdvm_value_at (ETableModel *etc, int col, int row)
if (col != 0 || row < 0 || row > views->data_count)
return NULL;
- value = views->data[row]->name;
+ value = gal_view_get_title (views->data[row]);
return (void *)(value ? value : "");
}
@@ -96,19 +96,6 @@ gdvm_is_cell_editable (ETableModel *etc, int col, int row)
static void
gdvm_append_row (ETableModel *etm, ETableModel *source, gint row)
{
- GalDefineViewsModel *views = GAL_DEFINE_VIEWS_MODEL(etm);
- GalView *view;
- const void *val = e_table_model_value_at(source, 0, row);
-
- e_table_model_pre_change(etm);
- view = gal_view_new();
- gtk_object_set(GTK_OBJECT(view),
- "name", val,
- NULL);
- views->data = g_renew(GalView *, views->data, views->data_count + 1);
- views->data[views->data_count] = view;
- views->data_count++;
- e_table_model_row_inserted(etm, views->data_count - 1);
}
/* This function duplicates the value passed to it. */
diff --git a/widgets/menus/gal-define-views.glade b/widgets/menus/gal-define-views.glade
index c78d854e2d..c9a8b4ffee 100644
--- a/widgets/menus/gal-define-views.glade
+++ b/widgets/menus/gal-define-views.glade
@@ -201,20 +201,7 @@
<class>GtkButton</class>
<name>button-modify</name>
<can_focus>True</can_focus>
- <label>_Modify...</label>
- <relief>GTK_RELIEF_NORMAL</relief>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-rename</name>
- <can_focus>True</can_focus>
- <label>_Rename...</label>
+ <label>_Edit...</label>
<relief>GTK_RELIEF_NORMAL</relief>
<child>
<padding>0</padding>
@@ -235,32 +222,6 @@
<fill>False</fill>
</child>
</widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-up</name>
- <can_focus>True</can_focus>
- <label>Move _Up</label>
- <relief>GTK_RELIEF_NORMAL</relief>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkButton</class>
- <name>button-down</name>
- <can_focus>True</can_focus>
- <label>Move Do_wn</label>
- <relief>GTK_RELIEF_NORMAL</relief>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
</widget>
</widget>
diff --git a/widgets/menus/gal-view-collection.c b/widgets/menus/gal-view-collection.c
new file mode 100644
index 0000000000..5b625c44f4
--- /dev/null
+++ b/widgets/menus/gal-view-collection.c
@@ -0,0 +1,128 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * gal-view-collection.c: a View Collection
+ *
+ * Authors:
+ * Chris Lahey (clahey@helixcode.com)
+ *
+ * (C) 1999, 2000 Helix Code, Inc.
+ */
+#include <config.h>
+#include <gtk/gtksignal.h>
+#include <gal/util/e-util.h>
+#include "gal-view-collection.h"
+
+#define GVC_CLASS(e) ((GalViewCollectionClass *)((GtkObject *)e)->klass)
+
+#define PARENT_TYPE gtk_object_get_type ()
+
+static GtkObjectClass *gal_view_collection_parent_class;
+
+enum {
+ DISPLAY_VIEW,
+ LAST_SIGNAL
+};
+
+static guint gal_view_collection_signals [LAST_SIGNAL] = { 0, };
+
+/**
+ * gal_view_collection_display_view:
+ * @collection: The GalViewCollection to send the signal on.
+ * @view: The view to display.
+ *
+ */
+void
+gal_view_collection_display_view (GalViewCollection *collection,
+ GalView *view)
+{
+ g_return_if_fail (collection != NULL);
+ g_return_if_fail (GAL_IS_VIEW_COLLECTION (collection));
+
+ gtk_signal_emit (GTK_OBJECT (collection),
+ gal_view_collection_signals [DISPLAY_VIEW],
+ view);
+}
+
+static void
+gal_view_collection_destroy (GtkObject *object)
+{
+ GalViewCollection *collection = GAL_VIEW_COLLECTION(object);
+
+ e_free_object_list(collection->view_list);
+ e_free_object_list(collection->factory_list);
+
+ if (gal_view_collection_parent_class->destroy)
+ (*gal_view_collection_parent_class->destroy)(object);
+}
+
+static void
+gal_view_collection_class_init (GtkObjectClass *object_class)
+{
+ GalViewCollectionClass *klass = GAL_VIEW_COLLECTION_CLASS(object_class);
+ gal_view_collection_parent_class = gtk_type_class (PARENT_TYPE);
+
+ object_class->destroy = gal_view_collection_destroy;
+
+ gal_view_collection_signals [DISPLAY_VIEW] =
+ gtk_signal_new ("display_view",
+ GTK_RUN_LAST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (GalViewCollectionClass, display_view),
+ gtk_marshal_NONE__OBJECT,
+ GTK_TYPE_NONE, 1, GTK_TYPE_OBJECT);
+
+ gtk_object_class_add_signals (object_class, gal_view_collection_signals, LAST_SIGNAL);
+
+ klass->display_view = NULL;
+}
+
+static void
+gal_view_collection_init (GalViewCollection *collection)
+{
+ collection->view_list = NULL;
+ collection->factory_list = NULL;
+}
+
+guint
+gal_view_collection_get_type (void)
+{
+ static guint type = 0;
+
+ if (!type)
+ {
+ GtkTypeInfo info =
+ {
+ "GalViewCollection",
+ sizeof (GalViewCollection),
+ sizeof (GalViewCollectionClass),
+ (GtkClassInitFunc) gal_view_collection_class_init,
+ (GtkObjectInitFunc) gal_view_collection_init,
+ /* reserved_1 */ NULL,
+ /* reserved_2 */ NULL,
+ (GtkClassInitFunc) NULL,
+ };
+
+ type = gtk_type_unique (PARENT_TYPE, &info);
+ }
+
+ return type;
+}
+
+GalViewCollection *gal_view_collection_new (void)
+{
+ return gtk_type_new(gal_view_collection_get_type());
+}
+
+/* Set up the view collection */
+void gal_view_collection_set_storage_directories (GalViewCollection *collection,
+ char *system_dir,
+ char *local_dir)
+{
+}
+
+void gal_view_collection_add_factory (GalViewCollection *collection,
+ GalViewFactory *factory)
+{
+ gtk_object_ref(GTK_OBJECT(factory));
+ collection->factory_list = g_list_prepend(collection->factory_list, factory);
+}
diff --git a/widgets/menus/gal-view-collection.h b/widgets/menus/gal-view-collection.h
new file mode 100644
index 0000000000..92f3b0d6b6
--- /dev/null
+++ b/widgets/menus/gal-view-collection.h
@@ -0,0 +1,47 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+#ifndef _GAL_VIEW_SET_H_
+#define _GAL_VIEW_SET_H_
+
+#include <gtk/gtkobject.h>
+#include <gal/util/e-list.h>
+#include <gal/menus/gal-view-factory.h>
+
+#define GAL_VIEW_COLLECTION_TYPE (gal_view_collection_get_type ())
+#define GAL_VIEW_COLLECTION(o) (GTK_CHECK_CAST ((o), GAL_VIEW_COLLECTION_TYPE, GalViewCollection))
+#define GAL_VIEW_COLLECTION_CLASS(k) (GTK_CHECK_CLASS_CAST((k), GAL_VIEW_COLLECTION_TYPE, GalViewCollectionClass))
+#define GAL_IS_VIEW_COLLECTION(o) (GTK_CHECK_TYPE ((o), GAL_VIEW_COLLECTION_TYPE))
+#define GAL_IS_VIEW_COLLECTION_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), GAL_VIEW_COLLECTION_TYPE))
+
+typedef struct {
+ GtkObject base;
+
+ GList *view_list;
+ GList *factory_list;
+} GalViewCollection;
+
+typedef struct {
+ GtkObjectClass parent_class;
+
+ /*
+ * Signals
+ */
+ void (*display_view) (GalViewCollection *collection,
+ GalView *view);
+} GalViewCollectionClass;
+
+/* Standard functions */
+GtkType gal_view_collection_get_type (void);
+GalViewCollection *gal_view_collection_new (void);
+
+/* Set up the view collection */
+void gal_view_collection_set_storage_directories (GalViewCollection *collection,
+ char *system_dir,
+ char *local_dir);
+void gal_view_collection_add_factory (GalViewCollection *collection,
+ GalViewFactory *factory);
+
+/* Send the display view signal. */
+void gal_view_collection_display_view (GalViewCollection *collection,
+ GalView *view);
+
+#endif /* _GAL_VIEW_COLLECTION_H_ */
diff --git a/widgets/menus/gal-view-etable.c b/widgets/menus/gal-view-etable.c
new file mode 100644
index 0000000000..d990e29ff9
--- /dev/null
+++ b/widgets/menus/gal-view-etable.c
@@ -0,0 +1,115 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * gal-view-etable.c: An ETable View
+ *
+ * Authors:
+ * Chris Lahey (clahey@helixcode.com)
+ *
+ * (C) 2000 Helix Code, Inc.
+ */
+#include <config.h>
+#include "gal-view-etable.h"
+
+#define PARENT_TYPE gal_view_get_type ()
+
+static GalViewClass *gal_view_etable_parent_class;
+
+static void
+gal_view_etable_edit (GalView *view)
+{
+
+}
+
+static void
+gal_view_etable_load_from_node (GalView *view,
+ xmlNode *node)
+{
+
+}
+
+static void
+gal_view_etable_save_to_node (GalView *view,
+ xmlNode *parent)
+{
+
+}
+
+static const char *
+gal_view_etable_get_title (GalView *view)
+{
+ return GAL_VIEW_ETABLE(view)->title;
+}
+
+static void
+gal_view_etable_destroy (GtkObject *object)
+{
+ GalViewEtable *view = GAL_VIEW_ETABLE(object);
+ g_free(view->title);
+ if (view->spec)
+ gtk_object_unref(GTK_OBJECT(view->spec));
+ if (view->state)
+ gtk_object_unref(GTK_OBJECT(view->state));
+}
+
+static void
+gal_view_etable_class_init (GtkObjectClass *object_class)
+{
+ GalViewClass *gal_view_class = GAL_VIEW_CLASS(object_class);
+ gal_view_etable_parent_class = gtk_type_class (PARENT_TYPE);
+
+ gal_view_class->edit = gal_view_etable_edit ;
+ gal_view_class->load_from_node = gal_view_etable_load_from_node;
+ gal_view_class->save_to_node = gal_view_etable_save_to_node ;
+ gal_view_class->get_title = gal_view_etable_get_title ;
+
+ object_class->destroy = gal_view_etable_destroy ;
+}
+
+static void
+gal_view_etable_init (GalViewEtable *gve)
+{
+ gve->spec = NULL;
+ gve->state = NULL;
+ gve->title = NULL;
+}
+
+GalView *
+gal_view_etable_new (ETableSpecification *spec)
+{
+ return gal_view_etable_construct (gtk_type_new (gal_view_etable_get_type ()), spec);
+}
+
+GalView *
+gal_view_etable_construct (GalViewEtable *view,
+ ETableSpecification *spec)
+{
+ if (spec)
+ gtk_object_ref(GTK_OBJECT(spec));
+ view->spec = spec;
+ return GAL_VIEW(view);
+}
+
+GtkType
+gal_view_etable_get_type (void)
+{
+ static guint type = 0;
+
+ if (!type)
+ {
+ GtkTypeInfo info =
+ {
+ "GalViewEtable",
+ sizeof (GalViewEtable),
+ sizeof (GalViewEtableClass),
+ (GtkClassInitFunc) gal_view_etable_class_init,
+ (GtkObjectInitFunc) gal_view_etable_init,
+ /* reserved_1 */ NULL,
+ /* reserved_2 */ NULL,
+ (GtkClassInitFunc) NULL,
+ };
+
+ type = gtk_type_unique (PARENT_TYPE, &info);
+ }
+
+ return type;
+}
diff --git a/widgets/menus/gal-view-etable.h b/widgets/menus/gal-view-etable.h
new file mode 100644
index 0000000000..5744da52ec
--- /dev/null
+++ b/widgets/menus/gal-view-etable.h
@@ -0,0 +1,34 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+#ifndef _GAL_VIEW_ETABLE_H_
+#define _GAL_VIEW_ETABLE_H_
+
+#include <gtk/gtkobject.h>
+#include <gal/menus/gal-view.h>
+#include <gal/e-table/e-table-state.h>
+#include <gal/e-table/e-table-specification.h>
+
+#define GAL_VIEW_ETABLE_TYPE (gal_view_etable_get_type ())
+#define GAL_VIEW_ETABLE(o) (GTK_CHECK_CAST ((o), GAL_VIEW_ETABLE_TYPE, GalViewEtable))
+#define GAL_VIEW_ETABLE_CLASS(k) (GTK_CHECK_CLASS_CAST((k), GAL_VIEW_ETABLE_TYPE, GalViewEtableClass))
+#define GAL_IS_VIEW_ETABLE(o) (GTK_CHECK_TYPE ((o), GAL_VIEW_ETABLE_TYPE))
+#define GAL_IS_VIEW_ETABLE_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), GAL_VIEW_ETABLE_TYPE))
+
+typedef struct {
+ GalView base;
+
+ ETableSpecification *spec;
+ ETableState *state;
+ char *title;
+} GalViewEtable;
+
+typedef struct {
+ GalViewClass parent_class;
+} GalViewEtableClass;
+
+/* Standard functions */
+GtkType gal_view_etable_get_type (void);
+GalView *gal_view_etable_new (ETableSpecification *spec);
+GalView *gal_view_etable_construct (GalViewEtable *view,
+ ETableSpecification *spec);
+
+#endif /* _GAL_VIEW_ETABLE_H_ */
diff --git a/widgets/menus/gal-view-factory-etable.c b/widgets/menus/gal-view-factory-etable.c
new file mode 100644
index 0000000000..918838050a
--- /dev/null
+++ b/widgets/menus/gal-view-factory-etable.c
@@ -0,0 +1,101 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * gal-view-factory.c: A View Factory
+ *
+ * Authors:
+ * Chris Lahey (clahey@helixcode.com)
+ *
+ * (C) 2000 Helix Code, Inc.
+ */
+#include <config.h>
+#include "gal-view-factory-etable.h"
+#include "gal-view-etable.h"
+#include <libgnome/gnome-defs.h>
+#include <libgnome/gnome-i18n.h>
+
+#define GVFE_CLASS(e) ((GalViewFactoryEtableClass *)((GtkObject *)e)->klass)
+
+#define PARENT_TYPE gal_view_factory_get_type ()
+
+static GalViewFactoryClass *gal_view_factory_etable_parent_class;
+
+static const char *
+gal_view_factory_etable_get_title (GalViewFactory *factory)
+{
+ return _("Table");
+}
+
+static GalView *
+gal_view_factory_etable_new_view (GalViewFactory *factory,
+ const char *name)
+{
+ return gal_view_etable_new(GAL_VIEW_FACTORY_ETABLE(factory)->spec);
+}
+
+static void
+gal_view_factory_etable_destroy (GtkObject *object)
+{
+ GalViewFactoryEtable *factory = GAL_VIEW_FACTORY_ETABLE(object);
+
+ if (factory->spec)
+ gtk_object_unref(GTK_OBJECT(factory->spec));
+}
+
+static void
+gal_view_factory_etable_class_init (GtkObjectClass *object_class)
+{
+ GalViewFactoryClass *view_factory_class = GAL_VIEW_FACTORY_CLASS(object_class);
+ gal_view_factory_etable_parent_class = gtk_type_class (PARENT_TYPE);
+
+ view_factory_class->get_title = gal_view_factory_etable_get_title;
+ view_factory_class->new_view = gal_view_factory_etable_new_view;
+
+ object_class->destroy = gal_view_factory_etable_destroy;
+}
+
+static void
+gal_view_factory_etable_init (GalViewFactoryEtable *factory)
+{
+ factory->spec = NULL;
+}
+
+GalViewFactory *
+gal_view_factory_etable_new (ETableSpecification *spec)
+{
+ return gal_view_factory_etable_construct (gtk_type_new (gal_view_factory_etable_get_type ()), spec);
+}
+
+GalViewFactory *
+gal_view_factory_etable_construct (GalViewFactoryEtable *factory,
+ ETableSpecification *spec)
+{
+ if (spec)
+ gtk_object_ref(GTK_OBJECT(spec));
+ factory->spec = spec;
+ return GAL_VIEW_FACTORY(factory);
+}
+
+GtkType
+gal_view_factory_etable_get_type (void)
+{
+ static guint type = 0;
+
+ if (!type)
+ {
+ GtkTypeInfo info =
+ {
+ "GalViewFactoryEtable",
+ sizeof (GalViewFactoryEtable),
+ sizeof (GalViewFactoryEtableClass),
+ (GtkClassInitFunc) gal_view_factory_etable_class_init,
+ (GtkObjectInitFunc) gal_view_factory_etable_init,
+ /* reserved_1 */ NULL,
+ /* reserved_2 */ NULL,
+ (GtkClassInitFunc) NULL,
+ };
+
+ type = gtk_type_unique (PARENT_TYPE, &info);
+ }
+
+ return type;
+}
diff --git a/widgets/menus/gal-view-factory-etable.h b/widgets/menus/gal-view-factory-etable.h
new file mode 100644
index 0000000000..226eac922a
--- /dev/null
+++ b/widgets/menus/gal-view-factory-etable.h
@@ -0,0 +1,31 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+#ifndef _GAL_VIEW_FACTORY_ETABLE_H_
+#define _GAL_VIEW_FACTORY_ETABLE_H_
+
+#include <gtk/gtkobject.h>
+#include <gal/menus/gal-view-factory.h>
+#include <gal/e-table/e-table-specification.h>
+
+#define GAL_VIEW_FACTORY_ETABLE_TYPE (gal_view_factory_etable_get_type ())
+#define GAL_VIEW_FACTORY_ETABLE(o) (GTK_CHECK_CAST ((o), GAL_VIEW_FACTORY_ETABLE_TYPE, GalViewFactoryEtable))
+#define GAL_VIEW_FACTORY_ETABLE_CLASS(k) (GTK_CHECK_CLASS_CAST((k), GAL_VIEW_FACTORY_ETABLE_TYPE, GalViewFactoryEtableClass))
+#define GAL_IS_VIEW_FACTORY_ETABLE(o) (GTK_CHECK_TYPE ((o), GAL_VIEW_FACTORY_ETABLE_TYPE))
+#define GAL_IS_VIEW_FACTORY_ETABLE_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), GAL_VIEW_FACTORY_ETABLE_TYPE))
+
+typedef struct {
+ GalViewFactory base;
+
+ ETableSpecification *spec;
+} GalViewFactoryEtable;
+
+typedef struct {
+ GalViewFactoryClass parent_class;
+} GalViewFactoryEtableClass;
+
+/* Standard functions */
+GtkType gal_view_factory_etable_get_type (void);
+GalViewFactory *gal_view_factory_etable_new (ETableSpecification *spec);
+GalViewFactory *gal_view_factory_etable_construct (GalViewFactoryEtable *factory,
+ ETableSpecification *spec);
+
+#endif /* _GAL_VIEW_FACTORY_ETABLE_H_ */
diff --git a/widgets/menus/gal-view-factory.c b/widgets/menus/gal-view-factory.c
new file mode 100644
index 0000000000..e9f36d806f
--- /dev/null
+++ b/widgets/menus/gal-view-factory.c
@@ -0,0 +1,93 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * gal-view-factory.c: A View Factory
+ *
+ * Authors:
+ * Chris Lahey (clahey@helixcode.com)
+ *
+ * (C) 2000 Helix Code, Inc.
+ */
+#include <config.h>
+#include "gal-view-factory.h"
+
+#define GVF_CLASS(e) ((GalViewFactoryClass *)((GtkObject *)e)->klass)
+
+#define PARENT_TYPE gtk_object_get_type ()
+
+#define d(x)
+
+d(static gint depth = 0);
+
+static GtkObjectClass *gal_view_factory_parent_class;
+
+/**
+ * gal_view_factory_get_title
+ * @factory: The factory to query.
+ *
+ * Returns: The title of the factory.
+ */
+const char *
+gal_view_factory_get_title (GalViewFactory *factory)
+{
+ g_return_val_if_fail (factory != NULL, 0);
+ g_return_val_if_fail (GAL_IS_VIEW (factory), 0);
+
+ if (GVF_CLASS (factory)->get_title)
+ return GVF_CLASS (factory)->get_title (factory);
+ else
+ return NULL;
+}
+
+/**
+ * gal_view_factory_new_view
+ * @factory: The factory to use
+ *
+ * Returns: The new view
+ */
+GalView *
+gal_view_factory_new_view (GalViewFactory *factory,
+ const char *name)
+{
+ g_return_val_if_fail (factory != NULL, 0);
+ g_return_val_if_fail (GAL_IS_VIEW (factory), 0);
+
+ if (GVF_CLASS (factory)->new_view)
+ return GVF_CLASS (factory)->new_view (factory, name);
+ else
+ return NULL;
+}
+
+static void
+gal_view_factory_class_init (GtkObjectClass *object_class)
+{
+ GalViewFactoryClass *klass = GAL_VIEW_FACTORY_CLASS(object_class);
+ gal_view_factory_parent_class = gtk_type_class (PARENT_TYPE);
+
+ klass->get_title = NULL;
+ klass->new_view = NULL;
+}
+
+GtkType
+gal_view_factory_get_type (void)
+{
+ static guint type = 0;
+
+ if (!type)
+ {
+ GtkTypeInfo info =
+ {
+ "GalViewFactory",
+ sizeof (GalViewFactory),
+ sizeof (GalViewFactoryClass),
+ (GtkClassInitFunc) gal_view_factory_class_init,
+ NULL,
+ /* reserved_1 */ NULL,
+ /* reserved_2 */ NULL,
+ (GtkClassInitFunc) NULL,
+ };
+
+ type = gtk_type_unique (PARENT_TYPE, &info);
+ }
+
+ return type;
+}
diff --git a/widgets/menus/gal-view-factory.h b/widgets/menus/gal-view-factory.h
new file mode 100644
index 0000000000..724235d7a6
--- /dev/null
+++ b/widgets/menus/gal-view-factory.h
@@ -0,0 +1,47 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+#ifndef _GAL_VIEW_FACTORY_H_
+#define _GAL_VIEW_FACTORY_H_
+
+#include <gtk/gtkobject.h>
+#include <gal/menus/gal-view.h>
+
+#define GAL_VIEW_FACTORY_TYPE (gal_view_factory_get_type ())
+#define GAL_VIEW_FACTORY(o) (GTK_CHECK_CAST ((o), GAL_VIEW_FACTORY_TYPE, GalViewFactory))
+#define GAL_VIEW_FACTORY_CLASS(k) (GTK_CHECK_CLASS_CAST((k), GAL_VIEW_FACTORY_TYPE, GalViewFactoryClass))
+#define GAL_IS_VIEW_FACTORY(o) (GTK_CHECK_TYPE ((o), GAL_VIEW_FACTORY_TYPE))
+#define GAL_IS_VIEW_FACTORY_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), GAL_VIEW_FACTORY_TYPE))
+
+typedef struct {
+ GtkObject base;
+} GalViewFactory;
+
+typedef struct {
+ GtkObjectClass parent_class;
+
+ /*
+ * Virtual methods
+ */
+ const char *(*get_title) (GalViewFactory *factory);
+ const char *(*get_type_code) (GalViewFactory *factory);
+ GalView *(*new_view) (GalViewFactory *factory,
+ const char *name);
+} GalViewFactoryClass;
+
+/* Standard functions */
+GtkType gal_view_factory_get_type (void);
+
+/* Query functions */
+/* Returns already translated title. */
+const char *gal_view_factory_get_title (GalViewFactory *factory);
+
+/* Returns the code for use in identifying this type of object in the
+ * view list. This identifier should identify this as being the
+ * unique factory for xml files which were written out with this
+ * identifier. Thus each factory should have a unique type code. */
+const char *gal_view_factory_get_type_code (GalViewFactory *factory);
+
+/* Create a new view */
+GalView *gal_view_factory_new_view (GalViewFactory *factory,
+ const char *name);
+
+#endif /* _GAL_VIEW_FACTORY_H_ */
diff --git a/widgets/menus/gal-view-new-dialog.c b/widgets/menus/gal-view-new-dialog.c
index 5ab5d511d0..aee6e3f0d0 100644
--- a/widgets/menus/gal-view-new-dialog.c
+++ b/widgets/menus/gal-view-new-dialog.c
@@ -39,6 +39,7 @@ static GnomeDialogClass *parent_class = NULL;
enum {
ARG_0,
ARG_NAME,
+ ARG_FACTORY,
};
GtkType
@@ -80,36 +81,18 @@ gal_view_new_dialog_class_init (GalViewNewDialogClass *klass)
gtk_object_add_arg_type ("GalViewNewDialog::name", GTK_TYPE_STRING,
GTK_ARG_READWRITE, ARG_NAME);
+ gtk_object_add_arg_type ("GalViewNewDialog::factory", GTK_TYPE_OBJECT,
+ GTK_ARG_READABLE, ARG_FACTORY);
}
-#if 0
-#define SPEC "<ETableSpecification cursor-mode=\"line\" draw-grid=\"true\">" \
- "<ETableColumn model_col= \"0\" _tite=\"Name\" expansion=\"1.0\" minimum_width=\"18\" resizable=\"true\" cell=\"string\" compare=\"string\"/>" \
- "<ETableState> <column source=\"0\"/> <grouping> </grouping> </ETableState>" \
- "</ETableSpecification>"
-
-/* For use from libglade. */
-GtkWidget *gal_view_new_dialog_create_etable(char *name, char *string1, char *string2, int int1, int int2);
-
-GtkWidget *
-gal_view_new_dialog_create_etable(char *name, char *string1, char *string2, int int1, int int2)
-{
- GtkWidget *table;
- ETableModel *model;
- model = gal_define_views_model_new();
- table = e_table_scrolled_new(model, NULL, SPEC, NULL);
- return table;
-}
-#endif
-
static void
-gal_view_new_dialog_init (GalViewNewDialog *gal_view_new_dialog)
+gal_view_new_dialog_init (GalViewNewDialog *dialog)
{
GladeXML *gui;
GtkWidget *widget;
gui = glade_xml_new (GAL_GLADEDIR "/gal-view-new-dialog.glade", NULL);
- gal_view_new_dialog->gui = gui;
+ dialog->gui = gui;
widget = glade_xml_get_widget(gui, "table-top");
if (!widget) {
@@ -117,15 +100,18 @@ gal_view_new_dialog_init (GalViewNewDialog *gal_view_new_dialog)
}
gtk_widget_ref(widget);
gtk_widget_unparent(widget);
- gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(gal_view_new_dialog)->vbox), widget, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(dialog)->vbox), widget, TRUE, TRUE, 0);
gtk_widget_unref(widget);
- gnome_dialog_append_buttons(GNOME_DIALOG(gal_view_new_dialog),
+ gnome_dialog_append_buttons(GNOME_DIALOG(dialog),
GNOME_STOCK_BUTTON_OK,
GNOME_STOCK_BUTTON_CANCEL,
NULL);
-
- gtk_window_set_policy(GTK_WINDOW(gal_view_new_dialog), FALSE, TRUE, FALSE);
+
+ gtk_window_set_policy(GTK_WINDOW(dialog), FALSE, TRUE, FALSE);
+
+ dialog->collection = NULL;
+ dialog->selected_factory = NULL;
}
static void
@@ -136,12 +122,56 @@ gal_view_new_dialog_destroy (GtkObject *object) {
}
GtkWidget*
-gal_view_new_dialog_new (void)
+gal_view_new_dialog_new (GalViewCollection *collection)
{
- GtkWidget *widget = GTK_WIDGET (gtk_type_new (gal_view_new_dialog_get_type ()));
+ GtkWidget *widget =
+ gal_view_new_dialog_construct(gtk_type_new (gal_view_new_dialog_get_type ()),
+ collection);
return widget;
}
+
+static void
+gal_view_new_dialog_select_row_callback(GtkCList *list,
+ gint row,
+ gint column,
+ GdkEventButton *event,
+ GalViewNewDialog *dialog)
+{
+ dialog->selected_factory = gtk_clist_get_row_data(list,
+ row);
+}
+
+GtkWidget*
+gal_view_new_dialog_construct (GalViewNewDialog *dialog,
+ GalViewCollection *collection)
+{
+ GtkWidget *list = glade_xml_get_widget(dialog->gui,
+ "clist-type-list");
+ GList *iterator;
+ dialog->collection = collection;
+
+ iterator = dialog->collection->factory_list;
+
+ for ( ; iterator; iterator = g_list_next(iterator) ) {
+ GalViewFactory *factory = iterator->data;
+ char *text[1];
+ int row;
+
+ gtk_object_ref(GTK_OBJECT(factory));
+ text[0] = (char *) gal_view_factory_get_title(factory);
+ row = gtk_clist_append(GTK_CLIST(list), text);
+ gtk_clist_set_row_data(GTK_CLIST(list), row, factory);
+ }
+
+ gtk_signal_connect(GTK_OBJECT (list),
+ "select_row",
+ GTK_SIGNAL_FUNC(gal_view_new_dialog_select_row_callback),
+ dialog);
+
+ return GTK_WIDGET(dialog);
+}
+
static void
gal_view_new_dialog_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
{
@@ -177,6 +207,9 @@ gal_view_new_dialog_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
GTK_VALUE_STRING(*arg) = e_utf8_gtk_editable_get_text(GTK_EDITABLE(entry));
}
break;
+ case ARG_FACTORY:
+ GTK_VALUE_OBJECT(*arg) = dialog->selected_factory ? GTK_OBJECT(dialog->selected_factory) : NULL;
+ break;
default:
arg->type = GTK_TYPE_INVALID;
break;
diff --git a/widgets/menus/gal-view-new-dialog.glade b/widgets/menus/gal-view-new-dialog.glade
index aba8dc6b0f..02d9866d49 100644
--- a/widgets/menus/gal-view-new-dialog.glade
+++ b/widgets/menus/gal-view-new-dialog.glade
@@ -81,7 +81,7 @@
<widget>
<class>GtkTable</class>
<name>table-top</name>
- <rows>2</rows>
+ <rows>4</rows>
<columns>1</columns>
<homogeneous>False</homogeneous>
<row_spacing>6</row_spacing>
@@ -95,13 +95,14 @@
<widget>
<class>GtkLabel</class>
<name>label1</name>
- <label>_Name of new view:</label>
+ <label>Name of new view:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
+ <focus_target>entry-name</focus_target>
<child>
<left_attach>0</left_attach>
<right_attach>1</right_attach>
@@ -141,6 +142,79 @@
<yfill>True</yfill>
</child>
</widget>
+
+ <widget>
+ <class>GtkLabel</class>
+ <name>label2</name>
+ <label>Type of view:</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <wrap>False</wrap>
+ <xalign>0</xalign>
+ <yalign>0.5</yalign>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <child>
+ <left_attach>0</left_attach>
+ <right_attach>1</right_attach>
+ <top_attach>2</top_attach>
+ <bottom_attach>3</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>False</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>False</yfill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkScrolledWindow</class>
+ <name>scrolledwindow1</name>
+ <hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy>
+ <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
+ <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
+ <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
+ <child>
+ <left_attach>0</left_attach>
+ <right_attach>1</right_attach>
+ <top_attach>3</top_attach>
+ <bottom_attach>4</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>False</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+
+ <widget>
+ <class>GtkCList</class>
+ <name>clist-type-list</name>
+ <can_focus>True</can_focus>
+ <columns>1</columns>
+ <column_widths>80</column_widths>
+ <selection_mode>GTK_SELECTION_SINGLE</selection_mode>
+ <show_titles>False</show_titles>
+ <shadow_type>GTK_SHADOW_IN</shadow_type>
+
+ <widget>
+ <class>GtkLabel</class>
+ <child_name>CList:title</child_name>
+ <name>label5</name>
+ <label>label5</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <wrap>False</wrap>
+ <xalign>0.5</xalign>
+ <yalign>0.5</yalign>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ </widget>
+ </widget>
+ </widget>
</widget>
</widget>
</widget>
diff --git a/widgets/menus/gal-view-new-dialog.h b/widgets/menus/gal-view-new-dialog.h
index 79f04d06b4..de4fcc9387 100644
--- a/widgets/menus/gal-view-new-dialog.h
+++ b/widgets/menus/gal-view-new-dialog.h
@@ -23,6 +23,7 @@
#include <gnome.h>
#include <glade/glade.h>
+#include <gal-view-collection.h>
#ifdef __cplusplus
extern "C" {
@@ -52,6 +53,9 @@ struct _GalViewNewDialog
/* item specific fields */
GladeXML *gui;
+
+ GalViewCollection *collection;
+ GalViewFactory *selected_factory;
};
struct _GalViewNewDialogClass
@@ -59,8 +63,11 @@ struct _GalViewNewDialogClass
GnomeDialogClass parent_class;
};
-GtkWidget *gal_view_new_dialog_new (void);
-GtkType gal_view_new_dialog_get_type (void);
+GtkWidget *gal_view_new_dialog_new (GalViewCollection *collection);
+GtkType gal_view_new_dialog_get_type (void);
+
+GtkWidget *gal_view_new_dialog_construct (GalViewNewDialog *dialog,
+ GalViewCollection *collection);
#ifdef __cplusplus
}
diff --git a/widgets/menus/gal-view.c b/widgets/menus/gal-view.c
index 19c9d50f85..1ff9ffab16 100644
--- a/widgets/menus/gal-view.c
+++ b/widgets/menus/gal-view.c
@@ -1,97 +1,123 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
- * gal-view-menus.c: Savable state of a table.
+ * gal-view.c: A View
*
- * Author:
- * Chris Lahey <clahey@helixcode.com>
+ * Authors:
+ * Chris Lahey (clahey@helixcode.com)
*
* (C) 2000 Helix Code, Inc.
*/
#include <config.h>
-#include <stdlib.h>
-#include <gtk/gtksignal.h>
#include "gal-view.h"
-#include <gal/util/e-util.h>
-static void gal_view_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
-static void gal_view_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
+#define GV_CLASS(e) ((GalViewClass *)((GtkObject *)e)->klass)
-#define PARENT_TYPE (gtk_object_get_type())
+#define PARENT_TYPE gtk_object_get_type ()
-static GtkObjectClass *gv_parent_class;
+#define d(x)
-enum {
- ARG_0,
- ARG_NAME,
-};
+d(static gint depth = 0);
-static void
-gv_destroy (GtkObject *object)
-{
- GalView *gv = GAL_VIEW (object);
- g_free(gv->name);
+static GtkObjectClass *gal_view_parent_class;
+
+/**
+ * gal_view_edit
+ * @view: The view to edit
+ */
+void
+gal_view_edit (GalView *view)
+{
+ g_return_if_fail (view != NULL);
+ g_return_if_fail (GAL_IS_VIEW (view));
- GTK_OBJECT_CLASS (gv_parent_class)->destroy (object);
+ if (GV_CLASS (view)->edit)
+ GV_CLASS (view)->edit (view);
}
-static void
-gal_view_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
+/**
+ * gal_view_load_from_node
+ * @view: The view to load to
+ * @node: The xml data to load
+ */
+void
+gal_view_load_from_node (GalView *view,
+ xmlNode *node)
{
- GalView *view;
+ g_return_if_fail (view != NULL);
+ g_return_if_fail (GAL_IS_VIEW (view));
- view = GAL_VIEW (o);
-
- switch (arg_id){
- case ARG_NAME:
- g_free(view->name);
- view->name = g_strdup(GTK_VALUE_STRING (*arg));
- break;
- }
+ if (GV_CLASS (view)->load_from_node)
+ GV_CLASS (view)->load_from_node (view, node);
}
-static void
-gal_view_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
+/**
+ * gal_view_save_to_node
+ * @view: The view to save
+ * @parent: Save the data as a child of this node
+ */
+void
+gal_view_save_to_node (GalView *view,
+ xmlNode *parent)
{
- GalView *view;
+ g_return_if_fail (view != NULL);
+ g_return_if_fail (GAL_IS_VIEW (view));
- view = GAL_VIEW (object);
-
- switch (arg_id) {
- case ARG_NAME:
- GTK_VALUE_STRING (*arg) = g_strdup(view->name);
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
+ if (GV_CLASS (view)->save_to_node)
+ GV_CLASS (view)->save_to_node (view, parent);
}
-static void
-gv_init (GalView *view)
+/**
+ * gal_view_get_title
+ * @view: The view to query.
+ *
+ * Returns: The title of the view.
+ */
+const char *
+gal_view_get_title (GalView *view)
{
- view->name = NULL;
+ g_return_val_if_fail (view != NULL, NULL);
+ g_return_val_if_fail (GAL_IS_VIEW (view), NULL);
+
+ if (GV_CLASS (view)->get_title)
+ return GV_CLASS (view)->get_title (view);
+ else
+ return NULL;
}
static void
-gv_class_init (GtkObjectClass *klass)
+gal_view_class_init (GtkObjectClass *object_class)
{
- gv_parent_class = gtk_type_class (PARENT_TYPE);
+ GalViewClass *klass = GAL_VIEW_CLASS(object_class);
+ gal_view_parent_class = gtk_type_class (PARENT_TYPE);
- klass->destroy = gv_destroy;
- klass->set_arg = gal_view_set_arg;
- klass->get_arg = gal_view_get_arg;
-
- gtk_object_add_arg_type ("GalView::name", GTK_TYPE_STRING,
- GTK_ARG_READWRITE, ARG_NAME);
+ klass->edit = NULL;
+ klass->load_from_node = NULL;
+ klass->save_to_node = NULL;
+ klass->get_title = NULL;
}
-E_MAKE_TYPE(gal_view, "GalView", GalView, gv_class_init, gv_init, PARENT_TYPE);
-
-GalView *
-gal_view_new (void)
+GtkType
+gal_view_get_type (void)
{
- GalView *gv = gtk_type_new (GAL_VIEW_TYPE);
+ static guint type = 0;
+
+ if (!type)
+ {
+ GtkTypeInfo info =
+ {
+ "GalView",
+ sizeof (GalView),
+ sizeof (GalViewClass),
+ (GtkClassInitFunc) gal_view_class_init,
+ NULL,
+ /* reserved_1 */ NULL,
+ /* reserved_2 */ NULL,
+ (GtkClassInitFunc) NULL,
+ };
+
+ type = gtk_type_unique (PARENT_TYPE, &info);
+ }
- return (GalView *) gv;
+ return type;
}
diff --git a/widgets/menus/gal-view.h b/widgets/menus/gal-view.h
index ba29e17fc7..7894e043dc 100644
--- a/widgets/menus/gal-view.h
+++ b/widgets/menus/gal-view.h
@@ -13,14 +13,36 @@
typedef struct {
GtkObject base;
- char *name;
} GalView;
typedef struct {
GtkObjectClass parent_class;
+
+ /*
+ * Virtual methods
+ */
+ void (*edit) (GalView *view);
+ void (*load_from_node) (GalView *view,
+ xmlNode *node);
+ void (*save_to_node) (GalView *view,
+ xmlNode *parent);
+ const char *(*get_title) (GalView *view);
} GalViewClass;
-GtkType gal_view_get_type (void);
-GalView *gal_view_new (void);
+/* Standard functions */
+GtkType gal_view_get_type (void);
+
+/* Open an editor dialog for this view. */
+void gal_view_edit (GalView *view);
+
+/* xml load and save functions */
+void gal_view_load_from_node (GalView *view,
+ xmlNode *node);
+void gal_view_save_to_node (GalView *view,
+ xmlNode *parent);
+
+/* Query functions */
+const char *gal_view_get_title (GalView *view);
+
#endif /* _GAL_VIEW_H_ */