C:\home\SVGCats_src\src\Undo.hpp
1|/*********************************************************************** 2| 1. <<< SVGCsts 用アンドゥバッファ (Undo) >>> 3|************************************************************************/ 4| 5|#ifndef __UNDO_HPP 6|#define __UNDO_HPP 7| 8| 9|#ifndef USES_UNDO 10|#define USES_UNDO 11| 12|#ifdef __cplusplus 13|class Undo_Buf; 14|struct Undo_Step_Com; 15|struct Undo_Step; 16|struct Undo_Step_Ink; 17|struct Undo_Step_Page; 18|struct Undo_InkAttr; 19|#endif 20| 21|#endif 22| 23|typedef struct _SVGCat_Page SVGCat_Page; 24|class CMainFrame; 25| 26|/* インク用アンドゥバッファのため Tablet PC SDK の msinkaut.h よりコピー */ 27|#ifndef __IInkDisp_FWD_DEFINED__ 28|#define __IInkDisp_FWD_DEFINED__ 29|typedef interface IInkDisp IInkDisp; 30|#endif /* __IInkDisp_FWD_DEFINED__ */ 31| 32|#ifndef __IInkStrokes_FWD_DEFINED__ 33|#define __IInkStrokes_FWD_DEFINED__ 34|typedef interface IInkStrokes IInkStrokes; 35|#endif /* __IInkStrokes_FWD_DEFINED__ */ 36| 37|#ifndef __IInkRectangle_FWD_DEFINED__ 38|#define __IInkRectangle_FWD_DEFINED__ 39|typedef interface IInkRectangle IInkRectangle; 40|#endif /* __IInkRectangle_FWD_DEFINED__ */ 41| 42| 43| 44|/*-----------------------------------------------------------------*/ 45|/* 2. <<< Interface Area ---------------------------------------- >>> */ 46|/*-----------------------------------------------------------------*/ 47| 48| 49| 50|/*********************************************************************** 51| 3. <<< [Undo_Buf] アンドゥバッファ >>> 52|【補足】 53|・m_Now, m_Save は、集合操作のときは、スタックの最も浅い要素をポイントします。 54|・複数を一度にアンドゥできるようにするには、アンドゥするときもリドゥするときも 55| 奥の図形から処理します。 56|・スタックなので、複数の図形を一度に生成したときは、手前の図形から登録します。 57|************************************************************************/ 58|class Undo_Buf { 59|public: 60| ListX m_Steps; /* Undo_Step_Com 型のリスト、スタック構造 */ 61| Undo_Step_Com* m_Now; /* 次のアンドゥを行う steps の要素, NULL=これ以上アンドゥは無い */ 62| Undo_Step_Com* m_Save; /* ファイルへ保存した直前の操作の steps の要素 */ 63| int m_MultiNum; /* 複数同時操作の図形番号 */ 64| int m_MultiNest; /* StartMulti の深さ */ 65| 66| ListX m_holds; /* 操作をした図形へのポインタの集合、ListX_ElemX::CadPrim* */ 67| IInkStrokes* m_holdStrokes; /* 操作をしたインク(所有) */ 68| 69| ListX m_deletedPages; /* 削除されたページの所有者, 削除の新しい順, ツリーの浅いもの順, SVGCat_Page* */ 70| int m_PageDelNum; /* 次のアンドゥを行うページ削除ID, Ink一時ファイル用 */ 71| 72| Undo_Buf(); 73| ~Undo_Buf(); 74| 75| void print( const char* title ); 76| 77| void StartMulti(); 78| void AllocNewStep( CadPrim* before, CadPrim* after, 79| CadPrim* before_f, CadPrim* after_f, int iPage ); 80| void AllocNewStep_Ink( int op, IInkDisp* ink, IInkStrokes* strokes, 81| int dx, int dy, int iPage ); 82| void AllocNewStep_Ink2( int op, IInkDisp* ink, IInkStrokes* strokes, 83| bool bPlus, int iPage ); 84| void AllocNewStep_Ink3( int op, IInkStrokes* strokes, 85| Undo_InkAttr* before, Undo_InkAttr* after, int iPage ); 86| int AllocNewStep_Page( int beforeNum_start, int beforeNum_over, 87| int beforeType, int afterNum, int afterType, SVGCat_Page* delPage_list ); 88| int AllocNewStep_PageTitle( int pageNum, const char* before, const char* after ); 89| void EndMulti(); 90| 91| void ClearAfterSteps(); 92| void ClearAll(); 93| 94| ListX* Undo( CMainFrame* frame, IInkDisp* ink ); 95| bool IsAbleUndo(); 96| int GetNextRedoPageNum(); 97| ListX* Redo( CMainFrame* frame, IInkDisp* ink ); 98| bool IsAbleRedo(); 99| int GetNextUndoPageNum(); 100| void Relink( ListX* prims ); 101| 102| void OnSaveed(); 103| bool IsModify(); 104|}; 105| 106| 107| 108|/*********************************************************************** 109| 4. <<< [Undo_Step_Com] 操作ステップ(スーパークラス) >>> 110|【補足】 111|・サブクラスにいかのものがあります。Undo_Step、Undo_Step_Ink、Undo_Step_Page 112|************************************************************************/ 113|struct Undo_Step_Com { 114| ListX_Elem inherit_ListX_Elem; 115| int typeID; /* サブクラス識別番号(下記) */ 116| bool bFirstOfMulti; /* 集合操作の最初(スタックの奥)のステップかどうか */ 117| int iPage; /* ページ番号(app->m_pages の要素番号) */ 118|}; 119| 120|/* 5. <<< [Undo_Step_Com::typeID] の値 >>> */ 121|#define Undo_PrimType 0 122|#define Undo_InkType 1 123|#define Undo_PageType 2 124| 125| 126| 127|/*********************************************************************** 128| 6. <<< [Undo_Step] 図形用操作ステップ >>> 129|************************************************************************/ 130|struct Undo_Step { 131| ListX_Elem inherit_ListX_Elem; 132| int typeID; /* typeID == Undo_PrimType */ 133| bool bFirstOfMulti; /* 集合操作の最初(スタックの奥)のステップかどうか */ 134| int iPage; /* ページ番号(app->m_pages の要素番号) */ 135| /* 以上が、Undo_Step_Com より継承されたメンバ変数 */ 136| 137| CadPrim* before; /* 操作前の図形のコピー(所有), NULL=生成 */ 138| CadPrim* after; /* 捜査後の図形のコピー(所有), NULL=削除 */ 139| CadPrim* before_z; /* Z オーダーで1つ手前(next)の図形のコピー(所有), NULL=生成orトップ */ 140| CadPrim* after_z; /* Z オーダーで1つ手前(next)の図形のコピー(所有), NULL=削除orトップ */ 141| /* Z オーダーが変化しない編集では、before_z=after_z=NULL でも可 */ 142| SVGCat_Page* page; /* デストラクタ起動前の CadPrim::AdjustLinks 用 */ 143|}; 144| 145| 146| 147|/*********************************************************************** 148| 7. <<< [Undo_Step_Ink] インク用操作ステップ >>> 149|************************************************************************/ 150|struct Undo_Step_Ink { 151| ListX_Elem inherit_ListX_Elem; 152| int typeID; /* typeID == Undo_InkType */ 153| bool bFirstOfMulti; /* 集合操作の最初(スタックの奥)のステップかどうか */ 154| int iPage; /* ページ番号(app->m_pages の要素番号) */ 155| /* 以上が、Undo_Step_Com より継承されたメンバ変数 */ 156| 157| int op; /* 操作内容 */ 158| long* stroke_id2s; /* Undo_StrokeTable の配列番号の配列([0]=ストローク数) */ 159| union { 160| int dx; /* [Move, Resize] dx, dy 移動量、拡大縮小矩形サイズの変化量 */ 161| IInkDisp* strokesInk; /* [Add, Del] 復帰するストロークのコピー */ 162| Undo_InkAttr* beforeAttr; /* [ChgAttr] 変更前の属性(所有、要素数はストローク数) */ 163| }; 164| union { 165| int dy; 166| IInkRectangle* boundingBox; /* [Add, Del] 復帰するときの位置 */ 167| Undo_InkAttr* afterAttr; /* [ChgAttr] 変更後の属性(所有、要素数はストローク数) */ 168| }; 169|}; 170| 171|/* 8. <<< [Undo_Step_Ink::op] の値 >>> */ 172|#define Undo_Ink_Move 1 173|#define Undo_Ink_Resize 2 174|#define Undo_Ink_Add 3 175|#define Undo_Ink_Del 4 176|#define Undo_Ink_ChgAttr 5 177| 178| 179| 180|/*********************************************************************** 181| 9. <<< [Undo_InkAttr] インクの属性のコピー >>> 182|************************************************************************/ 183|struct Undo_InkAttr { 184| long color; 185| float width; 186|}; 187| 188| 189|Undo_InkAttr* Undo_InkAttr_new( IInkStrokes* strokes ); 190|void Undo_InkAttr_resume( Undo_InkAttr* m, IInkStrokes* strokes ); 191| 192| 193| 194| 195|/*********************************************************************** 196| 10. <<< [Undo_Step_Page] ページ用操作ステップ >>> 197|【内部補足】 198|・beforeType == 1 のとき、beforeNum_over は、前の兄弟のページ番号になります。 199|************************************************************************/ 200|struct Undo_Step_Page { 201| ListX_Elem inherit_ListX_Elem; 202| int typeID; /* typeID == Undo_PageType */ 203| bool bFirstOfMulti; /* 集合操作の最初(スタックの奥)のステップかどうか */ 204| int iPage; /* -1 固定 */ 205| /* 以上が、Undo_Step_Com より継承されたメンバ変数 */ 206| 207| int beforeNum_start; /* 操作対象の最初のページ番号(新規作成 = -1)*/ 208| int beforeNum_over; /* 操作対象の最後の次のページ番号(新規作成 = -1, →内部補足) */ 209| int afterNum; /* 移動後や生成するページ番号(削除 = -1, タイトル編集=beforeNum_start)*/ 210| union { 211| SVGCat_Page* firstPage; /*[削除] 削除対象の最初、Undo_Buf::m_deletedPages 内へのポインタ(NULL) */ 212| int beforeType; /*[移動] 移動前の位置、1=次の兄弟はいない、2=孤独な子、0=その他 */ 213| char* beforeTitle; /*[タイトル編集] 編集前のタイトル、Undo_Buf所有 */ 214| }; 215| union { 216| int iFirstPage; /*[削除] ページ削除ID, Ink一時ファイル用、(削除ではない=-1) */ 217| int redoBaseNum; /*[移動] 0=afterNumの前、正=Redoでこのページの後に入れる、負=Redo でこのページの子に入れる */ 218| char* afterTitle; /*[タイトル編集] 編集後のタイトル、Undo_Buf所有 */ 219| }; 220|}; 221| 222| 223|/*********************************************************************** 224| 11. <<< [Undo_StrokesTable] ストロークの識別番号の対応テーブル >>> 225|【補足】 226|・アンドゥ・リドゥの対象となるストロークを取得するためのテーブルです。 227|・アンドゥ・リドゥで識別するストロークの識別番号(ID2, Undo_Step_Ink::stroke_id2s) 228| から、IInkOverlay 等で管理されているストロークの ID を取得するためのテーブルです。 229|・削除のアンドゥなどをしたとき、ID を更新します。 230|・このテーブルは、インクが拡大縮小ができ、削除のアンドゥをしたときに丸められてしまうため、 231| 座標によるストロークの識別ができないためにあります。 232|************************************************************************/ 233|extern long* Undo_StrokeTable_Ids; /* ID の配列の配列(配列番号は ID2)*/ 234|extern int Undo_StrokeTable_n; /* 要素数 */ 235|extern int Undo_StrokeTable_m; /* テーブルサイズ */ 236| 237|void Undo_StrokeTable_init(void); 238|void Undo_StrokeTable_finish(void); 239|void Undo_StrokeTable_clear(void); 240| 241|long* Undo_StrokeTable_addId2( IInkStrokes* strokes, long* id2s ); 242|long* Undo_StrokeTable_lookupId2( IInkStrokes* strokes, long* id2s ); /* ユーザ操作時 */ 243|IInkStrokes* Undo_StrokeTable_lookupStrokes( long* id2s, IInkDisp* ink ); /* アンドゥ・リドゥ開始時 */ 244|void Undo_StrokeTable_updateStrokes( long* id2s, IInkStrokes* strokes ); /* アンドゥ・リドゥ終了時 */ 245| 246| 247| 248|/*********************************************************************** 249| 12. <<< [Undo_Uty] その他 >>> 250|************************************************************************/ 251|CadPrim* Undo_Uty_getPrimPtr( ListX* prims, int id ); 252|CadPrim* Undo_Uty_createPrim( CadPrim* prim, CadPrim* prim_f, ListX* prims ); 253|void Undo_Uty_deletePrim( CadPrim* target, ListX* prims ); 254|CadPrim* Undo_Uty_editPrim( CadPrim* target, CadPrim* newPrim, CadPrim* target_z, 255| CadPrim* newPrim_z, ListX* prims, Canvas* canvas ); 256| 257|IInkStrokes* Undo_Uty_addStrokes( IInkDisp* masterInk, IInkDisp* strokesInk, 258| IInkRectangle* boundingBox ); 259| 260| 261|/*-----------------------------------------------------------------*/ 262|/* 13. <<< Mapping Area ------------------------------------------ >>> */ 263|/*-----------------------------------------------------------------*/ 264| 265| 266| 267|/*********************************************************************** 268| 14. <<< [Undo_StrokesTable_init] 初期化する >>> 269|【補足】 270|・void Undo_StrokesTable_init(void); 271|************************************************************************/ 272|#define Undo_StrokeTable_init() \ 273| ( Undo_StrokeTable_Ids = (long*)malloc( sizeof(long) * 256 ), \ 274| Undo_StrokeTable_n = 0, Undo_StrokeTable_m = 256 ) 275| 276| 277| 278|/*********************************************************************** 279| 15. <<< [Undo_StrokesTable_finish] 後始末する >>> 280|【補足】 281|・void Undo_StrokesTable_finish(void); 282|************************************************************************/ 283|#define Undo_StrokeTable_finish() \ 284| ( Undo_StrokeTable_clear(), free( Undo_StrokeTable_Ids ) ) 285| 286| 287| 288|#endif 289| 290|