Scinotes: show a messagebox when an external modif has been made on the current file
[scilab.git] / scilab / modules / scinotes / src / java / org / scilab / modules / scinotes / utils / SaveFile.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2009 - DIGITEO - Allan CORNET
4  * Copyright (C) 2010 - Calixte DENIZET
5  *
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at
10  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11  *
12  *
13  */
14 package org.scilab.modules.scinotes.utils;
15
16 import java.io.BufferedWriter;
17 import java.io.File;
18 import java.io.FileNotFoundException;
19 import java.io.FileOutputStream;
20 import java.io.IOException;
21 import java.io.OutputStreamWriter;
22 import java.io.UnsupportedEncodingException;
23
24 import javax.swing.JEditorPane;
25 import javax.swing.text.BadLocationException;
26 import javax.swing.text.EditorKit;
27
28 import org.scilab.modules.gui.messagebox.ScilabModalDialog;
29 import org.scilab.modules.gui.messagebox.ScilabModalDialog.AnswerOption;
30 import org.scilab.modules.gui.messagebox.ScilabModalDialog.ButtonType;
31 import org.scilab.modules.gui.messagebox.ScilabModalDialog.IconType;
32 import org.scilab.modules.scinotes.ScilabDocument;
33 import org.scilab.modules.scinotes.ScilabEditorPane;
34 import org.scilab.modules.scinotes.SciNotesOptions;
35
36 /**
37  * Save File utility class
38  * @author Allan CORNET
39  * @author Calixte DENIZET
40  */
41 public final class SaveFile {
42
43     private static final String LINE_SEPARATOR = "line.separator";
44
45     /**
46      * private Constructor
47      */
48     private SaveFile() { }
49
50     /**
51      * save text in JEditorPane
52      * @param textPane JEditorPane
53      * @param fOut File
54      * @param editorKit EditorKit
55      * @return true if saved
56      */
57     public static boolean doSave(ScilabEditorPane textPane, int index, File fOut, EditorKit editorKit) {
58         return doSave(textPane, index, fOut, editorKit, true, false);
59     }
60
61     /**
62      * save a document
63      * @param doc the document to save
64      * @param fOut File
65      * @param editorKit EditorKit
66      * @return true if saved
67      */
68     public static boolean doSave(ScilabDocument doc, File fOut, EditorKit editorKit) throws IOException {
69         // get default eol
70         String defaultEol = System.getProperty(LINE_SEPARATOR);
71         boolean bReturn = false;
72         BufferedWriter bw = null;
73         OutputStreamWriter osw = null;
74         FileOutputStream fos = null;
75
76         // set eol used to save file
77         if (doc.getEOL().compareTo(defaultEol) != 0) {
78             System.setProperty(LINE_SEPARATOR, doc.getEOL());
79         }
80
81         try {
82             fos = new FileOutputStream(fOut);
83             osw = new OutputStreamWriter(fos, SciNotesOptions.getSciNotesPreferences().encoding);
84             bw = new BufferedWriter(osw);
85             editorKit.write(bw, doc, 0, doc.getLength());
86             bw.flush();
87             bReturn = true;
88         } catch (BadLocationException e) {
89             System.err.println(e);
90         } finally {
91             try {
92                 if (fos != null) {
93                     fos.close();
94                 }
95                 if (osw != null) {
96                     osw.close();
97                 }
98                 if (bw != null) {
99                     bw.close();
100                 }
101             } catch (IOException e) {
102                 System.err.println(e);
103             }
104         }
105
106         // restore default eol
107         System.setProperty(LINE_SEPARATOR, defaultEol);
108
109         return bReturn;
110     }
111
112     /**
113      * save text in JEditorPane
114      * @param textPane JEditorPane
115      * @param fOut File
116      * @param editorKit EditorKit
117      * @return true if saved
118      */
119     public static boolean doSave(ScilabEditorPane textPane, int index, File fOut, EditorKit editorKit, boolean addEOL, boolean silent) {
120         ScilabDocument styledDocument = (ScilabDocument) textPane.getDocument();
121         boolean enc = false;
122         if (!styledDocument.getEncoding().equalsIgnoreCase(SciNotesOptions.getSciNotesPreferences().encoding)) {
123             if (!silent) {
124                 String msg = String.format(SciNotesMessages.DIFFERENT_ENCODINGS, styledDocument.getEncoding(), SciNotesOptions.getSciNotesPreferences().encoding);
125                 if (ScilabModalDialog.show(textPane.getEditor(), msg, SciNotesMessages.DIFFERENT_ENCODINGS_TITLE, IconType.QUESTION_ICON, ButtonType.YES_NO) == AnswerOption.NO_OPTION) {
126                     return false;
127                 }
128                 enc = true;
129             } else {
130                 return false;
131             }
132         }
133
134         try {
135             fOut.createNewFile();
136         } catch (IOException e) {
137             System.err.println(e);
138         }
139
140         if (!fOut.canWrite()) {
141             if (!silent) {
142                 ScilabModalDialog.show(textPane.getEditor(), SciNotesMessages.NOTWRITABLE, SciNotesMessages.SCINOTES_ERROR, IconType.ERROR_ICON);
143             }
144             return false;
145         }
146
147         // get default eol
148         String defaultEol = System.getProperty(LINE_SEPARATOR);
149
150         // set eol used to save file
151         if (styledDocument.getEOL().compareTo(defaultEol) != 0) {
152             System.setProperty(LINE_SEPARATOR, styledDocument.getEOL());
153         }
154         if (addEOL) {
155             styledDocument.addEOL();
156         }
157
158         boolean bReturn = false;
159
160         BufferedWriter bw = null;
161         OutputStreamWriter osw = null;
162         FileOutputStream fos = null;
163
164         try {
165             fos = new FileOutputStream(fOut);
166             osw = new OutputStreamWriter(fos, SciNotesOptions.getSciNotesPreferences().encoding);
167             bw = new BufferedWriter(osw);
168             editorKit.write(bw, styledDocument, 0, styledDocument.getLength());
169             bw.flush();
170             bReturn = true;
171         } catch (IOException e) {
172             System.err.println(e);
173             bReturn = false;
174         } catch (BadLocationException e) {
175             System.err.println(e);
176             bReturn = false;
177         } finally {
178             try {
179                 if (fos != null) {
180                     fos.close();
181                 }
182                 if (osw != null) {
183                     osw.close();
184                 }
185                 if (bw != null) {
186                     bw.close();
187                 }
188             } catch (IOException e) {
189                 System.err.println(e);
190             }
191         }
192
193         // restore default eol
194         System.setProperty(LINE_SEPARATOR, defaultEol);
195         if (enc) {
196             textPane.getEditor().reload(index);
197         }
198
199         return bReturn;
200     }
201 }