OpenLab Studio | >= 0.13.x |
OpenLab SDK | >= 0.13.x |
Generale #
Gli Eventi permettono di interagire con le operazioni eseguite dal sistema, vengono lanciati eventi in tutte le parti di OpenLab Studio, nei plugin, nel Dock, nel Dock Connector, etc. Ad ogni evento possono essere agganciati più EvenetHandler
. Gli eventi vengono gestiti dall’ EventsManager
che permette di aggiungere, rimuovere, lanciare, disabilitare/abilitare eventi.
Il sistema di eventi funziona tramite un dizionario che associa un nome ad una lista di EventHandler
. Questo permette operare sugli eventi in modo globale, ad esempio aggiungendo un evento questo potrà essere richiamato/intercettato ovunque.
Regole per i nomi degli eventi #
Il nome di ogni evento dovrebbe sempre contenere l’ambito, più univoco possibile, ad esempio un evento in modo da non creare conflitti o aggiugere un evento ad uno chiamato in un ambito non desiderato. Ad esempio creare un evento OnNavViewOpenedRemove
per la classe NavTabSystemTree
, il nome potrebbe essere questo OpenLabStudio.ui.OnNavViewOpenedRemove
.
L’ambito dovrebbe contenere il namespace e, la classe o il metodo in cui è contenuto l’evento, può anche contenere entrambi.
Gestione degli eventi #
Tramite l’EventsManager
gli eventi possono essere creati, rimossi, disabilitati/abilitati, lanciati etc.
Creare un evento #
La creazione di un evento viene fatta tramite il metodo createEvent
. Questo metodo accetta come argomento il nome dell’evento oppure il nome e un EventHandler
da aggiungere subito all’evento.
L’EventHandler prende come primo argomento un oggetto che rappresenta il sender
cioè un riferimento a chi lancia l’evento, come secondo argomento prendere un istanza di EventArgs
con la quale è possibile trasportare dati all’interno dell’EventHandler
, il funzionamento sarà chiarito meglio nel paragrafo Lanciare un evento
Di seguito viene creato un evento vuoto.
eventsManager.createEvent("test");
Nell’esempio di seguito viene creato un evento e aggiunto subito un EventHandler
eventsManager.createEvent("test", (sender, e) => { log.info("YEAAAAAA"); });
Se l’evento con il nome indicato esiste già viene lanciata un eccezione EventJustExistException
Rimuovere un evento #
per rimuover un evento usare il metodo removeEvent
, se l’evento non esiste viene lanciata un eccezione EventNotFoundException
eventsManager.removeEvent("test");
Disabilitare/abilitare un evento #
Disabilitando un evento non verranno eseguiti gli EventHandler quando verrà lanciato l’evento. Tutti gli altri accessi all’evento rimangono disponibili. Il metodo disableEvent
prende come argomenti il nome dell’evento e un valore booleano che abilita o disabilita l’evento.
eventsManager.disableEvent("test", true);
Lanciare un evento #
Quando si lancia un evento, tramite il metodo fireEvent
, vengono eseguiti tutti gli EventHandler di quell’evento uno dopo l’altro in orgine di inserimento. Questo metodo prende come argomento il nome dell’evento da lanciare, il sender e i dati da passare agli event handlers.
Il sender
è di tipo Object
e serve a passare agli event handlers un riferimento a chi ha lanciato l’evento, nel esempio di seguito viene usato this
per passare come riferimento la classe in cui c’è il metodo che lancia l’evento.
EventArgs data = new EventArgs(); eventsManager.fireEvent("test", this, data);
Passare dati agli event handlers #
Per passare dati dal sender
agli event handlers viene usata un istanza di EventArgs
. Questa è una classe vuota, impementandola può essere passato qualsiasi dato all’interno.
public class TestEventArgs : EventArgs { public string Data = ""; } TestEventArgs d = new TestEventArgs(); d.Data = "HelloWorld"; eventsManager.fireEvent("test", this, d);
Aggiungere un event handler ad un evento #
Per aggiungere un event handler ad un evento si usa il metodo addEventHandler
. E’ possibile specificare che l’evento venga creato se non esiste.
eventsManager.addEventHandler("test1", (sender, data) => { log.info("Hello World test 1"); });
Nell’esempio precedente, se l’evento non esiste già viene lanciata un eccezione del tipo EventNotFoundException
, è possibile creare l’evento se non esiste con un terzo parametro booleano
eventsManager.addEventHandler("test1", (sender, data) => { log.info("Hello World test 1"); }, true);
Rimuovere tutti gli event handler di un evento #
Per rimuovere da un evento tutti i suoi event handlers usare il metodo eventClear
.
eventsManager.eventClear("test")
Interrompere un evento #
Quando viene lanciato un evento vengono eseguiti tutti i sui event handler, ogni event handler ritorno un valore booleano. Se il valore che ritorna è false
l’esecuzione viene interrotta e gli altri handlers non eseguiti.
Nell’esempio di seguito supponiamo di aggiungere alcuni event handler ad un evento chiamato test
. Il penultimo di questi event handler restituirà false interrompendo il lancio dell’evento e quindi l’esecuzione degli event handler successivi. L’interruzione dell’esecuzione provoca il lancio di un eccezione FireEventInterruptedByEventHandlerException
eventsManager.addEventHandler("test", (sender, e) => { log.info("Handler 1"); return true; },true); eventsManager.addEventHandler("test", (sender, e) => { log.info("Handler 2"); return true; }); eventsManager.addEventHandler("test", (sender, e) => { log.info("Handler 3"); return false; }); eventsManager.addEventHandler("test", (sender, e) => { log.info("Handler 4"); return true; }); try { eventsManager.fireEvent("test", this, new EventArgs()); }catch(FireEventInterruptedByEventHandlerException ex) { log.warn("Event Test interrupted by event handler"); }
Nell’esempio sopra il primo event handler crea l’evento(notare il true
dopo l’implementazione dell’event handler), il penultimo event handler ritorna false. Questo bloccherà l’esecuzione quindi nel log vedremo solo i primi tre messaggi.
Esempi #
Esempio base, passaggio dati agli event handlers #
eventsManager.createEvent("test"); eventsManager.addEventHandler("test", (sender, data) => { log.info("Message: "data.Message); return true; }); public class TestEventArgs : EvetArgs { public string Message; public TestEventArgs(string message) { Message = message; } } eventsManager.fireEvent("test", this, TestEventArgs(txtMessage.Text));
Interruzione esecuzione evento #
eventsManager.createEvent("test"); eventsManager.addEventHandler("test", (sender, e) => { log.info("1"); return true; }); eventsManager.addEventHandler("test", (sender, e) => { log.info("2"); return true; }); eventsManager.addEventHandler("test", (sender, e) => { log.info("3"); return false; }); eventsManager.addEventHandler("test", (sender, e) => { log.info("4"); return true; }); EventArgs d = new EventArgs(); try { eventsManager.fireEvent("test", this, d); }catch(FireEventInterruptedByEventHandlerException ex) { errorManager.showCrashReport(ex); }