You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

118 lines
2.5 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

//////////////////////////////////////////////////////////////////////////////
//主要功能: Undo and Redo的全局操作函数为了区分符号修改与文件修改的Redo/Undo
//
//程序编写: 2006-12-07
/////////////////////////////////////////////////////////////////////////////
#if !defined(UNDOMANAGER_H)
#define UNDOMANAGER_H
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
#ifdef _MSC_VER
#pragma warning(disable:4786)
#endif
#include <deque>
#include <vector>
#include "UMString.h"
namespace NAction
{
/**
* Action 详情
*/
struct ActionDetail
{
std::string uuid;
std::string classType;
std::string createAt;
};
class CAction;
class CActionManager
{
public:
enum StackKind
{
UNDO,
REDO
};
public:
CActionManager(void *actionTarget);
virtual ~CActionManager();
void RemoveLastAction();
void ClearTarget();
long GetStackCapacity() const;
void SetStackCapacity(long capacity);
void SetLastAction(CAction *itsLastAction);
const UMString & GetActionName(StackKind kind, long pos) const;
long GetStackSize(StackKind kind) const;
virtual int Undo(long nActions = 1);
virtual bool CanUndo(long nActions = 1) const;
virtual int Redo(long nActions = 1);
virtual bool CanRedo(long nActions = 1) const;
void * GetTarget() const;
void TargetCleaned();
void SavePostion();
bool IsModified();
// we use a deque so that we can pop off both ends
// (e.g., off the bottom during overflow) and so we
// can access all actions, say when building an undo
// menu, rather than just the top; also note that we
// push onto the back (like you would with a vector)
typedef std::deque<CAction *> ActionStack;
const ActionStack& GetUndoStack() const;
const ActionStack& GetRedoStack() const;
/**
* 列出 * Action 清单
*
* \return
*/
std::vector<ActionDetail> ListActionDetails() const;
/**
* 恢复到指定 action如果为 uuid 为空,表示恢复到原图件
*
* \param uuid
*/
void RestoreToTargetAction(const std::string& targetUUID);
protected:
virtual void DeleteActions(ActionStack &aStack, long nActions);
//virtual void NotifyTarget(UINT operation, long nActions);
void * actionTarget;
ActionStack undoStack, redoStack;
long cleanMarker;
long capacity;
CAction* m_pSavedAction;
private:
/**
* 判断指定 uuid 的 Action 是否在 undo 栈中
*
* \param uuid
* \return
*/
bool InUndoStack(const std::string& uuid) const;
/**
* 判断指定 uuid 的 Action 是否在 redo 栈中
*
* \param uuid
* \return
*/
bool InRedoStack(const std::string& uuid) const;
};
} //end namespace
#endif