131 lines
3.9 KiB
C++
Executable File
131 lines
3.9 KiB
C++
Executable File
/**********************************************************************
|
|
*<
|
|
FILE: hold.h
|
|
|
|
DESCRIPTION:
|
|
|
|
CREATED BY: Dan Silva
|
|
|
|
HISTORY:
|
|
|
|
*> Copyright (c) 1994, All Rights Reserved.
|
|
**********************************************************************/
|
|
|
|
#ifndef __HOLD__H__
|
|
#define __HOLD__H__
|
|
|
|
#define RESTOBJ_DOES_REFERENCE_POINTER 1 // cmd ID for RestoreObj::Execute
|
|
#define RESTOBJ_GOING_TO_DELETE_POINTER 2 // cmd ID for RestoreObj::Execute
|
|
#define REFTARG_AUTO_DELETED 10 // cmd ID for HoldStore::Execute
|
|
|
|
#define HOLD_SYSTEM_EMPTY 1 // cmd ID for Hold::Execute - return 1 if hold system is definitely empty
|
|
#define HOLD_POINTER_IS_MANAGER 2 // cmd ID for Hold::Execute - return 1 if arg1 is a pointer to the undo manager
|
|
#define HOLD_SUPERLEVEL 3 // cmd ID for Hold::Execute - return Hold.superLevel
|
|
|
|
class HoldStore;
|
|
class RestoreObj : public InterfaceServer {
|
|
friend class HoldStore;
|
|
friend class GenUndoObject;
|
|
friend class CheckForFlush;
|
|
RestoreObj *next,*prev;
|
|
public:
|
|
RestoreObj() { next = prev = NULL; }
|
|
virtual ~RestoreObj() {};
|
|
virtual void Restore(int isUndo)=0;
|
|
virtual void Redo()=0;
|
|
virtual int Size() { return 1; }
|
|
virtual void EndHold() { }
|
|
virtual TSTR Description() { return TSTR(_T("---")); }
|
|
virtual INT_PTR Execute(int cmd, ULONG_PTR arg1=0, ULONG_PTR arg2=0, ULONG_PTR arg3=0) {return -1;}
|
|
// WIN64 Cleanup: Shuler
|
|
};
|
|
|
|
class Hold : public BaseInterfaceServer {
|
|
HoldStore *holdStore, *holdList;
|
|
int undoEnabled;
|
|
int superLevel;
|
|
int putCount;
|
|
HoldStore *ResetStore();
|
|
void Init();
|
|
void AddOpToUndoMgr(TCHAR *name,int id);
|
|
public:
|
|
CoreExport Hold();
|
|
CoreExport ~Hold();
|
|
CoreExport void Put(RestoreObj *rob);
|
|
CoreExport void Begin();
|
|
CoreExport void Suspend(); // temporarly suspend holding
|
|
CoreExport int IsSuspended();
|
|
CoreExport void Resume(); // resume holding
|
|
CoreExport int Holding(); // are we holding?
|
|
CoreExport int Restoring(int& isUndo);
|
|
CoreExport int Redoing();
|
|
CoreExport int RestoreOrRedoing();
|
|
CoreExport void DisableUndo(); // prevents Undo when Accept is called.
|
|
CoreExport void EnableUndo();
|
|
CoreExport void Restore(); // Restore changes from holdStore.
|
|
CoreExport void Release(); // Tosses out holdStore.
|
|
|
|
// 3 ways to terminate the Begin()...
|
|
CoreExport void End(); // toss holdStore.
|
|
CoreExport void Accept(int nameID); // record Undo (if enabled), End();
|
|
CoreExport void Accept(TCHAR *name);
|
|
CoreExport void Cancel(); // Restore changes, End()
|
|
|
|
//
|
|
// Group several Begin-End lists into a single Super-group.
|
|
CoreExport void SuperBegin();
|
|
CoreExport void SuperAccept(int nameID);
|
|
CoreExport void SuperAccept(TCHAR *name);
|
|
CoreExport void SuperCancel();
|
|
|
|
// Get the number of times Put() has been called in the current session of MAX
|
|
CoreExport int GetGlobalPutCount();
|
|
|
|
CoreExport INT_PTR Execute(int cmd, ULONG_PTR arg1=0, ULONG_PTR arg2=0, ULONG_PTR arg3=0);
|
|
|
|
protected:
|
|
friend HoldStore;
|
|
unsigned flags;
|
|
enum {
|
|
kInRestore,
|
|
kInUndo,
|
|
kInRedo
|
|
};
|
|
};
|
|
|
|
|
|
|
|
extern CoreExport Hold theHold;
|
|
|
|
void CoreExport EnableUndoDebugPrintout(BOOL onoff);
|
|
|
|
// A class to help control the hold system. Create an instance of this class, and when it is
|
|
// destructed any hold suspends are resumed. Makes it safe in case a throw occurs after the suspend,
|
|
// but before the resume
|
|
class HoldSuspend {
|
|
private:
|
|
int suspendCount;
|
|
public:
|
|
HoldSuspend(BOOL suspendNow = TRUE) {
|
|
if (suspendNow) {
|
|
theHold.Suspend ();
|
|
suspendCount=1;
|
|
}
|
|
else
|
|
suspendCount = 0;
|
|
}
|
|
void Suspend() {
|
|
if (suspendCount == 0) theHold.Suspend ();
|
|
suspendCount++;
|
|
}
|
|
void Resume() {
|
|
if (suspendCount == 1) theHold.Resume ();
|
|
if (suspendCount != 0) suspendCount--;
|
|
}
|
|
~HoldSuspend() { for (int i=0; i < suspendCount; i++) theHold.Resume ();};
|
|
};
|
|
|
|
|
|
|
|
#endif //__HOLD__H__
|