diff options
author | Gene Ragan <gzr@src.gnome.org> | 2000-06-12 20:29:32 +0000 |
---|---|---|
committer | Gene Ragan <gzr@src.gnome.org> | 2000-06-12 20:29:32 +0000 |
commit | 822c600faefc1d8f1e38c846178683a266ff1556 (patch) | |
tree | 6cbd881a196964002e32e6151151c121cb72ff61 | |
parent | 820f06eb6d24d77955b866d4dfef97950eff3c19 (diff) | |
download | nautilus-822c600faefc1d8f1e38c846178683a266ff1556.tar.gz |
New file and functions to handle undo in NautilusEntry and GtkEditables.
* libnautilus-extensions/nautilus-undo-signal-handlers.c:
* libnautilus-extensions/nautilus-undo-signal-handlers.h:
(nautilus_entry_user_changed_callback),
(nautilus_undo_setup_nautilus_entry_for_undo),
(nautilus_undo_teardown_nautilus_entry_for_undo),
(free_editable_undo_data), (free_editable_object_data),
(editable_insert_text_callback), (editable_delete_text_callback),
(editable_register_edit_undo),
(nautilus_undo_setup_editable_for_undo),
(nautilus_undo_teardown_editable_for_undo),
(restore_editable_from_undo_snapshot_callback),
(editable_key_press_event), (nautilus_undo_editable_set_undo_key):
New file and functions to handle undo in NautilusEntry and
GtkEditables. This file is intended to contain signal handlers
that enable undo for a variety of GTK widgets. Calling a
setup_for_undo function will prepare the widget to handle
undo functionality.
* libnautilus-extensions/Makefile.am:
Added entries for new files nautilus-undo-signal-handlers.c
and nautilus-undo-signal-handlers.h
* components/notes/nautilus-notes.c: (make_notes_view):
Fixed bug #973. Add undo to notes component.
* components/websearch/ntl-web-search.c: (make_obj):
Changed to use new undo signal handlers.
* libnautilus-extensions/nautilus-entry.c:
(nautilus_entry_initialize), (nautilus_entry_key_press),
(nautilus_entry_set_text), (nautilus_entry_delete_text):
Removed old undo code that had been rendered obsolete by the
new signal handlers mentioned above.
* src/nautilus-bookmarks-window.c: (create_bookmarks_window):
Changed to use new undo signal handlers.
----------------------------------
-rw-r--r-- | ChangeLog | 39 | ||||
-rw-r--r-- | components/notes/nautilus-notes.c | 15 | ||||
-rw-r--r-- | components/websearch/ntl-web-search.c | 10 | ||||
-rw-r--r-- | libnautilus-extensions/Makefile.am | 1 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-entry.c | 146 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-entry.h | 7 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-undo-signal-handlers.c | 323 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-undo-signal-handlers.h | 37 | ||||
-rw-r--r-- | libnautilus-private/Makefile.am | 1 | ||||
-rw-r--r-- | libnautilus-private/nautilus-entry.c | 146 | ||||
-rw-r--r-- | libnautilus-private/nautilus-entry.h | 7 | ||||
-rw-r--r-- | libnautilus-private/nautilus-undo-signal-handlers.c | 323 | ||||
-rw-r--r-- | libnautilus-private/nautilus-undo-signal-handlers.h | 37 | ||||
-rw-r--r-- | src/nautilus-bookmarks-window.c | 8 |
14 files changed, 795 insertions, 305 deletions
@@ -1,3 +1,42 @@ +2000-06-12 Gene Z. Ragan <gzr@eazel.com> + + * libnautilus-extensions/nautilus-undo-signal-handlers.c: + * libnautilus-extensions/nautilus-undo-signal-handlers.h: + (nautilus_entry_user_changed_callback), + (nautilus_undo_setup_nautilus_entry_for_undo), + (nautilus_undo_teardown_nautilus_entry_for_undo), + (free_editable_undo_data), (free_editable_object_data), + (editable_insert_text_callback), (editable_delete_text_callback), + (editable_register_edit_undo), + (nautilus_undo_setup_editable_for_undo), + (nautilus_undo_teardown_editable_for_undo), + (restore_editable_from_undo_snapshot_callback), + (editable_key_press_event), (nautilus_undo_editable_set_undo_key): + New file and functions to handle undo in NautilusEntry and + GtkEditables. This file is intended to contain signal handlers + that enable undo for a variety of GTK widgets. Calling a + setup_for_undo function will prepare the widget to handle + undo functionality. + + * libnautilus-extensions/Makefile.am: + Added entries for new files nautilus-undo-signal-handlers.c + and nautilus-undo-signal-handlers.h + + * components/notes/nautilus-notes.c: (make_notes_view): + Fixed bug #973. Add undo to notes component. + + * components/websearch/ntl-web-search.c: (make_obj): + Changed to use new undo signal handlers. + + * libnautilus-extensions/nautilus-entry.c: + (nautilus_entry_initialize), (nautilus_entry_key_press), + (nautilus_entry_set_text), (nautilus_entry_delete_text): + Removed old undo code that had been rendered obsolete by the + new signal handlers mentioned above. + + * src/nautilus-bookmarks-window.c: (create_bookmarks_window): + Changed to use new undo signal handlers. + 2000-06-12 John Sullivan <sullivan@eazel.com> Fixed bug 692 (Bookmarks for deleted files don't do diff --git a/components/notes/nautilus-notes.c b/components/notes/nautilus-notes.c index 34104bb60..ebf58ecc5 100644 --- a/components/notes/nautilus-notes.c +++ b/components/notes/nautilus-notes.c @@ -29,6 +29,7 @@ #include <libnautilus/libnautilus.h> #include <libnautilus-extensions/nautilus-metadata.h> +#include <libnautilus-extensions/nautilus-undo-signal-handlers.h> #include <gnome.h> #include <libgnomevfs/gnome-vfs.h> #include <liboaf/liboaf.h> @@ -149,23 +150,25 @@ make_notes_view (BonoboGenericFactory *Factory, const char *goad_id, gpointer cl notes->uri = g_strdup (""); /* allocate a vbox to hold all of the UI elements */ - vbox = gtk_vbox_new (FALSE, 0); - /* create the text container */ - + /* create the text container */ notes->note_text_field = gtk_text_new (NULL, NULL); - gtk_text_set_editable (GTK_TEXT (notes->note_text_field), TRUE); + gtk_text_set_editable (GTK_TEXT (notes->note_text_field), TRUE); gtk_box_pack_start (GTK_BOX (vbox), notes->note_text_field, TRUE, TRUE, 0); background = nautilus_get_widget_background (notes->note_text_field); nautilus_background_set_color (background, NOTES_DEFAULT_BACKGROUND_COLOR); - + gtk_widget_show_all (vbox); - /* Create CORBA object. */ + /* Create CORBA object. */ notes->view = nautilus_view_new (vbox); gtk_signal_connect (GTK_OBJECT (notes->view), "destroy", do_destroy, notes); + /* Setup up text field for undo */ + nautilus_undo_setup_editable_for_undo (GTK_EDITABLE (notes->note_text_field)); + nautilus_undo_editable_set_undo_key (GTK_EDITABLE (notes->note_text_field), TRUE); + notes_object_count++; /* handle events */ diff --git a/components/websearch/ntl-web-search.c b/components/websearch/ntl-web-search.c index ed61e2f7c..8cb96cf6c 100644 --- a/components/websearch/ntl-web-search.c +++ b/components/websearch/ntl-web-search.c @@ -25,13 +25,16 @@ /* ntl-web-search.c: Rewrite KWebSearch using Gtk+ and Nautilus */ #include <config.h> -#include <libnautilus/libnautilus.h> -#include <libnautilus-extensions/nautilus-entry.h> #include <gnome.h> #include <liboaf/liboaf.h> #include <limits.h> #include <ctype.h> + +#include <libnautilus/libnautilus.h> #include <libnautilus/nautilus-clipboard.h> +#include <libnautilus-extensions/nautilus-undo-signal-handlers.h> + + typedef struct { char *name, *url_head, *url_tail; @@ -182,7 +185,8 @@ make_obj(BonoboGenericFactory *Factory, const char *goad_id, gpointer closure) web_search_populate_engines(hview); hview->ent_params = nautilus_entry_new(); - + nautilus_undo_editable_set_undo_key ( GTK_EDITABLE (hview->ent_params), TRUE); + gtk_signal_connect(GTK_OBJECT(hview->ent_params), "activate", do_search, hview); gtk_container_add(GTK_CONTAINER(vbox), hview->ent_params); diff --git a/libnautilus-extensions/Makefile.am b/libnautilus-extensions/Makefile.am index 3f447108e..a6a4bac78 100644 --- a/libnautilus-extensions/Makefile.am +++ b/libnautilus-extensions/Makefile.am @@ -86,6 +86,7 @@ libnautilus_extensions_la_SOURCES = \ nautilus-text-caption.c \ nautilus-undo-context.c \ nautilus-undo-manager.c \ + nautilus-undo-signal-handlers.c \ nautilus-user-level-manager.c \ nautilus-view-identifier.c \ nautilus-xml-extensions.c \ diff --git a/libnautilus-extensions/nautilus-entry.c b/libnautilus-extensions/nautilus-entry.c index 99616216c..7177ef141 100644 --- a/libnautilus-extensions/nautilus-entry.c +++ b/libnautilus-extensions/nautilus-entry.c @@ -30,29 +30,24 @@ #include "nautilus-gtk-macros.h" #include <gdk/gdkkeysyms.h> +#include <gtk/gtksignal.h> #include <gtk/gtkmain.h> #include <gtk/gtkwidget.h> #include <libgnome/gnome-defs.h> #include <libgnome/gnome-i18n.h> -#include <libnautilus/nautilus-undo.h> +#include <libnautilus-extensions/nautilus-undo-signal-handlers.h> #include <orb/orbit.h> + enum { USER_CHANGED, LAST_SIGNAL }; static guint signals[LAST_SIGNAL]; -typedef struct -{ - char *undo_text; - gint position; -} NautilusEntryUndoData; - - static void nautilus_entry_initialize (NautilusEntry *entry); static void nautilus_entry_initialize_class (NautilusEntryClass *class); static void nautilus_entry_destroy (GtkObject *object); @@ -66,13 +61,6 @@ static void nautilus_entry_delete_text (GtkEditable *editable, gint start_pos, gint end_pos); -static void user_changed_callback (NautilusEntry *entry); - -/* Undo callbacks */ -static void register_edit_undo (NautilusEntry *entry); -static void restore_from_undo_snapshot_callback (GtkObject *target, gpointer callback_data); - - NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusEntry, nautilus_entry, GTK_TYPE_ENTRY) static void @@ -110,11 +98,7 @@ nautilus_entry_initialize (NautilusEntry *entry) { entry->user_edit = TRUE; - gtk_signal_connect (GTK_OBJECT (entry), - "user_changed", - GTK_SIGNAL_FUNC (user_changed_callback), - NULL); - + nautilus_undo_setup_nautilus_entry_for_undo (entry); } GtkWidget* @@ -153,15 +137,6 @@ nautilus_entry_key_press (GtkWidget *widget, GdkEventKey *event) case GDK_KP_Enter: gtk_widget_activate (widget); return TRUE; - - /* Undo */ - case 'z': - if ((event->state & GDK_CONTROL_MASK) != 0 - && entry->handle_undo_key) { - nautilus_undo (GTK_OBJECT (widget)); - return FALSE; - } - break; default: break; @@ -230,17 +205,10 @@ nautilus_entry_select_all_at_idle (NautilusEntry *entry) void nautilus_entry_set_text (NautilusEntry *entry, const gchar *text) { - gboolean val; - entry->user_edit = FALSE; - val = entry->undo_registered; - entry->undo_registered = TRUE; - gtk_entry_set_text ( GTK_ENTRY (entry), text); - - entry->undo_registered = val; - + entry->user_edit = TRUE; } @@ -276,108 +244,4 @@ nautilus_entry_delete_text (GtkEditable *editable, gint start_pos, gint end_pos) NAUTILUS_CALL_PARENT_CLASS (GTK_EDITABLE_CLASS, delete_text, (editable, start_pos, end_pos)); -} - -/* free_undo_data - * - * Clean up routine to free entry undo data - */ - -static void -free_undo_data (gpointer data) -{ - NautilusEntryUndoData *undo_data; - - undo_data = (NautilusEntryUndoData *) data; - - g_free (undo_data->undo_text); - g_free (undo_data); -} - -/* save_undo_snapshot_callback - * - * Get text at start of edit operation and store in undo data as - * string with a key of "undo_text". - */ -static void -register_edit_undo (NautilusEntry *entry) -{ - NautilusEntryUndoData *undo_data; - - if (entry->undo_registered) { - return; - } - - undo_data = g_new (NautilusEntryUndoData, 1); - undo_data->undo_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))); - undo_data->position = gtk_editable_get_position (GTK_EDITABLE (entry)); - entry->undo_registered = TRUE; - - nautilus_undo_register - (GTK_OBJECT (entry), - restore_from_undo_snapshot_callback, - undo_data, - (GDestroyNotify) free_undo_data, - _("Edit"), - _("Undo Edit"), - _("Undo the edit"), - _("Redo Edit"), - _("Redo the edit")); -} - - -/* restore_from_undo_snapshot_callback - * - * Restore edited text. - */ -static void -restore_from_undo_snapshot_callback (GtkObject *target, gpointer callback_data) -{ - NautilusEntry *entry; - GtkWindow *window; - NautilusEntryUndoData *undo_data; - - entry = NAUTILUS_ENTRY (target); - undo_data = (NautilusEntryUndoData *) callback_data; - - /* Reset the registered flag so we get a new item for future editing. */ - entry->undo_registered = FALSE; - - /* Register a new undo transaction for redo. */ - register_edit_undo (entry); - - /* Restore the text. */ - gtk_entry_set_text (GTK_ENTRY (entry), undo_data->undo_text); - - /* Set focus to widget */ - window = GTK_WINDOW (gtk_widget_get_toplevel ( GTK_WIDGET (target))); - gtk_window_set_focus (window, GTK_WIDGET (entry)); - - /* We have to do this call, because th eprevious call selects all text */ - gtk_editable_select_region (GTK_EDITABLE (entry), 0, 0); - - /* Set the i-beam to the end of the text */ - gtk_editable_set_position ( GTK_EDITABLE (target), undo_data->position); - - /* Reset the registered flag so we get a new item for future editing. */ - entry->undo_registered = FALSE; -} - -/* nautilus_entry_enable_undo_key - * - * Allow the use of ctrl-z from within widget. This should only be - * set if there is no menu bar to use to undo the widget. - */ -void -nautilus_entry_set_undo_key (NautilusEntry *entry, gboolean value) -{ - entry->handle_undo_key = value; -} - - -static void -user_changed_callback (NautilusEntry *entry) -{ - /* Register undo transaction */ - register_edit_undo (entry); } diff --git a/libnautilus-extensions/nautilus-entry.h b/libnautilus-extensions/nautilus-entry.h index 68a9f1f99..4b656c675 100644 --- a/libnautilus-extensions/nautilus-entry.h +++ b/libnautilus-extensions/nautilus-entry.h @@ -49,8 +49,6 @@ typedef struct NautilusEntryClass NautilusEntryClass; struct NautilusEntry { GtkEntry parent; - gboolean undo_registered; - gboolean handle_undo_key; gboolean user_edit; }; @@ -63,11 +61,10 @@ struct NautilusEntryClass { GtkType nautilus_entry_get_type (void); GtkWidget* nautilus_entry_new (void); -void nautilus_entry_set_text (NautilusEntry *entry, const gchar *text); +void nautilus_entry_set_text (NautilusEntry *entry, + const gchar *text); void nautilus_entry_select_all (NautilusEntry *entry); void nautilus_entry_select_all_at_idle (NautilusEntry *entry); -void nautilus_entry_set_undo_key (NautilusEntry *entry, - gboolean value); END_GNOME_DECLS diff --git a/libnautilus-extensions/nautilus-undo-signal-handlers.c b/libnautilus-extensions/nautilus-undo-signal-handlers.c new file mode 100644 index 000000000..0d028d896 --- /dev/null +++ b/libnautilus-extensions/nautilus-undo-signal-handlers.c @@ -0,0 +1,323 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ + +/* Signal handlers to enable undo in Gtk Widgets. + * + * Copyright (C) 2000 Eazel, Inc. + * + * Author: Gene Z. Ragan <gzr@eazel.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + +#include <config.h> +#include <gtk/gtk.h> + +#include <libgnome/gnome-defs.h> +#include <libgnome/gnome-i18n.h> +#include <libnautilus/nautilus-undo.h> + +#include "nautilus-gtk-macros.h" + +#include "nautilus-undo-signal-handlers.h" + + +typedef struct { + char *undo_text; + gint position; + guint selection_start; + guint selection_end; +} EditableUndoData; + +typedef struct { + gboolean undo_registered; +} EditableUndoObjectData; + + +static void restore_editable_from_undo_snapshot_callback (GtkObject *target, + gpointer callback_data); +static void editable_register_edit_undo (GtkEditable *editable); +static void free_editable_object_data (gpointer data); + +/* nautilus_undo_setup_nautilus_entry_for_undo + * + * Functions and callback methods to handle undo + * in a NautilusEntry + */ + +static void +nautilus_entry_user_changed_callback (NautilusEntry *entry) +{ + /* Register undo transaction */ + editable_register_edit_undo (GTK_EDITABLE (entry)); +} + +void +nautilus_undo_setup_nautilus_entry_for_undo (NautilusEntry *entry) +{ + EditableUndoObjectData *data; + + if (!NAUTILUS_IS_ENTRY (entry) ) { + return; + } + + data = g_new(EditableUndoObjectData, 1); + data->undo_registered = FALSE; + gtk_object_set_data_full (GTK_OBJECT (entry), "undo_registered", + data, free_editable_object_data); + + /* Connect to entry signals */ + gtk_signal_connect (GTK_OBJECT (entry), + "user_changed", + GTK_SIGNAL_FUNC (nautilus_entry_user_changed_callback), + NULL); +} + +void +nautilus_undo_teardown_nautilus_entry_for_undo (NautilusEntry *entry) +{ + if (!NAUTILUS_IS_ENTRY (entry) ) { + return; + } + + /* Disconnect from entry signals */ + gtk_signal_disconnect_by_func (GTK_OBJECT (entry), + GTK_SIGNAL_FUNC (nautilus_entry_user_changed_callback), + NULL); +} + +/* nautilus_undo_setup_nautilus_entry_for_undo + * + * Functions and callback methods to handle undo + * in a NautilusEntry + */ + +static void +free_editable_undo_data (gpointer data) +{ + EditableUndoData *undo_data; + + undo_data = (EditableUndoData *) data; + + g_free (undo_data->undo_text); + g_free (undo_data); +} + +static void +free_editable_object_data (gpointer data) +{ + g_free (data); +} + + +static void +editable_insert_text_callback (GtkEditable *editable) +{ + /* Register undo transaction */ + editable_register_edit_undo (editable); +} + +static void +editable_delete_text_callback (GtkEditable *editable) +{ + /* Register undo transaction */ + editable_register_edit_undo (editable); +} + +static void +editable_register_edit_undo (GtkEditable *editable) +{ + EditableUndoData *undo_data; + EditableUndoObjectData *undo_info; + gpointer data; + + if (!GTK_IS_EDITABLE (editable) ) { + return; + } + + /* Check our undo registered flag */ + data = gtk_object_get_data (GTK_OBJECT (editable), "undo_registered"); + if (data == NULL) { + return; + } + + undo_info = (EditableUndoObjectData *)data; + if (undo_info->undo_registered == TRUE) { + return; + } + + undo_data = g_new (EditableUndoData, 1); + undo_data->undo_text = g_strdup (gtk_editable_get_chars (editable, 0, -1)); + undo_data->position = gtk_editable_get_position (editable); + undo_data->selection_start = editable->selection_start_pos; + undo_data->selection_end = editable->selection_end_pos; + + nautilus_undo_register + (GTK_OBJECT (editable), + restore_editable_from_undo_snapshot_callback, + undo_data, + (GDestroyNotify) free_editable_undo_data, + _("Edit"), + _("Undo Edit"), + _("Undo the edit"), + _("Redo Edit"), + _("Redo the edit")); + + undo_info->undo_registered = TRUE; +} + +void +nautilus_undo_setup_editable_for_undo (GtkEditable *editable) +{ + EditableUndoObjectData *data; + + if (!GTK_IS_EDITABLE (editable) ) { + return; + } + + /* Connect to editable signals */ + gtk_signal_connect (GTK_OBJECT (editable), + "insert_text", + GTK_SIGNAL_FUNC (editable_insert_text_callback), + NULL); + + gtk_signal_connect (GTK_OBJECT (editable), + "delete_text", + GTK_SIGNAL_FUNC (editable_delete_text_callback), + NULL); + + + data = g_new(EditableUndoObjectData, 1); + data->undo_registered = FALSE; + gtk_object_set_data_full (GTK_OBJECT (editable), "undo_registered", + data, free_editable_object_data); +} + +void +nautilus_undo_teardown_editable_for_undo (GtkEditable *editable) +{ + if (!GTK_IS_EDITABLE (editable) ) { + return; + } + + /* Disconnect from entry signals */ + gtk_signal_disconnect_by_func (GTK_OBJECT (editable), + GTK_SIGNAL_FUNC (editable_insert_text_callback), + NULL); + + gtk_signal_disconnect_by_func (GTK_OBJECT (editable), + GTK_SIGNAL_FUNC (editable_delete_text_callback), + NULL); + +} + +/* restore_editable_from_undo_snapshot_callback + * + * Restore edited text. + */ +static void +restore_editable_from_undo_snapshot_callback (GtkObject *target, gpointer callback_data) +{ + GtkEditable *editable; + GtkWindow *window; + EditableUndoData *undo_data; + EditableUndoObjectData *data; + gint position; + + editable = GTK_EDITABLE (target); + undo_data = (EditableUndoData *) callback_data; + + /* Check our undo registered flag */ + data = gtk_object_get_data (target, "undo_registered"); + if (data == NULL) { + return; + } + + /* Reset the registered flag so we get a new item for future editing. */ + data->undo_registered = FALSE; + + /* Register a new undo transaction for redo. */ + editable_register_edit_undo (editable); + + /* Restore the text. */ + position = 0; + gtk_editable_delete_text (editable, 0, -1); + gtk_editable_insert_text (editable, undo_data->undo_text, + strlen (undo_data->undo_text), &position); + + /* Set focus to widget */ + window = GTK_WINDOW (gtk_widget_get_toplevel ( GTK_WIDGET (target))); + gtk_window_set_focus (window, GTK_WIDGET (editable)); + + /* We have to do this call, because the previous call selects all text */ + gtk_editable_select_region (editable, 0, 0); + + /* Restore selection */ + gtk_editable_select_region (editable, undo_data->selection_start, + undo_data->selection_end); + + /* Set the i-beam to the saved position */ + gtk_editable_set_position (editable, undo_data->position); + + /* Reset the registered flag so we get a new item for future editing. */ + data->undo_registered = FALSE; +} + + +/* editable_set_undo_key + * + * Allow the use of ctrl-z from within widget. + */ + +static void +editable_key_press_event (GtkEditable *editable, GdkEventKey *event, gpointer user_data) +{ + switch (event->keyval) { + /* Undo */ + case 'z': + if ((event->state & GDK_CONTROL_MASK) != 0) { + nautilus_undo (GTK_OBJECT (editable)); + return; + } + break; + + default: + break; + } +} + +/* editable_set_undo_key + * + * Allow the use of ctrl-z from within widget. This should only be + * set if there is no menu bar to use to undo the widget. + */ + +void +nautilus_undo_editable_set_undo_key (GtkEditable *editable, gboolean value) +{ + if (value) { + /* Connect to entry signals */ + gtk_signal_connect (GTK_OBJECT (editable), + "key-press-event", + GTK_SIGNAL_FUNC (editable_key_press_event), + NULL); + } + else { + gtk_signal_disconnect_by_func (GTK_OBJECT (editable), + GTK_SIGNAL_FUNC (editable_key_press_event), + NULL); + } +} diff --git a/libnautilus-extensions/nautilus-undo-signal-handlers.h b/libnautilus-extensions/nautilus-undo-signal-handlers.h new file mode 100644 index 000000000..e00ceb05a --- /dev/null +++ b/libnautilus-extensions/nautilus-undo-signal-handlers.h @@ -0,0 +1,37 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ + +/* Signal handlers to enable undo in Gtk Widgets. + * + * Copyright (C) 2000 Eazel, Inc. + * + * Author: Gene Z. Ragan <gzr@eazel.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef NAUTILUS_UNDO_SIGNAL_HANDLERS_H +#define NAUTILUS_UNDO_SIGNAL_HANDLERS_H + +#include <libnautilus-extensions/nautilus-entry.h> + +void nautilus_undo_setup_nautilus_entry_for_undo (NautilusEntry *entry); +void nautilus_undo_teardown_nautilus_entry_for_undo (NautilusEntry *entry); +void nautilus_undo_setup_editable_for_undo (GtkEditable *editable); +void nautilus_undo_teardown_editable_for_undo (GtkEditable *editable); +void nautilus_undo_editable_set_undo_key (GtkEditable *editable, + gboolean value); + +#endif /* NAUTILUS_UNDO_SIGNAL_HANDLERS_H */
\ No newline at end of file diff --git a/libnautilus-private/Makefile.am b/libnautilus-private/Makefile.am index 3f447108e..a6a4bac78 100644 --- a/libnautilus-private/Makefile.am +++ b/libnautilus-private/Makefile.am @@ -86,6 +86,7 @@ libnautilus_extensions_la_SOURCES = \ nautilus-text-caption.c \ nautilus-undo-context.c \ nautilus-undo-manager.c \ + nautilus-undo-signal-handlers.c \ nautilus-user-level-manager.c \ nautilus-view-identifier.c \ nautilus-xml-extensions.c \ diff --git a/libnautilus-private/nautilus-entry.c b/libnautilus-private/nautilus-entry.c index 99616216c..7177ef141 100644 --- a/libnautilus-private/nautilus-entry.c +++ b/libnautilus-private/nautilus-entry.c @@ -30,29 +30,24 @@ #include "nautilus-gtk-macros.h" #include <gdk/gdkkeysyms.h> +#include <gtk/gtksignal.h> #include <gtk/gtkmain.h> #include <gtk/gtkwidget.h> #include <libgnome/gnome-defs.h> #include <libgnome/gnome-i18n.h> -#include <libnautilus/nautilus-undo.h> +#include <libnautilus-extensions/nautilus-undo-signal-handlers.h> #include <orb/orbit.h> + enum { USER_CHANGED, LAST_SIGNAL }; static guint signals[LAST_SIGNAL]; -typedef struct -{ - char *undo_text; - gint position; -} NautilusEntryUndoData; - - static void nautilus_entry_initialize (NautilusEntry *entry); static void nautilus_entry_initialize_class (NautilusEntryClass *class); static void nautilus_entry_destroy (GtkObject *object); @@ -66,13 +61,6 @@ static void nautilus_entry_delete_text (GtkEditable *editable, gint start_pos, gint end_pos); -static void user_changed_callback (NautilusEntry *entry); - -/* Undo callbacks */ -static void register_edit_undo (NautilusEntry *entry); -static void restore_from_undo_snapshot_callback (GtkObject *target, gpointer callback_data); - - NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusEntry, nautilus_entry, GTK_TYPE_ENTRY) static void @@ -110,11 +98,7 @@ nautilus_entry_initialize (NautilusEntry *entry) { entry->user_edit = TRUE; - gtk_signal_connect (GTK_OBJECT (entry), - "user_changed", - GTK_SIGNAL_FUNC (user_changed_callback), - NULL); - + nautilus_undo_setup_nautilus_entry_for_undo (entry); } GtkWidget* @@ -153,15 +137,6 @@ nautilus_entry_key_press (GtkWidget *widget, GdkEventKey *event) case GDK_KP_Enter: gtk_widget_activate (widget); return TRUE; - - /* Undo */ - case 'z': - if ((event->state & GDK_CONTROL_MASK) != 0 - && entry->handle_undo_key) { - nautilus_undo (GTK_OBJECT (widget)); - return FALSE; - } - break; default: break; @@ -230,17 +205,10 @@ nautilus_entry_select_all_at_idle (NautilusEntry *entry) void nautilus_entry_set_text (NautilusEntry *entry, const gchar *text) { - gboolean val; - entry->user_edit = FALSE; - val = entry->undo_registered; - entry->undo_registered = TRUE; - gtk_entry_set_text ( GTK_ENTRY (entry), text); - - entry->undo_registered = val; - + entry->user_edit = TRUE; } @@ -276,108 +244,4 @@ nautilus_entry_delete_text (GtkEditable *editable, gint start_pos, gint end_pos) NAUTILUS_CALL_PARENT_CLASS (GTK_EDITABLE_CLASS, delete_text, (editable, start_pos, end_pos)); -} - -/* free_undo_data - * - * Clean up routine to free entry undo data - */ - -static void -free_undo_data (gpointer data) -{ - NautilusEntryUndoData *undo_data; - - undo_data = (NautilusEntryUndoData *) data; - - g_free (undo_data->undo_text); - g_free (undo_data); -} - -/* save_undo_snapshot_callback - * - * Get text at start of edit operation and store in undo data as - * string with a key of "undo_text". - */ -static void -register_edit_undo (NautilusEntry *entry) -{ - NautilusEntryUndoData *undo_data; - - if (entry->undo_registered) { - return; - } - - undo_data = g_new (NautilusEntryUndoData, 1); - undo_data->undo_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))); - undo_data->position = gtk_editable_get_position (GTK_EDITABLE (entry)); - entry->undo_registered = TRUE; - - nautilus_undo_register - (GTK_OBJECT (entry), - restore_from_undo_snapshot_callback, - undo_data, - (GDestroyNotify) free_undo_data, - _("Edit"), - _("Undo Edit"), - _("Undo the edit"), - _("Redo Edit"), - _("Redo the edit")); -} - - -/* restore_from_undo_snapshot_callback - * - * Restore edited text. - */ -static void -restore_from_undo_snapshot_callback (GtkObject *target, gpointer callback_data) -{ - NautilusEntry *entry; - GtkWindow *window; - NautilusEntryUndoData *undo_data; - - entry = NAUTILUS_ENTRY (target); - undo_data = (NautilusEntryUndoData *) callback_data; - - /* Reset the registered flag so we get a new item for future editing. */ - entry->undo_registered = FALSE; - - /* Register a new undo transaction for redo. */ - register_edit_undo (entry); - - /* Restore the text. */ - gtk_entry_set_text (GTK_ENTRY (entry), undo_data->undo_text); - - /* Set focus to widget */ - window = GTK_WINDOW (gtk_widget_get_toplevel ( GTK_WIDGET (target))); - gtk_window_set_focus (window, GTK_WIDGET (entry)); - - /* We have to do this call, because th eprevious call selects all text */ - gtk_editable_select_region (GTK_EDITABLE (entry), 0, 0); - - /* Set the i-beam to the end of the text */ - gtk_editable_set_position ( GTK_EDITABLE (target), undo_data->position); - - /* Reset the registered flag so we get a new item for future editing. */ - entry->undo_registered = FALSE; -} - -/* nautilus_entry_enable_undo_key - * - * Allow the use of ctrl-z from within widget. This should only be - * set if there is no menu bar to use to undo the widget. - */ -void -nautilus_entry_set_undo_key (NautilusEntry *entry, gboolean value) -{ - entry->handle_undo_key = value; -} - - -static void -user_changed_callback (NautilusEntry *entry) -{ - /* Register undo transaction */ - register_edit_undo (entry); } diff --git a/libnautilus-private/nautilus-entry.h b/libnautilus-private/nautilus-entry.h index 68a9f1f99..4b656c675 100644 --- a/libnautilus-private/nautilus-entry.h +++ b/libnautilus-private/nautilus-entry.h @@ -49,8 +49,6 @@ typedef struct NautilusEntryClass NautilusEntryClass; struct NautilusEntry { GtkEntry parent; - gboolean undo_registered; - gboolean handle_undo_key; gboolean user_edit; }; @@ -63,11 +61,10 @@ struct NautilusEntryClass { GtkType nautilus_entry_get_type (void); GtkWidget* nautilus_entry_new (void); -void nautilus_entry_set_text (NautilusEntry *entry, const gchar *text); +void nautilus_entry_set_text (NautilusEntry *entry, + const gchar *text); void nautilus_entry_select_all (NautilusEntry *entry); void nautilus_entry_select_all_at_idle (NautilusEntry *entry); -void nautilus_entry_set_undo_key (NautilusEntry *entry, - gboolean value); END_GNOME_DECLS diff --git a/libnautilus-private/nautilus-undo-signal-handlers.c b/libnautilus-private/nautilus-undo-signal-handlers.c new file mode 100644 index 000000000..0d028d896 --- /dev/null +++ b/libnautilus-private/nautilus-undo-signal-handlers.c @@ -0,0 +1,323 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ + +/* Signal handlers to enable undo in Gtk Widgets. + * + * Copyright (C) 2000 Eazel, Inc. + * + * Author: Gene Z. Ragan <gzr@eazel.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + +#include <config.h> +#include <gtk/gtk.h> + +#include <libgnome/gnome-defs.h> +#include <libgnome/gnome-i18n.h> +#include <libnautilus/nautilus-undo.h> + +#include "nautilus-gtk-macros.h" + +#include "nautilus-undo-signal-handlers.h" + + +typedef struct { + char *undo_text; + gint position; + guint selection_start; + guint selection_end; +} EditableUndoData; + +typedef struct { + gboolean undo_registered; +} EditableUndoObjectData; + + +static void restore_editable_from_undo_snapshot_callback (GtkObject *target, + gpointer callback_data); +static void editable_register_edit_undo (GtkEditable *editable); +static void free_editable_object_data (gpointer data); + +/* nautilus_undo_setup_nautilus_entry_for_undo + * + * Functions and callback methods to handle undo + * in a NautilusEntry + */ + +static void +nautilus_entry_user_changed_callback (NautilusEntry *entry) +{ + /* Register undo transaction */ + editable_register_edit_undo (GTK_EDITABLE (entry)); +} + +void +nautilus_undo_setup_nautilus_entry_for_undo (NautilusEntry *entry) +{ + EditableUndoObjectData *data; + + if (!NAUTILUS_IS_ENTRY (entry) ) { + return; + } + + data = g_new(EditableUndoObjectData, 1); + data->undo_registered = FALSE; + gtk_object_set_data_full (GTK_OBJECT (entry), "undo_registered", + data, free_editable_object_data); + + /* Connect to entry signals */ + gtk_signal_connect (GTK_OBJECT (entry), + "user_changed", + GTK_SIGNAL_FUNC (nautilus_entry_user_changed_callback), + NULL); +} + +void +nautilus_undo_teardown_nautilus_entry_for_undo (NautilusEntry *entry) +{ + if (!NAUTILUS_IS_ENTRY (entry) ) { + return; + } + + /* Disconnect from entry signals */ + gtk_signal_disconnect_by_func (GTK_OBJECT (entry), + GTK_SIGNAL_FUNC (nautilus_entry_user_changed_callback), + NULL); +} + +/* nautilus_undo_setup_nautilus_entry_for_undo + * + * Functions and callback methods to handle undo + * in a NautilusEntry + */ + +static void +free_editable_undo_data (gpointer data) +{ + EditableUndoData *undo_data; + + undo_data = (EditableUndoData *) data; + + g_free (undo_data->undo_text); + g_free (undo_data); +} + +static void +free_editable_object_data (gpointer data) +{ + g_free (data); +} + + +static void +editable_insert_text_callback (GtkEditable *editable) +{ + /* Register undo transaction */ + editable_register_edit_undo (editable); +} + +static void +editable_delete_text_callback (GtkEditable *editable) +{ + /* Register undo transaction */ + editable_register_edit_undo (editable); +} + +static void +editable_register_edit_undo (GtkEditable *editable) +{ + EditableUndoData *undo_data; + EditableUndoObjectData *undo_info; + gpointer data; + + if (!GTK_IS_EDITABLE (editable) ) { + return; + } + + /* Check our undo registered flag */ + data = gtk_object_get_data (GTK_OBJECT (editable), "undo_registered"); + if (data == NULL) { + return; + } + + undo_info = (EditableUndoObjectData *)data; + if (undo_info->undo_registered == TRUE) { + return; + } + + undo_data = g_new (EditableUndoData, 1); + undo_data->undo_text = g_strdup (gtk_editable_get_chars (editable, 0, -1)); + undo_data->position = gtk_editable_get_position (editable); + undo_data->selection_start = editable->selection_start_pos; + undo_data->selection_end = editable->selection_end_pos; + + nautilus_undo_register + (GTK_OBJECT (editable), + restore_editable_from_undo_snapshot_callback, + undo_data, + (GDestroyNotify) free_editable_undo_data, + _("Edit"), + _("Undo Edit"), + _("Undo the edit"), + _("Redo Edit"), + _("Redo the edit")); + + undo_info->undo_registered = TRUE; +} + +void +nautilus_undo_setup_editable_for_undo (GtkEditable *editable) +{ + EditableUndoObjectData *data; + + if (!GTK_IS_EDITABLE (editable) ) { + return; + } + + /* Connect to editable signals */ + gtk_signal_connect (GTK_OBJECT (editable), + "insert_text", + GTK_SIGNAL_FUNC (editable_insert_text_callback), + NULL); + + gtk_signal_connect (GTK_OBJECT (editable), + "delete_text", + GTK_SIGNAL_FUNC (editable_delete_text_callback), + NULL); + + + data = g_new(EditableUndoObjectData, 1); + data->undo_registered = FALSE; + gtk_object_set_data_full (GTK_OBJECT (editable), "undo_registered", + data, free_editable_object_data); +} + +void +nautilus_undo_teardown_editable_for_undo (GtkEditable *editable) +{ + if (!GTK_IS_EDITABLE (editable) ) { + return; + } + + /* Disconnect from entry signals */ + gtk_signal_disconnect_by_func (GTK_OBJECT (editable), + GTK_SIGNAL_FUNC (editable_insert_text_callback), + NULL); + + gtk_signal_disconnect_by_func (GTK_OBJECT (editable), + GTK_SIGNAL_FUNC (editable_delete_text_callback), + NULL); + +} + +/* restore_editable_from_undo_snapshot_callback + * + * Restore edited text. + */ +static void +restore_editable_from_undo_snapshot_callback (GtkObject *target, gpointer callback_data) +{ + GtkEditable *editable; + GtkWindow *window; + EditableUndoData *undo_data; + EditableUndoObjectData *data; + gint position; + + editable = GTK_EDITABLE (target); + undo_data = (EditableUndoData *) callback_data; + + /* Check our undo registered flag */ + data = gtk_object_get_data (target, "undo_registered"); + if (data == NULL) { + return; + } + + /* Reset the registered flag so we get a new item for future editing. */ + data->undo_registered = FALSE; + + /* Register a new undo transaction for redo. */ + editable_register_edit_undo (editable); + + /* Restore the text. */ + position = 0; + gtk_editable_delete_text (editable, 0, -1); + gtk_editable_insert_text (editable, undo_data->undo_text, + strlen (undo_data->undo_text), &position); + + /* Set focus to widget */ + window = GTK_WINDOW (gtk_widget_get_toplevel ( GTK_WIDGET (target))); + gtk_window_set_focus (window, GTK_WIDGET (editable)); + + /* We have to do this call, because the previous call selects all text */ + gtk_editable_select_region (editable, 0, 0); + + /* Restore selection */ + gtk_editable_select_region (editable, undo_data->selection_start, + undo_data->selection_end); + + /* Set the i-beam to the saved position */ + gtk_editable_set_position (editable, undo_data->position); + + /* Reset the registered flag so we get a new item for future editing. */ + data->undo_registered = FALSE; +} + + +/* editable_set_undo_key + * + * Allow the use of ctrl-z from within widget. + */ + +static void +editable_key_press_event (GtkEditable *editable, GdkEventKey *event, gpointer user_data) +{ + switch (event->keyval) { + /* Undo */ + case 'z': + if ((event->state & GDK_CONTROL_MASK) != 0) { + nautilus_undo (GTK_OBJECT (editable)); + return; + } + break; + + default: + break; + } +} + +/* editable_set_undo_key + * + * Allow the use of ctrl-z from within widget. This should only be + * set if there is no menu bar to use to undo the widget. + */ + +void +nautilus_undo_editable_set_undo_key (GtkEditable *editable, gboolean value) +{ + if (value) { + /* Connect to entry signals */ + gtk_signal_connect (GTK_OBJECT (editable), + "key-press-event", + GTK_SIGNAL_FUNC (editable_key_press_event), + NULL); + } + else { + gtk_signal_disconnect_by_func (GTK_OBJECT (editable), + GTK_SIGNAL_FUNC (editable_key_press_event), + NULL); + } +} diff --git a/libnautilus-private/nautilus-undo-signal-handlers.h b/libnautilus-private/nautilus-undo-signal-handlers.h new file mode 100644 index 000000000..e00ceb05a --- /dev/null +++ b/libnautilus-private/nautilus-undo-signal-handlers.h @@ -0,0 +1,37 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ + +/* Signal handlers to enable undo in Gtk Widgets. + * + * Copyright (C) 2000 Eazel, Inc. + * + * Author: Gene Z. Ragan <gzr@eazel.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef NAUTILUS_UNDO_SIGNAL_HANDLERS_H +#define NAUTILUS_UNDO_SIGNAL_HANDLERS_H + +#include <libnautilus-extensions/nautilus-entry.h> + +void nautilus_undo_setup_nautilus_entry_for_undo (NautilusEntry *entry); +void nautilus_undo_teardown_nautilus_entry_for_undo (NautilusEntry *entry); +void nautilus_undo_setup_editable_for_undo (GtkEditable *editable); +void nautilus_undo_teardown_editable_for_undo (GtkEditable *editable); +void nautilus_undo_editable_set_undo_key (GtkEditable *editable, + gboolean value); + +#endif /* NAUTILUS_UNDO_SIGNAL_HANDLERS_H */
\ No newline at end of file diff --git a/src/nautilus-bookmarks-window.c b/src/nautilus-bookmarks-window.c index 80c7dab36..ddadce11d 100644 --- a/src/nautilus-bookmarks-window.c +++ b/src/nautilus-bookmarks-window.c @@ -25,9 +25,9 @@ #include <config.h> #include "nautilus-bookmarks-window.h" #include <libnautilus/nautilus-undo.h> -#include <libnautilus-extensions/nautilus-entry.h> #include <libnautilus-extensions/nautilus-gtk-extensions.h> #include <libnautilus-extensions/nautilus-icon-factory.h> +#include <libnautilus-extensions/nautilus-undo-signal-handlers.h> #include <gnome.h> @@ -171,7 +171,7 @@ create_bookmarks_window (NautilusBookmarkList *list, GtkObject *undo_manager_sou name_field = nautilus_entry_new (); gtk_widget_show (name_field); gtk_box_pack_start (GTK_BOX (vbox3), name_field, FALSE, FALSE, 0); - nautilus_entry_set_undo_key (NAUTILUS_ENTRY (name_field), TRUE); + nautilus_undo_editable_set_undo_key (GTK_EDITABLE (name_field), TRUE); vbox4 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox4); @@ -183,8 +183,8 @@ create_bookmarks_window (NautilusBookmarkList *list, GtkObject *undo_manager_sou uri_field = nautilus_entry_new (); gtk_widget_show (uri_field); - gtk_box_pack_start (GTK_BOX (vbox4), uri_field, FALSE, FALSE, 0); - nautilus_entry_set_undo_key (NAUTILUS_ENTRY (uri_field), TRUE); + gtk_box_pack_start (GTK_BOX (vbox4), uri_field, FALSE, FALSE, 0); + nautilus_undo_editable_set_undo_key (GTK_EDITABLE (uri_field), TRUE); hbox2 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox2); |