|
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 |
}
|