diff options
author | Gene Z. Ragan <gzr@eazel.com> | 2000-05-17 23:54:25 +0000 |
---|---|---|
committer | Gene Ragan <gzr@src.gnome.org> | 2000-05-17 23:54:25 +0000 |
commit | 19159e79b31181b09826f5068e5f71efd37e04a2 (patch) | |
tree | d874f7c6a8b7d581926d97f4a07225e8e2e2cf5f | |
parent | 0cc8fb0b162292b9225e4de6b580bc0aadeb1809 (diff) | |
download | nautilus-19159e79b31181b09826f5068e5f71efd37e04a2.tar.gz |
CVS:
2000-05-17 Gene Z. Ragan <gzr@eazel.com>
CVS: ----------------------------------------------------------------------
First phase of modifying undo code. These changes CVS: Enter Log. Lines beginning with `CVS:' are removed automatically
affect the way undo is handled internally to Nautilus and CVS:
also defines a new IDL. This is work in progress. CVS: Committing in .
CVS:
* libnautilus-extensions/nautilus-entry.c: CVS: Modified Files:
Modified to use gtk_object_get_data() mechanism to locate undo manager CVS: ChangeLog libnautilus/.cvsignore libnautilus/Makefile.am
CVS: libnautilus/nautilus-undo-manager-private.h
* libnautilus-extensions/nautilus-icon-container.c: CVS: libnautilus/nautilus-undo-manager.c
(nautilus_icon_container_start_renaming_selected_item): CVS: libnautilus/nautilus-undo-manager.h
Modified to use gtk_object_get_data() mechanism to locate undo manager CVS: libnautilus/nautilus-undo-transaction.h
CVS: libnautilus/nautilus-undoable.c
* libnautilus-extensions/nautilus-icon-text-item.c: (iti_event), CVS: libnautilus/nautilus-undoable.h
(restore_from_undo_snapshot_callback): CVS: libnautilus/nautilus-view-component.idl
Modified to use gtk_object_get_data() mechanism to locate undo manager CVS: libnautilus-extensions/nautilus-entry.c
CVS: libnautilus-extensions/nautilus-entry.h
* libnautilus/.cvsignore: CVS: libnautilus-extensions/nautilus-icon-container.c
Added generated IDL source and header files to ignore CVS: libnautilus-extensions/nautilus-icon-text-item.c
CVS: src/nautilus-bookmarks-window.c
* libnautilus/Makefile.am: CVS: src/nautilus-bookmarks-window.h src/nautilus-location-bar.c
Modified makefile to include new IDL file for undo manager CVS: src/nautilus-location-bar.h src/nautilus-window-menus.c
CVS: src/ntl-app.c src/ntl-window-private.h src/ntl-window.c
* libnautilus/nautilus-undo-manager.c: CVS: src/ntl-window.h src/file-manager/fm-properties-window.c
(impl_Nautilus_Undo_Manager__destroy), CVS: Added Files:
(impl_Nautilus_Undo_Manager__create), CVS: libnautilus/nautilus-undo.idl
(impl_Nautilus_Undo_Manager__append), CVS: Removed Files:
(impl_Nautilus_Undo_Manager__forget), CVS: libnautilus/nautilus-undo-manager-component.idl
(nautilus_undo_manager_initialize), CVS: ----------------------------------------------------------------------
(nautilus_undo_manager_initialize_class),
(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),
(nautilus_undo_manager_can_undo), (nautilus_undo_manager_can_redo),
(get_current_transaction_name),
(nautilus_undo_manager_get_current_undo_transaction_name),
(nautilus_undo_manager_get_current_redo_transaction_name),
(destroy), (nautilus_undo_manager_enable_redo),
(nautilus_undo_manager_set_queue_depth),
(free_undo_manager_list_data), (prune_undo_manager_list):
Changes to support new IDL and new undo manager mechanism.
* libnautilus/nautilus-undo.idl:
New undo manager IDL file
* libnautilus/nautilus-undo-manager-component.idl:
Removed old undo manager IDL file
* src/file-manager/fm-properties-window.c:
(create_basic_page):
Modified to use gtk_object_get_data() mechanism to locate undo manager
* src/nautilus-bookmarks-window.c:
(create_bookmarks_window),
(on_text_field_focus_in_event),
(on_window_delete_event):
Modified to use gtk_object_get_data() mechanism to locate undo manager
* src/nautilus-location-bar.c:
(nautilus_location_bar_set_location),
(nautilus_location_bar_enable_undo):
Modified to use gtk_object_get_data() mechanism to locate undo manager
* src/nautilus-window-menus.c:
(edit_menu_undo_callback),
(edit_menu_cut_callback),
(bookmarks_menu_edit_bookmarks_callback),
(get_bookmarks_window),
(nautilus_bookmarks_exiting),
(nautilus_window_edit_bookmarks),
(nautilus_window_initialize_menus),
(update_undo_menu_item):
Modified to use gtk_object_get_data() mechanism to locate undo manager
* src/ntl-app.c:
(impl_Nautilus_Application__get_view_windows),
(impl_Nautilus_Application_new_view_window),
(impl_Nautilus_Application_supports),
(impl_Nautilus_Application_create_object),
(impl_Nautilus_Application__create), (nautilus_app_get_type),
(nautilus_app_class_init), (nautilus_app_init), (nautilus_app_new),
(nautilus_app_destroy), (nautilus_app_startup),
(nautilus_app_create_window):
Modified to use gtk_object_get_data() mechanism to locate undo manager.
Added and modified IDL C stubs to match new IDL interface.
* src/ntl-window.c:
(nautilus_window_constructed),
(nautilus_window_set_arg):
Changed order that arguments are set at time of main window create so the app instance
variable is valid when the main window is contructed.
46 files changed, 1648 insertions, 1698 deletions
@@ -1,3 +1,97 @@ +2000-05-17 Gene Z. Ragan <gzr@eazel.com> + + First phase of modifying undo code. These changes + affect the way undo is handled internally to Nautilus and + also defines a new IDL. This is work in progress. + + * libnautilus-extensions/nautilus-entry.c: + Modified to use gtk_object_get_data() mechanism to locate undo manager + + * libnautilus-extensions/nautilus-icon-container.c: + (nautilus_icon_container_start_renaming_selected_item): + Modified to use gtk_object_get_data() mechanism to locate undo manager + + * libnautilus-extensions/nautilus-icon-text-item.c: (iti_event), + (restore_from_undo_snapshot_callback): + Modified to use gtk_object_get_data() mechanism to locate undo manager + + * libnautilus/.cvsignore: + Added generated IDL source and header files to ignore + + * libnautilus/Makefile.am: + Modified makefile to include new IDL file for undo manager + + * libnautilus/nautilus-undo-manager.c: + (impl_Nautilus_Undo_Manager__destroy), + (impl_Nautilus_Undo_Manager__create), + (impl_Nautilus_Undo_Manager__append), + (impl_Nautilus_Undo_Manager__forget), + (nautilus_undo_manager_initialize), + (nautilus_undo_manager_initialize_class), + (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), + (nautilus_undo_manager_can_undo), (nautilus_undo_manager_can_redo), + (get_current_transaction_name), + (nautilus_undo_manager_get_current_undo_transaction_name), + (nautilus_undo_manager_get_current_redo_transaction_name), + (destroy), (nautilus_undo_manager_enable_redo), + (nautilus_undo_manager_set_queue_depth), + (free_undo_manager_list_data), (prune_undo_manager_list): + Changes to support new IDL and new undo manager mechanism. + + * libnautilus/nautilus-undo.idl: + New undo manager IDL file + + * libnautilus/nautilus-undo-manager-component.idl: + Removed old undo manager IDL file + + * src/file-manager/fm-properties-window.c: + (create_basic_page): + Modified to use gtk_object_get_data() mechanism to locate undo manager + + * src/nautilus-bookmarks-window.c: + (create_bookmarks_window), + (on_text_field_focus_in_event), + (on_window_delete_event): + Modified to use gtk_object_get_data() mechanism to locate undo manager + + * src/nautilus-location-bar.c: + (nautilus_location_bar_set_location), + (nautilus_location_bar_enable_undo): + Modified to use gtk_object_get_data() mechanism to locate undo manager + + * src/nautilus-window-menus.c: + (edit_menu_undo_callback), + (edit_menu_cut_callback), + (bookmarks_menu_edit_bookmarks_callback), + (get_bookmarks_window), + (nautilus_bookmarks_exiting), + (nautilus_window_edit_bookmarks), + (nautilus_window_initialize_menus), + (update_undo_menu_item): + Modified to use gtk_object_get_data() mechanism to locate undo manager + + * src/ntl-app.c: + (impl_Nautilus_Application__get_view_windows), + (impl_Nautilus_Application_new_view_window), + (impl_Nautilus_Application_supports), + (impl_Nautilus_Application_create_object), + (impl_Nautilus_Application__create), (nautilus_app_get_type), + (nautilus_app_class_init), (nautilus_app_init), (nautilus_app_new), + (nautilus_app_destroy), (nautilus_app_startup), + (nautilus_app_create_window): + Modified to use gtk_object_get_data() mechanism to locate undo manager. + Added and modified IDL C stubs to match new IDL interface. + + * src/ntl-window.c: + (nautilus_window_constructed), + (nautilus_window_set_arg): + Changed order that arguments are set at time of main window create so the app instance + variable is valid when the main window is contructed. + 2000-05-17 J Shane Culpepper <pepper@eazel.com> * components/services/install/command-line/eazel-install.c: diff --git a/libnautilus-extensions/nautilus-entry.c b/libnautilus-extensions/nautilus-entry.c index a20fd9cf1..ace881933 100644 --- a/libnautilus-extensions/nautilus-entry.c +++ b/libnautilus-extensions/nautilus-entry.c @@ -28,7 +28,6 @@ #include "nautilus-entry.h" #include "nautilus-gtk-macros.h" -#include <libnautilus/nautilus-undo-manager.h> #include <gdk/gdkkeysyms.h> #include <gtk/gtkmain.h> @@ -121,7 +120,10 @@ nautilus_entry_key_press (GtkWidget *widget, GdkEventKey *event) case 'z': if (event->state & GDK_CONTROL_MASK && entry->use_undo == TRUE && entry->handle_undo_key == TRUE) { - nautilus_undo_manager_undo_last_transaction(); + NautilusUndoManager *undo_manager; + undo_manager = gtk_object_get_data ( GTK_OBJECT (entry), NAUTILUS_UNDO_MANAGER_NAME); + g_assert (undo_manager); + nautilus_undo_manager_undo (undo_manager); return FALSE; } break; @@ -189,6 +191,7 @@ static void nautilus_entry_changed (GtkEditable *editable) { NautilusEntry *entry; + NautilusUndoTransactionInProgress *tip; g_assert (GTK_IS_EDITABLE (editable)); g_assert (NAUTILUS_IS_ENTRY (editable)); @@ -197,10 +200,10 @@ nautilus_entry_changed (GtkEditable *editable) /* Register undo transaction */ if (!entry->undo_registered && entry->use_undo) { - nautilus_undo_manager_begin_transaction (_("Edit")); - nautilus_undoable_save_undo_snapshot (GTK_OBJECT(entry), save_undo_snapshot_callback, - restore_from_undo_snapshot_callback); - nautilus_undo_manager_end_transaction (); + tip = nautilus_undo_manager_begin_transaction (GTK_OBJECT (entry), _("Edit")); + nautilus_undoable_save_undo_snapshot (tip->transaction, GTK_OBJECT(entry), save_undo_snapshot_callback, + restore_from_undo_snapshot_callback); + nautilus_undo_manager_end_transaction (tip); entry->undo_registered = TRUE; } @@ -270,15 +273,17 @@ restore_from_undo_snapshot_callback (NautilusUndoable *undoable) * Enable undo mechanism in entry item. */ void -nautilus_entry_enable_undo (NautilusEntry *entry, gboolean value) +nautilus_entry_enable_undo (NautilusEntry *entry, NautilusUndoManager *manager, gboolean value) { g_assert (entry); g_assert (NAUTILUS_IS_ENTRY (entry)); - + entry->undo_registered = !value; entry->use_undo = value; - if (!entry->undo_registered) { + if (!entry->undo_registered) { + gtk_object_set_data ( GTK_OBJECT(entry), NAUTILUS_UNDO_MANAGER_NAME, manager); + /* Get copy of entry text */ if (entry->undo_text != NULL) { g_free (entry->undo_text); diff --git a/libnautilus-extensions/nautilus-entry.h b/libnautilus-extensions/nautilus-entry.h index 3df09f064..a902493a1 100644 --- a/libnautilus-extensions/nautilus-entry.h +++ b/libnautilus-extensions/nautilus-entry.h @@ -29,6 +29,7 @@ #include <libgnome/gnome-defs.h> #include <gtk/gtkentry.h> +#include <libnautilus/nautilus-undo-manager.h> BEGIN_GNOME_DECLS @@ -48,7 +49,7 @@ typedef struct NautilusEntryClass NautilusEntryClass; struct NautilusEntry { GtkEntry parent; - + gchar *undo_text; gboolean undo_registered; gboolean use_undo; @@ -59,13 +60,15 @@ struct NautilusEntryClass { GtkEntryClass parent_class; }; -GtkType nautilus_entry_get_type (void); -GtkWidget* nautilus_entry_new (void); +GtkType nautilus_entry_get_type (void); +GtkWidget* nautilus_entry_new (void); -void nautilus_entry_select_all (NautilusEntry *entry); -void nautilus_entry_select_all_at_idle (NautilusEntry *entry); -void nautilus_entry_enable_undo (NautilusEntry *entry, gboolean value); -void nautilus_entry_enable_undo_key (NautilusEntry *entry, gboolean value); +void nautilus_entry_select_all (NautilusEntry *entry); +void nautilus_entry_select_all_at_idle (NautilusEntry *entry); +void nautilus_entry_enable_undo (NautilusEntry *entry, + NautilusUndoManager *manager, + gboolean value); +void nautilus_entry_enable_undo_key (NautilusEntry *entry, gboolean value); END_GNOME_DECLS diff --git a/libnautilus-extensions/nautilus-icon-container.c b/libnautilus-extensions/nautilus-icon-container.c index 43f1aaad4..994f1e636 100644 --- a/libnautilus-extensions/nautilus-icon-container.c +++ b/libnautilus-extensions/nautilus-icon-container.c @@ -3453,6 +3453,8 @@ nautilus_icon_container_start_renaming_selected_item (NautilusIconContainer *con { NautilusIconContainerDetails *details; NautilusIcon *icon; + GtkWidget *toplevel; + NautilusUndoManager *manager; ArtIRect text_rect; ArtDRect icon_rect; GdkFont *font; @@ -3487,6 +3489,11 @@ nautilus_icon_container_start_renaming_selected_item (NautilusIconContainer *con nautilus_icon_text_item_get_type (), NULL)); + /* Add undo manager */ + toplevel = gtk_widget_get_toplevel ( GTK_WIDGET (container)); + manager = gtk_object_get_data ( GTK_OBJECT (toplevel), NAUTILUS_UNDO_MANAGER_NAME); + gtk_object_set_data ( GTK_OBJECT (details->rename_widget), NAUTILUS_UNDO_MANAGER_NAME, manager); + /* Determine widget position widget in container */ font = details->label_font[details->zoom_level]; ppu = GNOME_CANVAS_ITEM (icon->item)->canvas->pixels_per_unit; diff --git a/libnautilus-extensions/nautilus-icon-text-item.c b/libnautilus-extensions/nautilus-icon-text-item.c index 8acd5039a..54f91f023 100644 --- a/libnautilus-extensions/nautilus-icon-text-item.c +++ b/libnautilus-extensions/nautilus-icon-text-item.c @@ -20,6 +20,7 @@ #include <gtk/gtkmain.h> #include <gtk/gtksignal.h> #include <gtk/gtkwindow.h> +#include <libgnome/gnome-i18n.h> /* Margins used to display the information */ #define MARGIN_X 2 @@ -801,6 +802,8 @@ iti_event (GnomeCanvasItem *item, GdkEvent *event) int idx; double x, y; int cx, cy; + NautilusUndoTransactionInProgress *tip; + iti = ITI (item); priv = iti->priv; @@ -835,10 +838,10 @@ iti_event (GnomeCanvasItem *item, GdkEvent *event) if (!priv->undo_registered) { priv->undo_registered = TRUE; - nautilus_undo_manager_begin_transaction ("Rename"); - nautilus_undoable_save_undo_snapshot (GTK_OBJECT(iti), save_undo_snapshot_callback, - restore_from_undo_snapshot_callback); - nautilus_undo_manager_end_transaction (); + tip = nautilus_undo_manager_begin_transaction ( GTK_OBJECT(iti), "Rename"); + nautilus_undoable_save_undo_snapshot (tip->transaction, GTK_OBJECT(iti), + save_undo_snapshot_callback, restore_from_undo_snapshot_callback); + nautilus_undo_manager_end_transaction (tip); } /* Handle any events that reach us */ @@ -1367,15 +1370,16 @@ restore_from_undo_snapshot_callback(NautilusUndoable *undoable) char *undo_text; NautilusIconTextItem *iti; ItiPrivate *priv; + NautilusUndoTransactionInProgress *tip; iti = NAUTILUS_ICON_TEXT_ITEM(undoable->undo_target_class); priv = iti->priv; /* Register undo transaction */ - nautilus_undo_manager_begin_transaction ("Rename"); - nautilus_undoable_save_undo_snapshot (GTK_OBJECT(iti), save_undo_snapshot_callback, - restore_from_undo_snapshot_callback); - nautilus_undo_manager_end_transaction (); + tip = nautilus_undo_manager_begin_transaction (GTK_OBJECT(iti), _("Rename")); + nautilus_undoable_save_undo_snapshot (tip->transaction, GTK_OBJECT(iti), + save_undo_snapshot_callback, restore_from_undo_snapshot_callback); + nautilus_undo_manager_end_transaction (tip); 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 1faf53994..97b1c0948 100644 --- a/libnautilus-extensions/nautilus-undo-manager.c +++ b/libnautilus-extensions/nautilus-undo-manager.c @@ -25,6 +25,7 @@ #include <config.h> #include <gtk/gtksignal.h> #include <gtk/gtkmain.h> +#include <glib.h> #include <string.h> #include <bonobo/bonobo-main.h> #include <bonobo/bonobo-control.h> @@ -45,11 +46,11 @@ static guint signals[LAST_SIGNAL]; typedef struct { - POA_Nautilus_UndoManager servant; + POA_Nautilus_Undo_Manager servant; gpointer bonobo_object; NautilusUndoManager *gtk_object; -} impl_POA_Nautilus_UndoManager; +} impl_POA_Nautilus_Undo_Manager; /* GtkObject */ @@ -62,33 +63,33 @@ static GList *prune_undo_manager_list (GList *list, gint items); /* CORBA/Bonobo */ -static CORBA_boolean impl_Nautilus_UndoManager__begin_transaction (impl_POA_Nautilus_UndoManager *servant, - const CORBA_char *name, - CORBA_Environment *ev); -static void impl_Nautilus_UndoManager__end_transaction (impl_POA_Nautilus_UndoManager *servant, - CORBA_Environment *ev); +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); NAUTILUS_DEFINE_CLASS_BOILERPLATE(NautilusUndoManager, nautilus_undo_manager, BONOBO_OBJECT_TYPE) -POA_Nautilus_UndoManager__epv libnautilus_extensions_Nautilus_UndoManager_epv = +POA_Nautilus_Undo_Manager__epv libnautilus_Nautilus_Undo_Manager_epv = { NULL, /* _private */ - (gpointer) &impl_Nautilus_UndoManager__begin_transaction, - (gpointer) &impl_Nautilus_UndoManager__end_transaction, + (gpointer) &impl_Nautilus_Undo_Manager__append, + (gpointer) &impl_Nautilus_Undo_Manager__forget, }; static PortableServer_ServantBase__epv base_epv = { NULL, NULL, NULL }; -static POA_Nautilus_UndoManager__vepv impl_Nautilus_UndoManager_vepv = +static POA_Nautilus_Undo_Manager__vepv impl_Nautilus_Undo_Manager_vepv = { &base_epv, NULL, - &libnautilus_extensions_Nautilus_UndoManager_epv + &libnautilus_Nautilus_Undo_Manager_epv }; static void -impl_Nautilus_UndoManager__destroy(BonoboObject *obj, impl_POA_Nautilus_UndoManager *servant) +impl_Nautilus_Undo_Manager__destroy(BonoboObject *obj, impl_POA_Nautilus_Undo_Manager *servant) { PortableServer_ObjectId *objid; CORBA_Environment ev; @@ -107,17 +108,17 @@ impl_Nautilus_UndoManager__destroy(BonoboObject *obj, impl_POA_Nautilus_UndoMana CORBA_exception_free(&ev); } -static Nautilus_UndoManager -impl_Nautilus_UndoManager__create(NautilusUndoManager *manager, CORBA_Environment * ev) +static Nautilus_Undo_Manager +impl_Nautilus_Undo_Manager__create(NautilusUndoManager *manager, CORBA_Environment * ev) { - Nautilus_UndoManager retval; - impl_POA_Nautilus_UndoManager *servant; + Nautilus_Undo_Manager retval; + impl_POA_Nautilus_Undo_Manager *servant; void (*servant_init_func) (PortableServer_Servant servant, CORBA_Environment *ev); NautilusUndoManagerClass *undo_class = NAUTILUS_UNDO_MANAGER_CLASS (GTK_OBJECT(manager)->klass); servant_init_func = undo_class->servant_init_func; - servant = g_new0 (impl_POA_Nautilus_UndoManager, 1); + servant = g_new0 (impl_POA_Nautilus_Undo_Manager, 1); servant->servant.vepv = undo_class->vepv; if (!servant->servant.vepv->Bonobo_Unknown_epv) servant->servant.vepv->Bonobo_Unknown_epv = bonobo_object_get_epv (); @@ -127,24 +128,22 @@ impl_Nautilus_UndoManager__create(NautilusUndoManager *manager, CORBA_Environmen retval = bonobo_object_activate_servant (BONOBO_OBJECT (manager), servant); - gtk_signal_connect (GTK_OBJECT (manager), "destroy", GTK_SIGNAL_FUNC (impl_Nautilus_UndoManager__destroy), servant); + gtk_signal_connect (GTK_OBJECT (manager), "destroy", GTK_SIGNAL_FUNC (impl_Nautilus_Undo_Manager__destroy), servant); return retval; } -static CORBA_boolean -impl_Nautilus_UndoManager__begin_transaction (impl_POA_Nautilus_UndoManager *servant, +static void +impl_Nautilus_Undo_Manager__append (impl_POA_Nautilus_Undo_Manager *servant, const CORBA_char *name, CORBA_Environment *ev) { - return nautilus_undo_manager_begin_transaction (name); } static void -impl_Nautilus_UndoManager__end_transaction (impl_POA_Nautilus_UndoManager *servant, +impl_Nautilus_Undo_Manager__forget (impl_POA_Nautilus_Undo_Manager *servant, CORBA_Environment *ev) { - nautilus_undo_manager_end_transaction (); } @@ -169,9 +168,6 @@ nautilus_undo_manager_initialize (NautilusUndoManager *manager) manager->details = g_new0 (NautilusUndoManagerDetails, 1); - /* Init transaction to none */ - manager->details->transaction = NULL; - /* Create empty lists */ manager->details->undo_list = NULL; manager->details->redo_list = NULL; @@ -185,7 +181,7 @@ nautilus_undo_manager_initialize (NautilusUndoManager *manager) /* No transaction is in progress */ manager->details->transaction_in_progress = FALSE; - bonobo_object_construct (BONOBO_OBJECT (manager), impl_Nautilus_UndoManager__create (manager, &ev)); + bonobo_object_construct (BONOBO_OBJECT (manager), impl_Nautilus_Undo_Manager__create (manager, &ev)); CORBA_exception_free(&ev); } @@ -201,9 +197,9 @@ nautilus_undo_manager_initialize_class (NautilusUndoManagerClass *klass) object_class->destroy = destroy; - klass->servant_init_func = POA_Nautilus_UndoManager__init; - klass->servant_destroy_func = POA_Nautilus_UndoManager__fini; - klass->vepv = &impl_Nautilus_UndoManager_vepv; + klass->servant_init_func = POA_Nautilus_Undo_Manager__init; + klass->servant_destroy_func = POA_Nautilus_Undo_Manager__fini; + klass->vepv = &impl_Nautilus_Undo_Manager_vepv; /* Setup signals */ signals[UNDO_TRANSACTION_OCCURED] @@ -218,236 +214,149 @@ nautilus_undo_manager_initialize_class (NautilusUndoManagerClass *klass) gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); } -/* nautilus_undo_manager_transaction_in_progress */ -gboolean -nautilus_undo_manager_transaction_in_progress (void) -{ - return global_undo_manager->details->transaction_in_progress; -} - - -/* nautilus_undo_manager_get_current_transaction - * Return current undo transaction - */ -NautilusUndoTransaction * -nautilus_undo_manager_get_current_transaction (void) -{ - return global_undo_manager->details->transaction; -} - /* nautilus_undo_manager_begin_transaction */ -gboolean -nautilus_undo_manager_begin_transaction (const gchar *name) +NautilusUndoTransactionInProgress * +nautilus_undo_manager_begin_transaction (GtkObject *object, const gchar *name) { + NautilusUndoManager *manager; + NautilusUndoTransactionInProgress *tip; + + /* Locate undo manager */ + manager = gtk_object_get_data (object, NAUTILUS_UNDO_MANAGER_NAME); + g_return_val_if_fail (manager != NULL, NULL); + /* We aren't handling nested transactions currently */ - if (global_undo_manager->details->transaction_in_progress) { + if (manager->details->transaction_in_progress) { g_warning("NautilusUndoManager does not handle nested transactions. End previous transaction first."); - return FALSE; + return NULL; } + /* Create NautilusUndoTransactionInProgress */ + tip = g_new (NautilusUndoTransactionInProgress, 1); + g_assert(tip); + + tip->manager = manager; + /* Create new transaction */ - global_undo_manager->details->transaction = nautilus_undo_transaction_new(name); + tip->transaction = nautilus_undo_transaction_new(name); - global_undo_manager->details->transaction_in_progress = TRUE; + tip->manager->details->transaction_in_progress = TRUE; - return TRUE; + return tip; } /* nautilus_undo_manager_end_transaction */ -gboolean -nautilus_undo_manager_end_transaction (void) +void +nautilus_undo_manager_end_transaction (NautilusUndoTransactionInProgress *tip) { /* Verify a transaction is in progress */ - if (!global_undo_manager->details->transaction_in_progress) { + if (!tip->manager->details->transaction_in_progress) { g_warning("NautilusUndoManager has no current transaction. Begin a transaction first."); - return FALSE; + return; } - global_undo_manager->details->transaction_in_progress = FALSE; + tip->manager->details->transaction_in_progress = FALSE; /* Commit current transaction to undo list */ - nautilus_undo_manager_add_undo_transaction (global_undo_manager->details->transaction); + nautilus_undo_manager_add_transaction (tip->manager, tip->transaction); /* Fire off signal informing that an undo transaction has occurred */ - gtk_signal_emit (GTK_OBJECT (global_undo_manager), signals[UNDO_TRANSACTION_OCCURED]); - - return TRUE; + gtk_signal_emit (GTK_OBJECT (tip->manager), signals[UNDO_TRANSACTION_OCCURED]); } /* nautilus_undo_manager_undo_last_transaction */ -gboolean -nautilus_undo_manager_undo_last_transaction (void) +void +nautilus_undo_manager_undo (NautilusUndoManager *manager) { GList *list; NautilusUndoTransaction *undo_transaction; /* Verify we have a transaction to be undone */ - if (global_undo_manager->details->undo_list == NULL) { + if (manager->details->undo_list == NULL) { g_warning("NautilusUndoManager has no transaction to be undone."); - return FALSE; + return; } /* Pop last transaction off undo list */ - list = g_list_last(global_undo_manager->details->undo_list); + list = g_list_last(manager->details->undo_list); g_assert(list); undo_transaction = list->data; - global_undo_manager->details->undo_list = g_list_remove(global_undo_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); /* Place transaction into redo list */ - if (global_undo_manager->details->enable_redo) { - nautilus_undo_manager_add_redo_transaction (undo_transaction); + if (manager->details->enable_redo) { + /* nautilus_undo_manager_add_redo_transaction (undo_transaction); */ } else { /* Purge transaction */ nautilus_undo_transaction_destroy(undo_transaction); } /* Fire off signal informing that an undo transaction has occurred */ - gtk_signal_emit (GTK_OBJECT (global_undo_manager), signals[UNDO_TRANSACTION_OCCURED]); - - return TRUE; + gtk_signal_emit (GTK_OBJECT (manager), signals[UNDO_TRANSACTION_OCCURED]); } /* nautilus_undo_manager_redo_last_undone_transaction */ -gboolean -nautilus_undo_manager_redo_last_undone_transaction (void) +void +nautilus_undo_manager_redo (NautilusUndoManager *manager) { GList *list; NautilusUndoTransaction *redo_transaction; /* Are we allowing redo operations? */ - if (global_undo_manager->details->enable_redo) { + if (manager->details->enable_redo) { g_warning("NautilusUndoManager is not configure to allow redo operations."); - return FALSE; + return; } /* Verify we have a transaction to be redone */ - if (global_undo_manager->details->redo_list == NULL) { + if (manager->details->redo_list == NULL) { g_warning("NautilusUndoManager has no transaction to be redone."); - return FALSE; + return; } /* Pop last transaction off redo list */ - list = g_list_last(global_undo_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); /* Place transaction into undo list */ - nautilus_undo_manager_add_undo_transaction (redo_transaction); - - return TRUE; + nautilus_undo_manager_add_transaction (manager, redo_transaction); } -/* nautilus_undo_manager_add_undoable_to_transaction */ -gboolean -nautilus_undo_manager_add_undoable_to_transaction (NautilusUndoable *undoable) -{ - gboolean result; - - /* Verify a transaction is in progress */ - if (!global_undo_manager->details->transaction_in_progress) { - g_warning("NautilusUndoManager has no current transaction. Begin a transaction first."); - return FALSE; - } - - g_assert(global_undo_manager->details->transaction != NULL); - - result = nautilus_undo_transaction_add_undoable(global_undo_manager->details->transaction, undoable); - - return result; -} - - -/* nautilus_undo_manager_remove_transaction */ -gboolean -nautilus_undo_manager_remove_transaction (NautilusUndoTransaction *transaction) -{ - /* Verify a transaction is not in progress */ - if (global_undo_manager->details->transaction_in_progress) { - g_warning("NautilusUndoManager cannot remove a transaction while one is in progress."); - return FALSE; - } - - g_return_val_if_fail(transaction != NULL, FALSE); - - /* Remove transaction from undo list */ - global_undo_manager->details->undo_list = g_list_remove(global_undo_manager->details->undo_list, - transaction); - - /* Remove transaction from redo list */ - global_undo_manager->details->redo_list = g_list_remove(global_undo_manager->details->redo_list, - transaction); - - /* Fire off signal informing that an undo transaction has occurred */ - gtk_signal_emit (GTK_OBJECT (global_undo_manager), signals[UNDO_TRANSACTION_OCCURED]); - - return TRUE; -} - - /* nautilus_undo_manager_add_undo_transaction */ -gboolean -nautilus_undo_manager_add_undo_transaction (NautilusUndoTransaction *transaction) +void +nautilus_undo_manager_add_transaction (NautilusUndoManager *manager, NautilusUndoTransaction *transaction) { int length; /* Verify a transaction is not in progress */ - if (global_undo_manager->details->transaction_in_progress) { + if (manager->details->transaction_in_progress) { g_warning("NautilusUndoManager cannot add a transaction while one is in progress."); - return FALSE; + return; } - g_return_val_if_fail(transaction != NULL, FALSE); + g_return_if_fail (transaction != NULL); /* Check and see if we are over our queue limit */ - length = g_list_length(global_undo_manager->details->undo_list); + length = g_list_length (manager->details->undo_list); - if (length >= global_undo_manager->details->queue_depth) { - global_undo_manager->details->undo_list = prune_undo_manager_list ( - global_undo_manager->details->undo_list, - (length - global_undo_manager->details->queue_depth) + 1); + if (length >= manager->details->queue_depth) { + manager->details->undo_list = prune_undo_manager_list ( + manager->details->undo_list, + (length - manager->details->queue_depth) + 1); } /* Add transaction to undo list */ - global_undo_manager->details->undo_list = g_list_append(global_undo_manager->details->undo_list, - transaction); + manager->details->undo_list = g_list_append(manager->details->undo_list, transaction); /* Fire off signal informing that an undo transaction has occurred */ - gtk_signal_emit (GTK_OBJECT (global_undo_manager), signals[UNDO_TRANSACTION_OCCURED]); - - return TRUE; -} - -/* nautilus_undo_manager_add_redo_transaction */ -gboolean -nautilus_undo_manager_add_redo_transaction (NautilusUndoTransaction *transaction) -{ - g_return_val_if_fail(transaction != NULL, FALSE); - - /* Verify a transaction is not in progress */ - if (global_undo_manager->details->transaction_in_progress) { - g_warning("NautilusUndoManager cannot add a transaction while one is in progress."); - return FALSE; - } - - /* Make sure we allow redo */ - if (!global_undo_manager->details->enable_redo) { - return FALSE; - } - - /* Add transaction to undo list */ - global_undo_manager->details->undo_list = g_list_append(global_undo_manager->details->undo_list, - transaction); - - /* Fire off signal informing that an redo transaction has occurred */ - gtk_signal_emit (GTK_OBJECT (global_undo_manager), signals[UNDO_TRANSACTION_OCCURED]); - - return TRUE; + gtk_signal_emit (GTK_OBJECT (manager), signals[UNDO_TRANSACTION_OCCURED]); } @@ -456,27 +365,32 @@ nautilus_undo_manager_add_redo_transaction (NautilusUndoTransaction *transaction * Remove any transaction with object as target from * the undo and redo queues */ - + gboolean nautilus_undo_manager_unregister_object (GtkObject *object) { + NautilusUndoManager *manager; NautilusUndoTransaction *transaction; gboolean success; GList *list; int index, length; success = FALSE; - + + /* Locate undo manager */ + manager = gtk_object_get_data (object, NAUTILUS_UNDO_MANAGER_NAME); + g_return_val_if_fail (manager != NULL, success); + /* Check undo list */ - length = g_list_length(global_undo_manager->details->undo_list); + length = g_list_length (manager->details->undo_list); for (index = 0; index < length; index++) { - list = g_list_nth(global_undo_manager->details->undo_list, index); + list = g_list_nth (manager->details->undo_list, index); if (list) { transaction = list->data; - if (nautilus_undo_transaction_contains_object(transaction, object)) { - global_undo_manager->details->undo_list = - g_list_remove(global_undo_manager->details->undo_list, transaction); - nautilus_undo_transaction_destroy(transaction); + 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); index--; success = TRUE; } @@ -484,14 +398,14 @@ nautilus_undo_manager_unregister_object (GtkObject *object) } /* Check redo list */ - length = g_list_length(global_undo_manager->details->redo_list); + length = g_list_length (manager->details->redo_list); for (index = 0; index < length; index++) { - list = g_list_nth(global_undo_manager->details->redo_list, index); + list = g_list_nth (manager->details->redo_list, index); if (list) { transaction = list->data; if (nautilus_undo_transaction_contains_object(transaction, object)) { - global_undo_manager->details->redo_list = - g_list_remove(global_undo_manager->details->redo_list, transaction); + manager->details->redo_list = + g_list_remove (manager->details->redo_list, transaction); nautilus_undo_transaction_destroy(transaction); index--; success = TRUE; @@ -501,7 +415,7 @@ nautilus_undo_manager_unregister_object (GtkObject *object) if (success) { /* Fire off signal informing that a transaction has occurred */ - gtk_signal_emit (GTK_OBJECT (global_undo_manager), signals[UNDO_TRANSACTION_OCCURED]); + gtk_signal_emit (GTK_OBJECT (manager), signals[UNDO_TRANSACTION_OCCURED]); } return success; @@ -509,10 +423,10 @@ nautilus_undo_manager_unregister_object (GtkObject *object) /* nautilus_undo_manager_can_undo */ gboolean -nautilus_undo_manager_can_undo (void) +nautilus_undo_manager_can_undo (NautilusUndoManager *manager) { - if (global_undo_manager != NULL) { - return (g_list_length(global_undo_manager->details->undo_list) > 0); + if (manager != NULL) { + return (g_list_length (manager->details->undo_list) > 0); } else { return FALSE; } @@ -520,11 +434,11 @@ nautilus_undo_manager_can_undo (void) /* nautilus_undo_manager_can_redo */ gboolean -nautilus_undo_manager_can_redo (void) +nautilus_undo_manager_can_redo (NautilusUndoManager *manager) { - if (global_undo_manager->details->enable_redo) { - if (global_undo_manager != NULL) { - return (g_list_length(global_undo_manager->details->redo_list) > 0); + if (manager->details->enable_redo) { + if (manager != NULL) { + return (g_list_length (manager->details->redo_list) > 0); } else { return FALSE; } @@ -540,23 +454,22 @@ nautilus_undo_manager_can_redo (void) * current undo transaction. */ -static gint -get_current_transaction_name(GList *list, gchar *name, gint max_length) +static const gchar * +get_current_transaction_name (GList *list) { NautilusUndoTransaction *transaction; const gchar *transaction_name; - gint name_length; - + /* Check for NULL list */ if (list == NULL) { g_warning("Unable to get current transaction name due to NULL undo list."); - return -1; + return NULL; } /* Check for empty list */ if (g_list_length(list) <= 0) { g_warning("No transaction to get current undo transaction name from."); - return -1; + return NULL; } /* Get last transaction from list */ @@ -564,30 +477,17 @@ get_current_transaction_name(GList *list, gchar *name, gint max_length) transaction = list->data; if (transaction == NULL) { g_warning("Unable to get current transaction name due to NULL transaction in list."); - return -1; + return NULL; } /* Check for valid transaction name */ transaction_name = nautilus_undo_transaction_get_name(transaction); if ( transaction_name == NULL) { g_warning("Current transaction name is NULL."); - return -1; + return NULL; } - /* Return length of transaction name if name argument is NULL */ - if (name == NULL) { - return strlen(transaction_name); - } - - /* Copy over requested amount into return name argument */ - name_length = strlen(transaction_name); - if (name_length > max_length) { - strncpy(name, transaction_name, max_length); - return max_length; - } else { - strncpy(name, transaction_name, name_length); - return name_length; - } + return transaction_name; } @@ -598,10 +498,10 @@ get_current_transaction_name(GList *list, gchar *name, gint max_length) * current undo transaction. */ -gint -nautilus_undo_manager_get_current_undo_transaction_name (gchar *name, gint max_length) +const gchar * +nautilus_undo_manager_get_current_undo_transaction_name (NautilusUndoManager *manager) { - return get_current_transaction_name(global_undo_manager->details->undo_list, name, max_length); + return get_current_transaction_name (manager->details->undo_list); } /* nautilus_undo_manager_get_current_undo_transaction_name @@ -611,120 +511,97 @@ nautilus_undo_manager_get_current_undo_transaction_name (gchar *name, gint max_l * current undo transaction. */ -gint -nautilus_undo_manager_get_current_redo_transaction_name (gchar *name, gint max_length) +const gchar * +nautilus_undo_manager_get_current_redo_transaction_name (NautilusUndoManager *manager) { - return get_current_transaction_name(global_undo_manager->details->redo_list, name, max_length); + return get_current_transaction_name (manager->details->redo_list); } /* destroy */ static void destroy (GtkObject *object) { + NautilusUndoManager *manager; + g_return_if_fail (NAUTILUS_IS_UNDO_MANAGER (object)); + manager = NAUTILUS_UNDO_MANAGER (object); + /* Clear lists */ - global_undo_manager->details->undo_list = free_undo_manager_list_data(global_undo_manager->details->undo_list); - global_undo_manager->details->redo_list = free_undo_manager_list_data(global_undo_manager->details->redo_list); + manager->details->undo_list = free_undo_manager_list_data (manager->details->undo_list); + manager->details->redo_list = free_undo_manager_list_data (manager->details->redo_list); NAUTILUS_CALL_PARENT_CLASS (GTK_OBJECT_CLASS, destroy, (object)); } -/* Initialize Nautilus global undo manager */ -gboolean -nautilus_undo_manager_initialize_global_manager (void) -{ - if (global_undo_manager != NULL) { - g_warning("A global undo manager has already been created."); - return FALSE; - } - - global_undo_manager = nautilus_undo_manager_new(); - - return TRUE; -} - - -/* Return global undo manager */ -NautilusUndoManager * -nautilus_undo_manager_get_undo_manager (void) -{ - g_return_val_if_fail(global_undo_manager != NULL, NULL); - return global_undo_manager; -} - - /* nautilus_undo_manager_enable_redo * * Enable or disable redo functionality */ -gboolean -nautilus_undo_manager_enable_redo (gboolean value) + +void +nautilus_undo_manager_enable_redo (NautilusUndoManager *manager, gboolean value) { - g_return_val_if_fail(global_undo_manager != NULL, FALSE); + g_return_if_fail (manager != NULL); - global_undo_manager->details->enable_redo = value; + manager->details->enable_redo = value; /* Flush and free redo queue */ - g_list_free(global_undo_manager->details->redo_list); - - return TRUE; + g_list_free (manager->details->redo_list); } /* nautilus_undo_manager_enable_redo * * Enable or disable redo functionality */ -gboolean -nautilus_undo_manager_set_queue_depth (gint depth) +void +nautilus_undo_manager_set_queue_depth (NautilusUndoManager *manager, gint depth) { int length; /* Don't allow negative or zero queue depth */ if (depth <= 0) { g_warning ("NautilusUndoManager doesn not allow negative or zero length queue."); - return FALSE; + return; } - global_undo_manager->details->queue_depth = depth; + manager->details->queue_depth = depth; /* Prune lists */ - length = g_list_length (global_undo_manager->details->undo_list); + length = g_list_length (manager->details->undo_list); if (length > depth) { - global_undo_manager->details->undo_list = prune_undo_manager_list (global_undo_manager->details->undo_list, + manager->details->undo_list = prune_undo_manager_list (manager->details->undo_list, length - depth); } - length = g_list_length (global_undo_manager->details->redo_list); + length = g_list_length (manager->details->redo_list); if (length > depth) { - global_undo_manager->details->undo_list = prune_undo_manager_list (global_undo_manager->details->redo_list, - length - depth); + manager->details->undo_list = prune_undo_manager_list (manager->details->redo_list, + length - depth); } /* Fire off signal informing that an undo transaction has occurred */ - gtk_signal_emit (GTK_OBJECT (global_undo_manager), signals[UNDO_TRANSACTION_OCCURED]); - - return TRUE; + gtk_signal_emit (GTK_OBJECT (manager), signals[UNDO_TRANSACTION_OCCURED]); } /* free_undo_manager_list_data * * Clear undo data from list */ - + static GList * free_undo_manager_list_data (GList *list) { int length, index; NautilusUndoTransaction *transaction; - - length = g_list_length(list); + + length = g_list_length (list); for (index = 0; index < length; index++) { - list = g_list_last(list); + list = g_list_last (list); if (list) { transaction = list->data; - list = g_list_remove(list, transaction); - nautilus_undo_transaction_destroy(transaction); + list = g_list_remove (list, transaction); + nautilus_undo_transaction_destroy (transaction); } } @@ -736,7 +613,7 @@ free_undo_manager_list_data (GList *list) * * Prune n items from start of list */ - + static GList * prune_undo_manager_list (GList *list, gint items) { @@ -744,11 +621,11 @@ prune_undo_manager_list (GList *list, gint items) NautilusUndoTransaction *transaction; for (index = 0; index < items; index++) { - list = g_list_first(list); + list = g_list_first (list); if (list) { transaction = list->data; - list = g_list_remove(list, transaction); - nautilus_undo_transaction_destroy(transaction); + list = g_list_remove (list, transaction); + nautilus_undo_transaction_destroy (transaction); } } diff --git a/libnautilus-extensions/nautilus-undo-manager.h b/libnautilus-extensions/nautilus-undo-manager.h index aef846797..272f0bd00 100644 --- a/libnautilus-extensions/nautilus-undo-manager.h +++ b/libnautilus-extensions/nautilus-undo-manager.h @@ -26,9 +26,10 @@ #define NAUTILUS_UNDO_MANAGER_H #include <bonobo/bonobo-object.h> -#include <libnautilus/nautilus-undo-manager-component.h> #include <bonobo/bonobo-persist.h> + #include "nautilus-undo-transaction.h" +#include "nautilus-undo.h" #define NAUTILUS_TYPE_UNDO_MANAGER \ (nautilus_undo_manager_get_type ()) @@ -43,6 +44,7 @@ typedef struct NautilusUndoManagerClass NautilusUndoManagerClass; typedef struct NautilusUndoManagerDetails NautilusUndoManagerDetails; +typedef struct NautilusUndoTransactionInProgress NautilusUndoTransactionInProgress; struct NautilusUndoManager { BonoboPersist parent; @@ -50,41 +52,44 @@ struct NautilusUndoManager { }; struct NautilusUndoManagerClass { - BonoboPersistClass parent_class; - + BonoboPersistClass parent_class; void (* undo_transaction_occurred) (GtkObject *object, gpointer data); - gpointer servant_init_func, servant_destroy_func, vepv; }; +struct NautilusUndoTransactionInProgress { + NautilusUndoManager *manager; + NautilusUndoTransaction *transaction; + +}; + +#define NAUTILUS_UNDO_MANAGER_NAME "NautilusUndoManager" /* GtkObject */ -GtkType nautilus_undo_manager_get_type (void); -NautilusUndoManager *nautilus_undo_manager_new (void); +GtkType nautilus_undo_manager_get_type (void); +NautilusUndoManager *nautilus_undo_manager_new (void); /* Prototypes */ -gboolean nautilus_undo_manager_initialize_global_manager (void); -gboolean nautilus_undo_manager_add_undoable_to_transaction (NautilusUndoable *undoable); -gboolean nautilus_undo_manager_begin_transaction (const gchar *name); -gboolean nautilus_undo_manager_end_transaction (void); -gboolean nautilus_undo_manager_undo_last_transaction (void); -gboolean nautilus_undo_manager_redo_last_undone_transaction (void); -NautilusUndoTransaction *nautilus_undo_manager_get_current_transaction (void); -gboolean nautilus_undo_manager_transaction_in_progress (void); -gboolean nautilus_undo_manager_add_undo_transaction (NautilusUndoTransaction - *transaction); -gboolean nautilus_undo_manager_add_redo_transaction (NautilusUndoTransaction - *transaction); -gboolean nautilus_undo_manager_remove_transaction (NautilusUndoTransaction - *transaction); +NautilusUndoTransactionInProgress *nautilus_undo_manager_begin_transaction (GtkObject *object, const gchar *name); +void nautilus_undo_manager_end_transaction (NautilusUndoTransactionInProgress *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); + +gboolean nautilus_undo_manager_can_undo (NautilusUndoManager *manager); +gboolean nautilus_undo_manager_can_redo (NautilusUndoManager *manager); + +const gchar *nautilus_undo_manager_get_current_undo_transaction_name (NautilusUndoManager *manager); +const gchar *nautilus_undo_manager_get_current_redo_transaction_name (NautilusUndoManager *manager); + +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); -gboolean nautilus_undo_manager_can_undo (void); -gboolean nautilus_undo_manager_can_redo (void); -gint nautilus_undo_manager_get_current_undo_transaction_name (gchar *name, gint max_length); -gint nautilus_undo_manager_get_current_redo_transaction_name (gchar *name, gint max_length); -NautilusUndoManager *nautilus_undo_manager_get_undo_manager (void); -gboolean nautilus_undo_manager_enable_redo (gboolean value); -gboolean nautilus_undo_manager_set_queue_depth (gint depth); #endif diff --git a/libnautilus-private/nautilus-entry.c b/libnautilus-private/nautilus-entry.c index a20fd9cf1..ace881933 100644 --- a/libnautilus-private/nautilus-entry.c +++ b/libnautilus-private/nautilus-entry.c @@ -28,7 +28,6 @@ #include "nautilus-entry.h" #include "nautilus-gtk-macros.h" -#include <libnautilus/nautilus-undo-manager.h> #include <gdk/gdkkeysyms.h> #include <gtk/gtkmain.h> @@ -121,7 +120,10 @@ nautilus_entry_key_press (GtkWidget *widget, GdkEventKey *event) case 'z': if (event->state & GDK_CONTROL_MASK && entry->use_undo == TRUE && entry->handle_undo_key == TRUE) { - nautilus_undo_manager_undo_last_transaction(); + NautilusUndoManager *undo_manager; + undo_manager = gtk_object_get_data ( GTK_OBJECT (entry), NAUTILUS_UNDO_MANAGER_NAME); + g_assert (undo_manager); + nautilus_undo_manager_undo (undo_manager); return FALSE; } break; @@ -189,6 +191,7 @@ static void nautilus_entry_changed (GtkEditable *editable) { NautilusEntry *entry; + NautilusUndoTransactionInProgress *tip; g_assert (GTK_IS_EDITABLE (editable)); g_assert (NAUTILUS_IS_ENTRY (editable)); @@ -197,10 +200,10 @@ nautilus_entry_changed (GtkEditable *editable) /* Register undo transaction */ if (!entry->undo_registered && entry->use_undo) { - nautilus_undo_manager_begin_transaction (_("Edit")); - nautilus_undoable_save_undo_snapshot (GTK_OBJECT(entry), save_undo_snapshot_callback, - restore_from_undo_snapshot_callback); - nautilus_undo_manager_end_transaction (); + tip = nautilus_undo_manager_begin_transaction (GTK_OBJECT (entry), _("Edit")); + nautilus_undoable_save_undo_snapshot (tip->transaction, GTK_OBJECT(entry), save_undo_snapshot_callback, + restore_from_undo_snapshot_callback); + nautilus_undo_manager_end_transaction (tip); entry->undo_registered = TRUE; } @@ -270,15 +273,17 @@ restore_from_undo_snapshot_callback (NautilusUndoable *undoable) * Enable undo mechanism in entry item. */ void -nautilus_entry_enable_undo (NautilusEntry *entry, gboolean value) +nautilus_entry_enable_undo (NautilusEntry *entry, NautilusUndoManager *manager, gboolean value) { g_assert (entry); g_assert (NAUTILUS_IS_ENTRY (entry)); - + entry->undo_registered = !value; entry->use_undo = value; - if (!entry->undo_registered) { + if (!entry->undo_registered) { + gtk_object_set_data ( GTK_OBJECT(entry), NAUTILUS_UNDO_MANAGER_NAME, manager); + /* Get copy of entry text */ if (entry->undo_text != NULL) { g_free (entry->undo_text); diff --git a/libnautilus-private/nautilus-entry.h b/libnautilus-private/nautilus-entry.h index 3df09f064..a902493a1 100644 --- a/libnautilus-private/nautilus-entry.h +++ b/libnautilus-private/nautilus-entry.h @@ -29,6 +29,7 @@ #include <libgnome/gnome-defs.h> #include <gtk/gtkentry.h> +#include <libnautilus/nautilus-undo-manager.h> BEGIN_GNOME_DECLS @@ -48,7 +49,7 @@ typedef struct NautilusEntryClass NautilusEntryClass; struct NautilusEntry { GtkEntry parent; - + gchar *undo_text; gboolean undo_registered; gboolean use_undo; @@ -59,13 +60,15 @@ struct NautilusEntryClass { GtkEntryClass parent_class; }; -GtkType nautilus_entry_get_type (void); -GtkWidget* nautilus_entry_new (void); +GtkType nautilus_entry_get_type (void); +GtkWidget* nautilus_entry_new (void); -void nautilus_entry_select_all (NautilusEntry *entry); -void nautilus_entry_select_all_at_idle (NautilusEntry *entry); -void nautilus_entry_enable_undo (NautilusEntry *entry, gboolean value); -void nautilus_entry_enable_undo_key (NautilusEntry *entry, gboolean value); +void nautilus_entry_select_all (NautilusEntry *entry); +void nautilus_entry_select_all_at_idle (NautilusEntry *entry); +void nautilus_entry_enable_undo (NautilusEntry *entry, + NautilusUndoManager *manager, + gboolean value); +void nautilus_entry_enable_undo_key (NautilusEntry *entry, gboolean value); END_GNOME_DECLS diff --git a/libnautilus-private/nautilus-icon-container.c b/libnautilus-private/nautilus-icon-container.c index 43f1aaad4..994f1e636 100644 --- a/libnautilus-private/nautilus-icon-container.c +++ b/libnautilus-private/nautilus-icon-container.c @@ -3453,6 +3453,8 @@ nautilus_icon_container_start_renaming_selected_item (NautilusIconContainer *con { NautilusIconContainerDetails *details; NautilusIcon *icon; + GtkWidget *toplevel; + NautilusUndoManager *manager; ArtIRect text_rect; ArtDRect icon_rect; GdkFont *font; @@ -3487,6 +3489,11 @@ nautilus_icon_container_start_renaming_selected_item (NautilusIconContainer *con nautilus_icon_text_item_get_type (), NULL)); + /* Add undo manager */ + toplevel = gtk_widget_get_toplevel ( GTK_WIDGET (container)); + manager = gtk_object_get_data ( GTK_OBJECT (toplevel), NAUTILUS_UNDO_MANAGER_NAME); + gtk_object_set_data ( GTK_OBJECT (details->rename_widget), NAUTILUS_UNDO_MANAGER_NAME, manager); + /* Determine widget position widget in container */ font = details->label_font[details->zoom_level]; ppu = GNOME_CANVAS_ITEM (icon->item)->canvas->pixels_per_unit; diff --git a/libnautilus-private/nautilus-icon-text-item.c b/libnautilus-private/nautilus-icon-text-item.c index 8acd5039a..54f91f023 100644 --- a/libnautilus-private/nautilus-icon-text-item.c +++ b/libnautilus-private/nautilus-icon-text-item.c @@ -20,6 +20,7 @@ #include <gtk/gtkmain.h> #include <gtk/gtksignal.h> #include <gtk/gtkwindow.h> +#include <libgnome/gnome-i18n.h> /* Margins used to display the information */ #define MARGIN_X 2 @@ -801,6 +802,8 @@ iti_event (GnomeCanvasItem *item, GdkEvent *event) int idx; double x, y; int cx, cy; + NautilusUndoTransactionInProgress *tip; + iti = ITI (item); priv = iti->priv; @@ -835,10 +838,10 @@ iti_event (GnomeCanvasItem *item, GdkEvent *event) if (!priv->undo_registered) { priv->undo_registered = TRUE; - nautilus_undo_manager_begin_transaction ("Rename"); - nautilus_undoable_save_undo_snapshot (GTK_OBJECT(iti), save_undo_snapshot_callback, - restore_from_undo_snapshot_callback); - nautilus_undo_manager_end_transaction (); + tip = nautilus_undo_manager_begin_transaction ( GTK_OBJECT(iti), "Rename"); + nautilus_undoable_save_undo_snapshot (tip->transaction, GTK_OBJECT(iti), + save_undo_snapshot_callback, restore_from_undo_snapshot_callback); + nautilus_undo_manager_end_transaction (tip); } /* Handle any events that reach us */ @@ -1367,15 +1370,16 @@ restore_from_undo_snapshot_callback(NautilusUndoable *undoable) char *undo_text; NautilusIconTextItem *iti; ItiPrivate *priv; + NautilusUndoTransactionInProgress *tip; iti = NAUTILUS_ICON_TEXT_ITEM(undoable->undo_target_class); priv = iti->priv; /* Register undo transaction */ - nautilus_undo_manager_begin_transaction ("Rename"); - nautilus_undoable_save_undo_snapshot (GTK_OBJECT(iti), save_undo_snapshot_callback, - restore_from_undo_snapshot_callback); - nautilus_undo_manager_end_transaction (); + tip = nautilus_undo_manager_begin_transaction (GTK_OBJECT(iti), _("Rename")); + nautilus_undoable_save_undo_snapshot (tip->transaction, GTK_OBJECT(iti), + save_undo_snapshot_callback, restore_from_undo_snapshot_callback); + nautilus_undo_manager_end_transaction (tip); 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 1faf53994..97b1c0948 100644 --- a/libnautilus-private/nautilus-undo-manager.c +++ b/libnautilus-private/nautilus-undo-manager.c @@ -25,6 +25,7 @@ #include <config.h> #include <gtk/gtksignal.h> #include <gtk/gtkmain.h> +#include <glib.h> #include <string.h> #include <bonobo/bonobo-main.h> #include <bonobo/bonobo-control.h> @@ -45,11 +46,11 @@ static guint signals[LAST_SIGNAL]; typedef struct { - POA_Nautilus_UndoManager servant; + POA_Nautilus_Undo_Manager servant; gpointer bonobo_object; NautilusUndoManager *gtk_object; -} impl_POA_Nautilus_UndoManager; +} impl_POA_Nautilus_Undo_Manager; /* GtkObject */ @@ -62,33 +63,33 @@ static GList *prune_undo_manager_list (GList *list, gint items); /* CORBA/Bonobo */ -static CORBA_boolean impl_Nautilus_UndoManager__begin_transaction (impl_POA_Nautilus_UndoManager *servant, - const CORBA_char *name, - CORBA_Environment *ev); -static void impl_Nautilus_UndoManager__end_transaction (impl_POA_Nautilus_UndoManager *servant, - CORBA_Environment *ev); +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); NAUTILUS_DEFINE_CLASS_BOILERPLATE(NautilusUndoManager, nautilus_undo_manager, BONOBO_OBJECT_TYPE) -POA_Nautilus_UndoManager__epv libnautilus_extensions_Nautilus_UndoManager_epv = +POA_Nautilus_Undo_Manager__epv libnautilus_Nautilus_Undo_Manager_epv = { NULL, /* _private */ - (gpointer) &impl_Nautilus_UndoManager__begin_transaction, - (gpointer) &impl_Nautilus_UndoManager__end_transaction, + (gpointer) &impl_Nautilus_Undo_Manager__append, + (gpointer) &impl_Nautilus_Undo_Manager__forget, }; static PortableServer_ServantBase__epv base_epv = { NULL, NULL, NULL }; -static POA_Nautilus_UndoManager__vepv impl_Nautilus_UndoManager_vepv = +static POA_Nautilus_Undo_Manager__vepv impl_Nautilus_Undo_Manager_vepv = { &base_epv, NULL, - &libnautilus_extensions_Nautilus_UndoManager_epv + &libnautilus_Nautilus_Undo_Manager_epv }; static void -impl_Nautilus_UndoManager__destroy(BonoboObject *obj, impl_POA_Nautilus_UndoManager *servant) +impl_Nautilus_Undo_Manager__destroy(BonoboObject *obj, impl_POA_Nautilus_Undo_Manager *servant) { PortableServer_ObjectId *objid; CORBA_Environment ev; @@ -107,17 +108,17 @@ impl_Nautilus_UndoManager__destroy(BonoboObject *obj, impl_POA_Nautilus_UndoMana CORBA_exception_free(&ev); } -static Nautilus_UndoManager -impl_Nautilus_UndoManager__create(NautilusUndoManager *manager, CORBA_Environment * ev) +static Nautilus_Undo_Manager +impl_Nautilus_Undo_Manager__create(NautilusUndoManager *manager, CORBA_Environment * ev) { - Nautilus_UndoManager retval; - impl_POA_Nautilus_UndoManager *servant; + Nautilus_Undo_Manager retval; + impl_POA_Nautilus_Undo_Manager *servant; void (*servant_init_func) (PortableServer_Servant servant, CORBA_Environment *ev); NautilusUndoManagerClass *undo_class = NAUTILUS_UNDO_MANAGER_CLASS (GTK_OBJECT(manager)->klass); servant_init_func = undo_class->servant_init_func; - servant = g_new0 (impl_POA_Nautilus_UndoManager, 1); + servant = g_new0 (impl_POA_Nautilus_Undo_Manager, 1); servant->servant.vepv = undo_class->vepv; if (!servant->servant.vepv->Bonobo_Unknown_epv) servant->servant.vepv->Bonobo_Unknown_epv = bonobo_object_get_epv (); @@ -127,24 +128,22 @@ impl_Nautilus_UndoManager__create(NautilusUndoManager *manager, CORBA_Environmen retval = bonobo_object_activate_servant (BONOBO_OBJECT (manager), servant); - gtk_signal_connect (GTK_OBJECT (manager), "destroy", GTK_SIGNAL_FUNC (impl_Nautilus_UndoManager__destroy), servant); + gtk_signal_connect (GTK_OBJECT (manager), "destroy", GTK_SIGNAL_FUNC (impl_Nautilus_Undo_Manager__destroy), servant); return retval; } -static CORBA_boolean -impl_Nautilus_UndoManager__begin_transaction (impl_POA_Nautilus_UndoManager *servant, +static void +impl_Nautilus_Undo_Manager__append (impl_POA_Nautilus_Undo_Manager *servant, const CORBA_char *name, CORBA_Environment *ev) { - return nautilus_undo_manager_begin_transaction (name); } static void -impl_Nautilus_UndoManager__end_transaction (impl_POA_Nautilus_UndoManager *servant, +impl_Nautilus_Undo_Manager__forget (impl_POA_Nautilus_Undo_Manager *servant, CORBA_Environment *ev) { - nautilus_undo_manager_end_transaction (); } @@ -169,9 +168,6 @@ nautilus_undo_manager_initialize (NautilusUndoManager *manager) manager->details = g_new0 (NautilusUndoManagerDetails, 1); - /* Init transaction to none */ - manager->details->transaction = NULL; - /* Create empty lists */ manager->details->undo_list = NULL; manager->details->redo_list = NULL; @@ -185,7 +181,7 @@ nautilus_undo_manager_initialize (NautilusUndoManager *manager) /* No transaction is in progress */ manager->details->transaction_in_progress = FALSE; - bonobo_object_construct (BONOBO_OBJECT (manager), impl_Nautilus_UndoManager__create (manager, &ev)); + bonobo_object_construct (BONOBO_OBJECT (manager), impl_Nautilus_Undo_Manager__create (manager, &ev)); CORBA_exception_free(&ev); } @@ -201,9 +197,9 @@ nautilus_undo_manager_initialize_class (NautilusUndoManagerClass *klass) object_class->destroy = destroy; - klass->servant_init_func = POA_Nautilus_UndoManager__init; - klass->servant_destroy_func = POA_Nautilus_UndoManager__fini; - klass->vepv = &impl_Nautilus_UndoManager_vepv; + klass->servant_init_func = POA_Nautilus_Undo_Manager__init; + klass->servant_destroy_func = POA_Nautilus_Undo_Manager__fini; + klass->vepv = &impl_Nautilus_Undo_Manager_vepv; /* Setup signals */ signals[UNDO_TRANSACTION_OCCURED] @@ -218,236 +214,149 @@ nautilus_undo_manager_initialize_class (NautilusUndoManagerClass *klass) gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); } -/* nautilus_undo_manager_transaction_in_progress */ -gboolean -nautilus_undo_manager_transaction_in_progress (void) -{ - return global_undo_manager->details->transaction_in_progress; -} - - -/* nautilus_undo_manager_get_current_transaction - * Return current undo transaction - */ -NautilusUndoTransaction * -nautilus_undo_manager_get_current_transaction (void) -{ - return global_undo_manager->details->transaction; -} - /* nautilus_undo_manager_begin_transaction */ -gboolean -nautilus_undo_manager_begin_transaction (const gchar *name) +NautilusUndoTransactionInProgress * +nautilus_undo_manager_begin_transaction (GtkObject *object, const gchar *name) { + NautilusUndoManager *manager; + NautilusUndoTransactionInProgress *tip; + + /* Locate undo manager */ + manager = gtk_object_get_data (object, NAUTILUS_UNDO_MANAGER_NAME); + g_return_val_if_fail (manager != NULL, NULL); + /* We aren't handling nested transactions currently */ - if (global_undo_manager->details->transaction_in_progress) { + if (manager->details->transaction_in_progress) { g_warning("NautilusUndoManager does not handle nested transactions. End previous transaction first."); - return FALSE; + return NULL; } + /* Create NautilusUndoTransactionInProgress */ + tip = g_new (NautilusUndoTransactionInProgress, 1); + g_assert(tip); + + tip->manager = manager; + /* Create new transaction */ - global_undo_manager->details->transaction = nautilus_undo_transaction_new(name); + tip->transaction = nautilus_undo_transaction_new(name); - global_undo_manager->details->transaction_in_progress = TRUE; + tip->manager->details->transaction_in_progress = TRUE; - return TRUE; + return tip; } /* nautilus_undo_manager_end_transaction */ -gboolean -nautilus_undo_manager_end_transaction (void) +void +nautilus_undo_manager_end_transaction (NautilusUndoTransactionInProgress *tip) { /* Verify a transaction is in progress */ - if (!global_undo_manager->details->transaction_in_progress) { + if (!tip->manager->details->transaction_in_progress) { g_warning("NautilusUndoManager has no current transaction. Begin a transaction first."); - return FALSE; + return; } - global_undo_manager->details->transaction_in_progress = FALSE; + tip->manager->details->transaction_in_progress = FALSE; /* Commit current transaction to undo list */ - nautilus_undo_manager_add_undo_transaction (global_undo_manager->details->transaction); + nautilus_undo_manager_add_transaction (tip->manager, tip->transaction); /* Fire off signal informing that an undo transaction has occurred */ - gtk_signal_emit (GTK_OBJECT (global_undo_manager), signals[UNDO_TRANSACTION_OCCURED]); - - return TRUE; + gtk_signal_emit (GTK_OBJECT (tip->manager), signals[UNDO_TRANSACTION_OCCURED]); } /* nautilus_undo_manager_undo_last_transaction */ -gboolean -nautilus_undo_manager_undo_last_transaction (void) +void +nautilus_undo_manager_undo (NautilusUndoManager *manager) { GList *list; NautilusUndoTransaction *undo_transaction; /* Verify we have a transaction to be undone */ - if (global_undo_manager->details->undo_list == NULL) { + if (manager->details->undo_list == NULL) { g_warning("NautilusUndoManager has no transaction to be undone."); - return FALSE; + return; } /* Pop last transaction off undo list */ - list = g_list_last(global_undo_manager->details->undo_list); + list = g_list_last(manager->details->undo_list); g_assert(list); undo_transaction = list->data; - global_undo_manager->details->undo_list = g_list_remove(global_undo_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); /* Place transaction into redo list */ - if (global_undo_manager->details->enable_redo) { - nautilus_undo_manager_add_redo_transaction (undo_transaction); + if (manager->details->enable_redo) { + /* nautilus_undo_manager_add_redo_transaction (undo_transaction); */ } else { /* Purge transaction */ nautilus_undo_transaction_destroy(undo_transaction); } /* Fire off signal informing that an undo transaction has occurred */ - gtk_signal_emit (GTK_OBJECT (global_undo_manager), signals[UNDO_TRANSACTION_OCCURED]); - - return TRUE; + gtk_signal_emit (GTK_OBJECT (manager), signals[UNDO_TRANSACTION_OCCURED]); } /* nautilus_undo_manager_redo_last_undone_transaction */ -gboolean -nautilus_undo_manager_redo_last_undone_transaction (void) +void +nautilus_undo_manager_redo (NautilusUndoManager *manager) { GList *list; NautilusUndoTransaction *redo_transaction; /* Are we allowing redo operations? */ - if (global_undo_manager->details->enable_redo) { + if (manager->details->enable_redo) { g_warning("NautilusUndoManager is not configure to allow redo operations."); - return FALSE; + return; } /* Verify we have a transaction to be redone */ - if (global_undo_manager->details->redo_list == NULL) { + if (manager->details->redo_list == NULL) { g_warning("NautilusUndoManager has no transaction to be redone."); - return FALSE; + return; } /* Pop last transaction off redo list */ - list = g_list_last(global_undo_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); /* Place transaction into undo list */ - nautilus_undo_manager_add_undo_transaction (redo_transaction); - - return TRUE; + nautilus_undo_manager_add_transaction (manager, redo_transaction); } -/* nautilus_undo_manager_add_undoable_to_transaction */ -gboolean -nautilus_undo_manager_add_undoable_to_transaction (NautilusUndoable *undoable) -{ - gboolean result; - - /* Verify a transaction is in progress */ - if (!global_undo_manager->details->transaction_in_progress) { - g_warning("NautilusUndoManager has no current transaction. Begin a transaction first."); - return FALSE; - } - - g_assert(global_undo_manager->details->transaction != NULL); - - result = nautilus_undo_transaction_add_undoable(global_undo_manager->details->transaction, undoable); - - return result; -} - - -/* nautilus_undo_manager_remove_transaction */ -gboolean -nautilus_undo_manager_remove_transaction (NautilusUndoTransaction *transaction) -{ - /* Verify a transaction is not in progress */ - if (global_undo_manager->details->transaction_in_progress) { - g_warning("NautilusUndoManager cannot remove a transaction while one is in progress."); - return FALSE; - } - - g_return_val_if_fail(transaction != NULL, FALSE); - - /* Remove transaction from undo list */ - global_undo_manager->details->undo_list = g_list_remove(global_undo_manager->details->undo_list, - transaction); - - /* Remove transaction from redo list */ - global_undo_manager->details->redo_list = g_list_remove(global_undo_manager->details->redo_list, - transaction); - - /* Fire off signal informing that an undo transaction has occurred */ - gtk_signal_emit (GTK_OBJECT (global_undo_manager), signals[UNDO_TRANSACTION_OCCURED]); - - return TRUE; -} - - /* nautilus_undo_manager_add_undo_transaction */ -gboolean -nautilus_undo_manager_add_undo_transaction (NautilusUndoTransaction *transaction) +void +nautilus_undo_manager_add_transaction (NautilusUndoManager *manager, NautilusUndoTransaction *transaction) { int length; /* Verify a transaction is not in progress */ - if (global_undo_manager->details->transaction_in_progress) { + if (manager->details->transaction_in_progress) { g_warning("NautilusUndoManager cannot add a transaction while one is in progress."); - return FALSE; + return; } - g_return_val_if_fail(transaction != NULL, FALSE); + g_return_if_fail (transaction != NULL); /* Check and see if we are over our queue limit */ - length = g_list_length(global_undo_manager->details->undo_list); + length = g_list_length (manager->details->undo_list); - if (length >= global_undo_manager->details->queue_depth) { - global_undo_manager->details->undo_list = prune_undo_manager_list ( - global_undo_manager->details->undo_list, - (length - global_undo_manager->details->queue_depth) + 1); + if (length >= manager->details->queue_depth) { + manager->details->undo_list = prune_undo_manager_list ( + manager->details->undo_list, + (length - manager->details->queue_depth) + 1); } /* Add transaction to undo list */ - global_undo_manager->details->undo_list = g_list_append(global_undo_manager->details->undo_list, - transaction); + manager->details->undo_list = g_list_append(manager->details->undo_list, transaction); /* Fire off signal informing that an undo transaction has occurred */ - gtk_signal_emit (GTK_OBJECT (global_undo_manager), signals[UNDO_TRANSACTION_OCCURED]); - - return TRUE; -} - -/* nautilus_undo_manager_add_redo_transaction */ -gboolean -nautilus_undo_manager_add_redo_transaction (NautilusUndoTransaction *transaction) -{ - g_return_val_if_fail(transaction != NULL, FALSE); - - /* Verify a transaction is not in progress */ - if (global_undo_manager->details->transaction_in_progress) { - g_warning("NautilusUndoManager cannot add a transaction while one is in progress."); - return FALSE; - } - - /* Make sure we allow redo */ - if (!global_undo_manager->details->enable_redo) { - return FALSE; - } - - /* Add transaction to undo list */ - global_undo_manager->details->undo_list = g_list_append(global_undo_manager->details->undo_list, - transaction); - - /* Fire off signal informing that an redo transaction has occurred */ - gtk_signal_emit (GTK_OBJECT (global_undo_manager), signals[UNDO_TRANSACTION_OCCURED]); - - return TRUE; + gtk_signal_emit (GTK_OBJECT (manager), signals[UNDO_TRANSACTION_OCCURED]); } @@ -456,27 +365,32 @@ nautilus_undo_manager_add_redo_transaction (NautilusUndoTransaction *transaction * Remove any transaction with object as target from * the undo and redo queues */ - + gboolean nautilus_undo_manager_unregister_object (GtkObject *object) { + NautilusUndoManager *manager; NautilusUndoTransaction *transaction; gboolean success; GList *list; int index, length; success = FALSE; - + + /* Locate undo manager */ + manager = gtk_object_get_data (object, NAUTILUS_UNDO_MANAGER_NAME); + g_return_val_if_fail (manager != NULL, success); + /* Check undo list */ - length = g_list_length(global_undo_manager->details->undo_list); + length = g_list_length (manager->details->undo_list); for (index = 0; index < length; index++) { - list = g_list_nth(global_undo_manager->details->undo_list, index); + list = g_list_nth (manager->details->undo_list, index); if (list) { transaction = list->data; - if (nautilus_undo_transaction_contains_object(transaction, object)) { - global_undo_manager->details->undo_list = - g_list_remove(global_undo_manager->details->undo_list, transaction); - nautilus_undo_transaction_destroy(transaction); + 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); index--; success = TRUE; } @@ -484,14 +398,14 @@ nautilus_undo_manager_unregister_object (GtkObject *object) } /* Check redo list */ - length = g_list_length(global_undo_manager->details->redo_list); + length = g_list_length (manager->details->redo_list); for (index = 0; index < length; index++) { - list = g_list_nth(global_undo_manager->details->redo_list, index); + list = g_list_nth (manager->details->redo_list, index); if (list) { transaction = list->data; if (nautilus_undo_transaction_contains_object(transaction, object)) { - global_undo_manager->details->redo_list = - g_list_remove(global_undo_manager->details->redo_list, transaction); + manager->details->redo_list = + g_list_remove (manager->details->redo_list, transaction); nautilus_undo_transaction_destroy(transaction); index--; success = TRUE; @@ -501,7 +415,7 @@ nautilus_undo_manager_unregister_object (GtkObject *object) if (success) { /* Fire off signal informing that a transaction has occurred */ - gtk_signal_emit (GTK_OBJECT (global_undo_manager), signals[UNDO_TRANSACTION_OCCURED]); + gtk_signal_emit (GTK_OBJECT (manager), signals[UNDO_TRANSACTION_OCCURED]); } return success; @@ -509,10 +423,10 @@ nautilus_undo_manager_unregister_object (GtkObject *object) /* nautilus_undo_manager_can_undo */ gboolean -nautilus_undo_manager_can_undo (void) +nautilus_undo_manager_can_undo (NautilusUndoManager *manager) { - if (global_undo_manager != NULL) { - return (g_list_length(global_undo_manager->details->undo_list) > 0); + if (manager != NULL) { + return (g_list_length (manager->details->undo_list) > 0); } else { return FALSE; } @@ -520,11 +434,11 @@ nautilus_undo_manager_can_undo (void) /* nautilus_undo_manager_can_redo */ gboolean -nautilus_undo_manager_can_redo (void) +nautilus_undo_manager_can_redo (NautilusUndoManager *manager) { - if (global_undo_manager->details->enable_redo) { - if (global_undo_manager != NULL) { - return (g_list_length(global_undo_manager->details->redo_list) > 0); + if (manager->details->enable_redo) { + if (manager != NULL) { + return (g_list_length (manager->details->redo_list) > 0); } else { return FALSE; } @@ -540,23 +454,22 @@ nautilus_undo_manager_can_redo (void) * current undo transaction. */ -static gint -get_current_transaction_name(GList *list, gchar *name, gint max_length) +static const gchar * +get_current_transaction_name (GList *list) { NautilusUndoTransaction *transaction; const gchar *transaction_name; - gint name_length; - + /* Check for NULL list */ if (list == NULL) { g_warning("Unable to get current transaction name due to NULL undo list."); - return -1; + return NULL; } /* Check for empty list */ if (g_list_length(list) <= 0) { g_warning("No transaction to get current undo transaction name from."); - return -1; + return NULL; } /* Get last transaction from list */ @@ -564,30 +477,17 @@ get_current_transaction_name(GList *list, gchar *name, gint max_length) transaction = list->data; if (transaction == NULL) { g_warning("Unable to get current transaction name due to NULL transaction in list."); - return -1; + return NULL; } /* Check for valid transaction name */ transaction_name = nautilus_undo_transaction_get_name(transaction); if ( transaction_name == NULL) { g_warning("Current transaction name is NULL."); - return -1; + return NULL; } - /* Return length of transaction name if name argument is NULL */ - if (name == NULL) { - return strlen(transaction_name); - } - - /* Copy over requested amount into return name argument */ - name_length = strlen(transaction_name); - if (name_length > max_length) { - strncpy(name, transaction_name, max_length); - return max_length; - } else { - strncpy(name, transaction_name, name_length); - return name_length; - } + return transaction_name; } @@ -598,10 +498,10 @@ get_current_transaction_name(GList *list, gchar *name, gint max_length) * current undo transaction. */ -gint -nautilus_undo_manager_get_current_undo_transaction_name (gchar *name, gint max_length) +const gchar * +nautilus_undo_manager_get_current_undo_transaction_name (NautilusUndoManager *manager) { - return get_current_transaction_name(global_undo_manager->details->undo_list, name, max_length); + return get_current_transaction_name (manager->details->undo_list); } /* nautilus_undo_manager_get_current_undo_transaction_name @@ -611,120 +511,97 @@ nautilus_undo_manager_get_current_undo_transaction_name (gchar *name, gint max_l * current undo transaction. */ -gint -nautilus_undo_manager_get_current_redo_transaction_name (gchar *name, gint max_length) +const gchar * +nautilus_undo_manager_get_current_redo_transaction_name (NautilusUndoManager *manager) { - return get_current_transaction_name(global_undo_manager->details->redo_list, name, max_length); + return get_current_transaction_name (manager->details->redo_list); } /* destroy */ static void destroy (GtkObject *object) { + NautilusUndoManager *manager; + g_return_if_fail (NAUTILUS_IS_UNDO_MANAGER (object)); + manager = NAUTILUS_UNDO_MANAGER (object); + /* Clear lists */ - global_undo_manager->details->undo_list = free_undo_manager_list_data(global_undo_manager->details->undo_list); - global_undo_manager->details->redo_list = free_undo_manager_list_data(global_undo_manager->details->redo_list); + manager->details->undo_list = free_undo_manager_list_data (manager->details->undo_list); + manager->details->redo_list = free_undo_manager_list_data (manager->details->redo_list); NAUTILUS_CALL_PARENT_CLASS (GTK_OBJECT_CLASS, destroy, (object)); } -/* Initialize Nautilus global undo manager */ -gboolean -nautilus_undo_manager_initialize_global_manager (void) -{ - if (global_undo_manager != NULL) { - g_warning("A global undo manager has already been created."); - return FALSE; - } - - global_undo_manager = nautilus_undo_manager_new(); - - return TRUE; -} - - -/* Return global undo manager */ -NautilusUndoManager * -nautilus_undo_manager_get_undo_manager (void) -{ - g_return_val_if_fail(global_undo_manager != NULL, NULL); - return global_undo_manager; -} - - /* nautilus_undo_manager_enable_redo * * Enable or disable redo functionality */ -gboolean -nautilus_undo_manager_enable_redo (gboolean value) + +void +nautilus_undo_manager_enable_redo (NautilusUndoManager *manager, gboolean value) { - g_return_val_if_fail(global_undo_manager != NULL, FALSE); + g_return_if_fail (manager != NULL); - global_undo_manager->details->enable_redo = value; + manager->details->enable_redo = value; /* Flush and free redo queue */ - g_list_free(global_undo_manager->details->redo_list); - - return TRUE; + g_list_free (manager->details->redo_list); } /* nautilus_undo_manager_enable_redo * * Enable or disable redo functionality */ -gboolean -nautilus_undo_manager_set_queue_depth (gint depth) +void +nautilus_undo_manager_set_queue_depth (NautilusUndoManager *manager, gint depth) { int length; /* Don't allow negative or zero queue depth */ if (depth <= 0) { g_warning ("NautilusUndoManager doesn not allow negative or zero length queue."); - return FALSE; + return; } - global_undo_manager->details->queue_depth = depth; + manager->details->queue_depth = depth; /* Prune lists */ - length = g_list_length (global_undo_manager->details->undo_list); + length = g_list_length (manager->details->undo_list); if (length > depth) { - global_undo_manager->details->undo_list = prune_undo_manager_list (global_undo_manager->details->undo_list, + manager->details->undo_list = prune_undo_manager_list (manager->details->undo_list, length - depth); } - length = g_list_length (global_undo_manager->details->redo_list); + length = g_list_length (manager->details->redo_list); if (length > depth) { - global_undo_manager->details->undo_list = prune_undo_manager_list (global_undo_manager->details->redo_list, - length - depth); + manager->details->undo_list = prune_undo_manager_list (manager->details->redo_list, + length - depth); } /* Fire off signal informing that an undo transaction has occurred */ - gtk_signal_emit (GTK_OBJECT (global_undo_manager), signals[UNDO_TRANSACTION_OCCURED]); - - return TRUE; + gtk_signal_emit (GTK_OBJECT (manager), signals[UNDO_TRANSACTION_OCCURED]); } /* free_undo_manager_list_data * * Clear undo data from list */ - + static GList * free_undo_manager_list_data (GList *list) { int length, index; NautilusUndoTransaction *transaction; - - length = g_list_length(list); + + length = g_list_length (list); for (index = 0; index < length; index++) { - list = g_list_last(list); + list = g_list_last (list); if (list) { transaction = list->data; - list = g_list_remove(list, transaction); - nautilus_undo_transaction_destroy(transaction); + list = g_list_remove (list, transaction); + nautilus_undo_transaction_destroy (transaction); } } @@ -736,7 +613,7 @@ free_undo_manager_list_data (GList *list) * * Prune n items from start of list */ - + static GList * prune_undo_manager_list (GList *list, gint items) { @@ -744,11 +621,11 @@ prune_undo_manager_list (GList *list, gint items) NautilusUndoTransaction *transaction; for (index = 0; index < items; index++) { - list = g_list_first(list); + list = g_list_first (list); if (list) { transaction = list->data; - list = g_list_remove(list, transaction); - nautilus_undo_transaction_destroy(transaction); + list = g_list_remove (list, transaction); + nautilus_undo_transaction_destroy (transaction); } } diff --git a/libnautilus-private/nautilus-undo-manager.h b/libnautilus-private/nautilus-undo-manager.h index aef846797..272f0bd00 100644 --- a/libnautilus-private/nautilus-undo-manager.h +++ b/libnautilus-private/nautilus-undo-manager.h @@ -26,9 +26,10 @@ #define NAUTILUS_UNDO_MANAGER_H #include <bonobo/bonobo-object.h> -#include <libnautilus/nautilus-undo-manager-component.h> #include <bonobo/bonobo-persist.h> + #include "nautilus-undo-transaction.h" +#include "nautilus-undo.h" #define NAUTILUS_TYPE_UNDO_MANAGER \ (nautilus_undo_manager_get_type ()) @@ -43,6 +44,7 @@ typedef struct NautilusUndoManagerClass NautilusUndoManagerClass; typedef struct NautilusUndoManagerDetails NautilusUndoManagerDetails; +typedef struct NautilusUndoTransactionInProgress NautilusUndoTransactionInProgress; struct NautilusUndoManager { BonoboPersist parent; @@ -50,41 +52,44 @@ struct NautilusUndoManager { }; struct NautilusUndoManagerClass { - BonoboPersistClass parent_class; - + BonoboPersistClass parent_class; void (* undo_transaction_occurred) (GtkObject *object, gpointer data); - gpointer servant_init_func, servant_destroy_func, vepv; }; +struct NautilusUndoTransactionInProgress { + NautilusUndoManager *manager; + NautilusUndoTransaction *transaction; + +}; + +#define NAUTILUS_UNDO_MANAGER_NAME "NautilusUndoManager" /* GtkObject */ -GtkType nautilus_undo_manager_get_type (void); -NautilusUndoManager *nautilus_undo_manager_new (void); +GtkType nautilus_undo_manager_get_type (void); +NautilusUndoManager *nautilus_undo_manager_new (void); /* Prototypes */ -gboolean nautilus_undo_manager_initialize_global_manager (void); -gboolean nautilus_undo_manager_add_undoable_to_transaction (NautilusUndoable *undoable); -gboolean nautilus_undo_manager_begin_transaction (const gchar *name); -gboolean nautilus_undo_manager_end_transaction (void); -gboolean nautilus_undo_manager_undo_last_transaction (void); -gboolean nautilus_undo_manager_redo_last_undone_transaction (void); -NautilusUndoTransaction *nautilus_undo_manager_get_current_transaction (void); -gboolean nautilus_undo_manager_transaction_in_progress (void); -gboolean nautilus_undo_manager_add_undo_transaction (NautilusUndoTransaction - *transaction); -gboolean nautilus_undo_manager_add_redo_transaction (NautilusUndoTransaction - *transaction); -gboolean nautilus_undo_manager_remove_transaction (NautilusUndoTransaction - *transaction); +NautilusUndoTransactionInProgress *nautilus_undo_manager_begin_transaction (GtkObject *object, const gchar *name); +void nautilus_undo_manager_end_transaction (NautilusUndoTransactionInProgress *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); + +gboolean nautilus_undo_manager_can_undo (NautilusUndoManager *manager); +gboolean nautilus_undo_manager_can_redo (NautilusUndoManager *manager); + +const gchar *nautilus_undo_manager_get_current_undo_transaction_name (NautilusUndoManager *manager); +const gchar *nautilus_undo_manager_get_current_redo_transaction_name (NautilusUndoManager *manager); + +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); -gboolean nautilus_undo_manager_can_undo (void); -gboolean nautilus_undo_manager_can_redo (void); -gint nautilus_undo_manager_get_current_undo_transaction_name (gchar *name, gint max_length); -gint nautilus_undo_manager_get_current_redo_transaction_name (gchar *name, gint max_length); -NautilusUndoManager *nautilus_undo_manager_get_undo_manager (void); -gboolean nautilus_undo_manager_enable_redo (gboolean value); -gboolean nautilus_undo_manager_set_queue_depth (gint depth); #endif diff --git a/libnautilus/.cvsignore b/libnautilus/.cvsignore index ac14f1dac..989bd8abd 100644 --- a/libnautilus/.cvsignore +++ b/libnautilus/.cvsignore @@ -7,13 +7,13 @@ libnautilus.la nautilus-common.c nautilus-skels.c nautilus-stubs.c -nautilus-undo-manager-component-common.c -nautilus-undo-manager-component-skels.c -nautilus-undo-manager-component-stubs.c -nautilus-undo-manager-component.h +nautilus-undo-common.c +nautilus-undo-skels.c +nautilus-undo-stubs.c +nautilus-undo.h nautilus-view-component-common.c nautilus-view-component-skels.c nautilus-view-component-stubs.c nautilus-view-component.h -nautilus_undo_manager_component_idl_stamp +nautilus_undo_idl_stamp nautilus_view_component_idl_stamp diff --git a/libnautilus/Makefile.am b/libnautilus/Makefile.am index 10554b423..dbbac331e 100644 --- a/libnautilus/Makefile.am +++ b/libnautilus/Makefile.am @@ -21,23 +21,22 @@ libnautilus_la_LDFLAGS=\ $(XML_LIBS) \ $(LIBPNG) -nautilus_undo_manager_component_idl_sources = \ - nautilus-undo-manager-component-stubs.c \ - nautilus-undo-manager-component-skels.c \ - nautilus-undo-manager-component-common.c \ - nautilus-undo-manager-component.h - nautilus_view_component_idl_sources = \ nautilus-view-component-stubs.c \ nautilus-view-component-skels.c \ nautilus-view-component.h \ nautilus-view-component-common.c -BUILT_SOURCES = \ - $(nautilus_undo_manager_component_idl_sources) \ - $(nautilus_view_component_idl_sources) \ - $(NULL) +nautilus_undo_idl_sources = \ + nautilus-undo-stubs.c \ + nautilus-undo-skels.c \ + nautilus-undo.h \ + nautilus-undo-common.c +BUILT_SOURCES = \ + $(nautilus_view_component_idl_sources) \ + $(nautilus_undo_idl_sources) + libnautilusincludedir=$(includedir)/libnautilus libnautilusinclude_HEADERS= \ @@ -57,8 +56,8 @@ libnautilusinclude_HEADERS= \ libnautilus_la_SOURCES= \ nautilus-undo-manager-private.h \ nautilus-view-frame-private.h \ - $(nautilus_undo_manager_component_idl_sources) \ $(nautilus_view_component_idl_sources) \ + $(nautilus_undo_idl_sources) \ nautilus-clipboard.c \ nautilus-content-view-frame.c \ nautilus-meta-view-frame.c \ @@ -69,16 +68,21 @@ libnautilus_la_SOURCES= \ nautilus-undoable.c \ $(NULL) -$(nautilus_undo_manager_component_idl_sources): nautilus_undo_manager_component_idl_stamp -nautilus_undo_manager_component_idl_stamp: nautilus-undo-manager-component.idl - orbit-idl -I${datadir}/idl `gnome-config --cflags idl` $(srcdir)/nautilus-undo-manager-component.idl - touch nautilus_undo_manager_component_idl_stamp - $(nautilus_view_component_idl_sources): nautilus_view_component_idl_stamp nautilus_view_component_idl_stamp: nautilus-view-component.idl orbit-idl -I${datadir}/idl `gnome-config --cflags idl` $(srcdir)/nautilus-view-component.idl touch nautilus_view_component_idl_stamp -CLEANFILES=nautilus_view_component_idl_stamp nautilus_undo_manager_component_idl_stamp +$(nautilus_undo_idl_sources): nautilus_undo_idl_stamp +nautilus_undo_idl_stamp: nautilus-undo.idl + orbit-idl -I${datadir}/idl `gnome-config --cflags idl` $(srcdir)/nautilus-undo.idl + touch nautilus_undo_idl_stamp + +CLEANFILES = \ + nautilus_view_component_idl_stamp \ + nautilus_undo_idl_stamp + +EXTRA_DIST = \ + nautilus-view-component.idl \ + nautilus-undo.idl -EXTRA_DIST = nautilus-undo-manager-component.idl nautilus-view-component.idl diff --git a/libnautilus/nautilus-distributed-undo.idl b/libnautilus/nautilus-distributed-undo.idl new file mode 100644 index 000000000..cd63e190b --- /dev/null +++ b/libnautilus/nautilus-distributed-undo.idl @@ -0,0 +1,40 @@ +/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: 8; c-basic-offset: 8 -*- */ + +#ifndef NAUTUILUS_UNDO_IDL_INCLUDED +#define NAUTUILUS_UNDO_MANAGER_IDL_INCLUDED + +#include <gnome-factory.idl> +#include <Bonobo.idl> + +module Nautilus { + + module Undo { + + // Forward declarations + interface Manager; + interface Transaction; + + // Contains elements that describe a transaction + struct TransactionMenuInfo { + string name; + string description; + }; + + // An undo transaction + interface Transaction : ::Bonobo::Unknown { + readonly attribute TransactionMenuInfo undo_description; + readonly attribute TransactionMenuInfo redo_description; + readonly attribute string base_description; + + void undo (in Transaction transaction); + }; + + // The main interface that handles undo transactions + interface Manager : ::Bonobo::Unknown { + void append (in Transaction transaction); + void forget (in Transaction transaction); + }; + }; +}; + +#endif /* NAUTUILUS_UNDO_IDL_INCLUDED */ diff --git a/libnautilus/nautilus-undo-manager-component.idl b/libnautilus/nautilus-undo-manager-component.idl deleted file mode 100644 index 9913a452d..000000000 --- a/libnautilus/nautilus-undo-manager-component.idl +++ /dev/null @@ -1,18 +0,0 @@ -/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: 8; c-basic-offset: 8 -*- */ - - -#ifndef _NAUTUILUS_UNDO_MANAGER_IDL_INCLUDED_ -#define _NAUTUILUS_UNDO_MANAGER_IDL_INCLUDED_ - -#include <gnome-factory.idl> -#include <Bonobo.idl> - -module Nautilus { - - interface UndoManager : ::Bonobo::Unknown { - boolean begin_transaction (in string name); - boolean end_transaction (); - }; -}; - -#endif /* _NAUTUILUS_UNDO_MANAGER_IDL_INCLUDED_ */
\ No newline at end of file diff --git a/libnautilus/nautilus-undo-manager-private.h b/libnautilus/nautilus-undo-manager-private.h index b825fe9c1..09dea2cfc 100644 --- a/libnautilus/nautilus-undo-manager-private.h +++ b/libnautilus/nautilus-undo-manager-private.h @@ -31,10 +31,8 @@ #include "nautilus-undo-transaction.h" /* Private data */ -NautilusUndoManager *global_undo_manager; struct NautilusUndoManagerDetails { - NautilusUndoTransaction *transaction; /* Current active and unique transaction */ GList *undo_list; GList *redo_list; gboolean transaction_in_progress; diff --git a/libnautilus/nautilus-undo-manager.c b/libnautilus/nautilus-undo-manager.c index 1faf53994..97b1c0948 100644 --- a/libnautilus/nautilus-undo-manager.c +++ b/libnautilus/nautilus-undo-manager.c @@ -25,6 +25,7 @@ #include <config.h> #include <gtk/gtksignal.h> #include <gtk/gtkmain.h> +#include <glib.h> #include <string.h> #include <bonobo/bonobo-main.h> #include <bonobo/bonobo-control.h> @@ -45,11 +46,11 @@ static guint signals[LAST_SIGNAL]; typedef struct { - POA_Nautilus_UndoManager servant; + POA_Nautilus_Undo_Manager servant; gpointer bonobo_object; NautilusUndoManager *gtk_object; -} impl_POA_Nautilus_UndoManager; +} impl_POA_Nautilus_Undo_Manager; /* GtkObject */ @@ -62,33 +63,33 @@ static GList *prune_undo_manager_list (GList *list, gint items); /* CORBA/Bonobo */ -static CORBA_boolean impl_Nautilus_UndoManager__begin_transaction (impl_POA_Nautilus_UndoManager *servant, - const CORBA_char *name, - CORBA_Environment *ev); -static void impl_Nautilus_UndoManager__end_transaction (impl_POA_Nautilus_UndoManager *servant, - CORBA_Environment *ev); +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); NAUTILUS_DEFINE_CLASS_BOILERPLATE(NautilusUndoManager, nautilus_undo_manager, BONOBO_OBJECT_TYPE) -POA_Nautilus_UndoManager__epv libnautilus_extensions_Nautilus_UndoManager_epv = +POA_Nautilus_Undo_Manager__epv libnautilus_Nautilus_Undo_Manager_epv = { NULL, /* _private */ - (gpointer) &impl_Nautilus_UndoManager__begin_transaction, - (gpointer) &impl_Nautilus_UndoManager__end_transaction, + (gpointer) &impl_Nautilus_Undo_Manager__append, + (gpointer) &impl_Nautilus_Undo_Manager__forget, }; static PortableServer_ServantBase__epv base_epv = { NULL, NULL, NULL }; -static POA_Nautilus_UndoManager__vepv impl_Nautilus_UndoManager_vepv = +static POA_Nautilus_Undo_Manager__vepv impl_Nautilus_Undo_Manager_vepv = { &base_epv, NULL, - &libnautilus_extensions_Nautilus_UndoManager_epv + &libnautilus_Nautilus_Undo_Manager_epv }; static void -impl_Nautilus_UndoManager__destroy(BonoboObject *obj, impl_POA_Nautilus_UndoManager *servant) +impl_Nautilus_Undo_Manager__destroy(BonoboObject *obj, impl_POA_Nautilus_Undo_Manager *servant) { PortableServer_ObjectId *objid; CORBA_Environment ev; @@ -107,17 +108,17 @@ impl_Nautilus_UndoManager__destroy(BonoboObject *obj, impl_POA_Nautilus_UndoMana CORBA_exception_free(&ev); } -static Nautilus_UndoManager -impl_Nautilus_UndoManager__create(NautilusUndoManager *manager, CORBA_Environment * ev) +static Nautilus_Undo_Manager +impl_Nautilus_Undo_Manager__create(NautilusUndoManager *manager, CORBA_Environment * ev) { - Nautilus_UndoManager retval; - impl_POA_Nautilus_UndoManager *servant; + Nautilus_Undo_Manager retval; + impl_POA_Nautilus_Undo_Manager *servant; void (*servant_init_func) (PortableServer_Servant servant, CORBA_Environment *ev); NautilusUndoManagerClass *undo_class = NAUTILUS_UNDO_MANAGER_CLASS (GTK_OBJECT(manager)->klass); servant_init_func = undo_class->servant_init_func; - servant = g_new0 (impl_POA_Nautilus_UndoManager, 1); + servant = g_new0 (impl_POA_Nautilus_Undo_Manager, 1); servant->servant.vepv = undo_class->vepv; if (!servant->servant.vepv->Bonobo_Unknown_epv) servant->servant.vepv->Bonobo_Unknown_epv = bonobo_object_get_epv (); @@ -127,24 +128,22 @@ impl_Nautilus_UndoManager__create(NautilusUndoManager *manager, CORBA_Environmen retval = bonobo_object_activate_servant (BONOBO_OBJECT (manager), servant); - gtk_signal_connect (GTK_OBJECT (manager), "destroy", GTK_SIGNAL_FUNC (impl_Nautilus_UndoManager__destroy), servant); + gtk_signal_connect (GTK_OBJECT (manager), "destroy", GTK_SIGNAL_FUNC (impl_Nautilus_Undo_Manager__destroy), servant); return retval; } -static CORBA_boolean -impl_Nautilus_UndoManager__begin_transaction (impl_POA_Nautilus_UndoManager *servant, +static void +impl_Nautilus_Undo_Manager__append (impl_POA_Nautilus_Undo_Manager *servant, const CORBA_char *name, CORBA_Environment *ev) { - return nautilus_undo_manager_begin_transaction (name); } static void -impl_Nautilus_UndoManager__end_transaction (impl_POA_Nautilus_UndoManager *servant, +impl_Nautilus_Undo_Manager__forget (impl_POA_Nautilus_Undo_Manager *servant, CORBA_Environment *ev) { - nautilus_undo_manager_end_transaction (); } @@ -169,9 +168,6 @@ nautilus_undo_manager_initialize (NautilusUndoManager *manager) manager->details = g_new0 (NautilusUndoManagerDetails, 1); - /* Init transaction to none */ - manager->details->transaction = NULL; - /* Create empty lists */ manager->details->undo_list = NULL; manager->details->redo_list = NULL; @@ -185,7 +181,7 @@ nautilus_undo_manager_initialize (NautilusUndoManager *manager) /* No transaction is in progress */ manager->details->transaction_in_progress = FALSE; - bonobo_object_construct (BONOBO_OBJECT (manager), impl_Nautilus_UndoManager__create (manager, &ev)); + bonobo_object_construct (BONOBO_OBJECT (manager), impl_Nautilus_Undo_Manager__create (manager, &ev)); CORBA_exception_free(&ev); } @@ -201,9 +197,9 @@ nautilus_undo_manager_initialize_class (NautilusUndoManagerClass *klass) object_class->destroy = destroy; - klass->servant_init_func = POA_Nautilus_UndoManager__init; - klass->servant_destroy_func = POA_Nautilus_UndoManager__fini; - klass->vepv = &impl_Nautilus_UndoManager_vepv; + klass->servant_init_func = POA_Nautilus_Undo_Manager__init; + klass->servant_destroy_func = POA_Nautilus_Undo_Manager__fini; + klass->vepv = &impl_Nautilus_Undo_Manager_vepv; /* Setup signals */ signals[UNDO_TRANSACTION_OCCURED] @@ -218,236 +214,149 @@ nautilus_undo_manager_initialize_class (NautilusUndoManagerClass *klass) gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); } -/* nautilus_undo_manager_transaction_in_progress */ -gboolean -nautilus_undo_manager_transaction_in_progress (void) -{ - return global_undo_manager->details->transaction_in_progress; -} - - -/* nautilus_undo_manager_get_current_transaction - * Return current undo transaction - */ -NautilusUndoTransaction * -nautilus_undo_manager_get_current_transaction (void) -{ - return global_undo_manager->details->transaction; -} - /* nautilus_undo_manager_begin_transaction */ -gboolean -nautilus_undo_manager_begin_transaction (const gchar *name) +NautilusUndoTransactionInProgress * +nautilus_undo_manager_begin_transaction (GtkObject *object, const gchar *name) { + NautilusUndoManager *manager; + NautilusUndoTransactionInProgress *tip; + + /* Locate undo manager */ + manager = gtk_object_get_data (object, NAUTILUS_UNDO_MANAGER_NAME); + g_return_val_if_fail (manager != NULL, NULL); + /* We aren't handling nested transactions currently */ - if (global_undo_manager->details->transaction_in_progress) { + if (manager->details->transaction_in_progress) { g_warning("NautilusUndoManager does not handle nested transactions. End previous transaction first."); - return FALSE; + return NULL; } + /* Create NautilusUndoTransactionInProgress */ + tip = g_new (NautilusUndoTransactionInProgress, 1); + g_assert(tip); + + tip->manager = manager; + /* Create new transaction */ - global_undo_manager->details->transaction = nautilus_undo_transaction_new(name); + tip->transaction = nautilus_undo_transaction_new(name); - global_undo_manager->details->transaction_in_progress = TRUE; + tip->manager->details->transaction_in_progress = TRUE; - return TRUE; + return tip; } /* nautilus_undo_manager_end_transaction */ -gboolean -nautilus_undo_manager_end_transaction (void) +void +nautilus_undo_manager_end_transaction (NautilusUndoTransactionInProgress *tip) { /* Verify a transaction is in progress */ - if (!global_undo_manager->details->transaction_in_progress) { + if (!tip->manager->details->transaction_in_progress) { g_warning("NautilusUndoManager has no current transaction. Begin a transaction first."); - return FALSE; + return; } - global_undo_manager->details->transaction_in_progress = FALSE; + tip->manager->details->transaction_in_progress = FALSE; /* Commit current transaction to undo list */ - nautilus_undo_manager_add_undo_transaction (global_undo_manager->details->transaction); + nautilus_undo_manager_add_transaction (tip->manager, tip->transaction); /* Fire off signal informing that an undo transaction has occurred */ - gtk_signal_emit (GTK_OBJECT (global_undo_manager), signals[UNDO_TRANSACTION_OCCURED]); - - return TRUE; + gtk_signal_emit (GTK_OBJECT (tip->manager), signals[UNDO_TRANSACTION_OCCURED]); } /* nautilus_undo_manager_undo_last_transaction */ -gboolean -nautilus_undo_manager_undo_last_transaction (void) +void +nautilus_undo_manager_undo (NautilusUndoManager *manager) { GList *list; NautilusUndoTransaction *undo_transaction; /* Verify we have a transaction to be undone */ - if (global_undo_manager->details->undo_list == NULL) { + if (manager->details->undo_list == NULL) { g_warning("NautilusUndoManager has no transaction to be undone."); - return FALSE; + return; } /* Pop last transaction off undo list */ - list = g_list_last(global_undo_manager->details->undo_list); + list = g_list_last(manager->details->undo_list); g_assert(list); undo_transaction = list->data; - global_undo_manager->details->undo_list = g_list_remove(global_undo_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); /* Place transaction into redo list */ - if (global_undo_manager->details->enable_redo) { - nautilus_undo_manager_add_redo_transaction (undo_transaction); + if (manager->details->enable_redo) { + /* nautilus_undo_manager_add_redo_transaction (undo_transaction); */ } else { /* Purge transaction */ nautilus_undo_transaction_destroy(undo_transaction); } /* Fire off signal informing that an undo transaction has occurred */ - gtk_signal_emit (GTK_OBJECT (global_undo_manager), signals[UNDO_TRANSACTION_OCCURED]); - - return TRUE; + gtk_signal_emit (GTK_OBJECT (manager), signals[UNDO_TRANSACTION_OCCURED]); } /* nautilus_undo_manager_redo_last_undone_transaction */ -gboolean -nautilus_undo_manager_redo_last_undone_transaction (void) +void +nautilus_undo_manager_redo (NautilusUndoManager *manager) { GList *list; NautilusUndoTransaction *redo_transaction; /* Are we allowing redo operations? */ - if (global_undo_manager->details->enable_redo) { + if (manager->details->enable_redo) { g_warning("NautilusUndoManager is not configure to allow redo operations."); - return FALSE; + return; } /* Verify we have a transaction to be redone */ - if (global_undo_manager->details->redo_list == NULL) { + if (manager->details->redo_list == NULL) { g_warning("NautilusUndoManager has no transaction to be redone."); - return FALSE; + return; } /* Pop last transaction off redo list */ - list = g_list_last(global_undo_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); /* Place transaction into undo list */ - nautilus_undo_manager_add_undo_transaction (redo_transaction); - - return TRUE; + nautilus_undo_manager_add_transaction (manager, redo_transaction); } -/* nautilus_undo_manager_add_undoable_to_transaction */ -gboolean -nautilus_undo_manager_add_undoable_to_transaction (NautilusUndoable *undoable) -{ - gboolean result; - - /* Verify a transaction is in progress */ - if (!global_undo_manager->details->transaction_in_progress) { - g_warning("NautilusUndoManager has no current transaction. Begin a transaction first."); - return FALSE; - } - - g_assert(global_undo_manager->details->transaction != NULL); - - result = nautilus_undo_transaction_add_undoable(global_undo_manager->details->transaction, undoable); - - return result; -} - - -/* nautilus_undo_manager_remove_transaction */ -gboolean -nautilus_undo_manager_remove_transaction (NautilusUndoTransaction *transaction) -{ - /* Verify a transaction is not in progress */ - if (global_undo_manager->details->transaction_in_progress) { - g_warning("NautilusUndoManager cannot remove a transaction while one is in progress."); - return FALSE; - } - - g_return_val_if_fail(transaction != NULL, FALSE); - - /* Remove transaction from undo list */ - global_undo_manager->details->undo_list = g_list_remove(global_undo_manager->details->undo_list, - transaction); - - /* Remove transaction from redo list */ - global_undo_manager->details->redo_list = g_list_remove(global_undo_manager->details->redo_list, - transaction); - - /* Fire off signal informing that an undo transaction has occurred */ - gtk_signal_emit (GTK_OBJECT (global_undo_manager), signals[UNDO_TRANSACTION_OCCURED]); - - return TRUE; -} - - /* nautilus_undo_manager_add_undo_transaction */ -gboolean -nautilus_undo_manager_add_undo_transaction (NautilusUndoTransaction *transaction) +void +nautilus_undo_manager_add_transaction (NautilusUndoManager *manager, NautilusUndoTransaction *transaction) { int length; /* Verify a transaction is not in progress */ - if (global_undo_manager->details->transaction_in_progress) { + if (manager->details->transaction_in_progress) { g_warning("NautilusUndoManager cannot add a transaction while one is in progress."); - return FALSE; + return; } - g_return_val_if_fail(transaction != NULL, FALSE); + g_return_if_fail (transaction != NULL); /* Check and see if we are over our queue limit */ - length = g_list_length(global_undo_manager->details->undo_list); + length = g_list_length (manager->details->undo_list); - if (length >= global_undo_manager->details->queue_depth) { - global_undo_manager->details->undo_list = prune_undo_manager_list ( - global_undo_manager->details->undo_list, - (length - global_undo_manager->details->queue_depth) + 1); + if (length >= manager->details->queue_depth) { + manager->details->undo_list = prune_undo_manager_list ( + manager->details->undo_list, + (length - manager->details->queue_depth) + 1); } /* Add transaction to undo list */ - global_undo_manager->details->undo_list = g_list_append(global_undo_manager->details->undo_list, - transaction); + manager->details->undo_list = g_list_append(manager->details->undo_list, transaction); /* Fire off signal informing that an undo transaction has occurred */ - gtk_signal_emit (GTK_OBJECT (global_undo_manager), signals[UNDO_TRANSACTION_OCCURED]); - - return TRUE; -} - -/* nautilus_undo_manager_add_redo_transaction */ -gboolean -nautilus_undo_manager_add_redo_transaction (NautilusUndoTransaction *transaction) -{ - g_return_val_if_fail(transaction != NULL, FALSE); - - /* Verify a transaction is not in progress */ - if (global_undo_manager->details->transaction_in_progress) { - g_warning("NautilusUndoManager cannot add a transaction while one is in progress."); - return FALSE; - } - - /* Make sure we allow redo */ - if (!global_undo_manager->details->enable_redo) { - return FALSE; - } - - /* Add transaction to undo list */ - global_undo_manager->details->undo_list = g_list_append(global_undo_manager->details->undo_list, - transaction); - - /* Fire off signal informing that an redo transaction has occurred */ - gtk_signal_emit (GTK_OBJECT (global_undo_manager), signals[UNDO_TRANSACTION_OCCURED]); - - return TRUE; + gtk_signal_emit (GTK_OBJECT (manager), signals[UNDO_TRANSACTION_OCCURED]); } @@ -456,27 +365,32 @@ nautilus_undo_manager_add_redo_transaction (NautilusUndoTransaction *transaction * Remove any transaction with object as target from * the undo and redo queues */ - + gboolean nautilus_undo_manager_unregister_object (GtkObject *object) { + NautilusUndoManager *manager; NautilusUndoTransaction *transaction; gboolean success; GList *list; int index, length; success = FALSE; - + + /* Locate undo manager */ + manager = gtk_object_get_data (object, NAUTILUS_UNDO_MANAGER_NAME); + g_return_val_if_fail (manager != NULL, success); + /* Check undo list */ - length = g_list_length(global_undo_manager->details->undo_list); + length = g_list_length (manager->details->undo_list); for (index = 0; index < length; index++) { - list = g_list_nth(global_undo_manager->details->undo_list, index); + list = g_list_nth (manager->details->undo_list, index); if (list) { transaction = list->data; - if (nautilus_undo_transaction_contains_object(transaction, object)) { - global_undo_manager->details->undo_list = - g_list_remove(global_undo_manager->details->undo_list, transaction); - nautilus_undo_transaction_destroy(transaction); + 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); index--; success = TRUE; } @@ -484,14 +398,14 @@ nautilus_undo_manager_unregister_object (GtkObject *object) } /* Check redo list */ - length = g_list_length(global_undo_manager->details->redo_list); + length = g_list_length (manager->details->redo_list); for (index = 0; index < length; index++) { - list = g_list_nth(global_undo_manager->details->redo_list, index); + list = g_list_nth (manager->details->redo_list, index); if (list) { transaction = list->data; if (nautilus_undo_transaction_contains_object(transaction, object)) { - global_undo_manager->details->redo_list = - g_list_remove(global_undo_manager->details->redo_list, transaction); + manager->details->redo_list = + g_list_remove (manager->details->redo_list, transaction); nautilus_undo_transaction_destroy(transaction); index--; success = TRUE; @@ -501,7 +415,7 @@ nautilus_undo_manager_unregister_object (GtkObject *object) if (success) { /* Fire off signal informing that a transaction has occurred */ - gtk_signal_emit (GTK_OBJECT (global_undo_manager), signals[UNDO_TRANSACTION_OCCURED]); + gtk_signal_emit (GTK_OBJECT (manager), signals[UNDO_TRANSACTION_OCCURED]); } return success; @@ -509,10 +423,10 @@ nautilus_undo_manager_unregister_object (GtkObject *object) /* nautilus_undo_manager_can_undo */ gboolean -nautilus_undo_manager_can_undo (void) +nautilus_undo_manager_can_undo (NautilusUndoManager *manager) { - if (global_undo_manager != NULL) { - return (g_list_length(global_undo_manager->details->undo_list) > 0); + if (manager != NULL) { + return (g_list_length (manager->details->undo_list) > 0); } else { return FALSE; } @@ -520,11 +434,11 @@ nautilus_undo_manager_can_undo (void) /* nautilus_undo_manager_can_redo */ gboolean -nautilus_undo_manager_can_redo (void) +nautilus_undo_manager_can_redo (NautilusUndoManager *manager) { - if (global_undo_manager->details->enable_redo) { - if (global_undo_manager != NULL) { - return (g_list_length(global_undo_manager->details->redo_list) > 0); + if (manager->details->enable_redo) { + if (manager != NULL) { + return (g_list_length (manager->details->redo_list) > 0); } else { return FALSE; } @@ -540,23 +454,22 @@ nautilus_undo_manager_can_redo (void) * current undo transaction. */ -static gint -get_current_transaction_name(GList *list, gchar *name, gint max_length) +static const gchar * +get_current_transaction_name (GList *list) { NautilusUndoTransaction *transaction; const gchar *transaction_name; - gint name_length; - + /* Check for NULL list */ if (list == NULL) { g_warning("Unable to get current transaction name due to NULL undo list."); - return -1; + return NULL; } /* Check for empty list */ if (g_list_length(list) <= 0) { g_warning("No transaction to get current undo transaction name from."); - return -1; + return NULL; } /* Get last transaction from list */ @@ -564,30 +477,17 @@ get_current_transaction_name(GList *list, gchar *name, gint max_length) transaction = list->data; if (transaction == NULL) { g_warning("Unable to get current transaction name due to NULL transaction in list."); - return -1; + return NULL; } /* Check for valid transaction name */ transaction_name = nautilus_undo_transaction_get_name(transaction); if ( transaction_name == NULL) { g_warning("Current transaction name is NULL."); - return -1; + return NULL; } - /* Return length of transaction name if name argument is NULL */ - if (name == NULL) { - return strlen(transaction_name); - } - - /* Copy over requested amount into return name argument */ - name_length = strlen(transaction_name); - if (name_length > max_length) { - strncpy(name, transaction_name, max_length); - return max_length; - } else { - strncpy(name, transaction_name, name_length); - return name_length; - } + return transaction_name; } @@ -598,10 +498,10 @@ get_current_transaction_name(GList *list, gchar *name, gint max_length) * current undo transaction. */ -gint -nautilus_undo_manager_get_current_undo_transaction_name (gchar *name, gint max_length) +const gchar * +nautilus_undo_manager_get_current_undo_transaction_name (NautilusUndoManager *manager) { - return get_current_transaction_name(global_undo_manager->details->undo_list, name, max_length); + return get_current_transaction_name (manager->details->undo_list); } /* nautilus_undo_manager_get_current_undo_transaction_name @@ -611,120 +511,97 @@ nautilus_undo_manager_get_current_undo_transaction_name (gchar *name, gint max_l * current undo transaction. */ -gint -nautilus_undo_manager_get_current_redo_transaction_name (gchar *name, gint max_length) +const gchar * +nautilus_undo_manager_get_current_redo_transaction_name (NautilusUndoManager *manager) { - return get_current_transaction_name(global_undo_manager->details->redo_list, name, max_length); + return get_current_transaction_name (manager->details->redo_list); } /* destroy */ static void destroy (GtkObject *object) { + NautilusUndoManager *manager; + g_return_if_fail (NAUTILUS_IS_UNDO_MANAGER (object)); + manager = NAUTILUS_UNDO_MANAGER (object); + /* Clear lists */ - global_undo_manager->details->undo_list = free_undo_manager_list_data(global_undo_manager->details->undo_list); - global_undo_manager->details->redo_list = free_undo_manager_list_data(global_undo_manager->details->redo_list); + manager->details->undo_list = free_undo_manager_list_data (manager->details->undo_list); + manager->details->redo_list = free_undo_manager_list_data (manager->details->redo_list); NAUTILUS_CALL_PARENT_CLASS (GTK_OBJECT_CLASS, destroy, (object)); } -/* Initialize Nautilus global undo manager */ -gboolean -nautilus_undo_manager_initialize_global_manager (void) -{ - if (global_undo_manager != NULL) { - g_warning("A global undo manager has already been created."); - return FALSE; - } - - global_undo_manager = nautilus_undo_manager_new(); - - return TRUE; -} - - -/* Return global undo manager */ -NautilusUndoManager * -nautilus_undo_manager_get_undo_manager (void) -{ - g_return_val_if_fail(global_undo_manager != NULL, NULL); - return global_undo_manager; -} - - /* nautilus_undo_manager_enable_redo * * Enable or disable redo functionality */ -gboolean -nautilus_undo_manager_enable_redo (gboolean value) + +void +nautilus_undo_manager_enable_redo (NautilusUndoManager *manager, gboolean value) { - g_return_val_if_fail(global_undo_manager != NULL, FALSE); + g_return_if_fail (manager != NULL); - global_undo_manager->details->enable_redo = value; + manager->details->enable_redo = value; /* Flush and free redo queue */ - g_list_free(global_undo_manager->details->redo_list); - - return TRUE; + g_list_free (manager->details->redo_list); } /* nautilus_undo_manager_enable_redo * * Enable or disable redo functionality */ -gboolean -nautilus_undo_manager_set_queue_depth (gint depth) +void +nautilus_undo_manager_set_queue_depth (NautilusUndoManager *manager, gint depth) { int length; /* Don't allow negative or zero queue depth */ if (depth <= 0) { g_warning ("NautilusUndoManager doesn not allow negative or zero length queue."); - return FALSE; + return; } - global_undo_manager->details->queue_depth = depth; + manager->details->queue_depth = depth; /* Prune lists */ - length = g_list_length (global_undo_manager->details->undo_list); + length = g_list_length (manager->details->undo_list); if (length > depth) { - global_undo_manager->details->undo_list = prune_undo_manager_list (global_undo_manager->details->undo_list, + manager->details->undo_list = prune_undo_manager_list (manager->details->undo_list, length - depth); } - length = g_list_length (global_undo_manager->details->redo_list); + length = g_list_length (manager->details->redo_list); if (length > depth) { - global_undo_manager->details->undo_list = prune_undo_manager_list (global_undo_manager->details->redo_list, - length - depth); + manager->details->undo_list = prune_undo_manager_list (manager->details->redo_list, + length - depth); } /* Fire off signal informing that an undo transaction has occurred */ - gtk_signal_emit (GTK_OBJECT (global_undo_manager), signals[UNDO_TRANSACTION_OCCURED]); - - return TRUE; + gtk_signal_emit (GTK_OBJECT (manager), signals[UNDO_TRANSACTION_OCCURED]); } /* free_undo_manager_list_data * * Clear undo data from list */ - + static GList * free_undo_manager_list_data (GList *list) { int length, index; NautilusUndoTransaction *transaction; - - length = g_list_length(list); + + length = g_list_length (list); for (index = 0; index < length; index++) { - list = g_list_last(list); + list = g_list_last (list); if (list) { transaction = list->data; - list = g_list_remove(list, transaction); - nautilus_undo_transaction_destroy(transaction); + list = g_list_remove (list, transaction); + nautilus_undo_transaction_destroy (transaction); } } @@ -736,7 +613,7 @@ free_undo_manager_list_data (GList *list) * * Prune n items from start of list */ - + static GList * prune_undo_manager_list (GList *list, gint items) { @@ -744,11 +621,11 @@ prune_undo_manager_list (GList *list, gint items) NautilusUndoTransaction *transaction; for (index = 0; index < items; index++) { - list = g_list_first(list); + list = g_list_first (list); if (list) { transaction = list->data; - list = g_list_remove(list, transaction); - nautilus_undo_transaction_destroy(transaction); + list = g_list_remove (list, transaction); + nautilus_undo_transaction_destroy (transaction); } } diff --git a/libnautilus/nautilus-undo-manager.h b/libnautilus/nautilus-undo-manager.h index aef846797..272f0bd00 100644 --- a/libnautilus/nautilus-undo-manager.h +++ b/libnautilus/nautilus-undo-manager.h @@ -26,9 +26,10 @@ #define NAUTILUS_UNDO_MANAGER_H #include <bonobo/bonobo-object.h> -#include <libnautilus/nautilus-undo-manager-component.h> #include <bonobo/bonobo-persist.h> + #include "nautilus-undo-transaction.h" +#include "nautilus-undo.h" #define NAUTILUS_TYPE_UNDO_MANAGER \ (nautilus_undo_manager_get_type ()) @@ -43,6 +44,7 @@ typedef struct NautilusUndoManagerClass NautilusUndoManagerClass; typedef struct NautilusUndoManagerDetails NautilusUndoManagerDetails; +typedef struct NautilusUndoTransactionInProgress NautilusUndoTransactionInProgress; struct NautilusUndoManager { BonoboPersist parent; @@ -50,41 +52,44 @@ struct NautilusUndoManager { }; struct NautilusUndoManagerClass { - BonoboPersistClass parent_class; - + BonoboPersistClass parent_class; void (* undo_transaction_occurred) (GtkObject *object, gpointer data); - gpointer servant_init_func, servant_destroy_func, vepv; }; +struct NautilusUndoTransactionInProgress { + NautilusUndoManager *manager; + NautilusUndoTransaction *transaction; + +}; + +#define NAUTILUS_UNDO_MANAGER_NAME "NautilusUndoManager" /* GtkObject */ -GtkType nautilus_undo_manager_get_type (void); -NautilusUndoManager *nautilus_undo_manager_new (void); +GtkType nautilus_undo_manager_get_type (void); +NautilusUndoManager *nautilus_undo_manager_new (void); /* Prototypes */ -gboolean nautilus_undo_manager_initialize_global_manager (void); -gboolean nautilus_undo_manager_add_undoable_to_transaction (NautilusUndoable *undoable); -gboolean nautilus_undo_manager_begin_transaction (const gchar *name); -gboolean nautilus_undo_manager_end_transaction (void); -gboolean nautilus_undo_manager_undo_last_transaction (void); -gboolean nautilus_undo_manager_redo_last_undone_transaction (void); -NautilusUndoTransaction *nautilus_undo_manager_get_current_transaction (void); -gboolean nautilus_undo_manager_transaction_in_progress (void); -gboolean nautilus_undo_manager_add_undo_transaction (NautilusUndoTransaction - *transaction); -gboolean nautilus_undo_manager_add_redo_transaction (NautilusUndoTransaction - *transaction); -gboolean nautilus_undo_manager_remove_transaction (NautilusUndoTransaction - *transaction); +NautilusUndoTransactionInProgress *nautilus_undo_manager_begin_transaction (GtkObject *object, const gchar *name); +void nautilus_undo_manager_end_transaction (NautilusUndoTransactionInProgress *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); + +gboolean nautilus_undo_manager_can_undo (NautilusUndoManager *manager); +gboolean nautilus_undo_manager_can_redo (NautilusUndoManager *manager); + +const gchar *nautilus_undo_manager_get_current_undo_transaction_name (NautilusUndoManager *manager); +const gchar *nautilus_undo_manager_get_current_redo_transaction_name (NautilusUndoManager *manager); + +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); -gboolean nautilus_undo_manager_can_undo (void); -gboolean nautilus_undo_manager_can_redo (void); -gint nautilus_undo_manager_get_current_undo_transaction_name (gchar *name, gint max_length); -gint nautilus_undo_manager_get_current_redo_transaction_name (gchar *name, gint max_length); -NautilusUndoManager *nautilus_undo_manager_get_undo_manager (void); -gboolean nautilus_undo_manager_enable_redo (gboolean value); -gboolean nautilus_undo_manager_set_queue_depth (gint depth); #endif diff --git a/libnautilus/nautilus-undo-transaction.h b/libnautilus/nautilus-undo-transaction.h index 6da767e4c..82026c0fb 100644 --- a/libnautilus/nautilus-undo-transaction.h +++ b/libnautilus/nautilus-undo-transaction.h @@ -26,17 +26,13 @@ #define NAUTILUS_UNDO_TRANSACTION_H #include <glib.h> - #include "nautilus-undoable.h" -typedef struct NautilusUndoTransaction NautilusUndoTransaction; - struct NautilusUndoTransaction { gchar *name; GList *transaction_list; }; - NautilusUndoTransaction *nautilus_undo_transaction_new (const gchar *name); void nautilus_undo_transaction_destroy (NautilusUndoTransaction *transaction); gboolean nautilus_undo_transaction_add_undoable (NautilusUndoTransaction *transaction, diff --git a/libnautilus/nautilus-undo.idl b/libnautilus/nautilus-undo.idl new file mode 100644 index 000000000..cd63e190b --- /dev/null +++ b/libnautilus/nautilus-undo.idl @@ -0,0 +1,40 @@ +/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: 8; c-basic-offset: 8 -*- */ + +#ifndef NAUTUILUS_UNDO_IDL_INCLUDED +#define NAUTUILUS_UNDO_MANAGER_IDL_INCLUDED + +#include <gnome-factory.idl> +#include <Bonobo.idl> + +module Nautilus { + + module Undo { + + // Forward declarations + interface Manager; + interface Transaction; + + // Contains elements that describe a transaction + struct TransactionMenuInfo { + string name; + string description; + }; + + // An undo transaction + interface Transaction : ::Bonobo::Unknown { + readonly attribute TransactionMenuInfo undo_description; + readonly attribute TransactionMenuInfo redo_description; + readonly attribute string base_description; + + void undo (in Transaction transaction); + }; + + // The main interface that handles undo transactions + interface Manager : ::Bonobo::Unknown { + void append (in Transaction transaction); + void forget (in Transaction transaction); + }; + }; +}; + +#endif /* NAUTUILUS_UNDO_IDL_INCLUDED */ diff --git a/libnautilus/nautilus-undoable.c b/libnautilus/nautilus-undoable.c index 56d3a680c..807940e83 100644 --- a/libnautilus/nautilus-undoable.c +++ b/libnautilus/nautilus-undoable.c @@ -122,7 +122,8 @@ destroy (GtkObject *object) /* nautilus_undoable_save_undo_snapshot */ void -nautilus_undoable_save_undo_snapshot (GtkObject *target, GtkSignalFunc save_func, GtkSignalFunc restore_func) +nautilus_undoable_save_undo_snapshot (NautilusUndoTransaction *transaction, GtkObject *target, + GtkSignalFunc save_func, GtkSignalFunc restore_func) { gboolean result; NautilusUndoable *undoable; @@ -138,7 +139,7 @@ nautilus_undoable_save_undo_snapshot (GtkObject *target, GtkSignalFunc save_func gtk_signal_connect_while_alive (GTK_OBJECT (undoable), "restore_from_undo_snapshot", restore_func, target, target); /* Add undoable to current transaction */ - result = nautilus_undo_manager_add_undoable_to_transaction (undoable); + result = nautilus_undo_transaction_add_undoable (transaction, undoable); /* Fire SAVE_UNDO_SNAPSHOT signal */ gtk_signal_emit (GTK_OBJECT (undoable), diff --git a/libnautilus/nautilus-undoable.h b/libnautilus/nautilus-undoable.h index a6c1805c9..9d56b5190 100644 --- a/libnautilus/nautilus-undoable.h +++ b/libnautilus/nautilus-undoable.h @@ -40,9 +40,10 @@ #define NAUTILUS_IS_UNDOABLE_CLASS(klass) \ (GTK_CHECK_CLASS_TYPE ((klass), NAUTILUS_TYPE_UNDOABLE)) -typedef struct NautilusUndoable NautilusUndoable; typedef struct NautilusUndoableClass NautilusUndoableClass; typedef struct NautilusUndoManager NautilusUndoManager; +typedef struct NautilusUndoable NautilusUndoable; +typedef struct NautilusUndoTransaction NautilusUndoTransaction; struct NautilusUndoable { GtkObject parent; @@ -62,8 +63,8 @@ struct NautilusUndoableClass { GtkType nautilus_undoable_get_type (void); GtkObject *nautilus_undoable_new (void); -void nautilus_undoable_save_undo_snapshot (GtkObject *target, GtkSignalFunc save_func, - GtkSignalFunc restore_func); +void nautilus_undoable_save_undo_snapshot (NautilusUndoTransaction *transaction, GtkObject *target, + GtkSignalFunc save_func, GtkSignalFunc restore_func); void nautilus_undoable_restore_from_undo_snapshot (NautilusUndoable *undoable); #endif diff --git a/libnautilus/nautilus-view-component.idl b/libnautilus/nautilus-view-component.idl index 24f2ce8a8..ddabf376c 100644 --- a/libnautilus/nautilus-view-component.idl +++ b/libnautilus/nautilus-view-component.idl @@ -10,14 +10,14 @@ #pragma inhibit push #endif -#include "nautilus-undo-manager-component.idl" +#include "nautilus-undo.idl" #if !defined(__BONOBO_COMPILATION) && defined(__ORBIT_IDL__) #pragma inhibit pop #endif %{ -#pragma include_defs "libnautilus/nautilus-undo-manager-component.h" +#pragma include_defs "libnautilus/nautilus-undo.h" %} module Nautilus { @@ -120,7 +120,7 @@ module Nautilus { interface Application : ::Bonobo::GenericFactory, ::Bonobo::Unknown { readonly attribute ViewWindowList view_windows; - readonly attribute UndoManager undo_manager; + readonly attribute Undo::Manager undo_manager; ViewWindow new_view_window (); }; }; diff --git a/src/file-manager/fm-properties-window.c b/src/file-manager/fm-properties-window.c index d8ac16595..5d59cc939 100644 --- a/src/file-manager/fm-properties-window.c +++ b/src/file-manager/fm-properties-window.c @@ -577,8 +577,8 @@ create_basic_page (GtkNotebook *notebook, NautilusFile *file) gtk_widget_grab_focus (GTK_WIDGET (name_field)); /* Enable undo in name field */ - nautilus_entry_enable_undo (NAUTILUS_ENTRY(name_field), TRUE); - nautilus_entry_enable_undo_key (NAUTILUS_ENTRY(name_field), TRUE); + nautilus_entry_enable_undo (NAUTILUS_ENTRY(name_field), NULL, FALSE); + nautilus_entry_enable_undo_key (NAUTILUS_ENTRY(name_field), FALSE); /* React to name changes from elsewhere. */ gtk_signal_connect_object_while_alive (GTK_OBJECT (file), diff --git a/src/nautilus-application.c b/src/nautilus-application.c index 6eb977ba8..82b421f4c 100644 --- a/src/nautilus-application.c +++ b/src/nautilus-application.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ /* * Nautilus @@ -35,16 +35,16 @@ #include <libnautilus/nautilus-undo-manager.h> typedef struct { - POA_Nautilus_Application servant; - NautilusApp *app; + POA_Nautilus_Application servant; + NautilusApp *app; - Nautilus_ViewWindowList attr_view_windows; + Nautilus_ViewWindowList attr_view_windows; } impl_POA_Nautilus_Application; static Nautilus_ViewWindowList * impl_Nautilus_Application__get_view_windows(impl_POA_Nautilus_Application* servant, CORBA_Environment * ev); -static Nautilus_UndoManager +static Nautilus_Undo_Manager impl_Nautilus_Application__get_undo_manager(impl_POA_Nautilus_Application* servant, CORBA_Environment * ev); static Nautilus_ViewWindow @@ -59,63 +59,63 @@ impl_Nautilus_Application_create_object(impl_POA_Nautilus_Application *servant, CORBA_char *obj_iid, GNOME_stringlist * params, CORBA_Environment * ev); - static POA_Nautilus_Application__epv impl_Nautilus_Application_epv = { - NULL, /* _private */ - (gpointer) &impl_Nautilus_Application__get_view_windows, - (gpointer) &impl_Nautilus_Application__get_undo_manager, - (gpointer) &impl_Nautilus_Application_new_view_window + NULL, /* _private */ + (gpointer) &impl_Nautilus_Application__get_view_windows, + (gpointer) &impl_Nautilus_Application__get_undo_manager, + (gpointer) &impl_Nautilus_Application_new_view_window }; static POA_Bonobo_GenericFactory__epv impl_Nautilus_Application_Bonobo_GenericFactory_epv = { - NULL, /* _private */ - (gpointer) &impl_Nautilus_Application_supports, - (gpointer) &impl_Nautilus_Application_create_object + NULL, /* _private */ + (gpointer) &impl_Nautilus_Application_supports, + (gpointer) &impl_Nautilus_Application_create_object }; static PortableServer_ServantBase__epv impl_Nautilus_Application_base_epv = { - NULL, /* _private data */ - NULL, /* finalize routine */ - NULL, /* default_POA routine */ + NULL, /* _private data */ + NULL, /* finalize routine */ + NULL, /* default_POA routine */ }; static POA_Nautilus_Application__vepv impl_Nautilus_Application_vepv = { - &impl_Nautilus_Application_base_epv, - &impl_Nautilus_Application_Bonobo_GenericFactory_epv, - NULL, - &impl_Nautilus_Application_epv, + &impl_Nautilus_Application_base_epv, + &impl_Nautilus_Application_Bonobo_GenericFactory_epv, + NULL, + &impl_Nautilus_Application_epv, }; static Nautilus_ViewWindowList * impl_Nautilus_Application__get_view_windows(impl_POA_Nautilus_Application *servant, CORBA_Environment * ev) { - Nautilus_ViewWindowList *retval; - - retval = Nautilus_ViewWindowList__alloc(); - retval->_length = g_slist_length(servant->app->windows); - - if(retval->_length) - { - int i; - GSList *ltmp; - - retval->_buffer = CORBA_sequence_Nautilus_ViewWindow_allocbuf(retval->_length); - for(i = 0, ltmp = servant->app->windows; ltmp; ltmp = ltmp->next, i++) - { - CORBA_Object obj; - obj = bonobo_object_corba_objref(NAUTILUS_WINDOW(ltmp->data)->ntl_viewwindow); - retval->_buffer[i] = CORBA_Object_duplicate(obj, ev); - } - } - else - retval->_buffer = NULL; - - CORBA_sequence_set_release(retval, CORBA_TRUE); - - return retval; + Nautilus_ViewWindowList *retval; + + retval = Nautilus_ViewWindowList__alloc(); + retval->_length = g_slist_length(servant->app->windows); + + if(retval->_length) + { + int i; + GSList *ltmp; + + retval->_buffer = CORBA_sequence_Nautilus_ViewWindow_allocbuf(retval->_length); + for(i = 0, ltmp = servant->app->windows; ltmp; ltmp = ltmp->next, i++) + { + CORBA_Object obj; + obj = bonobo_object_corba_objref(NAUTILUS_WINDOW(ltmp->data)->ntl_viewwindow); + retval->_buffer[i] = CORBA_Object_duplicate(obj, ev); + } + } + else { + retval->_buffer = NULL; + } + + CORBA_sequence_set_release(retval, CORBA_TRUE); + + return retval; } -static Nautilus_UndoManager +static Nautilus_Undo_Manager impl_Nautilus_Application__get_undo_manager(impl_POA_Nautilus_Application *servant, CORBA_Environment * ev) { @@ -126,11 +126,11 @@ impl_Nautilus_Application__get_undo_manager(impl_POA_Nautilus_Application *serva static Nautilus_ViewWindow impl_Nautilus_Application_new_view_window(impl_POA_Nautilus_Application *servant, CORBA_Environment * ev) { - NautilusWindow *win; + NautilusWindow *win; - win = nautilus_app_create_window(servant->app); + win = nautilus_app_create_window (servant->app); - return CORBA_Object_duplicate(bonobo_object_corba_objref(BONOBO_OBJECT(win)), ev); + return CORBA_Object_duplicate (bonobo_object_corba_objref (BONOBO_OBJECT (win)), ev); } static CORBA_boolean @@ -138,9 +138,9 @@ impl_Nautilus_Application_supports(impl_POA_Nautilus_Application * servant, CORBA_char * obj_iid, CORBA_Environment * ev) { - return (!strcmp(obj_iid, "OAFIID:ntl_file_manager_icon_view:42681b21-d5ca-4837-87d2-394d88ecc058") - || !strcmp(obj_iid, "OAFIID:ntl_file_manager_list_view:521e489d-0662-4ad7-ac3a-832deabe111c") - || !strcmp(obj_iid, "OAFIID:ntl_window:88e8b2e4-b627-4221-b566-5ba32185c88d")); + return (!strcmp(obj_iid, "OAFIID:ntl_file_manager_icon_view:42681b21-d5ca-4837-87d2-394d88ecc058") + || !strcmp(obj_iid, "OAFIID:ntl_file_manager_list_view:521e489d-0662-4ad7-ac3a-832deabe111c") + || !strcmp(obj_iid, "OAFIID:ntl_window:88e8b2e4-b627-4221-b566-5ba32185c88d")); } static CORBA_Object @@ -149,32 +149,33 @@ impl_Nautilus_Application_create_object(impl_POA_Nautilus_Application *servant, GNOME_stringlist * params, CORBA_Environment * ev) { - CORBA_Object retval = CORBA_OBJECT_NIL; - FMDirectoryView *dir_view; - NautilusContentViewFrame *view_frame; + CORBA_Object retval = CORBA_OBJECT_NIL; + FMDirectoryView *dir_view; + NautilusContentViewFrame *view_frame; - if(!impl_Nautilus_Application_supports(servant, obj_iid, ev)) - return CORBA_OBJECT_NIL; + if(!impl_Nautilus_Application_supports(servant, obj_iid, ev)) + return CORBA_OBJECT_NIL; - if (strcmp (obj_iid, "OAFIID:ntl_file_manager_icon_view:42681b21-d5ca-4837-87d2-394d88ecc058") == 0) - dir_view = FM_DIRECTORY_VIEW (gtk_object_new (fm_icon_view_get_type (), NULL)); - else if (strcmp (obj_iid, "OAFIID:ntl_file_manager_list_view:521e489d-0662-4ad7-ac3a-832deabe111c") == 0) - dir_view = FM_DIRECTORY_VIEW (gtk_object_new (fm_list_view_get_type (), NULL)); - else if (strcmp (obj_iid,"OAFIID:ntl_window:88e8b2e4-b627-4221-b566-5ba32185c88d") == 0) - retval = impl_Nautilus_Application_new_view_window (servant, ev); - else - dir_view = NULL; + if (strcmp (obj_iid, "OAFIID:ntl_file_manager_icon_view:42681b21-d5ca-4837-87d2-394d88ecc058") == 0) { + dir_view = FM_DIRECTORY_VIEW (gtk_object_new (fm_icon_view_get_type (), NULL)); + } else if (strcmp (obj_iid, "OAFIID:ntl_file_manager_list_view:521e489d-0662-4ad7-ac3a-832deabe111c") == 0) { + dir_view = FM_DIRECTORY_VIEW (gtk_object_new (fm_list_view_get_type (), NULL)); + } else if (strcmp (obj_iid,"OAFIID:ntl_window:88e8b2e4-b627-4221-b566-5ba32185c88d") == 0) { + retval = impl_Nautilus_Application_new_view_window (servant, ev); + } else { + dir_view = NULL; + } - g_return_val_if_fail(dir_view, CORBA_OBJECT_NIL); + g_return_val_if_fail(dir_view, CORBA_OBJECT_NIL); - if(dir_view) - { - view_frame = fm_directory_view_get_view_frame (dir_view); + if(dir_view) + { + view_frame = fm_directory_view_get_view_frame (dir_view); - retval = CORBA_Object_duplicate(bonobo_object_corba_objref(BONOBO_OBJECT(view_frame)), ev); - } + retval = CORBA_Object_duplicate(bonobo_object_corba_objref(BONOBO_OBJECT(view_frame)), ev); + } - return retval; + return retval; } @@ -183,13 +184,13 @@ impl_Nautilus_Application__create(PortableServer_POA poa, NautilusApp *app, CORBA_Environment * ev) { - impl_POA_Nautilus_Application *newservant; + impl_POA_Nautilus_Application *newservant; - newservant = g_new0(impl_POA_Nautilus_Application, 1); - newservant->servant.vepv = &impl_Nautilus_Application_vepv; - newservant->servant.vepv->Bonobo_Unknown_epv = NAUTILUS_APP_CLASS(GTK_OBJECT(app)->klass)->unknown_epv; - POA_Nautilus_Application__init((PortableServer_Servant) newservant, ev); - return bonobo_object_activate_servant(BONOBO_OBJECT(app), newservant); + newservant = g_new0(impl_POA_Nautilus_Application, 1); + newservant->servant.vepv = &impl_Nautilus_Application_vepv; + newservant->servant.vepv->Bonobo_Unknown_epv = NAUTILUS_APP_CLASS(GTK_OBJECT(app)->klass)->unknown_epv; + POA_Nautilus_Application__init((PortableServer_Servant) newservant, ev); + return bonobo_object_activate_servant(BONOBO_OBJECT(app), newservant); } static void nautilus_app_init (NautilusApp *app); @@ -201,39 +202,39 @@ static GtkObjectClass *app_parent_class = NULL; GtkType nautilus_app_get_type (void) { - static GtkType App_type = 0; - - if (!App_type) - { - static const GtkTypeInfo App_info = - { - "NautilusApp", - sizeof (NautilusApp), - sizeof (NautilusAppClass), - (GtkClassInitFunc) nautilus_app_class_init, - (GtkObjectInitFunc) nautilus_app_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - App_type = gtk_type_unique (bonobo_object_get_type (), &App_info); - } - - return App_type; + static GtkType App_type = 0; + + if (!App_type) + { + static const GtkTypeInfo App_info = + { + "NautilusApp", + sizeof (NautilusApp), + sizeof (NautilusAppClass), + (GtkClassInitFunc) nautilus_app_class_init, + (GtkObjectInitFunc) nautilus_app_init, + /* reserved_1 */ NULL, + /* reserved_2 */ NULL, + (GtkClassInitFunc) NULL, + }; + + App_type = gtk_type_unique (bonobo_object_get_type (), &App_info); + } + + return App_type; } static void nautilus_app_class_init (NautilusAppClass *klass) { - GtkObjectClass *object_class; + GtkObjectClass *object_class; - klass->unknown_epv = bonobo_object_get_epv(); + klass->unknown_epv = bonobo_object_get_epv(); - object_class = (GtkObjectClass*) klass; - object_class->destroy = nautilus_app_destroy; + object_class = (GtkObjectClass*) klass; + object_class->destroy = nautilus_app_destroy; - app_parent_class = gtk_type_class (gtk_object_get_type ()); + app_parent_class = gtk_type_class (gtk_object_get_type ()); /* * Startup preferences. This call is needed so that preferences have @@ -258,16 +259,19 @@ nautilus_app_init (NautilusApp *app) bonobo_object_construct(BONOBO_OBJECT(app), objref); /* Init undo manager */ - nautilus_undo_manager_initialize_global_manager (); - app->undo_manager = BONOBO_OBJECT (nautilus_undo_manager_get_undo_manager()); - + app->undo_manager = BONOBO_OBJECT (nautilus_undo_manager_new ()); + + /* Add undo manager to the app */ + g_assert (app->undo_manager); + gtk_object_set_data (GTK_OBJECT (app), "NautilusUndoManager", app->undo_manager); + CORBA_exception_free(&ev); } GtkObject * -nautilus_app_new (void) +nautilus_app_new (void) { - return gtk_object_new(nautilus_app_get_type(), NULL); + return gtk_object_new(nautilus_app_get_type(), NULL); } static void @@ -275,15 +279,15 @@ nautilus_app_destroy(GtkObject *object) { /* * Shutdown preferences. This is needed so that the global preferences - * obejct and all its allocations are freed. Not calling this function + * object and all its allocations are freed. Not calling this function * would have NOT cause the user to lose preferences. The only effect * would be to leak those objects - which would be collected at exit() * time anyway, but it adds noice to memory profile tool runs. */ nautilus_global_preferences_shutdown (); - nautilus_bookmarks_exiting(); - GTK_OBJECT_CLASS(app_parent_class)->destroy(object); + nautilus_bookmarks_exiting (object); + GTK_OBJECT_CLASS(app_parent_class)->destroy(object); } void @@ -292,9 +296,9 @@ nautilus_app_startup(NautilusApp *app, const char *initial_url) NautilusWindow *mainwin; /* Set default configuration */ - mainwin = nautilus_app_create_window(app); - bonobo_activate(); - nautilus_window_set_initial_state(mainwin, initial_url); + mainwin = nautilus_app_create_window (app); + bonobo_activate (); + nautilus_window_set_initial_state (mainwin, initial_url); } static void @@ -342,18 +346,20 @@ nautilus_app_quit (void) NautilusWindow * nautilus_app_create_window(NautilusApp *app) { - GtkWidget *win = GTK_WIDGET (gtk_object_new (nautilus_window_get_type(), "app_id", "nautilus", - "app", BONOBO_OBJECT(app), NULL)); + GtkWidget *win; + + win = GTK_WIDGET (gtk_object_new (nautilus_window_get_type(), "app", BONOBO_OBJECT(app), + "app_id", "nautilus", NULL)); - gtk_signal_connect(GTK_OBJECT(win), "destroy", nautilus_app_destroy_window, app); + gtk_signal_connect (GTK_OBJECT (win), "destroy", nautilus_app_destroy_window, app); - /* Do not yet show the window. It will be shown later on if it can - * successfully display its initial uri. Otherwise it will be destroyed - * without ever having seen the light of day. - */ + /* Do not yet show the window. It will be shown later on if it can + * successfully display its initial uri. Otherwise it will be destroyed + * without ever having seen the light of day. + */ - app->windows = g_slist_prepend(app->windows, win); + app->windows = g_slist_prepend(app->windows, win); - return NAUTILUS_WINDOW(win); + return NAUTILUS_WINDOW(win); } diff --git a/src/nautilus-bookmarks-window.c b/src/nautilus-bookmarks-window.c index 148167411..bbdf92c2b 100644 --- a/src/nautilus-bookmarks-window.c +++ b/src/nautilus-bookmarks-window.c @@ -108,7 +108,7 @@ static void repopulate (void); * Return value: A pointer to the new window. **/ GtkWidget * -create_bookmarks_window(NautilusBookmarkList *list) +create_bookmarks_window (NautilusBookmarkList *list, NautilusUndoManager *manager) { GtkWidget *window; GtkWidget *content_area; @@ -130,7 +130,7 @@ create_bookmarks_window(NautilusBookmarkList *list) BOOKMARKS_WINDOW_MIN_HEIGHT); nautilus_bookmarks_window_restore_geometry (window); gtk_window_set_policy (GTK_WINDOW (window), FALSE, TRUE, FALSE); - + content_area = gtk_hbox_new (TRUE, GNOME_PAD); gtk_widget_show (content_area); gtk_container_add (GTK_CONTAINER (window), content_area); @@ -191,8 +191,13 @@ create_bookmarks_window(NautilusBookmarkList *list) gtk_widget_show (remove_button); gtk_box_pack_start (GTK_BOX (hbox2), remove_button, TRUE, FALSE, 0); - /* Wire up all the signals. */ + /* Add undo manager to widgets */ + g_assert (manager); + gtk_object_set_data ( GTK_OBJECT (name_field), NAUTILUS_UNDO_MANAGER_NAME, manager); + gtk_object_set_data ( GTK_OBJECT (uri_field), NAUTILUS_UNDO_MANAGER_NAME, manager); + + /* Wire up all the signals. */ bookmark_list_changed_signalID = gtk_signal_connect (GTK_OBJECT(bookmarks), "contents_changed", GTK_SIGNAL_FUNC(on_bookmark_list_changed), @@ -518,11 +523,15 @@ on_text_field_focus_in_event (GtkWidget *widget, GdkEventFocus *event, gpointer user_data) { + NautilusUndoManager *manager; + g_assert (NAUTILUS_IS_ENTRY (widget)); + manager = gtk_object_get_data ( GTK_OBJECT (widget), NAUTILUS_UNDO_MANAGER_NAME); + nautilus_entry_select_all (NAUTILUS_ENTRY (widget)); nautilus_entry_enable_undo_key (NAUTILUS_ENTRY(widget), TRUE); - nautilus_entry_enable_undo(NAUTILUS_ENTRY(widget), TRUE); + nautilus_entry_enable_undo(NAUTILUS_ENTRY(widget), manager, TRUE); return FALSE; } @@ -570,8 +579,8 @@ on_window_delete_event (GtkWidget *widget, gtk_widget_hide (widget); /* Disable undo for entry widgets*/ - nautilus_entry_enable_undo(NAUTILUS_ENTRY(name_field), FALSE); - nautilus_entry_enable_undo(NAUTILUS_ENTRY(uri_field), FALSE); + nautilus_entry_enable_undo(NAUTILUS_ENTRY(name_field), NULL, FALSE); + nautilus_entry_enable_undo(NAUTILUS_ENTRY(uri_field), NULL, FALSE); /* Remove object transactions from undo manager */ nautilus_undo_manager_unregister_object(GTK_OBJECT(name_field)); diff --git a/src/nautilus-bookmarks-window.h b/src/nautilus-bookmarks-window.h index d8d64098c..59e096bf6 100644 --- a/src/nautilus-bookmarks-window.h +++ b/src/nautilus-bookmarks-window.h @@ -26,9 +26,11 @@ #define NAUTILUS_BOOKMARKS_WINDOW_H #include <gnome.h> +#include <libnautilus/nautilus-undo-manager.h> #include "nautilus-bookmark-list.h" -GtkWidget *create_bookmarks_window (NautilusBookmarkList *bookmarks); +GtkWidget *create_bookmarks_window (NautilusBookmarkList *bookmarks, + NautilusUndoManager *manager); void nautilus_bookmarks_window_save_geometry (GtkWidget *window); #endif /* NAUTILUS_BOOKMARKS_WINDOW_H */ diff --git a/src/nautilus-location-bar.c b/src/nautilus-location-bar.c index 527745d67..632d6ea4b 100644 --- a/src/nautilus-location-bar.c +++ b/src/nautilus-location-bar.c @@ -268,7 +268,26 @@ nautilus_location_bar_set_location (NautilusLocationBar *bar, /* Note: This is called in reaction to external changes, and * thus should not emit the LOCATION_CHANGED signal.*/ gtk_entry_set_text (bar->entry, - location == NULL ? "" : location); + location == NULL ? "" : location); +} + +/** + * nautilus_location_bar_enable_undo + * + * Set staus of location bar undo functionality. + * + * @bar: A NautilusLocationBar. + * @manager: A NautilusUndoManager. Can be NULL. + * @enable: State to set undo functionality in. + */ +void +nautilus_location_bar_enable_undo (NautilusLocationBar *bar, + NautilusUndoManager *manager, + gboolean value) +{ + g_return_if_fail (NAUTILUS_IS_LOCATION_BAR (bar)); - nautilus_entry_enable_undo (NAUTILUS_ENTRY (bar->entry), TRUE); + nautilus_entry_enable_undo ( NAUTILUS_ENTRY (bar->entry), manager, value); } + + diff --git a/src/nautilus-location-bar.h b/src/nautilus-location-bar.h index 4e6ef131f..7f001dd1f 100644 --- a/src/nautilus-location-bar.h +++ b/src/nautilus-location-bar.h @@ -29,6 +29,7 @@ #include <gtk/gtkhbox.h> #include <gtk/gtklabel.h> #include <gtk/gtkentry.h> +#include <libnautilus/nautilus-undo-manager.h> #define NAUTILUS_LOCATION_BAR(obj) \ GTK_CHECK_CAST (obj, nautilus_location_bar_get_type (), NautilusLocationBar) @@ -54,9 +55,13 @@ typedef struct { const char *location); } NautilusLocationBarClass; -GtkType nautilus_location_bar_get_type (void); -GtkWidget* nautilus_location_bar_new (void); -void nautilus_location_bar_set_location (NautilusLocationBar *bar, - const char *location); +GtkType nautilus_location_bar_get_type (void); +GtkWidget* nautilus_location_bar_new (void); +void nautilus_location_bar_set_location (NautilusLocationBar *bar, + const char *location); +void nautilus_location_bar_enable_undo (NautilusLocationBar *bar, + NautilusUndoManager *manager, + gboolean value); + #endif /* NAUTILUS_LOCATION_BAR_H */ diff --git a/src/nautilus-navigation-window-menus.c b/src/nautilus-navigation-window-menus.c index b5499470b..59cd861a2 100644 --- a/src/nautilus-navigation-window-menus.c +++ b/src/nautilus-navigation-window-menus.c @@ -33,9 +33,7 @@ #include "nautilus-property-browser.h" #include <libnautilus/nautilus-undo-manager.h> - #include <libnautilus/nautilus-bonobo-ui.h> - #include <libnautilus-extensions/nautilus-bonobo-extensions.h> #include <libnautilus-extensions/nautilus-glib-extensions.h> #include <libnautilus-extensions/nautilus-gtk-extensions.h> @@ -53,7 +51,7 @@ static void clear_appended_bookmark_items (NautilusWindow const char *menu_path, const char *last_static_item_path); static NautilusBookmarkList *get_bookmark_list (void); -static GtkWidget *get_bookmarks_window (void); +static GtkWidget *get_bookmarks_window (GtkObject *object); static void refresh_bookmarks_in_go_menu (NautilusWindow *window); static void refresh_bookmarks_in_bookmarks_menu (NautilusWindow *window); @@ -118,8 +116,16 @@ edit_menu_undo_callback (BonoboUIHandler *ui_handler, gpointer user_data, const char *path) { - if (nautilus_undo_manager_can_undo ()) - nautilus_undo_manager_undo_last_transaction (); + NautilusUndoManager *manager; + + g_assert (NAUTILUS_IS_WINDOW (user_data)); + + /* Locate undo manager */ + manager = gtk_object_get_data (GTK_OBJECT(user_data), "NautilusUndoManager"); + g_return_if_fail (manager != NULL); + + if (nautilus_undo_manager_can_undo (manager)) + nautilus_undo_manager_undo (manager); } static void @@ -131,7 +137,7 @@ edit_menu_cut_callback (BonoboUIHandler *ui_handler, g_assert (GTK_IS_WINDOW (user_data)); main_window=GTK_WINDOW (user_data); - + if (GTK_IS_EDITABLE (main_window->focus_widget)) { gtk_editable_cut_clipboard (GTK_EDITABLE (main_window->focus_widget)); } @@ -237,7 +243,7 @@ bookmarks_menu_edit_bookmarks_callback (BonoboUIHandler *ui_handler, { g_return_if_fail (NAUTILUS_IS_WINDOW (user_data)); - nautilus_window_edit_bookmarks (NAUTILUS_WINDOW (user_data)); + nautilus_window_edit_bookmarks (GTK_OBJECT (user_data)); } static void @@ -420,12 +426,15 @@ get_bookmark_list (void) } static GtkWidget * -get_bookmarks_window (void) +get_bookmarks_window (GtkObject *object) { static GtkWidget *bookmarks_window = NULL; + if (bookmarks_window == NULL) { - bookmarks_window = create_bookmarks_window (get_bookmark_list ()); + NautilusUndoManager *manager; + manager = gtk_object_get_data (object, NAUTILUS_UNDO_MANAGER_NAME); + bookmarks_window = create_bookmarks_window (get_bookmark_list (), manager); } g_assert (GTK_IS_WINDOW (bookmarks_window)); return bookmarks_window; @@ -438,9 +447,9 @@ get_bookmarks_window (void) * Called when application exits; don't call from anywhere else. **/ void -nautilus_bookmarks_exiting (void) +nautilus_bookmarks_exiting (GtkObject *object) { - nautilus_bookmarks_window_save_geometry (get_bookmarks_window ()); + nautilus_bookmarks_window_save_geometry (get_bookmarks_window (object)); } /** @@ -472,9 +481,9 @@ nautilus_window_add_bookmark_for_current_location (NautilusWindow *window) } void -nautilus_window_edit_bookmarks (NautilusWindow *window) +nautilus_window_edit_bookmarks (GtkObject *object) { - nautilus_gtk_window_present (GTK_WINDOW (get_bookmarks_window ())); + nautilus_gtk_window_present (GTK_WINDOW (get_bookmarks_window (object))); } /** @@ -564,6 +573,7 @@ void nautilus_window_initialize_menus (NautilusWindow *window) { BonoboUIHandler *ui_handler; + NautilusUndoManager *undo_manager; ui_handler = window->uih; g_assert (ui_handler != NULL); @@ -625,7 +635,7 @@ nautilus_window_initialize_menus (NautilusWindow *window) GNOME_KEY_NAME_UNDO, GNOME_KEY_MOD_UNDO, edit_menu_undo_callback, - NULL); + window); append_separator (window, NAUTILUS_MENU_PATH_SEPARATOR_AFTER_UNDO); @@ -851,11 +861,12 @@ nautilus_window_initialize_menus (NautilusWindow *window) GTK_OBJECT (window)); /* Connect to UndoManager so that we are notified when an undo transcation has occurred */ - gtk_signal_connect_object_while_alive (GTK_OBJECT(nautilus_undo_manager_get_undo_manager ()), - "undo_transaction_occurred", - update_undo_menu_item, - GTK_OBJECT (window)); - + undo_manager = gtk_object_get_data ( GTK_OBJECT(window), "NautilusUndoManager"); + if (undo_manager != NULL) { + gtk_signal_connect_object_while_alive ( GTK_OBJECT (undo_manager), "undo_transaction_occurred", + update_undo_menu_item, GTK_OBJECT (window)); + } + nautilus_window_initialize_bookmarks_menu (window); nautilus_window_initialize_go_menu (window); } @@ -955,9 +966,17 @@ update_eazel_theme_menu_item (NautilusWindow *window) static void update_undo_menu_item (NautilusWindow *window) { + NautilusUndoManager *undo_manager; + g_assert (NAUTILUS_IS_WINDOW (window)); - bonobo_ui_handler_menu_set_sensitivity(window->uih, NAUTILUS_MENU_PATH_UNDO_ITEM, - nautilus_undo_manager_can_undo ()); + undo_manager = gtk_object_get_data (GTK_OBJECT (window), "NautilusUndoManager"); + if (undo_manager != NULL) { + bonobo_ui_handler_menu_set_sensitivity(window->uih, NAUTILUS_MENU_PATH_UNDO_ITEM, + nautilus_undo_manager_can_undo (undo_manager)); + } else { + bonobo_ui_handler_menu_set_sensitivity(window->uih, NAUTILUS_MENU_PATH_UNDO_ITEM, + FALSE); + } } diff --git a/src/nautilus-navigation-window.c b/src/nautilus-navigation-window.c index 773634e3a..5ed1c059f 100644 --- a/src/nautilus-navigation-window.c +++ b/src/nautilus-navigation-window.c @@ -47,6 +47,7 @@ #include <libnautilus-extensions/nautilus-icon-factory.h> #include <libnautilus-extensions/nautilus-metadata.h> #include <libnautilus-extensions/nautilus-string.h> +#include <libnautilus/nautilus-undo-manager.h> #include "nautilus-zoom-control.h" #include <ctype.h> #include <libgnomevfs/gnome-vfs-uri.h> @@ -356,97 +357,100 @@ zoom_out_cb (NautilusZoomControl *zoom_control, static void -nautilus_window_constructed(NautilusWindow *window) +nautilus_window_constructed (NautilusWindow *window) { - GnomeApp *app; - GtkWidget *location_bar_box, *statusbar; - GtkWidget *temp_frame; - GnomeDockItemBehavior behavior; - int sidebar_width; + GnomeApp *app; + GtkWidget *location_bar_box, *statusbar; + GtkWidget *temp_frame; + GnomeDockItemBehavior behavior; + int sidebar_width; + NautilusUndoManager *undo_manager; - app = GNOME_APP(window); + app = GNOME_APP(window); - /* set up location bar */ + /* Set up undo manager */ + undo_manager = gtk_object_get_data ( GTK_OBJECT(window->app), "NautilusUndoManager"); + g_assert (undo_manager); + gtk_object_set_data ( GTK_OBJECT(window), "NautilusUndoManager", undo_manager); - location_bar_box = gtk_hbox_new(FALSE, GNOME_PAD); - gtk_container_set_border_width(GTK_CONTAINER(location_bar_box), GNOME_PAD_SMALL); + /* set up location bar */ + location_bar_box = gtk_hbox_new(FALSE, GNOME_PAD); + gtk_container_set_border_width(GTK_CONTAINER(location_bar_box), GNOME_PAD_SMALL); - window->ent_uri = nautilus_location_bar_new(); - gtk_signal_connect(GTK_OBJECT(window->ent_uri), "location_changed", + window->ent_uri = nautilus_location_bar_new(); + nautilus_location_bar_enable_undo ( NAUTILUS_LOCATION_BAR (window->ent_uri), undo_manager, TRUE); + + gtk_signal_connect(GTK_OBJECT(window->ent_uri), "location_changed", nautilus_window_goto_uri_cb, window); - gtk_box_pack_start(GTK_BOX(location_bar_box), window->ent_uri, TRUE, TRUE, GNOME_PAD_SMALL); - behavior = GNOME_DOCK_ITEM_BEH_EXCLUSIVE | GNOME_DOCK_ITEM_BEH_NEVER_VERTICAL; - if(!gnome_preferences_get_toolbar_detachable()) - behavior |= GNOME_DOCK_ITEM_BEH_LOCKED; - gnome_app_add_docked(app, location_bar_box, "uri-entry", - behavior, GNOME_DOCK_TOP, 2, 0, 0); - - /* Option menu for content view types; it's empty here, filled in when a uri is set. */ - window->option_cvtype = gtk_option_menu_new(); - gtk_box_pack_end(GTK_BOX(location_bar_box), window->option_cvtype, FALSE, FALSE, GNOME_PAD_SMALL); - gtk_widget_show(window->option_cvtype); - - /* allocate the zoom control and place on the right next to the menu */ - - window->zoom_control = nautilus_zoom_control_new (); - gtk_widget_show (window->zoom_control); - gtk_signal_connect (GTK_OBJECT (window->zoom_control), "zoom_in", zoom_in_cb, window); - gtk_signal_connect (GTK_OBJECT (window->zoom_control), "zoom_out", zoom_out_cb, window); - gtk_box_pack_end (GTK_BOX (location_bar_box), window->zoom_control, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(location_bar_box), window->ent_uri, TRUE, TRUE, GNOME_PAD_SMALL); + behavior = GNOME_DOCK_ITEM_BEH_EXCLUSIVE | GNOME_DOCK_ITEM_BEH_NEVER_VERTICAL; + if(!gnome_preferences_get_toolbar_detachable()) + behavior |= GNOME_DOCK_ITEM_BEH_LOCKED; + gnome_app_add_docked(app, location_bar_box, "uri-entry", behavior, GNOME_DOCK_TOP, 2, 0, 0); + + /* Option menu for content view types; it's empty here, filled in when a uri is set. */ + window->option_cvtype = gtk_option_menu_new(); + gtk_box_pack_end(GTK_BOX(location_bar_box), window->option_cvtype, FALSE, FALSE, GNOME_PAD_SMALL); + gtk_widget_show(window->option_cvtype); + + /* allocate the zoom control and place on the right next to the menu */ + window->zoom_control = nautilus_zoom_control_new (); + gtk_widget_show (window->zoom_control); + gtk_signal_connect (GTK_OBJECT (window->zoom_control), "zoom_in", zoom_in_cb, window); + gtk_signal_connect (GTK_OBJECT (window->zoom_control), "zoom_out", zoom_out_cb, window); + gtk_box_pack_end (GTK_BOX (location_bar_box), window->zoom_control, FALSE, FALSE, 0); - gtk_widget_show_all(location_bar_box); - - /* set up status bar */ + gtk_widget_show_all(location_bar_box); - gnome_app_set_statusbar(app, (statusbar = gtk_statusbar_new())); - /* insert a little padding so text isn't jammed against frame */ - gtk_misc_set_padding(GTK_MISC ((GTK_STATUSBAR (statusbar))->label), GNOME_PAD, 0); - window->statusbar_ctx = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar), "IhateGtkStatusbar"); - - /* set up window contents and policy */ + /* set up status bar */ + gnome_app_set_statusbar(app, (statusbar = gtk_statusbar_new())); + + /* insert a little padding so text isn't jammed against frame */ + gtk_misc_set_padding(GTK_MISC ((GTK_STATUSBAR (statusbar))->label), GNOME_PAD, 0); + window->statusbar_ctx = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar), "IhateGtkStatusbar"); - gtk_window_set_policy(GTK_WINDOW(window), FALSE, TRUE, FALSE); - gtk_window_set_default_size(GTK_WINDOW(window), 650, 400); + /* set up window contents and policy */ + gtk_window_set_policy(GTK_WINDOW(window), FALSE, TRUE, FALSE); + gtk_window_set_default_size(GTK_WINDOW(window), 650, 400); - window->content_hbox = gtk_hpaned_new(); - sidebar_width = nautilus_preferences_get_enum(NAUTILUS_PREFERENCES_SIDEBAR_WIDTH, 148); - gtk_paned_set_position(GTK_PANED(window->content_hbox), sidebar_width); + window->content_hbox = gtk_hpaned_new(); + sidebar_width = nautilus_preferences_get_enum(NAUTILUS_PREFERENCES_SIDEBAR_WIDTH, 148); + gtk_paned_set_position(GTK_PANED(window->content_hbox), sidebar_width); - gnome_app_set_contents(app, window->content_hbox); + gnome_app_set_contents(app, window->content_hbox); - /* set up the index panel in a frame */ - - temp_frame = gtk_frame_new(NULL); - gtk_frame_set_shadow_type(GTK_FRAME(temp_frame), GTK_SHADOW_OUT); - gtk_widget_show(temp_frame); + /* set up the index panel in a frame */ + temp_frame = gtk_frame_new(NULL); + gtk_frame_set_shadow_type(GTK_FRAME(temp_frame), GTK_SHADOW_OUT); + gtk_widget_show(temp_frame); - window->index_panel = nautilus_index_panel_new(); - gtk_widget_show (GTK_WIDGET (window->index_panel)); - gtk_container_add(GTK_CONTAINER(temp_frame), GTK_WIDGET (window->index_panel)); - - gtk_paned_pack1(GTK_PANED(window->content_hbox), temp_frame, FALSE, FALSE); + window->index_panel = nautilus_index_panel_new(); + gtk_widget_show (GTK_WIDGET (window->index_panel)); + gtk_container_add(GTK_CONTAINER(temp_frame), GTK_WIDGET (window->index_panel)); - gtk_widget_show_all(window->content_hbox); + gtk_paned_pack1(GTK_PANED(window->content_hbox), temp_frame, FALSE, FALSE); - /* enable mouse tracking for the index panel */ - gtk_widget_add_events(GTK_WIDGET (window->index_panel), GDK_POINTER_MOTION_MASK); + gtk_widget_show_all(window->content_hbox); - /* CORBA and Bonobo setup */ - window->ntl_viewwindow = impl_Nautilus_ViewWindow__create(window); - window->uih = bonobo_ui_handler_new(); - bonobo_ui_handler_set_app(window->uih, app); - bonobo_ui_handler_set_statusbar(window->uih, statusbar); + /* enable mouse tracking for the index panel */ + gtk_widget_add_events(GTK_WIDGET (window->index_panel), GDK_POINTER_MOTION_MASK); - /* Create menus and toolbars */ - nautilus_window_initialize_menus (window); - nautilus_window_initialize_toolbars (window); + /* CORBA and Bonobo setup */ + window->ntl_viewwindow = impl_Nautilus_ViewWindow__create(window); + window->uih = bonobo_ui_handler_new(); + bonobo_ui_handler_set_app(window->uih, app); + bonobo_ui_handler_set_statusbar(window->uih, statusbar); - /* Set initial sensitivity of some buttons & menu items - * now that they're all created. - */ - nautilus_window_allow_back(window, FALSE); - nautilus_window_allow_forward(window, FALSE); - nautilus_window_allow_stop(window, FALSE); + /* Create menus and toolbars */ + nautilus_window_initialize_menus (window); + nautilus_window_initialize_toolbars (window); + + /* Set initial sensitivity of some buttons & menu items + * now that they're all created. + */ + nautilus_window_allow_back(window, FALSE); + nautilus_window_allow_forward(window, FALSE); + nautilus_window_allow_stop(window, FALSE); } static void @@ -469,11 +473,12 @@ nautilus_window_set_arg (GtkObject *object, g_assert(app->name); g_free(app->prefix); app->prefix = g_strconcat("/", app->name, "/", NULL); - if(!old_app_name) + if(!old_app_name) { nautilus_window_constructed(NAUTILUS_WINDOW(object)); + } break; case ARG_APP: - window->app = BONOBO_OBJECT(GTK_VALUE_OBJECT(*arg)); + window->app = BONOBO_OBJECT(GTK_VALUE_OBJECT(*arg)); break; case ARG_CONTENT_VIEW: nautilus_window_real_set_content_view (window, (NautilusView *)GTK_VALUE_OBJECT(*arg)); diff --git a/src/nautilus-navigation-window.h b/src/nautilus-navigation-window.h index dbebf91df..6a8e65839 100644 --- a/src/nautilus-navigation-window.h +++ b/src/nautilus-navigation-window.h @@ -149,6 +149,6 @@ void nautilus_window_allow_reload (NautilusWindow *window, gboolean allow); void nautilus_window_allow_stop (NautilusWindow *window, gboolean allow); -void nautilus_bookmarks_exiting (void); +void nautilus_bookmarks_exiting (GtkObject *object); #endif diff --git a/src/nautilus-object-window.c b/src/nautilus-object-window.c index 773634e3a..5ed1c059f 100644 --- a/src/nautilus-object-window.c +++ b/src/nautilus-object-window.c @@ -47,6 +47,7 @@ #include <libnautilus-extensions/nautilus-icon-factory.h> #include <libnautilus-extensions/nautilus-metadata.h> #include <libnautilus-extensions/nautilus-string.h> +#include <libnautilus/nautilus-undo-manager.h> #include "nautilus-zoom-control.h" #include <ctype.h> #include <libgnomevfs/gnome-vfs-uri.h> @@ -356,97 +357,100 @@ zoom_out_cb (NautilusZoomControl *zoom_control, static void -nautilus_window_constructed(NautilusWindow *window) +nautilus_window_constructed (NautilusWindow *window) { - GnomeApp *app; - GtkWidget *location_bar_box, *statusbar; - GtkWidget *temp_frame; - GnomeDockItemBehavior behavior; - int sidebar_width; + GnomeApp *app; + GtkWidget *location_bar_box, *statusbar; + GtkWidget *temp_frame; + GnomeDockItemBehavior behavior; + int sidebar_width; + NautilusUndoManager *undo_manager; - app = GNOME_APP(window); + app = GNOME_APP(window); - /* set up location bar */ + /* Set up undo manager */ + undo_manager = gtk_object_get_data ( GTK_OBJECT(window->app), "NautilusUndoManager"); + g_assert (undo_manager); + gtk_object_set_data ( GTK_OBJECT(window), "NautilusUndoManager", undo_manager); - location_bar_box = gtk_hbox_new(FALSE, GNOME_PAD); - gtk_container_set_border_width(GTK_CONTAINER(location_bar_box), GNOME_PAD_SMALL); + /* set up location bar */ + location_bar_box = gtk_hbox_new(FALSE, GNOME_PAD); + gtk_container_set_border_width(GTK_CONTAINER(location_bar_box), GNOME_PAD_SMALL); - window->ent_uri = nautilus_location_bar_new(); - gtk_signal_connect(GTK_OBJECT(window->ent_uri), "location_changed", + window->ent_uri = nautilus_location_bar_new(); + nautilus_location_bar_enable_undo ( NAUTILUS_LOCATION_BAR (window->ent_uri), undo_manager, TRUE); + + gtk_signal_connect(GTK_OBJECT(window->ent_uri), "location_changed", nautilus_window_goto_uri_cb, window); - gtk_box_pack_start(GTK_BOX(location_bar_box), window->ent_uri, TRUE, TRUE, GNOME_PAD_SMALL); - behavior = GNOME_DOCK_ITEM_BEH_EXCLUSIVE | GNOME_DOCK_ITEM_BEH_NEVER_VERTICAL; - if(!gnome_preferences_get_toolbar_detachable()) - behavior |= GNOME_DOCK_ITEM_BEH_LOCKED; - gnome_app_add_docked(app, location_bar_box, "uri-entry", - behavior, GNOME_DOCK_TOP, 2, 0, 0); - - /* Option menu for content view types; it's empty here, filled in when a uri is set. */ - window->option_cvtype = gtk_option_menu_new(); - gtk_box_pack_end(GTK_BOX(location_bar_box), window->option_cvtype, FALSE, FALSE, GNOME_PAD_SMALL); - gtk_widget_show(window->option_cvtype); - - /* allocate the zoom control and place on the right next to the menu */ - - window->zoom_control = nautilus_zoom_control_new (); - gtk_widget_show (window->zoom_control); - gtk_signal_connect (GTK_OBJECT (window->zoom_control), "zoom_in", zoom_in_cb, window); - gtk_signal_connect (GTK_OBJECT (window->zoom_control), "zoom_out", zoom_out_cb, window); - gtk_box_pack_end (GTK_BOX (location_bar_box), window->zoom_control, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(location_bar_box), window->ent_uri, TRUE, TRUE, GNOME_PAD_SMALL); + behavior = GNOME_DOCK_ITEM_BEH_EXCLUSIVE | GNOME_DOCK_ITEM_BEH_NEVER_VERTICAL; + if(!gnome_preferences_get_toolbar_detachable()) + behavior |= GNOME_DOCK_ITEM_BEH_LOCKED; + gnome_app_add_docked(app, location_bar_box, "uri-entry", behavior, GNOME_DOCK_TOP, 2, 0, 0); + + /* Option menu for content view types; it's empty here, filled in when a uri is set. */ + window->option_cvtype = gtk_option_menu_new(); + gtk_box_pack_end(GTK_BOX(location_bar_box), window->option_cvtype, FALSE, FALSE, GNOME_PAD_SMALL); + gtk_widget_show(window->option_cvtype); + + /* allocate the zoom control and place on the right next to the menu */ + window->zoom_control = nautilus_zoom_control_new (); + gtk_widget_show (window->zoom_control); + gtk_signal_connect (GTK_OBJECT (window->zoom_control), "zoom_in", zoom_in_cb, window); + gtk_signal_connect (GTK_OBJECT (window->zoom_control), "zoom_out", zoom_out_cb, window); + gtk_box_pack_end (GTK_BOX (location_bar_box), window->zoom_control, FALSE, FALSE, 0); - gtk_widget_show_all(location_bar_box); - - /* set up status bar */ + gtk_widget_show_all(location_bar_box); - gnome_app_set_statusbar(app, (statusbar = gtk_statusbar_new())); - /* insert a little padding so text isn't jammed against frame */ - gtk_misc_set_padding(GTK_MISC ((GTK_STATUSBAR (statusbar))->label), GNOME_PAD, 0); - window->statusbar_ctx = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar), "IhateGtkStatusbar"); - - /* set up window contents and policy */ + /* set up status bar */ + gnome_app_set_statusbar(app, (statusbar = gtk_statusbar_new())); + + /* insert a little padding so text isn't jammed against frame */ + gtk_misc_set_padding(GTK_MISC ((GTK_STATUSBAR (statusbar))->label), GNOME_PAD, 0); + window->statusbar_ctx = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar), "IhateGtkStatusbar"); - gtk_window_set_policy(GTK_WINDOW(window), FALSE, TRUE, FALSE); - gtk_window_set_default_size(GTK_WINDOW(window), 650, 400); + /* set up window contents and policy */ + gtk_window_set_policy(GTK_WINDOW(window), FALSE, TRUE, FALSE); + gtk_window_set_default_size(GTK_WINDOW(window), 650, 400); - window->content_hbox = gtk_hpaned_new(); - sidebar_width = nautilus_preferences_get_enum(NAUTILUS_PREFERENCES_SIDEBAR_WIDTH, 148); - gtk_paned_set_position(GTK_PANED(window->content_hbox), sidebar_width); + window->content_hbox = gtk_hpaned_new(); + sidebar_width = nautilus_preferences_get_enum(NAUTILUS_PREFERENCES_SIDEBAR_WIDTH, 148); + gtk_paned_set_position(GTK_PANED(window->content_hbox), sidebar_width); - gnome_app_set_contents(app, window->content_hbox); + gnome_app_set_contents(app, window->content_hbox); - /* set up the index panel in a frame */ - - temp_frame = gtk_frame_new(NULL); - gtk_frame_set_shadow_type(GTK_FRAME(temp_frame), GTK_SHADOW_OUT); - gtk_widget_show(temp_frame); + /* set up the index panel in a frame */ + temp_frame = gtk_frame_new(NULL); + gtk_frame_set_shadow_type(GTK_FRAME(temp_frame), GTK_SHADOW_OUT); + gtk_widget_show(temp_frame); - window->index_panel = nautilus_index_panel_new(); - gtk_widget_show (GTK_WIDGET (window->index_panel)); - gtk_container_add(GTK_CONTAINER(temp_frame), GTK_WIDGET (window->index_panel)); - - gtk_paned_pack1(GTK_PANED(window->content_hbox), temp_frame, FALSE, FALSE); + window->index_panel = nautilus_index_panel_new(); + gtk_widget_show (GTK_WIDGET (window->index_panel)); + gtk_container_add(GTK_CONTAINER(temp_frame), GTK_WIDGET (window->index_panel)); - gtk_widget_show_all(window->content_hbox); + gtk_paned_pack1(GTK_PANED(window->content_hbox), temp_frame, FALSE, FALSE); - /* enable mouse tracking for the index panel */ - gtk_widget_add_events(GTK_WIDGET (window->index_panel), GDK_POINTER_MOTION_MASK); + gtk_widget_show_all(window->content_hbox); - /* CORBA and Bonobo setup */ - window->ntl_viewwindow = impl_Nautilus_ViewWindow__create(window); - window->uih = bonobo_ui_handler_new(); - bonobo_ui_handler_set_app(window->uih, app); - bonobo_ui_handler_set_statusbar(window->uih, statusbar); + /* enable mouse tracking for the index panel */ + gtk_widget_add_events(GTK_WIDGET (window->index_panel), GDK_POINTER_MOTION_MASK); - /* Create menus and toolbars */ - nautilus_window_initialize_menus (window); - nautilus_window_initialize_toolbars (window); + /* CORBA and Bonobo setup */ + window->ntl_viewwindow = impl_Nautilus_ViewWindow__create(window); + window->uih = bonobo_ui_handler_new(); + bonobo_ui_handler_set_app(window->uih, app); + bonobo_ui_handler_set_statusbar(window->uih, statusbar); - /* Set initial sensitivity of some buttons & menu items - * now that they're all created. - */ - nautilus_window_allow_back(window, FALSE); - nautilus_window_allow_forward(window, FALSE); - nautilus_window_allow_stop(window, FALSE); + /* Create menus and toolbars */ + nautilus_window_initialize_menus (window); + nautilus_window_initialize_toolbars (window); + + /* Set initial sensitivity of some buttons & menu items + * now that they're all created. + */ + nautilus_window_allow_back(window, FALSE); + nautilus_window_allow_forward(window, FALSE); + nautilus_window_allow_stop(window, FALSE); } static void @@ -469,11 +473,12 @@ nautilus_window_set_arg (GtkObject *object, g_assert(app->name); g_free(app->prefix); app->prefix = g_strconcat("/", app->name, "/", NULL); - if(!old_app_name) + if(!old_app_name) { nautilus_window_constructed(NAUTILUS_WINDOW(object)); + } break; case ARG_APP: - window->app = BONOBO_OBJECT(GTK_VALUE_OBJECT(*arg)); + window->app = BONOBO_OBJECT(GTK_VALUE_OBJECT(*arg)); break; case ARG_CONTENT_VIEW: nautilus_window_real_set_content_view (window, (NautilusView *)GTK_VALUE_OBJECT(*arg)); diff --git a/src/nautilus-object-window.h b/src/nautilus-object-window.h index dbebf91df..6a8e65839 100644 --- a/src/nautilus-object-window.h +++ b/src/nautilus-object-window.h @@ -149,6 +149,6 @@ void nautilus_window_allow_reload (NautilusWindow *window, gboolean allow); void nautilus_window_allow_stop (NautilusWindow *window, gboolean allow); -void nautilus_bookmarks_exiting (void); +void nautilus_bookmarks_exiting (GtkObject *object); #endif diff --git a/src/nautilus-spatial-window.c b/src/nautilus-spatial-window.c index 773634e3a..5ed1c059f 100644 --- a/src/nautilus-spatial-window.c +++ b/src/nautilus-spatial-window.c @@ -47,6 +47,7 @@ #include <libnautilus-extensions/nautilus-icon-factory.h> #include <libnautilus-extensions/nautilus-metadata.h> #include <libnautilus-extensions/nautilus-string.h> +#include <libnautilus/nautilus-undo-manager.h> #include "nautilus-zoom-control.h" #include <ctype.h> #include <libgnomevfs/gnome-vfs-uri.h> @@ -356,97 +357,100 @@ zoom_out_cb (NautilusZoomControl *zoom_control, static void -nautilus_window_constructed(NautilusWindow *window) +nautilus_window_constructed (NautilusWindow *window) { - GnomeApp *app; - GtkWidget *location_bar_box, *statusbar; - GtkWidget *temp_frame; - GnomeDockItemBehavior behavior; - int sidebar_width; + GnomeApp *app; + GtkWidget *location_bar_box, *statusbar; + GtkWidget *temp_frame; + GnomeDockItemBehavior behavior; + int sidebar_width; + NautilusUndoManager *undo_manager; - app = GNOME_APP(window); + app = GNOME_APP(window); - /* set up location bar */ + /* Set up undo manager */ + undo_manager = gtk_object_get_data ( GTK_OBJECT(window->app), "NautilusUndoManager"); + g_assert (undo_manager); + gtk_object_set_data ( GTK_OBJECT(window), "NautilusUndoManager", undo_manager); - location_bar_box = gtk_hbox_new(FALSE, GNOME_PAD); - gtk_container_set_border_width(GTK_CONTAINER(location_bar_box), GNOME_PAD_SMALL); + /* set up location bar */ + location_bar_box = gtk_hbox_new(FALSE, GNOME_PAD); + gtk_container_set_border_width(GTK_CONTAINER(location_bar_box), GNOME_PAD_SMALL); - window->ent_uri = nautilus_location_bar_new(); - gtk_signal_connect(GTK_OBJECT(window->ent_uri), "location_changed", + window->ent_uri = nautilus_location_bar_new(); + nautilus_location_bar_enable_undo ( NAUTILUS_LOCATION_BAR (window->ent_uri), undo_manager, TRUE); + + gtk_signal_connect(GTK_OBJECT(window->ent_uri), "location_changed", nautilus_window_goto_uri_cb, window); - gtk_box_pack_start(GTK_BOX(location_bar_box), window->ent_uri, TRUE, TRUE, GNOME_PAD_SMALL); - behavior = GNOME_DOCK_ITEM_BEH_EXCLUSIVE | GNOME_DOCK_ITEM_BEH_NEVER_VERTICAL; - if(!gnome_preferences_get_toolbar_detachable()) - behavior |= GNOME_DOCK_ITEM_BEH_LOCKED; - gnome_app_add_docked(app, location_bar_box, "uri-entry", - behavior, GNOME_DOCK_TOP, 2, 0, 0); - - /* Option menu for content view types; it's empty here, filled in when a uri is set. */ - window->option_cvtype = gtk_option_menu_new(); - gtk_box_pack_end(GTK_BOX(location_bar_box), window->option_cvtype, FALSE, FALSE, GNOME_PAD_SMALL); - gtk_widget_show(window->option_cvtype); - - /* allocate the zoom control and place on the right next to the menu */ - - window->zoom_control = nautilus_zoom_control_new (); - gtk_widget_show (window->zoom_control); - gtk_signal_connect (GTK_OBJECT (window->zoom_control), "zoom_in", zoom_in_cb, window); - gtk_signal_connect (GTK_OBJECT (window->zoom_control), "zoom_out", zoom_out_cb, window); - gtk_box_pack_end (GTK_BOX (location_bar_box), window->zoom_control, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(location_bar_box), window->ent_uri, TRUE, TRUE, GNOME_PAD_SMALL); + behavior = GNOME_DOCK_ITEM_BEH_EXCLUSIVE | GNOME_DOCK_ITEM_BEH_NEVER_VERTICAL; + if(!gnome_preferences_get_toolbar_detachable()) + behavior |= GNOME_DOCK_ITEM_BEH_LOCKED; + gnome_app_add_docked(app, location_bar_box, "uri-entry", behavior, GNOME_DOCK_TOP, 2, 0, 0); + + /* Option menu for content view types; it's empty here, filled in when a uri is set. */ + window->option_cvtype = gtk_option_menu_new(); + gtk_box_pack_end(GTK_BOX(location_bar_box), window->option_cvtype, FALSE, FALSE, GNOME_PAD_SMALL); + gtk_widget_show(window->option_cvtype); + + /* allocate the zoom control and place on the right next to the menu */ + window->zoom_control = nautilus_zoom_control_new (); + gtk_widget_show (window->zoom_control); + gtk_signal_connect (GTK_OBJECT (window->zoom_control), "zoom_in", zoom_in_cb, window); + gtk_signal_connect (GTK_OBJECT (window->zoom_control), "zoom_out", zoom_out_cb, window); + gtk_box_pack_end (GTK_BOX (location_bar_box), window->zoom_control, FALSE, FALSE, 0); - gtk_widget_show_all(location_bar_box); - - /* set up status bar */ + gtk_widget_show_all(location_bar_box); - gnome_app_set_statusbar(app, (statusbar = gtk_statusbar_new())); - /* insert a little padding so text isn't jammed against frame */ - gtk_misc_set_padding(GTK_MISC ((GTK_STATUSBAR (statusbar))->label), GNOME_PAD, 0); - window->statusbar_ctx = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar), "IhateGtkStatusbar"); - - /* set up window contents and policy */ + /* set up status bar */ + gnome_app_set_statusbar(app, (statusbar = gtk_statusbar_new())); + + /* insert a little padding so text isn't jammed against frame */ + gtk_misc_set_padding(GTK_MISC ((GTK_STATUSBAR (statusbar))->label), GNOME_PAD, 0); + window->statusbar_ctx = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar), "IhateGtkStatusbar"); - gtk_window_set_policy(GTK_WINDOW(window), FALSE, TRUE, FALSE); - gtk_window_set_default_size(GTK_WINDOW(window), 650, 400); + /* set up window contents and policy */ + gtk_window_set_policy(GTK_WINDOW(window), FALSE, TRUE, FALSE); + gtk_window_set_default_size(GTK_WINDOW(window), 650, 400); - window->content_hbox = gtk_hpaned_new(); - sidebar_width = nautilus_preferences_get_enum(NAUTILUS_PREFERENCES_SIDEBAR_WIDTH, 148); - gtk_paned_set_position(GTK_PANED(window->content_hbox), sidebar_width); + window->content_hbox = gtk_hpaned_new(); + sidebar_width = nautilus_preferences_get_enum(NAUTILUS_PREFERENCES_SIDEBAR_WIDTH, 148); + gtk_paned_set_position(GTK_PANED(window->content_hbox), sidebar_width); - gnome_app_set_contents(app, window->content_hbox); + gnome_app_set_contents(app, window->content_hbox); - /* set up the index panel in a frame */ - - temp_frame = gtk_frame_new(NULL); - gtk_frame_set_shadow_type(GTK_FRAME(temp_frame), GTK_SHADOW_OUT); - gtk_widget_show(temp_frame); + /* set up the index panel in a frame */ + temp_frame = gtk_frame_new(NULL); + gtk_frame_set_shadow_type(GTK_FRAME(temp_frame), GTK_SHADOW_OUT); + gtk_widget_show(temp_frame); - window->index_panel = nautilus_index_panel_new(); - gtk_widget_show (GTK_WIDGET (window->index_panel)); - gtk_container_add(GTK_CONTAINER(temp_frame), GTK_WIDGET (window->index_panel)); - - gtk_paned_pack1(GTK_PANED(window->content_hbox), temp_frame, FALSE, FALSE); + window->index_panel = nautilus_index_panel_new(); + gtk_widget_show (GTK_WIDGET (window->index_panel)); + gtk_container_add(GTK_CONTAINER(temp_frame), GTK_WIDGET (window->index_panel)); - gtk_widget_show_all(window->content_hbox); + gtk_paned_pack1(GTK_PANED(window->content_hbox), temp_frame, FALSE, FALSE); - /* enable mouse tracking for the index panel */ - gtk_widget_add_events(GTK_WIDGET (window->index_panel), GDK_POINTER_MOTION_MASK); + gtk_widget_show_all(window->content_hbox); - /* CORBA and Bonobo setup */ - window->ntl_viewwindow = impl_Nautilus_ViewWindow__create(window); - window->uih = bonobo_ui_handler_new(); - bonobo_ui_handler_set_app(window->uih, app); - bonobo_ui_handler_set_statusbar(window->uih, statusbar); + /* enable mouse tracking for the index panel */ + gtk_widget_add_events(GTK_WIDGET (window->index_panel), GDK_POINTER_MOTION_MASK); - /* Create menus and toolbars */ - nautilus_window_initialize_menus (window); - nautilus_window_initialize_toolbars (window); + /* CORBA and Bonobo setup */ + window->ntl_viewwindow = impl_Nautilus_ViewWindow__create(window); + window->uih = bonobo_ui_handler_new(); + bonobo_ui_handler_set_app(window->uih, app); + bonobo_ui_handler_set_statusbar(window->uih, statusbar); - /* Set initial sensitivity of some buttons & menu items - * now that they're all created. - */ - nautilus_window_allow_back(window, FALSE); - nautilus_window_allow_forward(window, FALSE); - nautilus_window_allow_stop(window, FALSE); + /* Create menus and toolbars */ + nautilus_window_initialize_menus (window); + nautilus_window_initialize_toolbars (window); + + /* Set initial sensitivity of some buttons & menu items + * now that they're all created. + */ + nautilus_window_allow_back(window, FALSE); + nautilus_window_allow_forward(window, FALSE); + nautilus_window_allow_stop(window, FALSE); } static void @@ -469,11 +473,12 @@ nautilus_window_set_arg (GtkObject *object, g_assert(app->name); g_free(app->prefix); app->prefix = g_strconcat("/", app->name, "/", NULL); - if(!old_app_name) + if(!old_app_name) { nautilus_window_constructed(NAUTILUS_WINDOW(object)); + } break; case ARG_APP: - window->app = BONOBO_OBJECT(GTK_VALUE_OBJECT(*arg)); + window->app = BONOBO_OBJECT(GTK_VALUE_OBJECT(*arg)); break; case ARG_CONTENT_VIEW: nautilus_window_real_set_content_view (window, (NautilusView *)GTK_VALUE_OBJECT(*arg)); diff --git a/src/nautilus-spatial-window.h b/src/nautilus-spatial-window.h index dbebf91df..6a8e65839 100644 --- a/src/nautilus-spatial-window.h +++ b/src/nautilus-spatial-window.h @@ -149,6 +149,6 @@ void nautilus_window_allow_reload (NautilusWindow *window, gboolean allow); void nautilus_window_allow_stop (NautilusWindow *window, gboolean allow); -void nautilus_bookmarks_exiting (void); +void nautilus_bookmarks_exiting (GtkObject *object); #endif diff --git a/src/nautilus-window-menus.c b/src/nautilus-window-menus.c index b5499470b..59cd861a2 100644 --- a/src/nautilus-window-menus.c +++ b/src/nautilus-window-menus.c @@ -33,9 +33,7 @@ #include "nautilus-property-browser.h" #include <libnautilus/nautilus-undo-manager.h> - #include <libnautilus/nautilus-bonobo-ui.h> - #include <libnautilus-extensions/nautilus-bonobo-extensions.h> #include <libnautilus-extensions/nautilus-glib-extensions.h> #include <libnautilus-extensions/nautilus-gtk-extensions.h> @@ -53,7 +51,7 @@ static void clear_appended_bookmark_items (NautilusWindow const char *menu_path, const char *last_static_item_path); static NautilusBookmarkList *get_bookmark_list (void); -static GtkWidget *get_bookmarks_window (void); +static GtkWidget *get_bookmarks_window (GtkObject *object); static void refresh_bookmarks_in_go_menu (NautilusWindow *window); static void refresh_bookmarks_in_bookmarks_menu (NautilusWindow *window); @@ -118,8 +116,16 @@ edit_menu_undo_callback (BonoboUIHandler *ui_handler, gpointer user_data, const char *path) { - if (nautilus_undo_manager_can_undo ()) - nautilus_undo_manager_undo_last_transaction (); + NautilusUndoManager *manager; + + g_assert (NAUTILUS_IS_WINDOW (user_data)); + + /* Locate undo manager */ + manager = gtk_object_get_data (GTK_OBJECT(user_data), "NautilusUndoManager"); + g_return_if_fail (manager != NULL); + + if (nautilus_undo_manager_can_undo (manager)) + nautilus_undo_manager_undo (manager); } static void @@ -131,7 +137,7 @@ edit_menu_cut_callback (BonoboUIHandler *ui_handler, g_assert (GTK_IS_WINDOW (user_data)); main_window=GTK_WINDOW (user_data); - + if (GTK_IS_EDITABLE (main_window->focus_widget)) { gtk_editable_cut_clipboard (GTK_EDITABLE (main_window->focus_widget)); } @@ -237,7 +243,7 @@ bookmarks_menu_edit_bookmarks_callback (BonoboUIHandler *ui_handler, { g_return_if_fail (NAUTILUS_IS_WINDOW (user_data)); - nautilus_window_edit_bookmarks (NAUTILUS_WINDOW (user_data)); + nautilus_window_edit_bookmarks (GTK_OBJECT (user_data)); } static void @@ -420,12 +426,15 @@ get_bookmark_list (void) } static GtkWidget * -get_bookmarks_window (void) +get_bookmarks_window (GtkObject *object) { static GtkWidget *bookmarks_window = NULL; + if (bookmarks_window == NULL) { - bookmarks_window = create_bookmarks_window (get_bookmark_list ()); + NautilusUndoManager *manager; + manager = gtk_object_get_data (object, NAUTILUS_UNDO_MANAGER_NAME); + bookmarks_window = create_bookmarks_window (get_bookmark_list (), manager); } g_assert (GTK_IS_WINDOW (bookmarks_window)); return bookmarks_window; @@ -438,9 +447,9 @@ get_bookmarks_window (void) * Called when application exits; don't call from anywhere else. **/ void -nautilus_bookmarks_exiting (void) +nautilus_bookmarks_exiting (GtkObject *object) { - nautilus_bookmarks_window_save_geometry (get_bookmarks_window ()); + nautilus_bookmarks_window_save_geometry (get_bookmarks_window (object)); } /** @@ -472,9 +481,9 @@ nautilus_window_add_bookmark_for_current_location (NautilusWindow *window) } void -nautilus_window_edit_bookmarks (NautilusWindow *window) +nautilus_window_edit_bookmarks (GtkObject *object) { - nautilus_gtk_window_present (GTK_WINDOW (get_bookmarks_window ())); + nautilus_gtk_window_present (GTK_WINDOW (get_bookmarks_window (object))); } /** @@ -564,6 +573,7 @@ void nautilus_window_initialize_menus (NautilusWindow *window) { BonoboUIHandler *ui_handler; + NautilusUndoManager *undo_manager; ui_handler = window->uih; g_assert (ui_handler != NULL); @@ -625,7 +635,7 @@ nautilus_window_initialize_menus (NautilusWindow *window) GNOME_KEY_NAME_UNDO, GNOME_KEY_MOD_UNDO, edit_menu_undo_callback, - NULL); + window); append_separator (window, NAUTILUS_MENU_PATH_SEPARATOR_AFTER_UNDO); @@ -851,11 +861,12 @@ nautilus_window_initialize_menus (NautilusWindow *window) GTK_OBJECT (window)); /* Connect to UndoManager so that we are notified when an undo transcation has occurred */ - gtk_signal_connect_object_while_alive (GTK_OBJECT(nautilus_undo_manager_get_undo_manager ()), - "undo_transaction_occurred", - update_undo_menu_item, - GTK_OBJECT (window)); - + undo_manager = gtk_object_get_data ( GTK_OBJECT(window), "NautilusUndoManager"); + if (undo_manager != NULL) { + gtk_signal_connect_object_while_alive ( GTK_OBJECT (undo_manager), "undo_transaction_occurred", + update_undo_menu_item, GTK_OBJECT (window)); + } + nautilus_window_initialize_bookmarks_menu (window); nautilus_window_initialize_go_menu (window); } @@ -955,9 +966,17 @@ update_eazel_theme_menu_item (NautilusWindow *window) static void update_undo_menu_item (NautilusWindow *window) { + NautilusUndoManager *undo_manager; + g_assert (NAUTILUS_IS_WINDOW (window)); - bonobo_ui_handler_menu_set_sensitivity(window->uih, NAUTILUS_MENU_PATH_UNDO_ITEM, - nautilus_undo_manager_can_undo ()); + undo_manager = gtk_object_get_data (GTK_OBJECT (window), "NautilusUndoManager"); + if (undo_manager != NULL) { + bonobo_ui_handler_menu_set_sensitivity(window->uih, NAUTILUS_MENU_PATH_UNDO_ITEM, + nautilus_undo_manager_can_undo (undo_manager)); + } else { + bonobo_ui_handler_menu_set_sensitivity(window->uih, NAUTILUS_MENU_PATH_UNDO_ITEM, + FALSE); + } } diff --git a/src/nautilus-window-private.h b/src/nautilus-window-private.h index 6e0a7a997..d993d0a22 100644 --- a/src/nautilus-window-private.h +++ b/src/nautilus-window-private.h @@ -59,7 +59,7 @@ void nautilus_add_to_history_list (NautilusBookmark *bookmark); GSList *nautilus_get_history_list (void); void nautilus_window_add_bookmark_for_current_location (NautilusWindow *window); -void nautilus_window_edit_bookmarks (NautilusWindow *window); +void nautilus_window_edit_bookmarks (GtkObject *object); void nautilus_window_initialize_menus (NautilusWindow *window); void nautilus_window_initialize_toolbars (NautilusWindow *window); diff --git a/src/nautilus-window.c b/src/nautilus-window.c index 773634e3a..5ed1c059f 100644 --- a/src/nautilus-window.c +++ b/src/nautilus-window.c @@ -47,6 +47,7 @@ #include <libnautilus-extensions/nautilus-icon-factory.h> #include <libnautilus-extensions/nautilus-metadata.h> #include <libnautilus-extensions/nautilus-string.h> +#include <libnautilus/nautilus-undo-manager.h> #include "nautilus-zoom-control.h" #include <ctype.h> #include <libgnomevfs/gnome-vfs-uri.h> @@ -356,97 +357,100 @@ zoom_out_cb (NautilusZoomControl *zoom_control, static void -nautilus_window_constructed(NautilusWindow *window) +nautilus_window_constructed (NautilusWindow *window) { - GnomeApp *app; - GtkWidget *location_bar_box, *statusbar; - GtkWidget *temp_frame; - GnomeDockItemBehavior behavior; - int sidebar_width; + GnomeApp *app; + GtkWidget *location_bar_box, *statusbar; + GtkWidget *temp_frame; + GnomeDockItemBehavior behavior; + int sidebar_width; + NautilusUndoManager *undo_manager; - app = GNOME_APP(window); + app = GNOME_APP(window); - /* set up location bar */ + /* Set up undo manager */ + undo_manager = gtk_object_get_data ( GTK_OBJECT(window->app), "NautilusUndoManager"); + g_assert (undo_manager); + gtk_object_set_data ( GTK_OBJECT(window), "NautilusUndoManager", undo_manager); - location_bar_box = gtk_hbox_new(FALSE, GNOME_PAD); - gtk_container_set_border_width(GTK_CONTAINER(location_bar_box), GNOME_PAD_SMALL); + /* set up location bar */ + location_bar_box = gtk_hbox_new(FALSE, GNOME_PAD); + gtk_container_set_border_width(GTK_CONTAINER(location_bar_box), GNOME_PAD_SMALL); - window->ent_uri = nautilus_location_bar_new(); - gtk_signal_connect(GTK_OBJECT(window->ent_uri), "location_changed", + window->ent_uri = nautilus_location_bar_new(); + nautilus_location_bar_enable_undo ( NAUTILUS_LOCATION_BAR (window->ent_uri), undo_manager, TRUE); + + gtk_signal_connect(GTK_OBJECT(window->ent_uri), "location_changed", nautilus_window_goto_uri_cb, window); - gtk_box_pack_start(GTK_BOX(location_bar_box), window->ent_uri, TRUE, TRUE, GNOME_PAD_SMALL); - behavior = GNOME_DOCK_ITEM_BEH_EXCLUSIVE | GNOME_DOCK_ITEM_BEH_NEVER_VERTICAL; - if(!gnome_preferences_get_toolbar_detachable()) - behavior |= GNOME_DOCK_ITEM_BEH_LOCKED; - gnome_app_add_docked(app, location_bar_box, "uri-entry", - behavior, GNOME_DOCK_TOP, 2, 0, 0); - - /* Option menu for content view types; it's empty here, filled in when a uri is set. */ - window->option_cvtype = gtk_option_menu_new(); - gtk_box_pack_end(GTK_BOX(location_bar_box), window->option_cvtype, FALSE, FALSE, GNOME_PAD_SMALL); - gtk_widget_show(window->option_cvtype); - - /* allocate the zoom control and place on the right next to the menu */ - - window->zoom_control = nautilus_zoom_control_new (); - gtk_widget_show (window->zoom_control); - gtk_signal_connect (GTK_OBJECT (window->zoom_control), "zoom_in", zoom_in_cb, window); - gtk_signal_connect (GTK_OBJECT (window->zoom_control), "zoom_out", zoom_out_cb, window); - gtk_box_pack_end (GTK_BOX (location_bar_box), window->zoom_control, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(location_bar_box), window->ent_uri, TRUE, TRUE, GNOME_PAD_SMALL); + behavior = GNOME_DOCK_ITEM_BEH_EXCLUSIVE | GNOME_DOCK_ITEM_BEH_NEVER_VERTICAL; + if(!gnome_preferences_get_toolbar_detachable()) + behavior |= GNOME_DOCK_ITEM_BEH_LOCKED; + gnome_app_add_docked(app, location_bar_box, "uri-entry", behavior, GNOME_DOCK_TOP, 2, 0, 0); + + /* Option menu for content view types; it's empty here, filled in when a uri is set. */ + window->option_cvtype = gtk_option_menu_new(); + gtk_box_pack_end(GTK_BOX(location_bar_box), window->option_cvtype, FALSE, FALSE, GNOME_PAD_SMALL); + gtk_widget_show(window->option_cvtype); + + /* allocate the zoom control and place on the right next to the menu */ + window->zoom_control = nautilus_zoom_control_new (); + gtk_widget_show (window->zoom_control); + gtk_signal_connect (GTK_OBJECT (window->zoom_control), "zoom_in", zoom_in_cb, window); + gtk_signal_connect (GTK_OBJECT (window->zoom_control), "zoom_out", zoom_out_cb, window); + gtk_box_pack_end (GTK_BOX (location_bar_box), window->zoom_control, FALSE, FALSE, 0); - gtk_widget_show_all(location_bar_box); - - /* set up status bar */ + gtk_widget_show_all(location_bar_box); - gnome_app_set_statusbar(app, (statusbar = gtk_statusbar_new())); - /* insert a little padding so text isn't jammed against frame */ - gtk_misc_set_padding(GTK_MISC ((GTK_STATUSBAR (statusbar))->label), GNOME_PAD, 0); - window->statusbar_ctx = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar), "IhateGtkStatusbar"); - - /* set up window contents and policy */ + /* set up status bar */ + gnome_app_set_statusbar(app, (statusbar = gtk_statusbar_new())); + + /* insert a little padding so text isn't jammed against frame */ + gtk_misc_set_padding(GTK_MISC ((GTK_STATUSBAR (statusbar))->label), GNOME_PAD, 0); + window->statusbar_ctx = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar), "IhateGtkStatusbar"); - gtk_window_set_policy(GTK_WINDOW(window), FALSE, TRUE, FALSE); - gtk_window_set_default_size(GTK_WINDOW(window), 650, 400); + /* set up window contents and policy */ + gtk_window_set_policy(GTK_WINDOW(window), FALSE, TRUE, FALSE); + gtk_window_set_default_size(GTK_WINDOW(window), 650, 400); - window->content_hbox = gtk_hpaned_new(); - sidebar_width = nautilus_preferences_get_enum(NAUTILUS_PREFERENCES_SIDEBAR_WIDTH, 148); - gtk_paned_set_position(GTK_PANED(window->content_hbox), sidebar_width); + window->content_hbox = gtk_hpaned_new(); + sidebar_width = nautilus_preferences_get_enum(NAUTILUS_PREFERENCES_SIDEBAR_WIDTH, 148); + gtk_paned_set_position(GTK_PANED(window->content_hbox), sidebar_width); - gnome_app_set_contents(app, window->content_hbox); + gnome_app_set_contents(app, window->content_hbox); - /* set up the index panel in a frame */ - - temp_frame = gtk_frame_new(NULL); - gtk_frame_set_shadow_type(GTK_FRAME(temp_frame), GTK_SHADOW_OUT); - gtk_widget_show(temp_frame); + /* set up the index panel in a frame */ + temp_frame = gtk_frame_new(NULL); + gtk_frame_set_shadow_type(GTK_FRAME(temp_frame), GTK_SHADOW_OUT); + gtk_widget_show(temp_frame); - window->index_panel = nautilus_index_panel_new(); - gtk_widget_show (GTK_WIDGET (window->index_panel)); - gtk_container_add(GTK_CONTAINER(temp_frame), GTK_WIDGET (window->index_panel)); - - gtk_paned_pack1(GTK_PANED(window->content_hbox), temp_frame, FALSE, FALSE); + window->index_panel = nautilus_index_panel_new(); + gtk_widget_show (GTK_WIDGET (window->index_panel)); + gtk_container_add(GTK_CONTAINER(temp_frame), GTK_WIDGET (window->index_panel)); - gtk_widget_show_all(window->content_hbox); + gtk_paned_pack1(GTK_PANED(window->content_hbox), temp_frame, FALSE, FALSE); - /* enable mouse tracking for the index panel */ - gtk_widget_add_events(GTK_WIDGET (window->index_panel), GDK_POINTER_MOTION_MASK); + gtk_widget_show_all(window->content_hbox); - /* CORBA and Bonobo setup */ - window->ntl_viewwindow = impl_Nautilus_ViewWindow__create(window); - window->uih = bonobo_ui_handler_new(); - bonobo_ui_handler_set_app(window->uih, app); - bonobo_ui_handler_set_statusbar(window->uih, statusbar); + /* enable mouse tracking for the index panel */ + gtk_widget_add_events(GTK_WIDGET (window->index_panel), GDK_POINTER_MOTION_MASK); - /* Create menus and toolbars */ - nautilus_window_initialize_menus (window); - nautilus_window_initialize_toolbars (window); + /* CORBA and Bonobo setup */ + window->ntl_viewwindow = impl_Nautilus_ViewWindow__create(window); + window->uih = bonobo_ui_handler_new(); + bonobo_ui_handler_set_app(window->uih, app); + bonobo_ui_handler_set_statusbar(window->uih, statusbar); - /* Set initial sensitivity of some buttons & menu items - * now that they're all created. - */ - nautilus_window_allow_back(window, FALSE); - nautilus_window_allow_forward(window, FALSE); - nautilus_window_allow_stop(window, FALSE); + /* Create menus and toolbars */ + nautilus_window_initialize_menus (window); + nautilus_window_initialize_toolbars (window); + + /* Set initial sensitivity of some buttons & menu items + * now that they're all created. + */ + nautilus_window_allow_back(window, FALSE); + nautilus_window_allow_forward(window, FALSE); + nautilus_window_allow_stop(window, FALSE); } static void @@ -469,11 +473,12 @@ nautilus_window_set_arg (GtkObject *object, g_assert(app->name); g_free(app->prefix); app->prefix = g_strconcat("/", app->name, "/", NULL); - if(!old_app_name) + if(!old_app_name) { nautilus_window_constructed(NAUTILUS_WINDOW(object)); + } break; case ARG_APP: - window->app = BONOBO_OBJECT(GTK_VALUE_OBJECT(*arg)); + window->app = BONOBO_OBJECT(GTK_VALUE_OBJECT(*arg)); break; case ARG_CONTENT_VIEW: nautilus_window_real_set_content_view (window, (NautilusView *)GTK_VALUE_OBJECT(*arg)); diff --git a/src/nautilus-window.h b/src/nautilus-window.h index dbebf91df..6a8e65839 100644 --- a/src/nautilus-window.h +++ b/src/nautilus-window.h @@ -149,6 +149,6 @@ void nautilus_window_allow_reload (NautilusWindow *window, gboolean allow); void nautilus_window_allow_stop (NautilusWindow *window, gboolean allow); -void nautilus_bookmarks_exiting (void); +void nautilus_bookmarks_exiting (GtkObject *object); #endif diff --git a/src/ntl-app.c b/src/ntl-app.c index 6eb977ba8..82b421f4c 100644 --- a/src/ntl-app.c +++ b/src/ntl-app.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ /* * Nautilus @@ -35,16 +35,16 @@ #include <libnautilus/nautilus-undo-manager.h> typedef struct { - POA_Nautilus_Application servant; - NautilusApp *app; + POA_Nautilus_Application servant; + NautilusApp *app; - Nautilus_ViewWindowList attr_view_windows; + Nautilus_ViewWindowList attr_view_windows; } impl_POA_Nautilus_Application; static Nautilus_ViewWindowList * impl_Nautilus_Application__get_view_windows(impl_POA_Nautilus_Application* servant, CORBA_Environment * ev); -static Nautilus_UndoManager +static Nautilus_Undo_Manager impl_Nautilus_Application__get_undo_manager(impl_POA_Nautilus_Application* servant, CORBA_Environment * ev); static Nautilus_ViewWindow @@ -59,63 +59,63 @@ impl_Nautilus_Application_create_object(impl_POA_Nautilus_Application *servant, CORBA_char *obj_iid, GNOME_stringlist * params, CORBA_Environment * ev); - static POA_Nautilus_Application__epv impl_Nautilus_Application_epv = { - NULL, /* _private */ - (gpointer) &impl_Nautilus_Application__get_view_windows, - (gpointer) &impl_Nautilus_Application__get_undo_manager, - (gpointer) &impl_Nautilus_Application_new_view_window + NULL, /* _private */ + (gpointer) &impl_Nautilus_Application__get_view_windows, + (gpointer) &impl_Nautilus_Application__get_undo_manager, + (gpointer) &impl_Nautilus_Application_new_view_window }; static POA_Bonobo_GenericFactory__epv impl_Nautilus_Application_Bonobo_GenericFactory_epv = { - NULL, /* _private */ - (gpointer) &impl_Nautilus_Application_supports, - (gpointer) &impl_Nautilus_Application_create_object + NULL, /* _private */ + (gpointer) &impl_Nautilus_Application_supports, + (gpointer) &impl_Nautilus_Application_create_object }; static PortableServer_ServantBase__epv impl_Nautilus_Application_base_epv = { - NULL, /* _private data */ - NULL, /* finalize routine */ - NULL, /* default_POA routine */ + NULL, /* _private data */ + NULL, /* finalize routine */ + NULL, /* default_POA routine */ }; static POA_Nautilus_Application__vepv impl_Nautilus_Application_vepv = { - &impl_Nautilus_Application_base_epv, - &impl_Nautilus_Application_Bonobo_GenericFactory_epv, - NULL, - &impl_Nautilus_Application_epv, + &impl_Nautilus_Application_base_epv, + &impl_Nautilus_Application_Bonobo_GenericFactory_epv, + NULL, + &impl_Nautilus_Application_epv, }; static Nautilus_ViewWindowList * impl_Nautilus_Application__get_view_windows(impl_POA_Nautilus_Application *servant, CORBA_Environment * ev) { - Nautilus_ViewWindowList *retval; - - retval = Nautilus_ViewWindowList__alloc(); - retval->_length = g_slist_length(servant->app->windows); - - if(retval->_length) - { - int i; - GSList *ltmp; - - retval->_buffer = CORBA_sequence_Nautilus_ViewWindow_allocbuf(retval->_length); - for(i = 0, ltmp = servant->app->windows; ltmp; ltmp = ltmp->next, i++) - { - CORBA_Object obj; - obj = bonobo_object_corba_objref(NAUTILUS_WINDOW(ltmp->data)->ntl_viewwindow); - retval->_buffer[i] = CORBA_Object_duplicate(obj, ev); - } - } - else - retval->_buffer = NULL; - - CORBA_sequence_set_release(retval, CORBA_TRUE); - - return retval; + Nautilus_ViewWindowList *retval; + + retval = Nautilus_ViewWindowList__alloc(); + retval->_length = g_slist_length(servant->app->windows); + + if(retval->_length) + { + int i; + GSList *ltmp; + + retval->_buffer = CORBA_sequence_Nautilus_ViewWindow_allocbuf(retval->_length); + for(i = 0, ltmp = servant->app->windows; ltmp; ltmp = ltmp->next, i++) + { + CORBA_Object obj; + obj = bonobo_object_corba_objref(NAUTILUS_WINDOW(ltmp->data)->ntl_viewwindow); + retval->_buffer[i] = CORBA_Object_duplicate(obj, ev); + } + } + else { + retval->_buffer = NULL; + } + + CORBA_sequence_set_release(retval, CORBA_TRUE); + + return retval; } -static Nautilus_UndoManager +static Nautilus_Undo_Manager impl_Nautilus_Application__get_undo_manager(impl_POA_Nautilus_Application *servant, CORBA_Environment * ev) { @@ -126,11 +126,11 @@ impl_Nautilus_Application__get_undo_manager(impl_POA_Nautilus_Application *serva static Nautilus_ViewWindow impl_Nautilus_Application_new_view_window(impl_POA_Nautilus_Application *servant, CORBA_Environment * ev) { - NautilusWindow *win; + NautilusWindow *win; - win = nautilus_app_create_window(servant->app); + win = nautilus_app_create_window (servant->app); - return CORBA_Object_duplicate(bonobo_object_corba_objref(BONOBO_OBJECT(win)), ev); + return CORBA_Object_duplicate (bonobo_object_corba_objref (BONOBO_OBJECT (win)), ev); } static CORBA_boolean @@ -138,9 +138,9 @@ impl_Nautilus_Application_supports(impl_POA_Nautilus_Application * servant, CORBA_char * obj_iid, CORBA_Environment * ev) { - return (!strcmp(obj_iid, "OAFIID:ntl_file_manager_icon_view:42681b21-d5ca-4837-87d2-394d88ecc058") - || !strcmp(obj_iid, "OAFIID:ntl_file_manager_list_view:521e489d-0662-4ad7-ac3a-832deabe111c") - || !strcmp(obj_iid, "OAFIID:ntl_window:88e8b2e4-b627-4221-b566-5ba32185c88d")); + return (!strcmp(obj_iid, "OAFIID:ntl_file_manager_icon_view:42681b21-d5ca-4837-87d2-394d88ecc058") + || !strcmp(obj_iid, "OAFIID:ntl_file_manager_list_view:521e489d-0662-4ad7-ac3a-832deabe111c") + || !strcmp(obj_iid, "OAFIID:ntl_window:88e8b2e4-b627-4221-b566-5ba32185c88d")); } static CORBA_Object @@ -149,32 +149,33 @@ impl_Nautilus_Application_create_object(impl_POA_Nautilus_Application *servant, GNOME_stringlist * params, CORBA_Environment * ev) { - CORBA_Object retval = CORBA_OBJECT_NIL; - FMDirectoryView *dir_view; - NautilusContentViewFrame *view_frame; + CORBA_Object retval = CORBA_OBJECT_NIL; + FMDirectoryView *dir_view; + NautilusContentViewFrame *view_frame; - if(!impl_Nautilus_Application_supports(servant, obj_iid, ev)) - return CORBA_OBJECT_NIL; + if(!impl_Nautilus_Application_supports(servant, obj_iid, ev)) + return CORBA_OBJECT_NIL; - if (strcmp (obj_iid, "OAFIID:ntl_file_manager_icon_view:42681b21-d5ca-4837-87d2-394d88ecc058") == 0) - dir_view = FM_DIRECTORY_VIEW (gtk_object_new (fm_icon_view_get_type (), NULL)); - else if (strcmp (obj_iid, "OAFIID:ntl_file_manager_list_view:521e489d-0662-4ad7-ac3a-832deabe111c") == 0) - dir_view = FM_DIRECTORY_VIEW (gtk_object_new (fm_list_view_get_type (), NULL)); - else if (strcmp (obj_iid,"OAFIID:ntl_window:88e8b2e4-b627-4221-b566-5ba32185c88d") == 0) - retval = impl_Nautilus_Application_new_view_window (servant, ev); - else - dir_view = NULL; + if (strcmp (obj_iid, "OAFIID:ntl_file_manager_icon_view:42681b21-d5ca-4837-87d2-394d88ecc058") == 0) { + dir_view = FM_DIRECTORY_VIEW (gtk_object_new (fm_icon_view_get_type (), NULL)); + } else if (strcmp (obj_iid, "OAFIID:ntl_file_manager_list_view:521e489d-0662-4ad7-ac3a-832deabe111c") == 0) { + dir_view = FM_DIRECTORY_VIEW (gtk_object_new (fm_list_view_get_type (), NULL)); + } else if (strcmp (obj_iid,"OAFIID:ntl_window:88e8b2e4-b627-4221-b566-5ba32185c88d") == 0) { + retval = impl_Nautilus_Application_new_view_window (servant, ev); + } else { + dir_view = NULL; + } - g_return_val_if_fail(dir_view, CORBA_OBJECT_NIL); + g_return_val_if_fail(dir_view, CORBA_OBJECT_NIL); - if(dir_view) - { - view_frame = fm_directory_view_get_view_frame (dir_view); + if(dir_view) + { + view_frame = fm_directory_view_get_view_frame (dir_view); - retval = CORBA_Object_duplicate(bonobo_object_corba_objref(BONOBO_OBJECT(view_frame)), ev); - } + retval = CORBA_Object_duplicate(bonobo_object_corba_objref(BONOBO_OBJECT(view_frame)), ev); + } - return retval; + return retval; } @@ -183,13 +184,13 @@ impl_Nautilus_Application__create(PortableServer_POA poa, NautilusApp *app, CORBA_Environment * ev) { - impl_POA_Nautilus_Application *newservant; + impl_POA_Nautilus_Application *newservant; - newservant = g_new0(impl_POA_Nautilus_Application, 1); - newservant->servant.vepv = &impl_Nautilus_Application_vepv; - newservant->servant.vepv->Bonobo_Unknown_epv = NAUTILUS_APP_CLASS(GTK_OBJECT(app)->klass)->unknown_epv; - POA_Nautilus_Application__init((PortableServer_Servant) newservant, ev); - return bonobo_object_activate_servant(BONOBO_OBJECT(app), newservant); + newservant = g_new0(impl_POA_Nautilus_Application, 1); + newservant->servant.vepv = &impl_Nautilus_Application_vepv; + newservant->servant.vepv->Bonobo_Unknown_epv = NAUTILUS_APP_CLASS(GTK_OBJECT(app)->klass)->unknown_epv; + POA_Nautilus_Application__init((PortableServer_Servant) newservant, ev); + return bonobo_object_activate_servant(BONOBO_OBJECT(app), newservant); } static void nautilus_app_init (NautilusApp *app); @@ -201,39 +202,39 @@ static GtkObjectClass *app_parent_class = NULL; GtkType nautilus_app_get_type (void) { - static GtkType App_type = 0; - - if (!App_type) - { - static const GtkTypeInfo App_info = - { - "NautilusApp", - sizeof (NautilusApp), - sizeof (NautilusAppClass), - (GtkClassInitFunc) nautilus_app_class_init, - (GtkObjectInitFunc) nautilus_app_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - App_type = gtk_type_unique (bonobo_object_get_type (), &App_info); - } - - return App_type; + static GtkType App_type = 0; + + if (!App_type) + { + static const GtkTypeInfo App_info = + { + "NautilusApp", + sizeof (NautilusApp), + sizeof (NautilusAppClass), + (GtkClassInitFunc) nautilus_app_class_init, + (GtkObjectInitFunc) nautilus_app_init, + /* reserved_1 */ NULL, + /* reserved_2 */ NULL, + (GtkClassInitFunc) NULL, + }; + + App_type = gtk_type_unique (bonobo_object_get_type (), &App_info); + } + + return App_type; } static void nautilus_app_class_init (NautilusAppClass *klass) { - GtkObjectClass *object_class; + GtkObjectClass *object_class; - klass->unknown_epv = bonobo_object_get_epv(); + klass->unknown_epv = bonobo_object_get_epv(); - object_class = (GtkObjectClass*) klass; - object_class->destroy = nautilus_app_destroy; + object_class = (GtkObjectClass*) klass; + object_class->destroy = nautilus_app_destroy; - app_parent_class = gtk_type_class (gtk_object_get_type ()); + app_parent_class = gtk_type_class (gtk_object_get_type ()); /* * Startup preferences. This call is needed so that preferences have @@ -258,16 +259,19 @@ nautilus_app_init (NautilusApp *app) bonobo_object_construct(BONOBO_OBJECT(app), objref); /* Init undo manager */ - nautilus_undo_manager_initialize_global_manager (); - app->undo_manager = BONOBO_OBJECT (nautilus_undo_manager_get_undo_manager()); - + app->undo_manager = BONOBO_OBJECT (nautilus_undo_manager_new ()); + + /* Add undo manager to the app */ + g_assert (app->undo_manager); + gtk_object_set_data (GTK_OBJECT (app), "NautilusUndoManager", app->undo_manager); + CORBA_exception_free(&ev); } GtkObject * -nautilus_app_new (void) +nautilus_app_new (void) { - return gtk_object_new(nautilus_app_get_type(), NULL); + return gtk_object_new(nautilus_app_get_type(), NULL); } static void @@ -275,15 +279,15 @@ nautilus_app_destroy(GtkObject *object) { /* * Shutdown preferences. This is needed so that the global preferences - * obejct and all its allocations are freed. Not calling this function + * object and all its allocations are freed. Not calling this function * would have NOT cause the user to lose preferences. The only effect * would be to leak those objects - which would be collected at exit() * time anyway, but it adds noice to memory profile tool runs. */ nautilus_global_preferences_shutdown (); - nautilus_bookmarks_exiting(); - GTK_OBJECT_CLASS(app_parent_class)->destroy(object); + nautilus_bookmarks_exiting (object); + GTK_OBJECT_CLASS(app_parent_class)->destroy(object); } void @@ -292,9 +296,9 @@ nautilus_app_startup(NautilusApp *app, const char *initial_url) NautilusWindow *mainwin; /* Set default configuration */ - mainwin = nautilus_app_create_window(app); - bonobo_activate(); - nautilus_window_set_initial_state(mainwin, initial_url); + mainwin = nautilus_app_create_window (app); + bonobo_activate (); + nautilus_window_set_initial_state (mainwin, initial_url); } static void @@ -342,18 +346,20 @@ nautilus_app_quit (void) NautilusWindow * nautilus_app_create_window(NautilusApp *app) { - GtkWidget *win = GTK_WIDGET (gtk_object_new (nautilus_window_get_type(), "app_id", "nautilus", - "app", BONOBO_OBJECT(app), NULL)); + GtkWidget *win; + + win = GTK_WIDGET (gtk_object_new (nautilus_window_get_type(), "app", BONOBO_OBJECT(app), + "app_id", "nautilus", NULL)); - gtk_signal_connect(GTK_OBJECT(win), "destroy", nautilus_app_destroy_window, app); + gtk_signal_connect (GTK_OBJECT (win), "destroy", nautilus_app_destroy_window, app); - /* Do not yet show the window. It will be shown later on if it can - * successfully display its initial uri. Otherwise it will be destroyed - * without ever having seen the light of day. - */ + /* Do not yet show the window. It will be shown later on if it can + * successfully display its initial uri. Otherwise it will be destroyed + * without ever having seen the light of day. + */ - app->windows = g_slist_prepend(app->windows, win); + app->windows = g_slist_prepend(app->windows, win); - return NAUTILUS_WINDOW(win); + return NAUTILUS_WINDOW(win); } diff --git a/src/ntl-window-private.h b/src/ntl-window-private.h index 6e0a7a997..d993d0a22 100644 --- a/src/ntl-window-private.h +++ b/src/ntl-window-private.h @@ -59,7 +59,7 @@ void nautilus_add_to_history_list (NautilusBookmark *bookmark); GSList *nautilus_get_history_list (void); void nautilus_window_add_bookmark_for_current_location (NautilusWindow *window); -void nautilus_window_edit_bookmarks (NautilusWindow *window); +void nautilus_window_edit_bookmarks (GtkObject *object); void nautilus_window_initialize_menus (NautilusWindow *window); void nautilus_window_initialize_toolbars (NautilusWindow *window); diff --git a/src/ntl-window.c b/src/ntl-window.c index 773634e3a..5ed1c059f 100644 --- a/src/ntl-window.c +++ b/src/ntl-window.c @@ -47,6 +47,7 @@ #include <libnautilus-extensions/nautilus-icon-factory.h> #include <libnautilus-extensions/nautilus-metadata.h> #include <libnautilus-extensions/nautilus-string.h> +#include <libnautilus/nautilus-undo-manager.h> #include "nautilus-zoom-control.h" #include <ctype.h> #include <libgnomevfs/gnome-vfs-uri.h> @@ -356,97 +357,100 @@ zoom_out_cb (NautilusZoomControl *zoom_control, static void -nautilus_window_constructed(NautilusWindow *window) +nautilus_window_constructed (NautilusWindow *window) { - GnomeApp *app; - GtkWidget *location_bar_box, *statusbar; - GtkWidget *temp_frame; - GnomeDockItemBehavior behavior; - int sidebar_width; + GnomeApp *app; + GtkWidget *location_bar_box, *statusbar; + GtkWidget *temp_frame; + GnomeDockItemBehavior behavior; + int sidebar_width; + NautilusUndoManager *undo_manager; - app = GNOME_APP(window); + app = GNOME_APP(window); - /* set up location bar */ + /* Set up undo manager */ + undo_manager = gtk_object_get_data ( GTK_OBJECT(window->app), "NautilusUndoManager"); + g_assert (undo_manager); + gtk_object_set_data ( GTK_OBJECT(window), "NautilusUndoManager", undo_manager); - location_bar_box = gtk_hbox_new(FALSE, GNOME_PAD); - gtk_container_set_border_width(GTK_CONTAINER(location_bar_box), GNOME_PAD_SMALL); + /* set up location bar */ + location_bar_box = gtk_hbox_new(FALSE, GNOME_PAD); + gtk_container_set_border_width(GTK_CONTAINER(location_bar_box), GNOME_PAD_SMALL); - window->ent_uri = nautilus_location_bar_new(); - gtk_signal_connect(GTK_OBJECT(window->ent_uri), "location_changed", + window->ent_uri = nautilus_location_bar_new(); + nautilus_location_bar_enable_undo ( NAUTILUS_LOCATION_BAR (window->ent_uri), undo_manager, TRUE); + + gtk_signal_connect(GTK_OBJECT(window->ent_uri), "location_changed", nautilus_window_goto_uri_cb, window); - gtk_box_pack_start(GTK_BOX(location_bar_box), window->ent_uri, TRUE, TRUE, GNOME_PAD_SMALL); - behavior = GNOME_DOCK_ITEM_BEH_EXCLUSIVE | GNOME_DOCK_ITEM_BEH_NEVER_VERTICAL; - if(!gnome_preferences_get_toolbar_detachable()) - behavior |= GNOME_DOCK_ITEM_BEH_LOCKED; - gnome_app_add_docked(app, location_bar_box, "uri-entry", - behavior, GNOME_DOCK_TOP, 2, 0, 0); - - /* Option menu for content view types; it's empty here, filled in when a uri is set. */ - window->option_cvtype = gtk_option_menu_new(); - gtk_box_pack_end(GTK_BOX(location_bar_box), window->option_cvtype, FALSE, FALSE, GNOME_PAD_SMALL); - gtk_widget_show(window->option_cvtype); - - /* allocate the zoom control and place on the right next to the menu */ - - window->zoom_control = nautilus_zoom_control_new (); - gtk_widget_show (window->zoom_control); - gtk_signal_connect (GTK_OBJECT (window->zoom_control), "zoom_in", zoom_in_cb, window); - gtk_signal_connect (GTK_OBJECT (window->zoom_control), "zoom_out", zoom_out_cb, window); - gtk_box_pack_end (GTK_BOX (location_bar_box), window->zoom_control, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(location_bar_box), window->ent_uri, TRUE, TRUE, GNOME_PAD_SMALL); + behavior = GNOME_DOCK_ITEM_BEH_EXCLUSIVE | GNOME_DOCK_ITEM_BEH_NEVER_VERTICAL; + if(!gnome_preferences_get_toolbar_detachable()) + behavior |= GNOME_DOCK_ITEM_BEH_LOCKED; + gnome_app_add_docked(app, location_bar_box, "uri-entry", behavior, GNOME_DOCK_TOP, 2, 0, 0); + + /* Option menu for content view types; it's empty here, filled in when a uri is set. */ + window->option_cvtype = gtk_option_menu_new(); + gtk_box_pack_end(GTK_BOX(location_bar_box), window->option_cvtype, FALSE, FALSE, GNOME_PAD_SMALL); + gtk_widget_show(window->option_cvtype); + + /* allocate the zoom control and place on the right next to the menu */ + window->zoom_control = nautilus_zoom_control_new (); + gtk_widget_show (window->zoom_control); + gtk_signal_connect (GTK_OBJECT (window->zoom_control), "zoom_in", zoom_in_cb, window); + gtk_signal_connect (GTK_OBJECT (window->zoom_control), "zoom_out", zoom_out_cb, window); + gtk_box_pack_end (GTK_BOX (location_bar_box), window->zoom_control, FALSE, FALSE, 0); - gtk_widget_show_all(location_bar_box); - - /* set up status bar */ + gtk_widget_show_all(location_bar_box); - gnome_app_set_statusbar(app, (statusbar = gtk_statusbar_new())); - /* insert a little padding so text isn't jammed against frame */ - gtk_misc_set_padding(GTK_MISC ((GTK_STATUSBAR (statusbar))->label), GNOME_PAD, 0); - window->statusbar_ctx = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar), "IhateGtkStatusbar"); - - /* set up window contents and policy */ + /* set up status bar */ + gnome_app_set_statusbar(app, (statusbar = gtk_statusbar_new())); + + /* insert a little padding so text isn't jammed against frame */ + gtk_misc_set_padding(GTK_MISC ((GTK_STATUSBAR (statusbar))->label), GNOME_PAD, 0); + window->statusbar_ctx = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar), "IhateGtkStatusbar"); - gtk_window_set_policy(GTK_WINDOW(window), FALSE, TRUE, FALSE); - gtk_window_set_default_size(GTK_WINDOW(window), 650, 400); + /* set up window contents and policy */ + gtk_window_set_policy(GTK_WINDOW(window), FALSE, TRUE, FALSE); + gtk_window_set_default_size(GTK_WINDOW(window), 650, 400); - window->content_hbox = gtk_hpaned_new(); - sidebar_width = nautilus_preferences_get_enum(NAUTILUS_PREFERENCES_SIDEBAR_WIDTH, 148); - gtk_paned_set_position(GTK_PANED(window->content_hbox), sidebar_width); + window->content_hbox = gtk_hpaned_new(); + sidebar_width = nautilus_preferences_get_enum(NAUTILUS_PREFERENCES_SIDEBAR_WIDTH, 148); + gtk_paned_set_position(GTK_PANED(window->content_hbox), sidebar_width); - gnome_app_set_contents(app, window->content_hbox); + gnome_app_set_contents(app, window->content_hbox); - /* set up the index panel in a frame */ - - temp_frame = gtk_frame_new(NULL); - gtk_frame_set_shadow_type(GTK_FRAME(temp_frame), GTK_SHADOW_OUT); - gtk_widget_show(temp_frame); + /* set up the index panel in a frame */ + temp_frame = gtk_frame_new(NULL); + gtk_frame_set_shadow_type(GTK_FRAME(temp_frame), GTK_SHADOW_OUT); + gtk_widget_show(temp_frame); - window->index_panel = nautilus_index_panel_new(); - gtk_widget_show (GTK_WIDGET (window->index_panel)); - gtk_container_add(GTK_CONTAINER(temp_frame), GTK_WIDGET (window->index_panel)); - - gtk_paned_pack1(GTK_PANED(window->content_hbox), temp_frame, FALSE, FALSE); + window->index_panel = nautilus_index_panel_new(); + gtk_widget_show (GTK_WIDGET (window->index_panel)); + gtk_container_add(GTK_CONTAINER(temp_frame), GTK_WIDGET (window->index_panel)); - gtk_widget_show_all(window->content_hbox); + gtk_paned_pack1(GTK_PANED(window->content_hbox), temp_frame, FALSE, FALSE); - /* enable mouse tracking for the index panel */ - gtk_widget_add_events(GTK_WIDGET (window->index_panel), GDK_POINTER_MOTION_MASK); + gtk_widget_show_all(window->content_hbox); - /* CORBA and Bonobo setup */ - window->ntl_viewwindow = impl_Nautilus_ViewWindow__create(window); - window->uih = bonobo_ui_handler_new(); - bonobo_ui_handler_set_app(window->uih, app); - bonobo_ui_handler_set_statusbar(window->uih, statusbar); + /* enable mouse tracking for the index panel */ + gtk_widget_add_events(GTK_WIDGET (window->index_panel), GDK_POINTER_MOTION_MASK); - /* Create menus and toolbars */ - nautilus_window_initialize_menus (window); - nautilus_window_initialize_toolbars (window); + /* CORBA and Bonobo setup */ + window->ntl_viewwindow = impl_Nautilus_ViewWindow__create(window); + window->uih = bonobo_ui_handler_new(); + bonobo_ui_handler_set_app(window->uih, app); + bonobo_ui_handler_set_statusbar(window->uih, statusbar); - /* Set initial sensitivity of some buttons & menu items - * now that they're all created. - */ - nautilus_window_allow_back(window, FALSE); - nautilus_window_allow_forward(window, FALSE); - nautilus_window_allow_stop(window, FALSE); + /* Create menus and toolbars */ + nautilus_window_initialize_menus (window); + nautilus_window_initialize_toolbars (window); + + /* Set initial sensitivity of some buttons & menu items + * now that they're all created. + */ + nautilus_window_allow_back(window, FALSE); + nautilus_window_allow_forward(window, FALSE); + nautilus_window_allow_stop(window, FALSE); } static void @@ -469,11 +473,12 @@ nautilus_window_set_arg (GtkObject *object, g_assert(app->name); g_free(app->prefix); app->prefix = g_strconcat("/", app->name, "/", NULL); - if(!old_app_name) + if(!old_app_name) { nautilus_window_constructed(NAUTILUS_WINDOW(object)); + } break; case ARG_APP: - window->app = BONOBO_OBJECT(GTK_VALUE_OBJECT(*arg)); + window->app = BONOBO_OBJECT(GTK_VALUE_OBJECT(*arg)); break; case ARG_CONTENT_VIEW: nautilus_window_real_set_content_view (window, (NautilusView *)GTK_VALUE_OBJECT(*arg)); diff --git a/src/ntl-window.h b/src/ntl-window.h index dbebf91df..6a8e65839 100644 --- a/src/ntl-window.h +++ b/src/ntl-window.h @@ -149,6 +149,6 @@ void nautilus_window_allow_reload (NautilusWindow *window, gboolean allow); void nautilus_window_allow_stop (NautilusWindow *window, gboolean allow); -void nautilus_bookmarks_exiting (void); +void nautilus_bookmarks_exiting (GtkObject *object); #endif |