Fix wrong Scale calculation for Matplot1.
[scilab.git] / scilab / modules / scinotes / src / java / org / scilab / modules / scinotes / actions / DefaultEncodingAction.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - Calixte DENIZET
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 package org.scilab.modules.scinotes.actions;
14
15 import java.awt.event.ActionEvent;
16 import java.awt.event.ActionListener;
17 import java.io.BufferedReader;
18 import java.io.File;
19 import java.io.FileInputStream;
20 import java.io.IOException;
21 import java.io.InputStreamReader;
22 import java.nio.charset.CharacterCodingException;
23 import java.nio.charset.Charset;
24 import java.nio.charset.CharsetDecoder;
25 import java.nio.charset.CodingErrorAction;
26 import java.util.HashMap;
27 import java.util.Map;
28 import java.util.StringTokenizer;
29
30 import javax.swing.ButtonGroup;
31 import javax.swing.JMenu;
32 import javax.swing.JRadioButtonMenuItem;
33 import javax.swing.KeyStroke;
34
35 import org.scilab.modules.gui.menu.Menu;
36 import org.scilab.modules.gui.menu.ScilabMenu;
37 import org.scilab.modules.scinotes.SciNotes;
38 import org.scilab.modules.scinotes.utils.ConfigSciNotesManager;
39
40 /**
41  * DefaultEncodingAction Class
42  * @author Calixte DENIZET
43  *
44  */
45 public class DefaultEncodingAction extends DefaultCheckAction {
46
47     private static final long serialVersionUID = 455217357242331617L;
48
49     /**
50      * Default encoding to test
51      */
52     public static final String[] ENCODINGS = new String[]{"utf-8", "windows-1252", "iso-8859-1"};
53
54     private static final Map<String, Integer> encPos = new HashMap<String, Integer>(ENCODINGS.length);
55
56     static {
57         for (int i = 0; i < ENCODINGS.length; i++) {
58             encPos.put(ENCODINGS[i], i);
59         }
60     }
61
62     private static final int BUFFERCAPACITY = 8192;
63     private String encoding;
64
65     /**
66      * Construtor
67      * @param name the name of the action
68      * @param editor SciNotes
69      */
70     public DefaultEncodingAction(String name, SciNotes editor) {
71         super(name, editor);
72         encoding = ConfigSciNotesManager.getDefaultEncoding();
73     }
74
75     /**
76      * doAction
77      */
78     public void doAction() {
79         ConfigSciNotesManager.saveDefaultEncoding(encoding);
80     }
81
82     /**
83      * createMenu
84      * @param label label of the menu
85      * @param editor SciNotes
86      * @param key KeyStroke
87      * @return createMenu
88      */
89     public static Menu createMenu(String label, SciNotes editor, KeyStroke key) {
90         StringTokenizer tokens = new StringTokenizer(label, ";");
91         String labelDefaultEnc = tokens.nextToken();
92         String labelUTF8 = tokens.nextToken();
93         String labelANSI = tokens.nextToken();
94         String labelISO88591 = tokens.nextToken();
95
96         DefaultEncodingAction de = new DefaultEncodingAction(labelDefaultEnc, editor);
97         final JRadioButtonMenuItem[] arr = new JRadioButtonMenuItem[3];
98         String[] labels = new String[]{labelUTF8, labelANSI, labelISO88591};
99
100         final Menu menu = ScilabMenu.createMenu();
101         menu.setText(labelDefaultEnc);
102
103         ButtonGroup group = new ButtonGroup();
104         JRadioButtonMenuItem radio;
105
106         for (int i = 0; i < labels.length; i++) {
107             radio = createRadioButtonMenuItem(de, labels[i], ENCODINGS[i]);
108             group.add(radio);
109             ((JMenu) menu.getAsSimpleMenu()).add(radio);
110             arr[i] = radio;
111         }
112
113         arr[encPos.get(de.encoding)].setSelected(true);
114
115         return menu;
116     }
117
118     /**
119      * @param file the file to test
120      * @return the corresponding charset if exists
121      * @throws IOExecption if I/O problems are met
122      * @throws CharacterCodingException if no charset is found
123      */
124     public static Charset tryToGuessEncoding(File file) throws IOException, CharacterCodingException {
125         for (int i = 0; i < ENCODINGS.length; i++) {
126             if (tryToGuessEncoding(file, Charset.forName(ENCODINGS[i]))) {
127                 return Charset.forName(ENCODINGS[i]);
128             }
129         }
130
131         throw new CharacterCodingException();
132     }
133
134     /**
135      * @param file the file to test
136      * @param charset the charset to test
137      * @return true if the file can be decoded with the charset
138      * @throws IOExecption if I/O problems are met
139      */
140     public static boolean tryToGuessEncoding(File file, Charset charset) throws IOException {
141         char[] cbuf = new char[BUFFERCAPACITY];
142         CharsetDecoder decoder = charset.newDecoder().onMalformedInput(CodingErrorAction.REPORT).onUnmappableCharacter(CodingErrorAction.REPORT);
143         FileInputStream fis = new FileInputStream(file);
144         InputStreamReader inReader = new InputStreamReader(fis, decoder);
145         BufferedReader bufReader = new BufferedReader(inReader);
146         try {
147             while (bufReader.read(cbuf) != -1);
148             fis.close();
149             inReader.close();
150             bufReader.close();
151             return true;
152         } catch (Exception e) { }
153
154         return false;
155     }
156
157     /**
158      * createRadioButtonMenuItem
159      * @param ln the LineNumbersAction
160      * @param title the label of the menuitem
161      * @param state the state associated with the menuitem
162      * @return JRadioButtonMenuItem
163      */
164     private static JRadioButtonMenuItem createRadioButtonMenuItem(final DefaultEncodingAction de, String title, final String encoding) {
165         JRadioButtonMenuItem radio = new JRadioButtonMenuItem(title);
166         radio.addActionListener(new ActionListener() {
167                 public void actionPerformed(ActionEvent arg0) {
168                     de.encoding = encoding;
169                     de.doAction();
170                 }
171             });
172
173         return radio;
174     }
175 }