45fd9400cdd5375c9ba44f13ec02dba49089f25f
[scilab.git] / scilab / modules / gui / src / java / org / scilab / modules / gui / bridge / filechooser / SwingScilabFileChooser.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2007 - INRIA - Vincent Couvert
4  * Copyright (C) 2008 - DIGITEO - Sylvestre KOUMAR
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.1-en.txt
11  *
12  */
13
14 package org.scilab.modules.gui.bridge.filechooser;
15
16 import java.io.File;
17 import java.util.StringTokenizer;
18
19 import javax.swing.ImageIcon;
20 import javax.swing.JFileChooser;
21 import javax.swing.JFrame;
22 import javax.swing.JOptionPane;
23
24 import org.scilab.modules.gui.filechooser.FileChooserInfos;
25 import org.scilab.modules.gui.filechooser.SimpleFileChooser;
26 import org.scilab.modules.gui.utils.ConfigManager;
27 import org.scilab.modules.gui.utils.SciFileFilter;
28 import org.scilab.modules.gui.utils.ScilabSwingUtilities;
29 import org.scilab.modules.localization.Messages;
30
31 /**
32  * Swing implementation of a Scilab File ChooserS
33  * @author Vincent COUVERT
34  * @author Sylvestre KOUMAR
35  */
36 public class SwingScilabFileChooser extends JFileChooser implements SimpleFileChooser {
37
38     private static final long serialVersionUID = 1L;
39
40     private String[] selection; // Path + filenames
41     private String selectionPath; // Path
42     private String[] selectionFileNames; // Filenames
43     private int selectionSize;
44     private int filterIndex;
45     private int maskSize;
46     private int dialogType;
47
48     private String[] maskDescription;
49     private JFrame parent;
50
51     /**
52      * Default constructor
53      */
54     public SwingScilabFileChooser() {
55         super();
56
57         //System.out.println("[Constructor] SwingScilabFileChooser");
58         /** Bug 3231 fixed: do not explore all zip files on desktop under Windows */
59         //putClientProperty("FileChooser.useShellFolder", Boolean.FALSE);
60         /**
61          * Bug 4187 fixed: uigetdir() opens on "Desktop" and not on "Computer" on windows
62          * No need to use 'putClientProperty' anymore (bug 3231)
63          */
64         /* Bug 5111 : The Current directory have to be set before */
65         super.setCurrentDirectory(new File(ConfigManager.getLastOpenedDirectory()));
66     }
67
68     /**
69      * Set the title of the file chooser
70      * @param title the title to set
71      */
72     @Override
73     public void setTitle(String title) {
74         super.setDialogTitle(title);
75     }
76
77     /**
78      * Set the mask & the mask description for the filechooser
79      * @param mask the mask to set
80      * @param fileMaskDescription the maskDescription to set
81      */
82     public void addMask(String[] mask, String[] fileMaskDescription) {
83
84         //size of the mask list
85         maskSize = mask.length;
86
87         //If the mask description is empty we allocate description
88         //according to the extensions given
89         if (fileMaskDescription == null || fileMaskDescription.length == 0) {
90             for (int i = 0; i < mask.length; i++) {
91                 super.addChoosableFileFilter(new SciFileFilter(mask[i], null, i/*, maskSize*/));
92             }
93         } else {
94             //If the mask description is filled
95             //we use those descriptions given by the user
96             this.maskDescription = fileMaskDescription;
97             for (int i = 0; i < mask.length; i++) {
98                 super.addChoosableFileFilter(new SciFileFilter(mask[i], maskDescription[i], i/*, maskSize*/));
99             }
100         }
101     }
102
103     /**
104      * Set the initial directory used for file search
105      * @param path the default path
106      */
107     @Override
108     public void setInitialDirectory(String path) {
109         // When empty string given
110         if (path.length() == 0) {
111             return;
112         }
113         // Replace beginning of the path if is an environment variable
114         String newPath = path;
115         StringTokenizer tok = new StringTokenizer(path, File.separator);
116         if (tok.hasMoreTokens()) {
117             /* It is possible that we don't have any more token here when
118                                           Scilab is started from / for example */
119             String firstToken = tok.nextToken();
120             if (firstToken != null && System.getenv(firstToken) != null)  {
121                 newPath = newPath.replaceFirst(firstToken, System.getenv(firstToken));
122             }
123         }
124         super.setCurrentDirectory(new File(newPath));
125     }
126
127     /**
128      * Set the parent frame
129      * @param parent the parent frame
130      */
131     public void setParentFrame(JFrame parent) {
132         this.parent = parent;
133     }
134
135     /**
136      * Display this chooser and wait for user selection
137      */
138     @Override
139     public void displayAndWait() {
140         JFrame parentFrame;
141         if (parent == null) {
142             parentFrame = new JFrame();
143             parentFrame.setIconImage(new ImageIcon(ScilabSwingUtilities.findIcon("scilab", "256x256")).getImage());
144         } else {
145             parentFrame = parent;
146         }
147
148         int returnValue = 0;
149         if (maskSize > 0) {
150             setFileFilter(getChoosableFileFilters()[maskSize]);
151         }
152         if (this.dialogType == JFileChooser.SAVE_DIALOG) {
153             returnValue = this.showSaveDialog(parentFrame);
154         } else {
155             returnValue = this.showOpenDialog(parentFrame);
156         }
157
158         //User validate the uigetfile
159         if (returnValue == APPROVE_OPTION) {
160             if (this.isMultiSelectionEnabled()) {
161                 File[] files = this.getSelectedFiles();
162                 selection = new String[files.length];
163                 selectionFileNames = new String[files.length];
164                 selectionSize = files.length;
165                 for (int i = 0; i < files.length; i++) {
166                     selection[i] = files[i].getAbsolutePath();
167                     selectionPath = files[i].getParentFile().getPath();
168                     selectionFileNames[i] = files[i].getName();
169                 }
170             } else {
171                 File file = this.getSelectedFile();
172
173                 if (this.dialogType == JFileChooser.SAVE_DIALOG) {
174                     //Test if there is a file with the same name
175                     if (file.exists()) {
176                         int actionDialog = JOptionPane.showConfirmDialog(this,
177                                            Messages.gettext("Replace existing file?"),
178                                            Messages.gettext("File already exists"),
179                                            JOptionPane.YES_NO_OPTION);
180
181                         if (actionDialog != JOptionPane.YES_OPTION) {
182                             // Same as cancel case
183                             selection = new String[1];
184                             selection[0] = "";
185                             selectionSize = 0;
186                             selectionPath = "";
187                             selectionFileNames = new String[1];
188                             selectionFileNames[0] = "";
189                             //set the filter index of the JFileChooser at 0 if "cancel" button was selected
190                             filterIndex = 0;
191
192                             //return the filechooser's information
193                             //they are stocked into FileChooserInfos
194                             FileChooserInfos.getInstance().setSelection(selection);
195                             FileChooserInfos.getInstance().setSelectionPathName(selectionPath);
196                             FileChooserInfos.getInstance().setSelectionFileNames(selectionFileNames);
197                             FileChooserInfos.getInstance().setSelectionSize(selectionSize);
198                             FileChooserInfos.getInstance().setFilterIndex(filterIndex);
199                             return;
200                         }
201                     }
202                 }
203
204                 selection = new String[1];
205                 selection[0] = file.getAbsolutePath();
206                 if (getFileSelectionMode() == DIRECTORIES_ONLY) {
207                     selectionPath = file.getPath();
208                 } else {
209                     selectionPath = file.getParentFile().getPath();
210                 }
211                 selectionFileNames = new String[1];
212                 selectionFileNames[0] = file.getName();
213                 selectionSize = 1;
214             }
215
216             //return the filechooser's information
217             //they are stocked into FileChooserInfos
218             FileChooserInfos.getInstance().setSelection(selection);
219             FileChooserInfos.getInstance().setSelectionPathName(selectionPath);
220             FileChooserInfos.getInstance().setSelectionFileNames(selectionFileNames);
221             FileChooserInfos.getInstance().setSelectionSize(selectionSize);
222
223             //set the filter index at the last index
224             //of the list box if the mask "All files" is selected
225             javax.swing.filechooser.FileFilter allFilesSelected = getFileFilter();
226             if (allFilesSelected.getDescription().equals("All Files")) {
227                 FileChooserInfos.getInstance().setFilterIndex(maskSize + 1);
228             }
229             //TODO
230             ConfigManager.saveLastOpenedDirectory(selectionPath);
231             //User cancel the uigetfile
232         } else {
233             selection = new String[1];
234             selection[0] = "";
235             selectionSize = 0;
236             selectionPath = "";
237             selectionFileNames = new String[1];
238             selectionFileNames[0] = "";
239             //set the filter index of the JFileChooser at 0 if "cancel" button was selected
240             filterIndex = 0;
241
242             //return the filechooser's information
243             //they are stocked into FileChooserInfos
244             FileChooserInfos.getInstance().setSelection(selection);
245             FileChooserInfos.getInstance().setSelectionPathName(selectionPath);
246             FileChooserInfos.getInstance().setSelectionFileNames(selectionFileNames);
247             FileChooserInfos.getInstance().setSelectionSize(selectionSize);
248             FileChooserInfos.getInstance().setFilterIndex(filterIndex);
249         }
250
251
252
253     }
254
255     /**
256      * Get the number of files selected
257      * @return the number of files selected
258      */
259     @Override
260     public int getSelectionSize() {
261         return selectionSize;
262     }
263
264     /**
265      * Get the names of selected files
266      * @return the names of selected files
267      */
268     @Override
269     public String[] getSelection() {
270         return selection;
271     }
272
273     /**
274      * Set the flag indicating that we want only select directories
275      */
276     @Override
277     public void setDirectorySelectionOnly() {
278         setFileSelectionMode(DIRECTORIES_ONLY);
279     }
280
281     /**
282      * Set the flag indicating that we can select multiple files
283      * @param multipleSelection is enable or not
284      */
285     @Override
286     public void setMultipleSelection(boolean multipleSelection) {
287         setMultiSelectionEnabled(multipleSelection);
288     }
289
290     /**
291      * Get the path of selected files
292      * @return selectionPath selected file(s) path
293      */
294     @Override
295     public String getSelectionPathName() {
296         return selectionPath;
297     }
298
299     /**
300      * Get the names of selected files
301      * @return selectionFileNnames selected file(s) path
302      */
303     @Override
304     public String[] getSelectionFileNames() {
305         return selectionFileNames;
306     }
307
308     /**
309      * Get the filter index
310      * @return this.getFilterIndex() filter index
311      */
312     @Override
313     public int getFilterIndex() {
314         return getFilterIndex();
315     }
316
317     /**
318      * Set the flag indicating the filter index
319      * @param filterIndex index of the filter
320      */
321     public void setFilterIndex(int filterIndex) {
322         setFilterIndex(filterIndex);
323     }
324
325     /**
326      * Set the dialog type (save or open a file ?)
327      * @param dialogType the dialog type
328      */
329     @Override
330     public void setUiDialogType(int dialogType) {
331         this.dialogType = dialogType;
332     }
333 }