diff options
Diffstat (limited to 'widgets/menus/gal-view-etable.c')
-rw-r--r-- | widgets/menus/gal-view-etable.c | 145 |
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); } |