aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/menus/gal-view-etable.c
diff options
context:
space:
mode:
Diffstat (limited to 'widgets/menus/gal-view-etable.c')
-rw-r--r--widgets/menus/gal-view-etable.c145
1 files changed, 122 insertions, 23 deletions
diff --git a/widgets/menus/gal-view-etable.c b/widgets/menus/gal-view-etable.c
index 24d9815034..87351866bd 100644
--- a/widgets/menus/gal-view-etable.c
+++ b/widgets/menus/gal-view-etable.c
@@ -30,6 +30,31 @@
static GalViewClass *gal_view_etable_parent_class;
+static void
+detach_table (GalViewEtable *view)
+{
+ if (view->table == NULL)
+ return;
+ if (view->table_state_changed_id) {
+ gtk_signal_disconnect (GTK_OBJECT (view->table),
+ view->table_state_changed_id);
+ }
+ gtk_object_unref (GTK_OBJECT (view->table));
+ view->table = NULL;
+}
+
+static void
+detach_tree (GalViewEtable *view)
+{
+ if (view->tree == NULL)
+ return;
+ if (view->tree_state_changed_id) {
+ gtk_signal_disconnect (GTK_OBJECT (view->tree),
+ view->tree_state_changed_id);
+ }
+ gtk_object_unref (GTK_OBJECT (view->tree));
+ view->tree = NULL;
+}
static void
config_changed (ETableConfig *config, GalViewEtable *view)
@@ -79,8 +104,8 @@ gal_view_etable_get_title (GalView *view)
}
static void
-gal_view_etable_set_title (GalView *view,
- const char *title)
+gal_view_etable_set_title (GalView *view,
+ const char *title)
{
g_free(GAL_VIEW_ETABLE(view)->title);
GAL_VIEW_ETABLE(view)->title = g_strdup(title);
@@ -113,6 +138,9 @@ static void
gal_view_etable_destroy (GtkObject *object)
{
GalViewEtable *view = GAL_VIEW_ETABLE(object);
+
+ gal_view_etable_detach (view);
+
g_free(view->title);
if (view->spec)
gtk_object_unref(GTK_OBJECT(view->spec));
@@ -148,6 +176,31 @@ gal_view_etable_init (GalViewEtable *gve)
gve->title = NULL;
}
+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;
+}
+
/**
* gal_view_etable_new
* @spec: The ETableSpecification that this view will be based upon.
@@ -194,27 +247,73 @@ gal_view_etable_construct (GalViewEtable *view,
return GAL_VIEW(view);
}
-GtkType
-gal_view_etable_get_type (void)
+void
+gal_view_etable_set_state (GalViewEtable *view, ETableState *state)
{
- 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);
- }
+ if (view->state)
+ gtk_object_unref(GTK_OBJECT(view->state));
+ view->state = e_table_state_duplicate(state);
- return type;
+ gal_view_changed(GAL_VIEW(view));
+}
+
+static void
+table_state_changed (ETable *table, GalViewEtable *view)
+{
+ ETableState *state;
+
+ state = e_table_get_state_object (table);
+ gtk_object_unref (GTK_OBJECT (view->state));
+ view->state = state;
+
+ gal_view_changed(GAL_VIEW(view));
+}
+
+static void
+tree_state_changed (ETree *tree, GalViewEtable *view)
+{
+ ETableState *state;
+
+ state = e_tree_get_state_object (tree);
+ gtk_object_unref (GTK_OBJECT (view->state));
+ view->state = state;
+
+ gal_view_changed(GAL_VIEW(view));
+}
+
+void
+gal_view_etable_attach_table (GalViewEtable *view, ETable *table)
+{
+ gal_view_etable_detach (view);
+
+ view->table = table;
+
+ e_table_set_state_object(view->table, view->state);
+ gtk_object_ref (GTK_OBJECT (view->table));
+ view->table_state_changed_id =
+ gtk_signal_connect(GTK_OBJECT(view->table), "state_change",
+ GTK_SIGNAL_FUNC (table_state_changed), view);
+}
+
+void
+gal_view_etable_attach_tree (GalViewEtable *view, ETree *tree)
+{
+ gal_view_etable_detach (view);
+
+ view->tree = tree;
+
+ e_tree_set_state_object(view->tree, view->state);
+ gtk_object_ref (GTK_OBJECT (view->tree));
+ view->tree_state_changed_id =
+ gtk_signal_connect(GTK_OBJECT(view->tree), "state_change",
+ GTK_SIGNAL_FUNC (tree_state_changed), view);
+}
+
+void
+gal_view_etable_detach (GalViewEtable *view)
+{
+ if (view->table != NULL)
+ detach_table (view);
+ if (view->tree != NULL)
+ detach_tree (view);
}