You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
koffice/karbon/commands/vcommand.h

320 lines
7.2 KiB

/* This file is part of the KDE project
Copyright (C) 2001, The Karbon Developers
Copyright (C) 2002, The Karbon Developers
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; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifndef __VCOMMAND_H__
#define __VCOMMAND_H__
//#include <assert.h>
#include <tqobject.h>
#include <tqptrlist.h>
#include "vvisitor.h"
class VDocument;
class KarbonPart;
class TDEAction;
/**
* The base class for all karbon commands.
*
* It basically defines the common interface that all commands should implement.
*/
class VCommand : public VVisitor
{
public:
/**
* Constructs a new command.
*
* @param doc the document the command should work on
* @param name the name of the command (appears in command history)
* @param icon the icon of the command (appears in command history)
*/
VCommand( VDocument* doc, const TQString& name, const TQString& icon = "14_action" )
: m_document( doc ), m_name( name ), m_icon( icon )
{
// A crash because of an assert() is not much better than an crash because of a null
// pointer. Allowing null pointers allows the usage of the vitors ascpect of a VCommand.
// assert( doc );
}
/** Destroys the command */
virtual ~VCommand() {}
/**
* Executes the command.
*
* All the changes to the document are done here.
* All commands have to implement this function.
*/
virtual void execute() = 0;
/**
* Unexecutes the command.
*
* All changes to the document have to be undone here.
*/
virtual void unexecute() {}
/**
* Returns if the command changes the actual document selection.
*
* This flag is checked to determine if the document has to be redrawn.
*
* @return true if the selection is changed, else false
*/
virtual bool changesSelection() const { return false; }
/**
* Returns the name of the command.
*
* @return the command name
*/
TQString name() const
{
return m_name;
}
/**
* Sets the name of the command.
*
* @param name the new command name
*/
void setName( const TQString& name )
{
m_name = name;
}
/**
* Returns the icon of the command.
*
* @return the command icon
*/
TQString icon() const
{
return m_icon;
}
/**
* Returns the document the command works on.
*
* @return the command's document
*/
VDocument* document() const
{
return m_document;
}
private:
VDocument* m_document;
TQString m_name;
TQString m_icon;
};
/**
* Manages a set of commands.
*
* It keeps the commands in a list, commands higher in the list are older
* than lower commands.
* All commands in the list can be undone, beginning from the latest command
* at the end of the list. Undone commands can be redone, beginning at the
* oldest undone command. That makes it possible to go back and forth to a
* specific document state.
*/
class VCommandHistory : public TQObject
{
Q_OBJECT
public:
/**
* Constructs a command history.
*
* @param part the part the commands are managed for
*/
VCommandHistory( KarbonPart* part );
/** Destroys the command history. */
~VCommandHistory();
/**
* Clears the command history by removing all commands.
*
* Emits the historyCleared signal
*/
void clear();
/**
* Adds a new command to the history.
*
* @param command the new command to add
* @param execute controls if the new command should be executed
*/
void addCommand( VCommand* command, bool execute = true );
// limits
/**
* Returns the actual undo limit.
*
* @return the undo limit
*/
unsigned int undoLimit() const
{
return m_undoLimit;
}
/**
* Sets a new undo limit.
*
* The undo limit controls how many commands are stored in the history.
* If the new limit is lower than the actual history size, the oldest
* commands are removed unitl the size matches the undo limit.
*
* @param limit the new undo limit
*/
void setUndoLimit( unsigned int limit );
/**
* Returns the actual redo limit.
*
* @return the redo limit
*/
unsigned int redoLimit() const
{
return m_redoLimit;
}
/**
* Sets a new redo limit.
*
* The redo limit controls how many undone commands are stored in history.
* If the new limit is lower than the actual number of undone commands,
* the newest commands are removed until the number matches the redo limit.
*
* @param limit the new redo limit
*/
void setRedoLimit( unsigned int limit );
/**
* Read only access to the command history list.
*
* @return pointer to the list of commands
*/
const TQPtrList<VCommand>* commands() const
{
return & m_commands;
}
public slots:
/** Undoes the last command not already undone. */
void undo();
/** Redoes the last command not already undone. */
void redo();
/**
* Undoes the specified command.
*
* @param command the command to undo
*/
void undo( VCommand* command );
/**
* Redoes the specified command.
*
* @param command the command to redo
*/
void redo( VCommand* command );
/**
* Undoes all command up to the specified command.
*
* @param command the command up to which all later commands should be undone
*/
void undoAllTo( VCommand* command );
/**
* Redoes all command up to the specified command.
*
* @param command the command up to which all former commands should be redone
*/
void redoAllTo( VCommand* command );
/**
* Marks the actual document state as saved.
*
* The position within the list corresponding to the actual document state is saved.
*/
void documentSaved();
signals:
/** This signal is emitted when the command history gets cleared. */
void historyCleared();
/**
* This signal is emitted when a command is executed.
*
* The executed command is given as the argument.
*/
void commandExecuted( VCommand* );
/** This signal is emitted when a command is executed. */
void commandExecuted();
/**
* This signal is emitted when a command is added to the history.
*
* The added command is given as the argument.
*/
void commandAdded( VCommand* );
/** This signal is emitted when the first (oldest) command is removed. */
void firstCommandRemoved();
/** This signal is emitted when the last (latest) command is removed. */
void lastCommandRemoved();
/**
* This signal is emitted when the actual document state matches the last saved one.
*
* Use documentSaved to set the last saved document state.
*/
void documentRestored();
private:
// helpers
void clipCommands();
void updateActions();
KarbonPart *m_part;
unsigned int m_undoLimit;
unsigned int m_redoLimit;
TDEAction *m_undo;
TDEAction *m_redo;
TQPtrList<VCommand> m_commands;
int m_savedPos;
};
#endif