Blame gtksourceview/gtksourceundomanager.c

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