diff options
-rw-r--r-- | ChangeLog | 42 | ||||
-rw-r--r-- | components/notes/nautilus-notes.c | 32 | ||||
-rw-r--r-- | components/notes/ntl-notes.c | 32 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-entry.c | 12 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-icon-text-item.c | 23 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-undo-manager.c | 127 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-undo-manager.h | 20 | ||||
-rw-r--r-- | libnautilus-private/nautilus-entry.c | 12 | ||||
-rw-r--r-- | libnautilus-private/nautilus-icon-text-item.c | 23 | ||||
-rw-r--r-- | libnautilus-private/nautilus-undo-manager.c | 127 | ||||
-rw-r--r-- | libnautilus-private/nautilus-undo-manager.h | 20 | ||||
-rw-r--r-- | libnautilus/nautilus-undo-manager.c | 127 | ||||
-rw-r--r-- | libnautilus/nautilus-undo-manager.h | 20 | ||||
-rw-r--r-- | libnautilus/nautilus-undo-transaction.c | 187 | ||||
-rw-r--r-- | libnautilus/nautilus-undo-transaction.h | 26 |
15 files changed, 587 insertions, 243 deletions
@@ -1,3 +1,45 @@ +2000-05-19 Gene Z. Ragan <gzr@eazel.com> + + More undo framework work. Still incomplete. + + * libnautilus-extensions/nautilus-entry.c: + (nautilus_entry_changed): + Modified to use new undo manager location API + + * libnautilus-extensions/nautilus-icon-text-item.c: + (iti_event), + (restore_from_undo_snapshot_callback): + Modified to use new undo manager location API + + * libnautilus/nautilus-undo-manager.c: + * libnautilus/nautilus-undo-manager.h: + (impl_Nautilus_Undo_Manager__create), + (impl_Nautilus_Undo_Manager__append), + (impl_Nautilus_Undo_Manager__forget), + (nautilus_undo_manager_begin_transaction), + (nautilus_undo_manager_end_transaction), + (nautilus_undo_manager_undo), (nautilus_undo_manager_redo), + (nautilus_undo_manager_add_transaction), + (nautilus_undo_manager_unregister_object), + (free_undo_manager_list_data), (prune_undo_manager_list): + Modified to use new API and Undo::Manager::Transaction + + * libnautilus/nautilus-undo-transaction.c: + * libnautilus/nautilus-undo-transaction.h: + (impl_Nautilus_Undo_Transaction__destroy), + (impl_Nautilus_Undo_Transaction__create), + (impl_Nautilus_Undo_Transaction__get_undo_description), + (impl_Nautilus_Undo_Transaction__get_redo_description), + (impl_Nautilus_Undo_Transaction__get_base_description), + (impl_Nautilus_Undo_Transaction__undo), + (nautilus_undo_transaction_new), + (nautilus_undo_transaction_initialize), + (nautilus_undo_transaction_destroy), + (nautilus_undo_transaction_initialize_class), + (nautilus_undo_transaction_undo), + (nautilus_undo_transaction_contains_object): + Added support for new Undo::Manager::Transaction object + 2000-05-19 Ali Abdin <aliabdin@aucegypt.edu> * components/help/converters/gnome-db2html2/gdb3html.c: diff --git a/components/notes/nautilus-notes.c b/components/notes/nautilus-notes.c index 078a0be39..b370ecadc 100644 --- a/components/notes/nautilus-notes.c +++ b/components/notes/nautilus-notes.c @@ -39,6 +39,8 @@ #include <libnautilus-extensions/nautilus-file.h> #include <libnautilus-extensions/nautilus-debug.h> #include <libnautilus/nautilus-clipboard.h> +#include <libnautilus/nautilus-undo-manager.h> +#include <libnautilus/nautilus-undo.h> #define NOTES_DEFAULT_BACKGROUND_COLOR "rgb:FFFF/FFFF/BBBB" @@ -120,6 +122,36 @@ notes_notify_location_change (NautilusViewFrame *view, notes->uri = g_strdup (loci->requested_uri); notes_load_metainfo (notes); } + +#if 0 + { + CORBA_Environment ev; + Nautilus_Undo_Manager undo_manager; + Nautilus_Undo_Transaction undo_transaction; + NautilusUndoTransaction *transaction; + BonoboObject *view_control; + + CORBA_exception_init(&ev); + + view_control = nautilus_view_frame_get_bonobo_control (view); + g_assert (view_control); + + undo_manager = bonobo_object_query_interface (view_control, + "IDL:Nautilus/Undo/Context:1.0"); + g_assert (undo_manager); + + transaction = nautilus_undo_transaction_new ("Test"); + g_assert (transaction); + + undo_transaction = bonobo_object_corba_objref (BONOBO_OBJECT (transaction)); + g_assert (undo_transaction); + + Nautilus_Undo_Manager_append (undo_manager, undo_transaction, &ev); + + CORBA_exception_free(&ev); + } +#endif + } diff --git a/components/notes/ntl-notes.c b/components/notes/ntl-notes.c index 078a0be39..b370ecadc 100644 --- a/components/notes/ntl-notes.c +++ b/components/notes/ntl-notes.c @@ -39,6 +39,8 @@ #include <libnautilus-extensions/nautilus-file.h> #include <libnautilus-extensions/nautilus-debug.h> #include <libnautilus/nautilus-clipboard.h> +#include <libnautilus/nautilus-undo-manager.h> +#include <libnautilus/nautilus-undo.h> #define NOTES_DEFAULT_BACKGROUND_COLOR "rgb:FFFF/FFFF/BBBB" @@ -120,6 +122,36 @@ notes_notify_location_change (NautilusViewFrame *view, notes->uri = g_strdup (loci->requested_uri); notes_load_metainfo (notes); } + +#if 0 + { + CORBA_Environment ev; + Nautilus_Undo_Manager undo_manager; + Nautilus_Undo_Transaction undo_transaction; + NautilusUndoTransaction *transaction; + BonoboObject *view_control; + + CORBA_exception_init(&ev); + + view_control = nautilus_view_frame_get_bonobo_control (view); + g_assert (view_control); + + undo_manager = bonobo_object_query_interface (view_control, + "IDL:Nautilus/Undo/Context:1.0"); + g_assert (undo_manager); + + transaction = nautilus_undo_transaction_new ("Test"); + g_assert (transaction); + + undo_transaction = bonobo_object_corba_objref (BONOBO_OBJECT (transaction)); + g_assert (undo_transaction); + + Nautilus_Undo_Manager_append (undo_manager, undo_transaction, &ev); + + CORBA_exception_free(&ev); + } +#endif + } diff --git a/libnautilus-extensions/nautilus-entry.c b/libnautilus-extensions/nautilus-entry.c index dffb13533..d0707eea3 100644 --- a/libnautilus-extensions/nautilus-entry.c +++ b/libnautilus-extensions/nautilus-entry.c @@ -190,7 +190,8 @@ static void nautilus_entry_changed (GtkEditable *editable) { NautilusEntry *entry; - NautilusUndoTransactionInProgress *tip; + NautilusUndoTransaction *transaction; + NautilusUndoManager *manager; g_assert (GTK_IS_EDITABLE (editable)); g_assert (NAUTILUS_IS_ENTRY (editable)); @@ -199,10 +200,13 @@ nautilus_entry_changed (GtkEditable *editable) /* Register undo transaction */ if (!entry->undo_registered && entry->use_undo) { - tip = nautilus_undo_manager_begin_transaction (GTK_OBJECT (entry), _("Edit")); - nautilus_undoable_save_undo_snapshot (tip->transaction, GTK_OBJECT(entry), save_undo_snapshot_callback, + + manager = nautilus_get_undo_manager (GTK_OBJECT (entry)); + g_assert (manager); + transaction = nautilus_undo_manager_begin_transaction (manager, _("Edit")); + nautilus_undoable_save_undo_snapshot (transaction, GTK_OBJECT(entry), save_undo_snapshot_callback, restore_from_undo_snapshot_callback); - nautilus_undo_manager_end_transaction (tip); + nautilus_undo_manager_end_transaction (manager, transaction); entry->undo_registered = TRUE; } diff --git a/libnautilus-extensions/nautilus-icon-text-item.c b/libnautilus-extensions/nautilus-icon-text-item.c index 54f91f023..1a4dad692 100644 --- a/libnautilus-extensions/nautilus-icon-text-item.c +++ b/libnautilus-extensions/nautilus-icon-text-item.c @@ -802,9 +802,9 @@ iti_event (GnomeCanvasItem *item, GdkEvent *event) int idx; double x, y; int cx, cy; - NautilusUndoTransactionInProgress *tip; + NautilusUndoTransaction *transaction; + NautilusUndoManager *manager; - iti = ITI (item); priv = iti->priv; @@ -838,10 +838,11 @@ iti_event (GnomeCanvasItem *item, GdkEvent *event) if (!priv->undo_registered) { priv->undo_registered = TRUE; - tip = nautilus_undo_manager_begin_transaction ( GTK_OBJECT(iti), "Rename"); - nautilus_undoable_save_undo_snapshot (tip->transaction, GTK_OBJECT(iti), + manager = gtk_object_get_data (GTK_OBJECT (iti), NAUTILUS_UNDO_MANAGER_NAME); + transaction = nautilus_undo_manager_begin_transaction ( manager, "Rename"); + nautilus_undoable_save_undo_snapshot (transaction, GTK_OBJECT(iti), save_undo_snapshot_callback, restore_from_undo_snapshot_callback); - nautilus_undo_manager_end_transaction (tip); + nautilus_undo_manager_end_transaction (manager, transaction); } /* Handle any events that reach us */ @@ -1370,16 +1371,18 @@ restore_from_undo_snapshot_callback(NautilusUndoable *undoable) char *undo_text; NautilusIconTextItem *iti; ItiPrivate *priv; - NautilusUndoTransactionInProgress *tip; + NautilusUndoTransaction *transaction; + NautilusUndoManager *manager; iti = NAUTILUS_ICON_TEXT_ITEM(undoable->undo_target_class); priv = iti->priv; - /* Register undo transaction */ - tip = nautilus_undo_manager_begin_transaction (GTK_OBJECT(iti), _("Rename")); - nautilus_undoable_save_undo_snapshot (tip->transaction, GTK_OBJECT(iti), + /* Register undo transaction */ + manager = gtk_object_get_data (GTK_OBJECT (iti), NAUTILUS_UNDO_MANAGER_NAME); + transaction = nautilus_undo_manager_begin_transaction (manager, _("Rename")); + nautilus_undoable_save_undo_snapshot (transaction, GTK_OBJECT(iti), save_undo_snapshot_callback, restore_from_undo_snapshot_callback); - nautilus_undo_manager_end_transaction (tip); + nautilus_undo_manager_end_transaction (manager, transaction); undo_text = g_datalist_get_data(&undoable->undo_data, "undo_text"); if (undo_text != NULL) { diff --git a/libnautilus-extensions/nautilus-undo-manager.c b/libnautilus-extensions/nautilus-undo-manager.c index 8a5dc6c6a..06d530023 100644 --- a/libnautilus-extensions/nautilus-undo-manager.c +++ b/libnautilus-extensions/nautilus-undo-manager.c @@ -46,10 +46,10 @@ static guint signals[LAST_SIGNAL]; typedef struct { - POA_Nautilus_Undo_Manager servant; - gpointer bonobo_object; + POA_Nautilus_Undo_Manager servant; + gpointer bonobo_object; - NautilusUndoManager *gtk_object; + NautilusUndoManager *gtk_object; } impl_POA_Nautilus_Undo_Manager; /* GtkObject */ @@ -61,12 +61,12 @@ static GList *free_undo_manager_list_data (GList *list); static GList *prune_undo_manager_list (GList *list, gint items); /* CORBA/Bonobo */ - -static void impl_Nautilus_Undo_Manager__append (impl_POA_Nautilus_Undo_Manager *servant, - const CORBA_char *name, - CORBA_Environment *ev); -static void impl_Nautilus_Undo_Manager__forget (impl_POA_Nautilus_Undo_Manager *servant, - CORBA_Environment *ev); +static void impl_Nautilus_Undo_Manager__append (impl_POA_Nautilus_Undo_Manager *servant, + const Nautilus_Undo_Transaction transaction, + CORBA_Environment *ev); +static void impl_Nautilus_Undo_Manager__forget (impl_POA_Nautilus_Undo_Manager *servant, + const Nautilus_Undo_Transaction transaction, + CORBA_Environment *ev); NAUTILUS_DEFINE_CLASS_BOILERPLATE(NautilusUndoManager, nautilus_undo_manager, BONOBO_OBJECT_TYPE) @@ -108,7 +108,7 @@ impl_Nautilus_Undo_Manager__destroy(BonoboObject *obj, impl_POA_Nautilus_Undo_Ma } static Nautilus_Undo_Manager -impl_Nautilus_Undo_Manager__create(NautilusUndoManager *manager, CORBA_Environment * ev) +impl_Nautilus_Undo_Manager__create (NautilusUndoManager *manager, CORBA_Environment * ev) { Nautilus_Undo_Manager retval; impl_POA_Nautilus_Undo_Manager *servant; @@ -132,16 +132,25 @@ impl_Nautilus_Undo_Manager__create(NautilusUndoManager *manager, CORBA_Environme return retval; } + static void impl_Nautilus_Undo_Manager__append (impl_POA_Nautilus_Undo_Manager *servant, - const CORBA_char *name, - CORBA_Environment *ev) -{ + const Nautilus_Undo_Transaction undo_transaction, + CORBA_Environment *ev) +{ + NautilusUndoManager *manager; + + g_assert (NAUTILUS_IS_UNDO_MANAGER (servant->gtk_object)); + manager = NAUTILUS_UNDO_MANAGER (servant->gtk_object); + + Bonobo_Unknown_ref (undo_transaction, ev); + nautilus_undo_manager_add_transaction (manager, undo_transaction); } static void impl_Nautilus_Undo_Manager__forget (impl_POA_Nautilus_Undo_Manager *servant, - CORBA_Environment *ev) + const Nautilus_Undo_Transaction transaction, + CORBA_Environment *ev) { } @@ -186,7 +195,7 @@ nautilus_undo_manager_initialize (NautilusUndoManager *manager) } -/* Class initialization function for the NautilusUndoable item. */ +/* Class initialization function for the NautilusUndoManager. */ static void nautilus_undo_manager_initialize_class (NautilusUndoManagerClass *klass) { @@ -214,18 +223,10 @@ nautilus_undo_manager_initialize_class (NautilusUndoManagerClass *klass) } /* nautilus_undo_manager_begin_transaction */ -NautilusUndoTransactionInProgress * -nautilus_undo_manager_begin_transaction (GtkObject *object, const gchar *name) +NautilusUndoTransaction * +nautilus_undo_manager_begin_transaction (NautilusUndoManager *manager, const gchar *name) { - NautilusUndoManager *manager; - NautilusUndoTransactionInProgress *tip; - - /* Locate undo manager. */ - /* FIXME: We can't get a pointer to the actual undo manager, so this - * needs to work through the CORBA interface to the undo manager. - */ - manager = nautilus_get_undo_manager (object); - g_assert (manager != NULL); + NautilusUndoTransaction *transaction; /* We aren't handling nested transactions currently */ if (manager->details->transaction_in_progress) { @@ -233,37 +234,40 @@ nautilus_undo_manager_begin_transaction (GtkObject *object, const gchar *name) return NULL; } - /* Create NautilusUndoTransactionInProgress */ - tip = g_new (NautilusUndoTransactionInProgress, 1); - g_assert(tip); - - tip->manager = manager; - /* Create new transaction */ - tip->transaction = nautilus_undo_transaction_new(name); + transaction = nautilus_undo_transaction_new (name); - tip->manager->details->transaction_in_progress = TRUE; + manager->details->transaction_in_progress = TRUE; - return tip; + return transaction; } /* nautilus_undo_manager_end_transaction */ void -nautilus_undo_manager_end_transaction (NautilusUndoTransactionInProgress *tip) +nautilus_undo_manager_end_transaction (NautilusUndoManager *manager, NautilusUndoTransaction *transaction) { + CORBA_Object undo_transaction; + CORBA_Environment ev; + + CORBA_exception_init(&ev); + /* Verify a transaction is in progress */ - if (!tip->manager->details->transaction_in_progress) { + if (!manager->details->transaction_in_progress) { g_warning("NautilusUndoManager has no current transaction. Begin a transaction first."); return; } - tip->manager->details->transaction_in_progress = FALSE; + manager->details->transaction_in_progress = FALSE; - /* Commit current transaction to undo list */ - nautilus_undo_manager_add_transaction (tip->manager, tip->transaction); + /* Commit current transaction to undo list */ + undo_transaction = bonobo_object_corba_objref (BONOBO_OBJECT (transaction)); + Bonobo_Unknown_ref (undo_transaction, &ev); + nautilus_undo_manager_add_transaction (manager, undo_transaction); /* Fire off signal informing that an undo transaction has occurred */ - gtk_signal_emit (GTK_OBJECT (tip->manager), signals[UNDO_TRANSACTION_OCCURED]); + gtk_signal_emit (GTK_OBJECT (manager), signals[UNDO_TRANSACTION_OCCURED]); + + CORBA_exception_free(&ev); } /* nautilus_undo_manager_undo_last_transaction */ @@ -271,8 +275,11 @@ void nautilus_undo_manager_undo (NautilusUndoManager *manager) { GList *list; - NautilusUndoTransaction *undo_transaction; - + CORBA_Object undo_transaction; + CORBA_Environment ev; + + CORBA_exception_init(&ev); + /* Verify we have a transaction to be undone */ if (manager->details->undo_list == NULL) { g_warning("NautilusUndoManager has no transaction to be undone."); @@ -283,21 +290,23 @@ nautilus_undo_manager_undo (NautilusUndoManager *manager) list = g_list_last(manager->details->undo_list); g_assert(list); undo_transaction = list->data; - manager->details->undo_list = g_list_remove(manager->details->undo_list, list->data); + manager->details->undo_list = g_list_remove (manager->details->undo_list, list->data); /* Undo transaction */ - nautilus_undo_transaction_undo(undo_transaction); + Nautilus_Undo_Transaction_undo (undo_transaction, &ev); /* Place transaction into redo list */ if (manager->details->enable_redo) { /* nautilus_undo_manager_add_redo_transaction (undo_transaction); */ } else { /* Purge transaction */ - nautilus_undo_transaction_destroy(undo_transaction); + bonobo_object_unref (BONOBO_OBJECT (undo_transaction)); } /* Fire off signal informing that an undo transaction has occurred */ gtk_signal_emit (GTK_OBJECT (manager), signals[UNDO_TRANSACTION_OCCURED]); + + CORBA_exception_free(&ev); } /* nautilus_undo_manager_redo_last_undone_transaction */ @@ -305,7 +314,11 @@ void nautilus_undo_manager_redo (NautilusUndoManager *manager) { GList *list; - NautilusUndoTransaction *redo_transaction; + CORBA_Object redo_transaction; + CORBA_Object undo_transaction; + CORBA_Environment ev; + + CORBA_exception_init(&ev); /* Are we allowing redo operations? */ if (manager->details->enable_redo) { @@ -320,19 +333,23 @@ nautilus_undo_manager_redo (NautilusUndoManager *manager) } /* Pop last transaction off redo list */ - list = g_list_last(manager->details->redo_list); + list = g_list_last (manager->details->redo_list); g_assert(list); redo_transaction = list->data; - nautilus_undo_transaction_undo(redo_transaction); + Nautilus_Undo_Transaction_undo (redo_transaction, &ev); /* Place transaction into undo list */ - nautilus_undo_manager_add_transaction (manager, redo_transaction); + undo_transaction = bonobo_object_corba_objref (BONOBO_OBJECT (redo_transaction)); + Bonobo_Unknown_ref (undo_transaction, &ev); + nautilus_undo_manager_add_transaction (manager, undo_transaction); + + CORBA_exception_free(&ev); } /* nautilus_undo_manager_add_undo_transaction */ void -nautilus_undo_manager_add_transaction (NautilusUndoManager *manager, NautilusUndoTransaction *transaction) +nautilus_undo_manager_add_transaction (NautilusUndoManager *manager, Nautilus_Undo_Transaction transaction) { int length; @@ -397,7 +414,7 @@ nautilus_undo_manager_unregister_object (GtkObject *object) if (nautilus_undo_transaction_contains_object (transaction, object)) { manager->details->undo_list = g_list_remove (manager->details->undo_list, transaction); - nautilus_undo_transaction_destroy (transaction); + bonobo_object_unref (BONOBO_OBJECT (transaction)); index--; success = TRUE; } @@ -413,7 +430,7 @@ nautilus_undo_manager_unregister_object (GtkObject *object) if (nautilus_undo_transaction_contains_object(transaction, object)) { manager->details->redo_list = g_list_remove (manager->details->redo_list, transaction); - nautilus_undo_transaction_destroy(transaction); + bonobo_object_unref (BONOBO_OBJECT (transaction)); index--; success = TRUE; } @@ -608,7 +625,7 @@ free_undo_manager_list_data (GList *list) if (list) { transaction = list->data; list = g_list_remove (list, transaction); - nautilus_undo_transaction_destroy (transaction); + bonobo_object_unref (BONOBO_OBJECT (transaction)); } } @@ -632,7 +649,7 @@ prune_undo_manager_list (GList *list, gint items) if (list) { transaction = list->data; list = g_list_remove (list, transaction); - nautilus_undo_transaction_destroy (transaction); + bonobo_object_unref (BONOBO_OBJECT (transaction)); } } diff --git a/libnautilus-extensions/nautilus-undo-manager.h b/libnautilus-extensions/nautilus-undo-manager.h index 57550d438..76205747a 100644 --- a/libnautilus-extensions/nautilus-undo-manager.h +++ b/libnautilus-extensions/nautilus-undo-manager.h @@ -26,7 +26,6 @@ #define NAUTILUS_UNDO_MANAGER_H #include <bonobo/bonobo-object.h> -#include <bonobo/bonobo-persist.h> #include "nautilus-undo-transaction.h" #include "nautilus-undo.h" @@ -42,40 +41,36 @@ #define NAUTILUS_IS_UNDO_MANAGER_CLASS(klass) \ (GTK_CHECK_CLASS_TYPE ((klass), NAUTILUS_TYPE_UNDO_MANAGER)) +#define NAUTILUS_UNDO_MANAGER_NAME "NautilusUndoManager" + typedef struct NautilusUndoManagerClass NautilusUndoManagerClass; typedef struct NautilusUndoManagerDetails NautilusUndoManagerDetails; -typedef struct NautilusUndoTransactionInProgress NautilusUndoTransactionInProgress; struct NautilusUndoManager { - BonoboPersist parent; + BonoboObject parent; NautilusUndoManagerDetails *details; }; struct NautilusUndoManagerClass { - BonoboPersistClass parent_class; + BonoboObjectClass parent_class; void (* undo_transaction_occurred) (GtkObject *object, gpointer data); gpointer servant_init_func, servant_destroy_func, vepv; }; -struct NautilusUndoTransactionInProgress { - NautilusUndoManager *manager; - NautilusUndoTransaction *transaction; - -}; /* GtkObject */ GtkType nautilus_undo_manager_get_type (void); NautilusUndoManager *nautilus_undo_manager_new (void); /* Prototypes */ -NautilusUndoTransactionInProgress *nautilus_undo_manager_begin_transaction (GtkObject *object, const gchar *name); -void nautilus_undo_manager_end_transaction (NautilusUndoTransactionInProgress *transaction); +NautilusUndoTransaction *nautilus_undo_manager_begin_transaction (NautilusUndoManager *manager, const gchar *name); +void nautilus_undo_manager_end_transaction (NautilusUndoManager *manager, NautilusUndoTransaction *transaction); void nautilus_undo_manager_undo (NautilusUndoManager *manager); void nautilus_undo_manager_redo (NautilusUndoManager *manager); void nautilus_undo_manager_add_transaction (NautilusUndoManager *manager, - NautilusUndoTransaction *transaction); + Nautilus_Undo_Transaction transaction); gboolean nautilus_undo_manager_can_undo (NautilusUndoManager *manager); gboolean nautilus_undo_manager_can_redo (NautilusUndoManager *manager); @@ -85,6 +80,7 @@ const gchar *nautilus_undo_manager_get_current_redo_transaction_name (Nautilus void nautilus_undo_manager_enable_redo (NautilusUndoManager *manager, gboolean value); void nautilus_undo_manager_set_queue_depth (NautilusUndoManager *manager, gint depth); + gboolean nautilus_undo_manager_unregister_object (GtkObject *object); void nautilus_attach_undo_manager (GtkObject *object, diff --git a/libnautilus-private/nautilus-entry.c b/libnautilus-private/nautilus-entry.c index dffb13533..d0707eea3 100644 --- a/libnautilus-private/nautilus-entry.c +++ b/libnautilus-private/nautilus-entry.c @@ -190,7 +190,8 @@ static void nautilus_entry_changed (GtkEditable *editable) { NautilusEntry *entry; - NautilusUndoTransactionInProgress *tip; + NautilusUndoTransaction *transaction; + NautilusUndoManager *manager; g_assert (GTK_IS_EDITABLE (editable)); g_assert (NAUTILUS_IS_ENTRY (editable)); @@ -199,10 +200,13 @@ nautilus_entry_changed (GtkEditable *editable) /* Register undo transaction */ if (!entry->undo_registered && entry->use_undo) { - tip = nautilus_undo_manager_begin_transaction (GTK_OBJECT (entry), _("Edit")); - nautilus_undoable_save_undo_snapshot (tip->transaction, GTK_OBJECT(entry), save_undo_snapshot_callback, + + manager = nautilus_get_undo_manager (GTK_OBJECT (entry)); + g_assert (manager); + transaction = nautilus_undo_manager_begin_transaction (manager, _("Edit")); + nautilus_undoable_save_undo_snapshot (transaction, GTK_OBJECT(entry), save_undo_snapshot_callback, restore_from_undo_snapshot_callback); - nautilus_undo_manager_end_transaction (tip); + nautilus_undo_manager_end_transaction (manager, transaction); entry->undo_registered = TRUE; } diff --git a/libnautilus-private/nautilus-icon-text-item.c b/libnautilus-private/nautilus-icon-text-item.c index 54f91f023..1a4dad692 100644 --- a/libnautilus-private/nautilus-icon-text-item.c +++ b/libnautilus-private/nautilus-icon-text-item.c @@ -802,9 +802,9 @@ iti_event (GnomeCanvasItem *item, GdkEvent *event) int idx; double x, y; int cx, cy; - NautilusUndoTransactionInProgress *tip; + NautilusUndoTransaction *transaction; + NautilusUndoManager *manager; - iti = ITI (item); priv = iti->priv; @@ -838,10 +838,11 @@ iti_event (GnomeCanvasItem *item, GdkEvent *event) if (!priv->undo_registered) { priv->undo_registered = TRUE; - tip = nautilus_undo_manager_begin_transaction ( GTK_OBJECT(iti), "Rename"); - nautilus_undoable_save_undo_snapshot (tip->transaction, GTK_OBJECT(iti), + manager = gtk_object_get_data (GTK_OBJECT (iti), NAUTILUS_UNDO_MANAGER_NAME); + transaction = nautilus_undo_manager_begin_transaction ( manager, "Rename"); + nautilus_undoable_save_undo_snapshot (transaction, GTK_OBJECT(iti), save_undo_snapshot_callback, restore_from_undo_snapshot_callback); - nautilus_undo_manager_end_transaction (tip); + nautilus_undo_manager_end_transaction (manager, transaction); } /* Handle any events that reach us */ @@ -1370,16 +1371,18 @@ restore_from_undo_snapshot_callback(NautilusUndoable *undoable) char *undo_text; NautilusIconTextItem *iti; ItiPrivate *priv; - NautilusUndoTransactionInProgress *tip; + NautilusUndoTransaction *transaction; + NautilusUndoManager *manager; iti = NAUTILUS_ICON_TEXT_ITEM(undoable->undo_target_class); priv = iti->priv; - /* Register undo transaction */ - tip = nautilus_undo_manager_begin_transaction (GTK_OBJECT(iti), _("Rename")); - nautilus_undoable_save_undo_snapshot (tip->transaction, GTK_OBJECT(iti), + /* Register undo transaction */ + manager = gtk_object_get_data (GTK_OBJECT (iti), NAUTILUS_UNDO_MANAGER_NAME); + transaction = nautilus_undo_manager_begin_transaction (manager, _("Rename")); + nautilus_undoable_save_undo_snapshot (transaction, GTK_OBJECT(iti), save_undo_snapshot_callback, restore_from_undo_snapshot_callback); - nautilus_undo_manager_end_transaction (tip); + nautilus_undo_manager_end_transaction (manager, transaction); undo_text = g_datalist_get_data(&undoable->undo_data, "undo_text"); if (undo_text != NULL) { diff --git a/libnautilus-private/nautilus-undo-manager.c b/libnautilus-private/nautilus-undo-manager.c index 8a5dc6c6a..06d530023 100644 --- a/libnautilus-private/nautilus-undo-manager.c +++ b/libnautilus-private/nautilus-undo-manager.c @@ -46,10 +46,10 @@ static guint signals[LAST_SIGNAL]; typedef struct { - POA_Nautilus_Undo_Manager servant; - gpointer bonobo_object; + POA_Nautilus_Undo_Manager servant; + gpointer bonobo_object; - NautilusUndoManager *gtk_object; + NautilusUndoManager *gtk_object; } impl_POA_Nautilus_Undo_Manager; /* GtkObject */ @@ -61,12 +61,12 @@ static GList *free_undo_manager_list_data (GList *list); static GList *prune_undo_manager_list (GList *list, gint items); /* CORBA/Bonobo */ - -static void impl_Nautilus_Undo_Manager__append (impl_POA_Nautilus_Undo_Manager *servant, - const CORBA_char *name, - CORBA_Environment *ev); -static void impl_Nautilus_Undo_Manager__forget (impl_POA_Nautilus_Undo_Manager *servant, - CORBA_Environment *ev); +static void impl_Nautilus_Undo_Manager__append (impl_POA_Nautilus_Undo_Manager *servant, + const Nautilus_Undo_Transaction transaction, + CORBA_Environment *ev); +static void impl_Nautilus_Undo_Manager__forget (impl_POA_Nautilus_Undo_Manager *servant, + const Nautilus_Undo_Transaction transaction, + CORBA_Environment *ev); NAUTILUS_DEFINE_CLASS_BOILERPLATE(NautilusUndoManager, nautilus_undo_manager, BONOBO_OBJECT_TYPE) @@ -108,7 +108,7 @@ impl_Nautilus_Undo_Manager__destroy(BonoboObject *obj, impl_POA_Nautilus_Undo_Ma } static Nautilus_Undo_Manager -impl_Nautilus_Undo_Manager__create(NautilusUndoManager *manager, CORBA_Environment * ev) +impl_Nautilus_Undo_Manager__create (NautilusUndoManager *manager, CORBA_Environment * ev) { Nautilus_Undo_Manager retval; impl_POA_Nautilus_Undo_Manager *servant; @@ -132,16 +132,25 @@ impl_Nautilus_Undo_Manager__create(NautilusUndoManager *manager, CORBA_Environme return retval; } + static void impl_Nautilus_Undo_Manager__append (impl_POA_Nautilus_Undo_Manager *servant, - const CORBA_char *name, - CORBA_Environment *ev) -{ + const Nautilus_Undo_Transaction undo_transaction, + CORBA_Environment *ev) +{ + NautilusUndoManager *manager; + + g_assert (NAUTILUS_IS_UNDO_MANAGER (servant->gtk_object)); + manager = NAUTILUS_UNDO_MANAGER (servant->gtk_object); + + Bonobo_Unknown_ref (undo_transaction, ev); + nautilus_undo_manager_add_transaction (manager, undo_transaction); } static void impl_Nautilus_Undo_Manager__forget (impl_POA_Nautilus_Undo_Manager *servant, - CORBA_Environment *ev) + const Nautilus_Undo_Transaction transaction, + CORBA_Environment *ev) { } @@ -186,7 +195,7 @@ nautilus_undo_manager_initialize (NautilusUndoManager *manager) } -/* Class initialization function for the NautilusUndoable item. */ +/* Class initialization function for the NautilusUndoManager. */ static void nautilus_undo_manager_initialize_class (NautilusUndoManagerClass *klass) { @@ -214,18 +223,10 @@ nautilus_undo_manager_initialize_class (NautilusUndoManagerClass *klass) } /* nautilus_undo_manager_begin_transaction */ -NautilusUndoTransactionInProgress * -nautilus_undo_manager_begin_transaction (GtkObject *object, const gchar *name) +NautilusUndoTransaction * +nautilus_undo_manager_begin_transaction (NautilusUndoManager *manager, const gchar *name) { - NautilusUndoManager *manager; - NautilusUndoTransactionInProgress *tip; - - /* Locate undo manager. */ - /* FIXME: We can't get a pointer to the actual undo manager, so this - * needs to work through the CORBA interface to the undo manager. - */ - manager = nautilus_get_undo_manager (object); - g_assert (manager != NULL); + NautilusUndoTransaction *transaction; /* We aren't handling nested transactions currently */ if (manager->details->transaction_in_progress) { @@ -233,37 +234,40 @@ nautilus_undo_manager_begin_transaction (GtkObject *object, const gchar *name) return NULL; } - /* Create NautilusUndoTransactionInProgress */ - tip = g_new (NautilusUndoTransactionInProgress, 1); - g_assert(tip); - - tip->manager = manager; - /* Create new transaction */ - tip->transaction = nautilus_undo_transaction_new(name); + transaction = nautilus_undo_transaction_new (name); - tip->manager->details->transaction_in_progress = TRUE; + manager->details->transaction_in_progress = TRUE; - return tip; + return transaction; } /* nautilus_undo_manager_end_transaction */ void -nautilus_undo_manager_end_transaction (NautilusUndoTransactionInProgress *tip) +nautilus_undo_manager_end_transaction (NautilusUndoManager *manager, NautilusUndoTransaction *transaction) { + CORBA_Object undo_transaction; + CORBA_Environment ev; + + CORBA_exception_init(&ev); + /* Verify a transaction is in progress */ - if (!tip->manager->details->transaction_in_progress) { + if (!manager->details->transaction_in_progress) { g_warning("NautilusUndoManager has no current transaction. Begin a transaction first."); return; } - tip->manager->details->transaction_in_progress = FALSE; + manager->details->transaction_in_progress = FALSE; - /* Commit current transaction to undo list */ - nautilus_undo_manager_add_transaction (tip->manager, tip->transaction); + /* Commit current transaction to undo list */ + undo_transaction = bonobo_object_corba_objref (BONOBO_OBJECT (transaction)); + Bonobo_Unknown_ref (undo_transaction, &ev); + nautilus_undo_manager_add_transaction (manager, undo_transaction); /* Fire off signal informing that an undo transaction has occurred */ - gtk_signal_emit (GTK_OBJECT (tip->manager), signals[UNDO_TRANSACTION_OCCURED]); + gtk_signal_emit (GTK_OBJECT (manager), signals[UNDO_TRANSACTION_OCCURED]); + + CORBA_exception_free(&ev); } /* nautilus_undo_manager_undo_last_transaction */ @@ -271,8 +275,11 @@ void nautilus_undo_manager_undo (NautilusUndoManager *manager) { GList *list; - NautilusUndoTransaction *undo_transaction; - + CORBA_Object undo_transaction; + CORBA_Environment ev; + + CORBA_exception_init(&ev); + /* Verify we have a transaction to be undone */ if (manager->details->undo_list == NULL) { g_warning("NautilusUndoManager has no transaction to be undone."); @@ -283,21 +290,23 @@ nautilus_undo_manager_undo (NautilusUndoManager *manager) list = g_list_last(manager->details->undo_list); g_assert(list); undo_transaction = list->data; - manager->details->undo_list = g_list_remove(manager->details->undo_list, list->data); + manager->details->undo_list = g_list_remove (manager->details->undo_list, list->data); /* Undo transaction */ - nautilus_undo_transaction_undo(undo_transaction); + Nautilus_Undo_Transaction_undo (undo_transaction, &ev); /* Place transaction into redo list */ if (manager->details->enable_redo) { /* nautilus_undo_manager_add_redo_transaction (undo_transaction); */ } else { /* Purge transaction */ - nautilus_undo_transaction_destroy(undo_transaction); + bonobo_object_unref (BONOBO_OBJECT (undo_transaction)); } /* Fire off signal informing that an undo transaction has occurred */ gtk_signal_emit (GTK_OBJECT (manager), signals[UNDO_TRANSACTION_OCCURED]); + + CORBA_exception_free(&ev); } /* nautilus_undo_manager_redo_last_undone_transaction */ @@ -305,7 +314,11 @@ void nautilus_undo_manager_redo (NautilusUndoManager *manager) { GList *list; - NautilusUndoTransaction *redo_transaction; + CORBA_Object redo_transaction; + CORBA_Object undo_transaction; + CORBA_Environment ev; + + CORBA_exception_init(&ev); /* Are we allowing redo operations? */ if (manager->details->enable_redo) { @@ -320,19 +333,23 @@ nautilus_undo_manager_redo (NautilusUndoManager *manager) } /* Pop last transaction off redo list */ - list = g_list_last(manager->details->redo_list); + list = g_list_last (manager->details->redo_list); g_assert(list); redo_transaction = list->data; - nautilus_undo_transaction_undo(redo_transaction); + Nautilus_Undo_Transaction_undo (redo_transaction, &ev); /* Place transaction into undo list */ - nautilus_undo_manager_add_transaction (manager, redo_transaction); + undo_transaction = bonobo_object_corba_objref (BONOBO_OBJECT (redo_transaction)); + Bonobo_Unknown_ref (undo_transaction, &ev); + nautilus_undo_manager_add_transaction (manager, undo_transaction); + + CORBA_exception_free(&ev); } /* nautilus_undo_manager_add_undo_transaction */ void -nautilus_undo_manager_add_transaction (NautilusUndoManager *manager, NautilusUndoTransaction *transaction) +nautilus_undo_manager_add_transaction (NautilusUndoManager *manager, Nautilus_Undo_Transaction transaction) { int length; @@ -397,7 +414,7 @@ nautilus_undo_manager_unregister_object (GtkObject *object) if (nautilus_undo_transaction_contains_object (transaction, object)) { manager->details->undo_list = g_list_remove (manager->details->undo_list, transaction); - nautilus_undo_transaction_destroy (transaction); + bonobo_object_unref (BONOBO_OBJECT (transaction)); index--; success = TRUE; } @@ -413,7 +430,7 @@ nautilus_undo_manager_unregister_object (GtkObject *object) if (nautilus_undo_transaction_contains_object(transaction, object)) { manager->details->redo_list = g_list_remove (manager->details->redo_list, transaction); - nautilus_undo_transaction_destroy(transaction); + bonobo_object_unref (BONOBO_OBJECT (transaction)); index--; success = TRUE; } @@ -608,7 +625,7 @@ free_undo_manager_list_data (GList *list) if (list) { transaction = list->data; list = g_list_remove (list, transaction); - nautilus_undo_transaction_destroy (transaction); + bonobo_object_unref (BONOBO_OBJECT (transaction)); } } @@ -632,7 +649,7 @@ prune_undo_manager_list (GList *list, gint items) if (list) { transaction = list->data; list = g_list_remove (list, transaction); - nautilus_undo_transaction_destroy (transaction); + bonobo_object_unref (BONOBO_OBJECT (transaction)); } } diff --git a/libnautilus-private/nautilus-undo-manager.h b/libnautilus-private/nautilus-undo-manager.h index 57550d438..76205747a 100644 --- a/libnautilus-private/nautilus-undo-manager.h +++ b/libnautilus-private/nautilus-undo-manager.h @@ -26,7 +26,6 @@ #define NAUTILUS_UNDO_MANAGER_H #include <bonobo/bonobo-object.h> -#include <bonobo/bonobo-persist.h> #include "nautilus-undo-transaction.h" #include "nautilus-undo.h" @@ -42,40 +41,36 @@ #define NAUTILUS_IS_UNDO_MANAGER_CLASS(klass) \ (GTK_CHECK_CLASS_TYPE ((klass), NAUTILUS_TYPE_UNDO_MANAGER)) +#define NAUTILUS_UNDO_MANAGER_NAME "NautilusUndoManager" + typedef struct NautilusUndoManagerClass NautilusUndoManagerClass; typedef struct NautilusUndoManagerDetails NautilusUndoManagerDetails; -typedef struct NautilusUndoTransactionInProgress NautilusUndoTransactionInProgress; struct NautilusUndoManager { - BonoboPersist parent; + BonoboObject parent; NautilusUndoManagerDetails *details; }; struct NautilusUndoManagerClass { - BonoboPersistClass parent_class; + BonoboObjectClass parent_class; void (* undo_transaction_occurred) (GtkObject *object, gpointer data); gpointer servant_init_func, servant_destroy_func, vepv; }; -struct NautilusUndoTransactionInProgress { - NautilusUndoManager *manager; - NautilusUndoTransaction *transaction; - -}; /* GtkObject */ GtkType nautilus_undo_manager_get_type (void); NautilusUndoManager *nautilus_undo_manager_new (void); /* Prototypes */ -NautilusUndoTransactionInProgress *nautilus_undo_manager_begin_transaction (GtkObject *object, const gchar *name); -void nautilus_undo_manager_end_transaction (NautilusUndoTransactionInProgress *transaction); +NautilusUndoTransaction *nautilus_undo_manager_begin_transaction (NautilusUndoManager *manager, const gchar *name); +void nautilus_undo_manager_end_transaction (NautilusUndoManager *manager, NautilusUndoTransaction *transaction); void nautilus_undo_manager_undo (NautilusUndoManager *manager); void nautilus_undo_manager_redo (NautilusUndoManager *manager); void nautilus_undo_manager_add_transaction (NautilusUndoManager *manager, - NautilusUndoTransaction *transaction); + Nautilus_Undo_Transaction transaction); gboolean nautilus_undo_manager_can_undo (NautilusUndoManager *manager); gboolean nautilus_undo_manager_can_redo (NautilusUndoManager *manager); @@ -85,6 +80,7 @@ const gchar *nautilus_undo_manager_get_current_redo_transaction_name (Nautilus void nautilus_undo_manager_enable_redo (NautilusUndoManager *manager, gboolean value); void nautilus_undo_manager_set_queue_depth (NautilusUndoManager *manager, gint depth); + gboolean nautilus_undo_manager_unregister_object (GtkObject *object); void nautilus_attach_undo_manager (GtkObject *object, diff --git a/libnautilus/nautilus-undo-manager.c b/libnautilus/nautilus-undo-manager.c index 8a5dc6c6a..06d530023 100644 --- a/libnautilus/nautilus-undo-manager.c +++ b/libnautilus/nautilus-undo-manager.c @@ -46,10 +46,10 @@ static guint signals[LAST_SIGNAL]; typedef struct { - POA_Nautilus_Undo_Manager servant; - gpointer bonobo_object; + POA_Nautilus_Undo_Manager servant; + gpointer bonobo_object; - NautilusUndoManager *gtk_object; + NautilusUndoManager *gtk_object; } impl_POA_Nautilus_Undo_Manager; /* GtkObject */ @@ -61,12 +61,12 @@ static GList *free_undo_manager_list_data (GList *list); static GList *prune_undo_manager_list (GList *list, gint items); /* CORBA/Bonobo */ - -static void impl_Nautilus_Undo_Manager__append (impl_POA_Nautilus_Undo_Manager *servant, - const CORBA_char *name, - CORBA_Environment *ev); -static void impl_Nautilus_Undo_Manager__forget (impl_POA_Nautilus_Undo_Manager *servant, - CORBA_Environment *ev); +static void impl_Nautilus_Undo_Manager__append (impl_POA_Nautilus_Undo_Manager *servant, + const Nautilus_Undo_Transaction transaction, + CORBA_Environment *ev); +static void impl_Nautilus_Undo_Manager__forget (impl_POA_Nautilus_Undo_Manager *servant, + const Nautilus_Undo_Transaction transaction, + CORBA_Environment *ev); NAUTILUS_DEFINE_CLASS_BOILERPLATE(NautilusUndoManager, nautilus_undo_manager, BONOBO_OBJECT_TYPE) @@ -108,7 +108,7 @@ impl_Nautilus_Undo_Manager__destroy(BonoboObject *obj, impl_POA_Nautilus_Undo_Ma } static Nautilus_Undo_Manager -impl_Nautilus_Undo_Manager__create(NautilusUndoManager *manager, CORBA_Environment * ev) +impl_Nautilus_Undo_Manager__create (NautilusUndoManager *manager, CORBA_Environment * ev) { Nautilus_Undo_Manager retval; impl_POA_Nautilus_Undo_Manager *servant; @@ -132,16 +132,25 @@ impl_Nautilus_Undo_Manager__create(NautilusUndoManager *manager, CORBA_Environme return retval; } + static void impl_Nautilus_Undo_Manager__append (impl_POA_Nautilus_Undo_Manager *servant, - const CORBA_char *name, - CORBA_Environment *ev) -{ + const Nautilus_Undo_Transaction undo_transaction, + CORBA_Environment *ev) +{ + NautilusUndoManager *manager; + + g_assert (NAUTILUS_IS_UNDO_MANAGER (servant->gtk_object)); + manager = NAUTILUS_UNDO_MANAGER (servant->gtk_object); + + Bonobo_Unknown_ref (undo_transaction, ev); + nautilus_undo_manager_add_transaction (manager, undo_transaction); } static void impl_Nautilus_Undo_Manager__forget (impl_POA_Nautilus_Undo_Manager *servant, - CORBA_Environment *ev) + const Nautilus_Undo_Transaction transaction, + CORBA_Environment *ev) { } @@ -186,7 +195,7 @@ nautilus_undo_manager_initialize (NautilusUndoManager *manager) } -/* Class initialization function for the NautilusUndoable item. */ +/* Class initialization function for the NautilusUndoManager. */ static void nautilus_undo_manager_initialize_class (NautilusUndoManagerClass *klass) { @@ -214,18 +223,10 @@ nautilus_undo_manager_initialize_class (NautilusUndoManagerClass *klass) } /* nautilus_undo_manager_begin_transaction */ -NautilusUndoTransactionInProgress * -nautilus_undo_manager_begin_transaction (GtkObject *object, const gchar *name) +NautilusUndoTransaction * +nautilus_undo_manager_begin_transaction (NautilusUndoManager *manager, const gchar *name) { - NautilusUndoManager *manager; - NautilusUndoTransactionInProgress *tip; - - /* Locate undo manager. */ - /* FIXME: We can't get a pointer to the actual undo manager, so this - * needs to work through the CORBA interface to the undo manager. - */ - manager = nautilus_get_undo_manager (object); - g_assert (manager != NULL); + NautilusUndoTransaction *transaction; /* We aren't handling nested transactions currently */ if (manager->details->transaction_in_progress) { @@ -233,37 +234,40 @@ nautilus_undo_manager_begin_transaction (GtkObject *object, const gchar *name) return NULL; } - /* Create NautilusUndoTransactionInProgress */ - tip = g_new (NautilusUndoTransactionInProgress, 1); - g_assert(tip); - - tip->manager = manager; - /* Create new transaction */ - tip->transaction = nautilus_undo_transaction_new(name); + transaction = nautilus_undo_transaction_new (name); - tip->manager->details->transaction_in_progress = TRUE; + manager->details->transaction_in_progress = TRUE; - return tip; + return transaction; } /* nautilus_undo_manager_end_transaction */ void -nautilus_undo_manager_end_transaction (NautilusUndoTransactionInProgress *tip) +nautilus_undo_manager_end_transaction (NautilusUndoManager *manager, NautilusUndoTransaction *transaction) { + CORBA_Object undo_transaction; + CORBA_Environment ev; + + CORBA_exception_init(&ev); + /* Verify a transaction is in progress */ - if (!tip->manager->details->transaction_in_progress) { + if (!manager->details->transaction_in_progress) { g_warning("NautilusUndoManager has no current transaction. Begin a transaction first."); return; } - tip->manager->details->transaction_in_progress = FALSE; + manager->details->transaction_in_progress = FALSE; - /* Commit current transaction to undo list */ - nautilus_undo_manager_add_transaction (tip->manager, tip->transaction); + /* Commit current transaction to undo list */ + undo_transaction = bonobo_object_corba_objref (BONOBO_OBJECT (transaction)); + Bonobo_Unknown_ref (undo_transaction, &ev); + nautilus_undo_manager_add_transaction (manager, undo_transaction); /* Fire off signal informing that an undo transaction has occurred */ - gtk_signal_emit (GTK_OBJECT (tip->manager), signals[UNDO_TRANSACTION_OCCURED]); + gtk_signal_emit (GTK_OBJECT (manager), signals[UNDO_TRANSACTION_OCCURED]); + + CORBA_exception_free(&ev); } /* nautilus_undo_manager_undo_last_transaction */ @@ -271,8 +275,11 @@ void nautilus_undo_manager_undo (NautilusUndoManager *manager) { GList *list; - NautilusUndoTransaction *undo_transaction; - + CORBA_Object undo_transaction; + CORBA_Environment ev; + + CORBA_exception_init(&ev); + /* Verify we have a transaction to be undone */ if (manager->details->undo_list == NULL) { g_warning("NautilusUndoManager has no transaction to be undone."); @@ -283,21 +290,23 @@ nautilus_undo_manager_undo (NautilusUndoManager *manager) list = g_list_last(manager->details->undo_list); g_assert(list); undo_transaction = list->data; - manager->details->undo_list = g_list_remove(manager->details->undo_list, list->data); + manager->details->undo_list = g_list_remove (manager->details->undo_list, list->data); /* Undo transaction */ - nautilus_undo_transaction_undo(undo_transaction); + Nautilus_Undo_Transaction_undo (undo_transaction, &ev); /* Place transaction into redo list */ if (manager->details->enable_redo) { /* nautilus_undo_manager_add_redo_transaction (undo_transaction); */ } else { /* Purge transaction */ - nautilus_undo_transaction_destroy(undo_transaction); + bonobo_object_unref (BONOBO_OBJECT (undo_transaction)); } /* Fire off signal informing that an undo transaction has occurred */ gtk_signal_emit (GTK_OBJECT (manager), signals[UNDO_TRANSACTION_OCCURED]); + + CORBA_exception_free(&ev); } /* nautilus_undo_manager_redo_last_undone_transaction */ @@ -305,7 +314,11 @@ void nautilus_undo_manager_redo (NautilusUndoManager *manager) { GList *list; - NautilusUndoTransaction *redo_transaction; + CORBA_Object redo_transaction; + CORBA_Object undo_transaction; + CORBA_Environment ev; + + CORBA_exception_init(&ev); /* Are we allowing redo operations? */ if (manager->details->enable_redo) { @@ -320,19 +333,23 @@ nautilus_undo_manager_redo (NautilusUndoManager *manager) } /* Pop last transaction off redo list */ - list = g_list_last(manager->details->redo_list); + list = g_list_last (manager->details->redo_list); g_assert(list); redo_transaction = list->data; - nautilus_undo_transaction_undo(redo_transaction); + Nautilus_Undo_Transaction_undo (redo_transaction, &ev); /* Place transaction into undo list */ - nautilus_undo_manager_add_transaction (manager, redo_transaction); + undo_transaction = bonobo_object_corba_objref (BONOBO_OBJECT (redo_transaction)); + Bonobo_Unknown_ref (undo_transaction, &ev); + nautilus_undo_manager_add_transaction (manager, undo_transaction); + + CORBA_exception_free(&ev); } /* nautilus_undo_manager_add_undo_transaction */ void -nautilus_undo_manager_add_transaction (NautilusUndoManager *manager, NautilusUndoTransaction *transaction) +nautilus_undo_manager_add_transaction (NautilusUndoManager *manager, Nautilus_Undo_Transaction transaction) { int length; @@ -397,7 +414,7 @@ nautilus_undo_manager_unregister_object (GtkObject *object) if (nautilus_undo_transaction_contains_object (transaction, object)) { manager->details->undo_list = g_list_remove (manager->details->undo_list, transaction); - nautilus_undo_transaction_destroy (transaction); + bonobo_object_unref (BONOBO_OBJECT (transaction)); index--; success = TRUE; } @@ -413,7 +430,7 @@ nautilus_undo_manager_unregister_object (GtkObject *object) if (nautilus_undo_transaction_contains_object(transaction, object)) { manager->details->redo_list = g_list_remove (manager->details->redo_list, transaction); - nautilus_undo_transaction_destroy(transaction); + bonobo_object_unref (BONOBO_OBJECT (transaction)); index--; success = TRUE; } @@ -608,7 +625,7 @@ free_undo_manager_list_data (GList *list) if (list) { transaction = list->data; list = g_list_remove (list, transaction); - nautilus_undo_transaction_destroy (transaction); + bonobo_object_unref (BONOBO_OBJECT (transaction)); } } @@ -632,7 +649,7 @@ prune_undo_manager_list (GList *list, gint items) if (list) { transaction = list->data; list = g_list_remove (list, transaction); - nautilus_undo_transaction_destroy (transaction); + bonobo_object_unref (BONOBO_OBJECT (transaction)); } } diff --git a/libnautilus/nautilus-undo-manager.h b/libnautilus/nautilus-undo-manager.h index 57550d438..76205747a 100644 --- a/libnautilus/nautilus-undo-manager.h +++ b/libnautilus/nautilus-undo-manager.h @@ -26,7 +26,6 @@ #define NAUTILUS_UNDO_MANAGER_H #include <bonobo/bonobo-object.h> -#include <bonobo/bonobo-persist.h> #include "nautilus-undo-transaction.h" #include "nautilus-undo.h" @@ -42,40 +41,36 @@ #define NAUTILUS_IS_UNDO_MANAGER_CLASS(klass) \ (GTK_CHECK_CLASS_TYPE ((klass), NAUTILUS_TYPE_UNDO_MANAGER)) +#define NAUTILUS_UNDO_MANAGER_NAME "NautilusUndoManager" + typedef struct NautilusUndoManagerClass NautilusUndoManagerClass; typedef struct NautilusUndoManagerDetails NautilusUndoManagerDetails; -typedef struct NautilusUndoTransactionInProgress NautilusUndoTransactionInProgress; struct NautilusUndoManager { - BonoboPersist parent; + BonoboObject parent; NautilusUndoManagerDetails *details; }; struct NautilusUndoManagerClass { - BonoboPersistClass parent_class; + BonoboObjectClass parent_class; void (* undo_transaction_occurred) (GtkObject *object, gpointer data); gpointer servant_init_func, servant_destroy_func, vepv; }; -struct NautilusUndoTransactionInProgress { - NautilusUndoManager *manager; - NautilusUndoTransaction *transaction; - -}; /* GtkObject */ GtkType nautilus_undo_manager_get_type (void); NautilusUndoManager *nautilus_undo_manager_new (void); /* Prototypes */ -NautilusUndoTransactionInProgress *nautilus_undo_manager_begin_transaction (GtkObject *object, const gchar *name); -void nautilus_undo_manager_end_transaction (NautilusUndoTransactionInProgress *transaction); +NautilusUndoTransaction *nautilus_undo_manager_begin_transaction (NautilusUndoManager *manager, const gchar *name); +void nautilus_undo_manager_end_transaction (NautilusUndoManager *manager, NautilusUndoTransaction *transaction); void nautilus_undo_manager_undo (NautilusUndoManager *manager); void nautilus_undo_manager_redo (NautilusUndoManager *manager); void nautilus_undo_manager_add_transaction (NautilusUndoManager *manager, - NautilusUndoTransaction *transaction); + Nautilus_Undo_Transaction transaction); gboolean nautilus_undo_manager_can_undo (NautilusUndoManager *manager); gboolean nautilus_undo_manager_can_redo (NautilusUndoManager *manager); @@ -85,6 +80,7 @@ const gchar *nautilus_undo_manager_get_current_redo_transaction_name (Nautilus void nautilus_undo_manager_enable_redo (NautilusUndoManager *manager, gboolean value); void nautilus_undo_manager_set_queue_depth (NautilusUndoManager *manager, gint depth); + gboolean nautilus_undo_manager_unregister_object (GtkObject *object); void nautilus_attach_undo_manager (GtkObject *object, diff --git a/libnautilus/nautilus-undo-transaction.c b/libnautilus/nautilus-undo-transaction.c index 6381605a5..a56214b02 100644 --- a/libnautilus/nautilus-undo-transaction.c +++ b/libnautilus/nautilus-undo-transaction.c @@ -23,32 +23,195 @@ */ #include <config.h> + +#include <string.h> +#include <glib.h> +#include <gtk/gtksignal.h> +#include <gtk/gtkmain.h> +#include <bonobo/bonobo-main.h> +#include <bonobo/bonobo-control.h> +#include <libnautilus-extensions/nautilus-gtk-macros.h> + #include "nautilus-undo-transaction.h" +typedef struct { + POA_Nautilus_Undo_Transaction servant; + gpointer bonobo_object; + + NautilusUndoTransaction *undo_transaction; +} impl_POA_Nautilus_Undo_Transaction; + +/* GtkObject */ +static void nautilus_undo_transaction_initialize_class (NautilusUndoTransactionClass *class); +static void nautilus_undo_transaction_initialize (NautilusUndoTransaction *item); +static void nautilus_undo_transaction_destroy (GtkObject *object); +static void nautilus_undo_transaction_undo (NautilusUndoTransaction *transaction); + + +/* CORBA/Bonobo */ +static Nautilus_Undo_MenuItem *impl_Nautilus_Undo_Transaction__get_undo_description (impl_POA_Nautilus_Undo_Transaction *servant, + CORBA_Environment *ev); +static Nautilus_Undo_MenuItem *impl_Nautilus_Undo_Transaction__get_redo_description (impl_POA_Nautilus_Undo_Transaction *servant, + CORBA_Environment *ev); +static CORBA_char *impl_Nautilus_Undo_Transaction__get_base_description (impl_POA_Nautilus_Undo_Transaction *servant, + CORBA_Environment *ev); +static void impl_Nautilus_Undo_Transaction__undo (impl_POA_Nautilus_Undo_Transaction *servant, + CORBA_Environment *ev); + + +NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusUndoTransaction, nautilus_undo_transaction, BONOBO_OBJECT_TYPE) + +POA_Nautilus_Undo_Transaction__epv libnautilus_Nautilus_Undo_Transaction_epv = +{ + NULL, /* _private */ + + (gpointer) &impl_Nautilus_Undo_Transaction__get_undo_description, + (gpointer) &impl_Nautilus_Undo_Transaction__get_redo_description, + (gpointer) &impl_Nautilus_Undo_Transaction__get_base_description, + (gpointer) &impl_Nautilus_Undo_Transaction__undo +}; + +static PortableServer_ServantBase__epv base_epv = { NULL, NULL, NULL }; + +static POA_Nautilus_Undo_Transaction__vepv impl_Nautilus_Undo_Transaction_vepv = +{ + &base_epv, + NULL, + &libnautilus_Nautilus_Undo_Transaction_epv +}; + + +static void +impl_Nautilus_Undo_Transaction__destroy(BonoboObject *obj, impl_POA_Nautilus_Undo_Transaction *servant) +{ + PortableServer_ObjectId *objid; + CORBA_Environment ev; + void (*servant_destroy_func) (PortableServer_Servant servant, CORBA_Environment *ev); + + CORBA_exception_init (&ev); + + servant_destroy_func = NAUTILUS_UNDO_TRANSACTION_CLASS (GTK_OBJECT (servant->undo_transaction)->klass)->servant_destroy_func; + objid = PortableServer_POA_servant_to_id (bonobo_poa (), servant, &ev); + PortableServer_POA_deactivate_object (bonobo_poa (), objid, &ev); + CORBA_free (objid); + obj->servant = NULL; + + servant_destroy_func ((PortableServer_Servant) servant, &ev); + g_free (servant); + CORBA_exception_free(&ev); +} + + +static Nautilus_Undo_Transaction +impl_Nautilus_Undo_Transaction__create (NautilusUndoTransaction *transaction, CORBA_Environment *ev) +{ + Nautilus_Undo_Transaction retval; + impl_POA_Nautilus_Undo_Transaction *servant; + void (*servant_init_func) (PortableServer_Servant servant, CORBA_Environment *ev); + + NautilusUndoTransactionClass *transaction_class = NAUTILUS_UNDO_TRANSACTION_CLASS (GTK_OBJECT (transaction)->klass); + + servant_init_func = transaction_class->servant_init_func; + servant = g_new0 (impl_POA_Nautilus_Undo_Transaction, 1); + servant->servant.vepv = transaction_class->vepv; + if (!servant->servant.vepv->Bonobo_Unknown_epv) + servant->servant.vepv->Bonobo_Unknown_epv = bonobo_object_get_epv (); + servant_init_func ((PortableServer_Servant) servant, ev); + + servant->undo_transaction = transaction; + + retval = bonobo_object_activate_servant (BONOBO_OBJECT (transaction), servant); + + gtk_signal_connect (GTK_OBJECT (transaction), "destroy", GTK_SIGNAL_FUNC (impl_Nautilus_Undo_Transaction__destroy), servant); + + return retval; +} + + +static Nautilus_Undo_MenuItem *impl_Nautilus_Undo_Transaction__get_undo_description (impl_POA_Nautilus_Undo_Transaction *servant, + CORBA_Environment *ev) +{ + return NULL; +} + +static Nautilus_Undo_MenuItem *impl_Nautilus_Undo_Transaction__get_redo_description (impl_POA_Nautilus_Undo_Transaction *servant, + CORBA_Environment *ev) +{ + return NULL; +} + +static CORBA_char *impl_Nautilus_Undo_Transaction__get_base_description (impl_POA_Nautilus_Undo_Transaction *servant, + CORBA_Environment *ev) +{ + return NULL; +} + +static void impl_Nautilus_Undo_Transaction__undo (impl_POA_Nautilus_Undo_Transaction *servant, CORBA_Environment *ev) +{ + nautilus_undo_transaction_undo (servant->undo_transaction); +} + /* nautilus_undo_transaction_new */ NautilusUndoTransaction * nautilus_undo_transaction_new (const gchar *name) { NautilusUndoTransaction *transaction; - transaction = g_new(NautilusUndoTransaction, 1); - transaction->transaction_list = NULL; + transaction = gtk_type_new (nautilus_undo_transaction_get_type ()); + transaction->name = g_strdup(name); return transaction; } + +/* Object initialization function for the NautilusUndoManager */ +static void +nautilus_undo_transaction_initialize (NautilusUndoTransaction *transaction) +{ + CORBA_Environment ev; + CORBA_exception_init(&ev); + + /* Create empty lists */ + transaction->transaction_list = NULL; + + bonobo_object_construct (BONOBO_OBJECT (transaction), + impl_Nautilus_Undo_Transaction__create (transaction, &ev)); + + CORBA_exception_free(&ev); +} + /* nautilus_undo_transaction_destroy */ -void -nautilus_undo_transaction_destroy (NautilusUndoTransaction *transaction) +static void +nautilus_undo_transaction_destroy (GtkObject *object) { - g_assert(transaction); + NautilusUndoTransaction *transaction; + + g_return_if_fail (NAUTILUS_IS_UNDO_TRANSACTION (object)); + + transaction = NAUTILUS_UNDO_TRANSACTION (object); /* Empty list */ g_list_free(transaction->transaction_list); g_free(transaction->name); - g_free(transaction); + + NAUTILUS_CALL_PARENT_CLASS (GTK_OBJECT_CLASS, destroy, (object)); +} + +/* Class initialization function for the NautilusUndoable item. */ +static void +nautilus_undo_transaction_initialize_class (NautilusUndoTransactionClass *klass) +{ + GtkObjectClass *object_class; + + object_class = GTK_OBJECT_CLASS (klass); + + object_class->destroy = nautilus_undo_transaction_destroy; + + klass->servant_init_func = POA_Nautilus_Undo_Transaction__init; + klass->servant_destroy_func = POA_Nautilus_Undo_Transaction__fini; + klass->vepv = &impl_Nautilus_Undo_Transaction_vepv; } /* nautilus_undo_transaction_add_undoable */ @@ -77,13 +240,15 @@ nautilus_undo_transaction_add_undoable (NautilusUndoTransaction *transaction, * Parse transaction and send undo signals to undoable objects stored in transaction */ -gboolean +void nautilus_undo_transaction_undo (NautilusUndoTransaction *transaction) { NautilusUndoable *undoable; guint index; - - g_return_val_if_fail(transaction != NULL, FALSE); + + if (transaction == NULL) { + return; + } for ( index = 0; index < g_list_length(transaction->transaction_list); index++) { @@ -94,10 +259,9 @@ nautilus_undo_transaction_undo (NautilusUndoTransaction *transaction) if (undoable != NULL) nautilus_undoable_restore_from_undo_snapshot (undoable); } - - return TRUE; } + /* nautilus_undo_transaction_contains_object * * Return name of requested transaction @@ -137,4 +301,3 @@ nautilus_undo_transaction_contains_object (NautilusUndoTransaction *transaction, return FALSE; } - diff --git a/libnautilus/nautilus-undo-transaction.h b/libnautilus/nautilus-undo-transaction.h index 82026c0fb..f0a2c8441 100644 --- a/libnautilus/nautilus-undo-transaction.h +++ b/libnautilus/nautilus-undo-transaction.h @@ -26,18 +26,40 @@ #define NAUTILUS_UNDO_TRANSACTION_H #include <glib.h> +#include <bonobo/bonobo-object.h> #include "nautilus-undoable.h" +#include "nautilus-undo.h" +#define NAUTILUS_TYPE_UNDO_TRANSACTION \ + (nautilus_undo_transaction_get_type ()) +#define NAUTILUS_UNDO_TRANSACTION(obj) \ + (GTK_CHECK_CAST ((obj), NAUTILUS_TYPE_UNDO_TRANSACTION, NautilusUndoTransaction)) +#define NAUTILUS_UNDO_TRANSACTION_CLASS(klass) \ + (GTK_CHECK_CLASS_CAST ((klass), NAUTILUS_TYPE_UNDO_TRANSACTION, NautilusUndoTransactionClass)) +#define NAUTILUS_IS_UNDO_TRANSACTION(obj) \ + (GTK_CHECK_TYPE ((obj), NAUTILUS_TYPE_UNDO_TRANSACTION)) +#define NAUTILUS_IS_UNDO_TRANSACTION_CLASS(klass) \ + (GTK_CHECK_CLASS_TYPE ((klass), NAUTILUS_TYPE_UNDO_TRANSACTION)) + +typedef struct NautilusUndoTransactionClass NautilusUndoTransactionClass; + + struct NautilusUndoTransaction { + BonoboObject parent; gchar *name; GList *transaction_list; }; +struct NautilusUndoTransactionClass { + BonoboObjectClass parent_class; + gpointer servant_init_func, servant_destroy_func, vepv; +}; + +GtkType nautilus_undo_transaction_get_type (void); NautilusUndoTransaction *nautilus_undo_transaction_new (const gchar *name); -void nautilus_undo_transaction_destroy (NautilusUndoTransaction *transaction); + gboolean nautilus_undo_transaction_add_undoable (NautilusUndoTransaction *transaction, NautilusUndoable *undoable); -gboolean nautilus_undo_transaction_undo (NautilusUndoTransaction *transaction); const gchar *nautilus_undo_transaction_get_name (NautilusUndoTransaction *transaction); gboolean nautilus_undo_transaction_contains_object (NautilusUndoTransaction *transaction, GtkObject *object); |