00001 #ifndef HistoryListH 00002 #define HistoryListH 00003 00004 /******************************************************************************* 00005 Copyright 2000,2001,2002 Petr Kulhanek 00006 00007 This file is part of Core plugin. 00008 00009 Core plugin is free software; you can redistribute it and/or modify 00010 it under the terms of the GNU General Public License as published by 00011 the Free Software Foundation; either version 2 of the License, or 00012 (at your option) any later version. 00013 00014 Core plugin is distributed in the hope that it will be useful, 00015 but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00017 GNU General Public License for more details. 00018 00019 You should have received a copy of the GNU General Public License 00020 along with Core plugin; if not, write to the Free Software 00021 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00022 *******************************************************************************/ 00023 /******************************************************************************* 00024 ** PROJEKT: HiPoLy - HIgh POrtability LibrarY 00025 ** SOUBOR: HistoryList 00026 ** ÚČEL: slouží k záznamu změn 00027 ** VERZE: 2.0 00028 ** JAZYK: C++ Builder 00029 ** CÍLOVÝ POČÍTAČ: IBM PC 00030 ** PROGRAMÁTOR: Petr Kulhánek 00031 ** HISTORIE ÚPRAV: 00032 VERZE DATUM POZNÁMKA 00033 1.0 ??.??.???? vznik třídy pro záznam změn 00034 1.1 2000-09-23 drobné upravy kódu 00035 2000-11-02 zavedení lokalizace on-the-fly 00036 2.0 2001-04-05 zavedená obecná část, část související s projektem NEMESIS 00037 byla přenesena do Core.dll 00038 *******************************************************************************/ 00039 00043 /* HLAVIČKOVÉ SOUBORY *********************************************************/ 00044 00045 #include "CoreMainHeader.h" 00046 #include "SmallString.h" 00047 #include "SimpleList.h" 00048 00049 /* KONEC HLAVIČKOVÝCH SOUBORů *************************************************/ 00050 00051 00052 //------------------------------------------------------------------------------ 00053 00054 /* 00055 ZÁKLADNÍ FILOZOFIE PRÁCE s HISTORY_LISTEM 00056 00057 Každá změna je charakterizovaná třídou, která obsahuje data, pomocí nichž lze 00058 změnu rekonstruovat. Každá tato třída se odvozuje buď od CHistoryRecord nebo 00059 od CElementsRecord. 00060 CHistoryRecord - se použije jako bázová třída v případě, že změna je malá a 00061 jednoduše popsatelná. např. změna jména, řádu vazby aj. 00062 Tato třída je ve verzi 1.1 zrušena a vše přebírá CElementData 00063 00064 CElementsRecord - se použije u složitých změn nebo složenin změn. 00065 např.: při strukturních změnách (mazání atomu, vložení 00066 struktury), popř. pokud chceme, aby sbirka změn (např. změna 00067 jména několika objektů) byla zaznamenána jako jedna 00068 registrovaná změna. 00069 POZOR: Pro identifikaci objektu používejte vždy hodnotu vrácenou funkci GetIndex(), 00070 pouze toto číslo jednoznačne identifikuje objekt. (objekty se mohou během změn 00071 vytvářet nebo odstraňovat). 00072 00073 Každá z těchto tříd má dvě čisté virtuální funkce: 00074 Forward() - provede změnu objektu ve směru provedené změny (tedy REDO), pokud 00075 však vzniká nebo zaniká objekt má bez ohledu na charakter změny 00076 význam konstrukce objektu 00077 Backward() - provede změnu objektu ve směru opačném vůči provedené změně (tedy 00078 UNDO), pokud však vzniká nebo zaniká objekt má bez ohledu na 00079 charakter změny význam destrukce objektu 00080 V případě konstrukce a destrukce objektu reálný směr změny, je určen hodnotou 00081 Create - TRUE - ve směru Forward(konstrukce) 00082 - FALSE - ve směru Backward(destrukce) 00083 POZOR: během konstrukce a destrukce se musí zachovat UIndex objektu (hodnota 00084 vrácená funkci GetIndex() 00085 00086 Záznam změn je inkrementální a proto je nutné, aby se zajistila úplná zpětnost 00087 obnovy dat. 00088 00089 */ 00090 00091 /* DEFINICE TŘÍD **************************************************************/ 00092 00094 00097 class NEMESIS_CORE_PACKAGE CElementData{ 00098 public: 00099 __fastcall CElementData(bool forward_direction); 00100 virtual __fastcall ~CElementData(void); 00101 void __fastcall MakeChange(void); // provede změnu ve správném směru 00102 bool __fastcall IsInForwardDirection(void); 00103 00104 private: 00105 virtual void __fastcall Forward(void)=0; // vpřed 00106 virtual void __fastcall Backward(void)=0; // vzad 00107 bool ForwardDirection; // konstrukce při dopředném směru? 00108 }; 00109 00110 //------------------------------------------------------------------------------ 00111 00113 00125 class NEMESIS_CORE_PACKAGE CElementsRecord : public CElementData{ 00126 public: 00127 00128 // konstruktor a destruktor --------------------------------------------------- 00129 __fastcall CElementsRecord(bool forward_direction,const CSmallString& change_tag); 00130 virtual __fastcall ~CElementsRecord(void); 00131 00132 // registrace elementární změny ----------------------------------------------- 00133 void __fastcall Register(CElementData* data); // registruje elementarní data 00134 00135 // vrací popis změny v daných směrech ----------------------------------------- 00136 CSmallString __fastcall GetUndoDescription(void); // dlouhý popis - plně popisuje změnu 00137 CSmallString __fastcall GetRedoDescription(void); 00138 00139 CSmallString __fastcall GetShortUndoDescription(void); // krátký popis - výstižné vyjádření změny 00140 CSmallString __fastcall GetShortRedoDescription(void); 00141 00142 inline void __fastcall SetChangeTag(const CSmallString& tag); 00143 00144 // sekce soukromých dat ------------------------------------------------------- 00145 private: 00146 CSmallString ChangeTag; // jednoznačný popisovač formátovacího tagu 00147 00148 CSimpleList<CElementData> Elements; // elementární data 00149 int NumOfCopies; // počet zrcadlených duplikátů 00150 CElementsRecord* Original; 00151 00152 void __fastcall Destroy(void); // odstraní objekt pokud NumOfCopies == 0 00153 // zjištění popisu --------------------------------------------------------- 00154 00155 virtual CSmallString __fastcall GetDescription(const CSmallString& format); 00156 virtual void __fastcall Forward(void); // vpřed 00157 virtual void __fastcall Backward(void); // vzad 00158 00159 friend class CHistoryList; 00160 }; 00161 00162 //------------------------------------------------------------------------------ 00163 // ############################################################################# 00164 //------------------------------------------------------------------------------ 00165 00166 enum EChangeMessage{ 00167 OTHER, 00168 HISTORY_UNDO, // provedeno undo 00169 HISTORY_REDO, // provedeno redo 00170 HISTORY_BUFFER_CHANGE, // změněn obsah bufferu bez změny struktury 00171 DATA_WERE_SAVED, // data byla uložena 00172 }; 00173 00174 00175 typedef void __fastcall (__closure * _FChange)(EChangeMessage message); 00176 00177 //------------------------------------------------------------------------------ 00178 00180 00183 class NEMESIS_CORE_PACKAGE CHistoryList{ 00184 public: 00185 enum EUndoMode{ 00186 Mode_1, 00187 Mode_2, 00188 }; 00189 00190 // metody - konstruktor a destruktor ------------------------------------------ 00191 __fastcall CHistoryList(void); 00192 __fastcall ~CHistoryList(void); 00193 00194 // metody - nastavení hloubky změn -------------------------------------------- 00195 void __fastcall SetDepthOfBuffer(int depth); 00196 void __fastcall SetUndoMode(EUndoMode mode); 00197 void __fastcall RemoveAllRecords(void); 00198 00199 // metody - uzamčení - nastavení úrovně uzamčení ------------------------------ 00200 void __fastcall SetLockModeLevel(int level); 00201 int __fastcall GetLockModeLevel(void) const; 00202 00203 // metody - exekuce - provedení změn v daném směru ---------------------------- 00204 bool __fastcall Undo(int i=0); // undo i - hloubka změny 00205 bool __fastcall Redo(int i=0); // redo i - hloubka změny 00206 00207 // metody - iterace popisu změn ----------------------------------------------- 00208 bool __fastcall GetFirstUndoName(CSmallString& text,bool short_type=true); // zjištuje jména změn 00209 bool __fastcall GetNextUndoName(CSmallString& text,bool short_type=true); 00210 bool __fastcall GetFirstRedoName(CSmallString& text,bool short_type=true); 00211 bool __fastcall GetNextRedoName(CSmallString& text,bool short_type=true); 00212 00213 // metody - popis aktivních změn ---------------------------------------------- 00214 bool __fastcall IsUndoActive(void); // určuje stav undo a redo bufferů 00215 bool __fastcall IsRedoActive(void); 00216 00217 // metody - exekuce záznamu změn ---------------------------------------------- 00218 bool __fastcall BeginChange(int lockmodelevel); // metody pro záznam změn 00219 void __fastcall RegisterChange(CElementsRecord *record); 00220 void __fastcall EndChange(void); 00221 00222 // událost - změna seznamu změn 00223 __property _FChange OnChange = {read = ChangeFce,write = ChangeFce}; 00224 00225 // sekce soukromých dat ------------------------------------------------------- 00226 private: 00227 CSimpleList<CElementsRecord> Histories; // seznam změn 00228 CSimpleList<CElementsRecord> RegHistories; // seznam změn v RegisterChange 00229 00230 00231 CSimpleIterator<CElementsRecord> UndoIter; // iterátor pro získání popisů změn 00232 CSimpleIterator<CElementsRecord> RedoIter; // iterátor pro získání popisů změn 00233 00234 int LockModeLevel; // úroveň uzamčení 00235 EUndoMode UndoMode; // typ undo 00236 00237 bool RedoStatus; // určuje zda je povolen redo 00238 int RedoIterCounter; // pomocná proměnná pro získávání popisu pro redo 00239 int NumOfRedo; // počet realizovatelných redo změn 00240 int NumOfMaxChanges; // maximální počet změn 00241 00242 _FChange ChangeFce; 00243 00244 void __fastcall OnChangeStatus(EChangeMessage message); 00245 }; 00246 00247 /* KONEC DEFINICE TŘÍD ********************************************************/ 00248 00249 inline void __fastcall CElementsRecord::SetChangeTag(const CSmallString& tag) 00250 { 00251 ChangeTag = tag; 00252 } 00253 00254 #endif 00255