Monday, May 28, 2007

Undo / Redo galimybės programoje (2 dalis)

Ankščiau rašiau apie tai, kad mūsų kuriamoje desktop programoje reikia galimybės atšaukti naudotojo padarytus veiksmus.

Nors API undo atžvilgiu dar nėra iki galo nusistovėjusi (tiesą sakant, undo mechanizmas šiek tiek *nervina*, nes jam *palaikyti* reikia tam tikrų pastangų), sprendimas yra.

Sprendimas veikia, ir štai kaip jis maždaug atrodo.

Undo mechanizmui užtenka turėti sąrašą objektų, kurie gali atstatyti naują būseną į seną būseną. Tarkime, IMemento:


///
/// An interface for all undo / redo actions
///

public interface IMemento
{
///
/// Restores the state of the object.
///

/// A new memento, which performs the Redo action
IMemento Restore();
}


Kiekvienas IMememtno Restore() metode atstato kokią nors informaciją į prieš tai buvusį būvį.

Man kol kas prireikė dviejų memento tipų:
PropertyMenento - atstato bet kurio properčio reikšmę į prieš tai buvusį
DelegateMemento - lengvai kustomizuojamas memento per delegatus

No comments: