UNDO pro slidy

Title UNDO pro slidy
Author Jiří Krutil
Date 7. 12. 1998
Reference jkru5249@artax.karlin.mff.cuni.cz
File plpoint/docs/slideUNDO.html
Project KTTV
Version 2
 

    Základní princip

    Jak bylo dohodnuto, Undo je společné pro editory slidů i textu. Pracuje s jedním společným undo a jedním redo zásobníkem. Při každé zaznamenávané editační operaci se na undo zásobník zapíše informace o tom, jaká operace to byla a také všechny údaje potřebné k jejímu vrácení zpět. To, které události se zaznamenávají a jak, si určují oba editory každý zvlášť pro své operace.
    V případě vyvolání funkce undo uživatelem se provedou následující kroky:     Při každém Undo tedy na redo zásobník přibude jedna operace. Jakmile ale uživatel provede jakoukoli jinou zaznamenávanou operaci než Undo, zásobník redo se smaže. Jinými slovy, při každém zápisu do zásobníku undo se vyprázdní obsah zásobníku redo. Na druhou stranu, při každém provedení redo se dotyčná operace zanovu ocitne na undo zásobníku (viz odstavec "Vztah Undo - Redo" na konci dokumentu).

    Data na zásobníku

    Zde je popsáno, co se zapisuje na undo/redo zásobník. Na zásobník se vždy uloží objekt (mluvíme o editoru slidů) následující údaje (v obráceném pořadí):

    Zaznamenávané operace

    Editor slidů bude rozlišovat následující zaznamenávané operace a jejich údaje:

    Reprezentace dat na zásobníku

    K dispozici by byl objekt, který by se o zásobník staral a uměl by na něj zapisovat nebo z něj číst. Tento zásobník by obsahoval pouze ukazatele na objekty, které by byly potomky třídy UndoElement. Tato obecná nadtřída by obsahovala pouze informaci o tom, který editor zápis na zásobník provedl. O obsah objektu by se už zajímal tento editor, ne obejkt spravující zásobník undo. Zmíněný zásobník je společný pro editor slidů a pro editor prezentací.

    Vztah Undo - Redo

    Při provedení Undo se (jak již bylo zmíněno) na zásobník Redo uloží záznam inverzní k záznamu, který byl na zásobníku Undo. Tento nový záznam by měl vystihovat operaci, která byla původně provedena a teď ji uživatel ruší. Tento záznam pak lze při ev. zavolání funkce Redo použít naprosto stejně jako záznam z undo zásobníku, dokonce to může dělat přímo metoda UndoOperation.
    Vytvoření inverzního záznamu k záznamu používanému pro Undo je snadné pro všechny přápady kromě operace nastavení vlastností. Takový záznam dokonce ani neobsahuje nadbytečné informace, ale pouze ty, které jsou nutné k jednoznačnému znovuprovedení operace, kterou uživatel zrušil pomocí Undo.
    V případě nastavení vlastnosti(-í) by bylo možné rozlišovat nastavení každé vlastnosti zvlášť jako samostatnou zaznamenávanou událost. Podle mého názoru by to bylo zbytečně pracné a navíc by se při změně několika vlastností najednou zbytečně vyčerpalo víc úrovní Undo. Navrhuji udržovat vše v jedné instanci třídy Properties, která běžně nese informace o aktuálním stavu vlastností pro každý element. Použití by bylo následující:
    Při změně vlastností pro element(-y) by se na undo zásobník zkopíroval objekt Properties (je-li elementů více, pak pro každý zvlášť). Provedl-li by pak uživatel Undo, nejprve by se na redo zásobník zkopírovala instance třídy Properties nesoucí již změněné informace a pak by se tato aktuální instance přepsala tou z undo zásobníku. V případě zavolání Redo by se zavolalo "Undo na Undo", jak již bylo zmíněno: Prostě by se provedla metoda UndoOperation, ale s prohozenými zásobníky undo a redo. Tím by se mimo jiné dosáhlo toho, že jakmile by se nějaká operace zopakovala pomocí Redo, automaticky by se ocitla znovu na undo zásobníku.
    Zápis ostatních operací na redo zásobník jako inverzních je triviální.