/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * gtksourceundomanager.c * This file is part of GtkSourceView * * Copyright (C) 1998, 1999 Alex Roberts, Evan Lawrence * Copyright (C) 2000, 2001 Chema Celorio, Paolo Maggi * Copyright (C) 2002-2005 Paolo Maggi * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include "gtksourceundomanager.h" /** * SECTION:undomanager * @short_description: Undo manager interface for GtkSourceView * @title: GtkSourceUndoManager * @see_also: #GtkTextBuffer, #GtkSourceView * * For most uses it isn't needed to use #GtkSourceUndoManager. #GtkSourceBuffer * already provides an API and a default implementation for the undo/redo. * * For specific needs, the #GtkSourceUndoManager interface can be implemented to * provide custom undo management. Use gtk_source_buffer_set_undo_manager() to * install a custom undo manager for a particular #GtkSourceBuffer. * * Use gtk_source_undo_manager_can_undo_changed() and * gtk_source_undo_manager_can_redo_changed() when respectively the undo state * or redo state of the undo stack has changed. * * Since: 2.10 */ enum { CAN_UNDO_CHANGED, CAN_REDO_CHANGED, N_SIGNALS }; static guint signals[N_SIGNALS]; typedef GtkSourceUndoManagerIface GtkSourceUndoManagerInterface; G_DEFINE_INTERFACE (GtkSourceUndoManager, gtk_source_undo_manager, G_TYPE_OBJECT) static gboolean gtk_source_undo_manager_can_undo_default (GtkSourceUndoManager *manager) { return FALSE; } static gboolean gtk_source_undo_manager_can_redo_default (GtkSourceUndoManager *manager) { return FALSE; } static void gtk_source_undo_manager_undo_default (GtkSourceUndoManager *manager) { } static void gtk_source_undo_manager_redo_default (GtkSourceUndoManager *manager) { } static void gtk_source_undo_manager_begin_not_undoable_action_default (GtkSourceUndoManager *manager) { } static void gtk_source_undo_manager_end_not_undoable_action_default (GtkSourceUndoManager *manager) { } static void gtk_source_undo_manager_default_init (GtkSourceUndoManagerIface *iface) { iface->can_undo = gtk_source_undo_manager_can_undo_default; iface->can_redo = gtk_source_undo_manager_can_redo_default; iface->undo = gtk_source_undo_manager_undo_default; iface->redo = gtk_source_undo_manager_redo_default; iface->begin_not_undoable_action = gtk_source_undo_manager_begin_not_undoable_action_default; iface->end_not_undoable_action = gtk_source_undo_manager_end_not_undoable_action_default; /** * GtkSourceUndoManager::can-undo-changed: * @manager: The #GtkSourceUndoManager * * Emitted when the ability to undo has changed. * * Since: 2.10 * */ signals[CAN_UNDO_CHANGED] = g_signal_new ("can-undo-changed", G_TYPE_FROM_INTERFACE (iface), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GtkSourceUndoManagerIface, can_undo_changed), NULL, NULL, NULL, G_TYPE_NONE, 0); /** * GtkSourceUndoManager::can-redo-changed: * @manager: The #GtkSourceUndoManager * * Emitted when the ability to redo has changed. * * Since: 2.10 * */ signals[CAN_REDO_CHANGED] = g_signal_new ("can-redo-changed", G_TYPE_FROM_INTERFACE (iface), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GtkSourceUndoManagerIface, can_redo_changed), NULL, NULL, NULL, G_TYPE_NONE, 0); } /** * gtk_source_undo_manager_can_undo: * @manager: a #GtkSourceUndoManager. * * Get whether there are undo operations available. * * Returns: %TRUE if there are undo operations available, %FALSE otherwise * * Since: 2.10 */ gboolean gtk_source_undo_manager_can_undo (GtkSourceUndoManager *manager) { g_return_val_if_fail (GTK_SOURCE_IS_UNDO_MANAGER (manager), FALSE); return GTK_SOURCE_UNDO_MANAGER_GET_INTERFACE (manager)->can_undo (manager); } /** * gtk_source_undo_manager_can_redo: * @manager: a #GtkSourceUndoManager. * * Get whether there are redo operations available. * * Returns: %TRUE if there are redo operations available, %FALSE otherwise * * Since: 2.10 */ gboolean gtk_source_undo_manager_can_redo (GtkSourceUndoManager *manager) { g_return_val_if_fail (GTK_SOURCE_IS_UNDO_MANAGER (manager), FALSE); return GTK_SOURCE_UNDO_MANAGER_GET_INTERFACE (manager)->can_redo (manager); } /** * gtk_source_undo_manager_undo: * @manager: a #GtkSourceUndoManager. * * Perform a single undo. Calling this function when there are no undo operations * available is an error. Use gtk_source_undo_manager_can_undo() to find out * if there are undo operations available. * * Since: 2.10 */ void gtk_source_undo_manager_undo (GtkSourceUndoManager *manager) { g_return_if_fail (GTK_SOURCE_IS_UNDO_MANAGER (manager)); GTK_SOURCE_UNDO_MANAGER_GET_INTERFACE (manager)->undo (manager); } /** * gtk_source_undo_manager_redo: * @manager: a #GtkSourceUndoManager. * * Perform a single redo. Calling this function when there are no redo operations * available is an error. Use gtk_source_undo_manager_can_redo() to find out * if there are redo operations available. * * Since: 2.10 */ void gtk_source_undo_manager_redo (GtkSourceUndoManager *manager) { g_return_if_fail (GTK_SOURCE_IS_UNDO_MANAGER (manager)); GTK_SOURCE_UNDO_MANAGER_GET_INTERFACE (manager)->redo (manager); } /** * gtk_source_undo_manager_begin_not_undoable_action: * @manager: a #GtkSourceUndoManager. * * Begin a not undoable action on the buffer. All changes between this call * and the call to gtk_source_undo_manager_end_not_undoable_action() cannot * be undone. This function should be re-entrant. * * Since: 2.10 */ void gtk_source_undo_manager_begin_not_undoable_action (GtkSourceUndoManager *manager) { g_return_if_fail (GTK_SOURCE_IS_UNDO_MANAGER (manager)); GTK_SOURCE_UNDO_MANAGER_GET_INTERFACE (manager)->begin_not_undoable_action (manager); } /** * gtk_source_undo_manager_end_not_undoable_action: * @manager: a #GtkSourceUndoManager. * * Ends a not undoable action on the buffer. * * Since: 2.10 */ void gtk_source_undo_manager_end_not_undoable_action (GtkSourceUndoManager *manager) { g_return_if_fail (GTK_SOURCE_IS_UNDO_MANAGER (manager)); GTK_SOURCE_UNDO_MANAGER_GET_INTERFACE (manager)->end_not_undoable_action (manager); } /** * gtk_source_undo_manager_can_undo_changed: * @manager: a #GtkSourceUndoManager. * * Emits the #GtkSourceUndoManager::can-undo-changed signal. * * Since: 2.10 **/ void gtk_source_undo_manager_can_undo_changed (GtkSourceUndoManager *manager) { g_return_if_fail (GTK_SOURCE_IS_UNDO_MANAGER (manager)); g_signal_emit (manager, signals[CAN_UNDO_CHANGED], 0); } /** * gtk_source_undo_manager_can_redo_changed: * @manager: a #GtkSourceUndoManager. * * Emits the #GtkSourceUndoManager::can-redo-changed signal. * * Since: 2.10 **/ void gtk_source_undo_manager_can_redo_changed (GtkSourceUndoManager *manager) { g_return_if_fail (GTK_SOURCE_IS_UNDO_MANAGER (manager)); g_signal_emit (manager, signals[CAN_REDO_CHANGED], 0); }