class DOCUMENT_HISTORY
DOCUMENT_HISTORY è la classe di gestione della lista delle azioni effettuate su un documento (OPERATION_CALL). Il modo migliore per utilizzare questa interfaccia è quella di dichiararla pubblica su una classe; La classe DB_OBJECT già contiene l’interfaccia DOCUMENT_HISTORY, quindi qualunque classe derivata da essa già contiene l’interfaccia alla storia del documento. Ad esempio la classe SPECTRAL_IMAGE, che gestisce le immagini spettrali di Colibri, derivando da DB_OBJECT eredita anche DOCUMENT_HISTORY.
La classe mette a disposizione un insieme di metodi per la gestione della lista delle azioni; è una FIFO che viene popolata con il metodo Push e Redo, e svuotata con i metodi Pop, Undo, Flush.
La lista delle azioni Undo/Redo non è limitata: questo significa che l’uso della classe permette di gestire un numero qualunque di azioni di undo, limite posto solo dalle dimensioni della memoria e del disco a disposizione.
SetDocument(OPERATION_CALL *doc)
Questo metodo deve essere richiamato nel costruttore della classe per assegnare il documento di riferimento; Per le classi derivate da DB_OBJECT non è necessario richiamare questo metodo, poiché l’assegnazione è fatta nel costruttore di DB_OBJECT (vedi esempio che segue)
[sourcecode language=”cpp”]
DB_OBJECT::DB_OBJECT(void)
{
SetDocument(this); // assegna il documento al DOCUMENT_HISTORY
}
[/sourcecode]
Con questo metodo si informa l’interfaccia DOCUMENT_HISTORY che tutte le operazioni successive di Undo e Redo saranno relative al documento passato.
Push(ACTION *action)
Il metodo è usato per aggiungere alla lista un’azione di undo.
Pop()
Il metodo rimuove l’ultimo elemento inserito nella lista; chiamate successive di Pop svuotano la lista delle azioni in sospeso, dalla più recente alla più vecchia. In genere non esiste necessità di usare questa funzione, a meno che l’applicazione specifica non lo richiedA.
Flush()
Azzera la lista delle azioni di undo/redo. Il metodo è chiamato internamente dal distruttore di DOCUMENT_HISTORY, ma può essere richiamato comunque anche dall’applicazione. Tutte le operazioni di svuotamento della lista distruggono le istanze delle classi ACTION inserite con Push(); pertanto tutte le ACTION, sempre allocate dall’esterno, verranno distrutte nella DOCUMENT_HISTORY in modo completamente trasparente al programmatore che usa l’API di Colibri.
Undo()
esegue undo sull’ultima azione inserita in ordine cronologico, rimuove l’azione e genera un’azione di redo nella lista dei redo.
Redo()
E’ l’operazione inversa di Undo(); l’ultima operazione inserita dalla Undo() viene ripristinata nella lista degli undo e rimossa da quella dei redo.
Nota:
Le classi fin qui descritte gestiscono l’infrastruttura delle operazioni di Undo/Redo ma, come si può capire dal fatto che gestiscono documenti derivati da OPERATION_CALL, comunicano con questi attraverso i metodi di questa interfaccia; A conclusione dell’articolo propongo un esempio concreto di come questi metodi sono applicati in Colibrì: la gestione undo/redo nella classe SPECTRAL_IMAGE.