Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

HistoryList.h

Go to the documentation of this file.
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  

Generated on Sun Feb 9 12:53:51 2003 for NemesisCore by doxygen1.3-rc2