Undo.hpp

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