//--------------------------------------------------------------------------- #include #include #pragma hdrstop #include "NewGrouping_Undo.h" //--------------------------------------------------------------------------- #pragma package(smart_init) //--------------------------------------------------------------------------- __fastcall NewGrouingUndo::NewGrouingUndo(TUnionBitmap *_blurBitmap, TUnionBitmap *_previewBitmap, TUnionBitmap *_tempBitmap, TPWorkArea *_WorkArea) { DataOfUndo = new TList; ImageOfUndo = new TList; IndexOfUndo = -1; blurBitmap = _blurBitmap; previewBitmap = _previewBitmap; tempBitmap = _tempBitmap; WorkArea = _WorkArea; IsFirstRedo=true; } //--------------------------------------------------------------------------- __fastcall NewGrouingUndo::~NewGrouingUndo() { while(DataOfUndo->Count){ RemoveLast(DataOfUndo); } delete DataOfUndo; while(ImageOfUndo->Count){ RemoveLast(ImageOfUndo); } delete ImageOfUndo; } //--------------------------------------------------------------------------- bool __fastcall NewGrouingUndo::canundo() { return DataOfUndo->Count>0 && IndexOfUndo>-1; // return true; } //--------------------------------------------------------------------------- bool __fastcall NewGrouingUndo::canredo() { return IndexOfUndo < DataOfUndo->Count-1; } //--------------------------------------------------------------------------- // do_´Â ¸ðµç actionÀü¿¡ ½ÇÇàÇÑ´Ù // setUndoData()¿¡ parameter·Î type°ú Image¸¦ TList¿¡ ÀúÀåÇÑ´Ù. void __fastcall NewGrouingUndo::do_(int ntype, int OncolorChip) { type = ntype; setUndoData(type, OncolorChip); switch(type) { case UT_BLUR: { blurBitmap->PartialUndo->AddUndo(); previewBitmap->PartialUndo->AddUndo(); break; } case UT_GROUP: { previewBitmap->PartialUndo->AddUndo(); break; } case UT_FILTER: { if (OncolorChip) tempBitmap->PartialUndo->AddUndo(); else previewBitmap->PartialUndo->AddUndo(); break; } case UT_CCPEN: { previewBitmap->PartialUndo->AddUndo(); break; } case UT_CCWORKAREA: { previewBitmap->PartialUndo->AddUndo(); break; } case UT_HALFTONE: { if (OncolorChip) tempBitmap->PartialUndo->AddUndo(); else previewBitmap->PartialUndo->AddUndo(); break; } case UT_WORKAREA: { WorkArea->UndoSave(); break; } } } //--------------------------------------------------------------------------- // OncolorChip : 0 - previewBitmap ( All Color Image) // 1 - tempBitmap ( Selected Color Image) void __fastcall NewGrouingUndo::undo(int OncolorChip) { if( canundo() ) { switch(getUndoData(IndexOfUndo--)) { case UT_BLUR: { blurBitmap->PartialUndo->LoadUndo(); previewBitmap->PartialUndo->LoadUndo(); break; } case UT_GROUP: { previewBitmap->PartialUndo->LoadUndo(); break; } case UT_FILTER: { if (OncolorChip) tempBitmap->PartialUndo->LoadUndo(); else previewBitmap->PartialUndo->LoadUndo(); break; } case UT_CCPEN: { previewBitmap->PartialUndo->LoadUndo(); break; } case UT_CCWORKAREA: { previewBitmap->PartialUndo->LoadUndo(); break; } case UT_HALFTONE: { if (OncolorChip) tempBitmap->PartialUndo->LoadUndo(); else previewBitmap->PartialUndo->LoadUndo(); break; } case UT_WORKAREA: { WorkArea->UndoRead(); break; } } } } //--------------------------------------------------------------------------- void __fastcall NewGrouingUndo::redo(int OncolorChip) { if( canredo() ) { switch(getUndoData(++IndexOfUndo)) { case UT_BLUR: { blurBitmap->PartialUndo->LoadRedo(); previewBitmap->PartialUndo->LoadRedo(); break; } case UT_GROUP: { previewBitmap->PartialUndo->LoadRedo(); break; } case UT_FILTER: { if (OncolorChip) tempBitmap->PartialUndo->LoadRedo(); else previewBitmap->PartialUndo->LoadRedo(); break; } case UT_CCPEN: { previewBitmap->PartialUndo->LoadRedo(); break; } case UT_CCWORKAREA: { previewBitmap->PartialUndo->LoadRedo(); break; } case UT_HALFTONE: { if (OncolorChip) tempBitmap->PartialUndo->LoadRedo(); else previewBitmap->PartialUndo->LoadRedo(); break; } case UT_WORKAREA: { WorkArea->RedoRead(); break; } } } } //--------------------------------------------------------------------------- void __fastcall NewGrouingUndo::setUndoData(int Type, int OnImage) { int *nType = new int; int *nOnImage = new int; *nType = Type; *nOnImage = OnImage; IndexOfUndo++; while(DataOfUndo->Count > IndexOfUndo) { RemoveLast(DataOfUndo); RemoveLast(ImageOfUndo); } DataOfUndo->Add(nType); ImageOfUndo->Add(nOnImage); } //--------------------------------------------------------------------------- // ÀúÀåµÈ TypeÀ» getÇÏ´Â ÇÔ¼ö int __fastcall NewGrouingUndo::getUndoData(int IndexOfUndo) { int *nTempInt; if(IndexOfUndoCount) { nTempInt=(int *)DataOfUndo->Items[IndexOfUndo]; } else { nTempInt=(int *)DataOfUndo->Last(); } return *nTempInt; } //--------------------------------------------------------------------------- // UndoData·Î ÀúÀåµÈ Image°¡ previewBitmapÀÎÁö tempBitmapÀÎÁö ±¸ºÐÇϱâ À§Çؼ­ // »ç¿ëµÈ´Ù. Redo/Undo°¡ µÇ±â Àü¿¡ Ç×»ó ¸ÕÀú ÀÌ ÇÔ¼ö°¡ È£ÃâµÇ¾î È®ÀÎÇÑ´Ù. int __fastcall NewGrouingUndo::getUndoImage(int IndexOfUndo) { int *nTempInt; if(IndexOfUndoCount) { nTempInt=(int *)ImageOfUndo->Items[IndexOfUndo]; } else { nTempInt=(int *)ImageOfUndo->Last(); } return *nTempInt; } //--------------------------------------------------------------------------- bool __fastcall NewGrouingUndo::RemoveLast(TList *DataOfList) { int * tempInt; tempInt = (int *)DataOfList->Last(); DataOfList->Remove(tempInt); delete tempInt; return true; } //---------------------------------------------------------------------------