• Non ci sono risultati.

Chiusura di una nestra: Close

4.2 Gestione dei documenti

4.2.4 Chiusura di una nestra: Close

Quando l'utente decide di voler chiudere una nestra di editing, il modo più semplice è utilizzando il pulsante di chiusura sulla barra della nestra, oppure il pulsante Close nel menù principale (la cui scorciatoia da tastiera è CTRL+W).

Sia il pulsante che la barra principale della nestra infatti utilizzano lo stesso procedimento, semplicemente partendo da due listener diversi (uno in ascolto sui pulsanti del menù (MenuAreaButtonListener), uno in ascolto sul- le azione che l'utente compie sulla nestra(DefaultInternalFrameAdapter)).

Questa funzione si comporta diversamente a seconda che la nestra da chiudere sia una di editing, oppure sia una FootprintMatrixInfo utilizzata per la visualizzazione dei report delle analisi.

1 // if the frame is an EventLogEditor

2 if (selectedInternalFrame instanceof EventLogEditor) {

3 ...

4 // if the editor content has not been modified by the user, check the associated file and then decide

5 if (!eventLogEditor.isContentModified()) {

6 if ((absolutePath == null)||(absolutePath.equals(""))) { 7 // this is a new empty event log, so we can just close it

8 eventLogEditor.dispose();

9 fileClosed = true;

10 } else {

11 // create a Path object using the String path

13 // if the file still exists

14 if (Files.exists(targetFile)) {

15 // the editor has no modifications to save and its associated file still exists, so we can close it

16 eventLogEditor.dispose();

17 fileClosed = true;

18 } else if (Files.notExists(targetFile)) { // if the target file does not longer exist

19 // set a specific message for the save procedure and the name for the file

20 ...

21 } else { //if the process cannot determine if the file exists or not, because it does not have access to the file

22 // show an error message to the user and then set the saving name for the file

23 ...

24 }

25 }

26 }

27 // if the file is still open, it means we need to save it 28 if(!fileClosed) {

29 // retrieve the user's choice, using the message decided before

30 ...

31 int choice = elmView.showOptionDialog(message, title, JOptionPane. QUESTION_MESSAGE, options, options[0]);

32 // check user's decision

33 if (choice == 0) { // if YES, call the save method

34 boolean fileSaved;

35 // if we have to save in a new location

36 if (location != null) {

37 fileSaved = saveAsEventLog(location);

38 } else { // otherwise just save in the same location

39 fileSaved = saveEventLog();

40 }

41 if (fileSaved) { // if we have successfully saved the file, then set the

editor as closable

42 eventLogEditor.dispose();

44 }// if we have not saved the file, then do not close the editor because its content has not been saved

45 } else if (choice == 1) { // if NO, just set the internal frame as closable, without saving it

46 eventLogEditor.dispose();

47 fileClosed = true;

48 }

49 // if the choice is Cancel (2) or the user closed the dialog (-1), do nothing

50 }

51 } else if (selectedInternalFrame instanceof FootprintMatrixInfo) { // if the frame is a FootprintMatrixInfo

52 ...

53 // check if the file has already been exported

54 if (footprintMatrixInfo.isContentExported()) { // if the document has already been exported by the user, check the associated file and then decide

55 // create a Path object using the String path

56 Path targetFile = Paths.get(footprintMatrixInfo.getAbsolutePath()); 57 // if the file still exists

58 if (Files.exists(targetFile)) {

59 // it has been exported and its associated file still exists, so we can close it

60 footprintMatrixInfo.dispose();

61 fileClosed = true;

62 } else if (Files.notExists(targetFile)) { // if the target file does not longer exist

63 // set a specific message for the export procedure and the name for the file

64 ...

65 } else { //if the process cannot determine if the file exists or not, because it does not have access to the file

66 // show an error message to the user, then set a specific message for the export procedure and the export name for the file

67 ...

68 }

69 }

70 // if the file is still open, it means we need to export it

71 if (!fileClosed) {

73 ...

74 int choice = elmView.showOptionDialog(message, title, JOptionPane. QUESTION_MESSAGE, options, options[0]);

75 // check user's decision

76 if (choice == 0) { // if YES, call the export method

77 // if we have to export in a new location or in the same is decided by the value of location (null or String)

78 boolean fileExported = exportDocument(location);

79 if (fileExported) { // if we have successfully exported the file, then set the

editor as closable

80 selectedInternalFrame.dispose();

81 fileClosed = true;

82 }// if we have not exported the file, then do not close the editor because its

content has not been saved

83 } else if (choice == 1) { // if NO, just set the internal frame as closable, without exporting it

84 selectedInternalFrame.dispose();

85 fileClosed = true;

86 }

87 // if the choice is Cancel (2) or the user closed the dialog (-1), do nothing

88 }

89 } else { // for every other type of frame, close them directly 90 selectedInternalFrame.dispose();

91 fileClosed = true; 92 }

Nel primo caso, si controlla innanzitutto se il contenuto dell'editor risulta modicato: se non è stato modicato e l'editor ha un le associato esistente e accessibile, o se si tratta di un editor nuovo e vuoto, la nestra viene chiusa; se il documento non è stato modicato ma il le associato risulta cancellato o non accessibile, o se il contenuto dell'editor risulta modicato, la funzione informa l'utente di queste situazioni e chiede se si vuole salvare il documento prima di chiuderlo.

tare dall'asterisco accanto al nome, il documento "exercise2.xes" è stato modicato e non salvato prima di richiederne la chiusura.

Figura 4.7: La funzione Close nel caso di un documento di testo

Oltre alla possibilità di annullare la procedura di chiusura e mantenere il documento aperto, è ovviamente possibile rispondere alla domanda in ma- niera negativa, ottenendo che l'editor verrà chiuso e il contenuto non salvato, oppure positiva: in questo caso la funzione demanda le operazioni di salvatag- gio alla procedura Save, nel caso in cui l'editor abbia un le di destinazione impostato, alla procedura Save As, altrimenti.

Al termine delle procedure di salvataggio, se concluse dall'utente in ma- niera positiva, la nestra viene chiusa. In caso di annullamento della pro- cedura di salvataggio invece, la funzione Close lascia inalterata la nestra all'interno dell'applicazione.

Nel secondo caso, quello in cui la nestra sia una FootprintMatrixInfo, la funzione chiede all'utente se si vuole esportare il documento, e non salvare.

Questo deriva dal fatto che, mentre il contenuto di un editor è testuale e può essere salvato nei modi visti nella procedura di salvataggio, il contenuto di questa nestra è in HTML e deve essere trattato diversamente: se infatti si salvasse in maniera testuale il contenuto, otterremmo semplicemente un le di tipo testuale con all'interno codice HTML.

In conseguenza di questo, l'eventuale salvataggio del contenuto viene de- mandato alla funzione di export, che si occuperà di processare la richiesta in maniera appropriata. Vedremo in dettaglio la funzione di export nella Sezio- ne 5.3, per ora citiamo il fatto che questa funzione permetterà di esportare il contenuto di questa nestra in vari formati che ne permetteranno la cor- retta visualizzazione. I formati disponibili sono: HTML (apribile in qualsiasi browser ed immediatamente visualizzabile), PDF, PNG e LaTeX (quest'ul- timo genera un documento in formato TeX a partire dal codice HTML della nestra, che poi potrà essere a sua volta modicato e compilato in appositi programmi per questo linguaggio).

Il comportamento della funzione Close in questa situazione è comunque pressoché identico alla precedente situazione: se il documento risulta mai esportato in HTML, chiede all'utente se vuole o meno esportare il contenuto, procedendo in caso negativo alla chiusura immediata della nestra, in caso aermativo all'avvio della funzione di export e alla chiusura della nestra solo se il procedimento si è concluso positivamente (in maniera analoga al com- portamento tenuto nel caso delle nestre EventLogEditor); se il documento risulta esportato almeno una volta in HTML ed il le dove è stato esportato esiste, la nestra viene chiusa, se il le non esiste più o non è accessibile, si procede alla richiesta di export all'utente.

In Figura 4.8 viene mostrato il dierente messaggio quando tentiamo di chiudere un report di analisi anziché un editor di testo.

Figura 4.8: La funzione Close nel caso di un documento HTML

Abbiamo appena detto che la discrezionalità sulla richiesta di eettuare o meno un export dipende dal fatto che il contenuto della nestra sia stato o meno esportato in HTML. Il motivo per il quale solo questo formato vale come "salvataggio" è semplice: mentre gli altri formati sono non modicabili (PDF e PNG sono documenti nali, non più apribili in editor di testo per essere modicati) oppure scritti in linguaggi diversi dall'originale (una volta generato il documento in LaTeX, questo non può essere usato per tornare alla versione HTML), il formato HTML è l'esatta rappresentazione del contenuto della nestra, che semplicemente mostra la compilazione del suddetto codice all'utente, ma che sotto mantiene il riferimento al codice sorgente del docu- mento. Esportando dunque il documento in HTML si ottiene una versione identica a quella interna all'applicazione: questa versione può allora essere

importata di nuovo nel sistema utilizzando la funzione di Import (che vedre- mo nella Sez. 5.3), in maniera del tutto simile ad una procedura di apertura di un documento testuale all'interno dell'applicazione, come abbiamo visto in precedenza. É proprio questa possibilità di salvataggio esterno e riapertura nel sistema che caratterizza l'export in HTML come un formato valido come denizione di "salvataggio" del documento.

É importante inne notare come il listener in ascolto sulla nestra, De- faultInternalFrameAdapter, quando una di queste viene chiusa, si occupi anche dell'eliminazione del relativo pulsante FooterAreaButton all'interno della barra in fondo alla nestra principale e dell'eventuale FilterPanel aperto ad esso associato, in modo da rimuovere ogni riferimento alla nestra e componente ad essa collegato.