Bug 6615 fixed: ui(get|put)file did not center the file dialog on the last focused...
[scilab.git] / scilab / modules / gui / src / java / org / scilab / modules / gui / bridge / filechooser / SwingScilabExportFileChooser.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2008 - INRIA - Sylvestre Koumar
4  * Copyright (C) 2011 - 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.1-en.txt
11  *
12  */
13 package org.scilab.modules.gui.bridge.filechooser;
14
15 import java.awt.Component;
16 import java.awt.Window;
17 import java.io.File;
18 import java.util.ArrayList;
19
20 import javax.swing.BorderFactory;
21 import javax.swing.JFileChooser;
22 import javax.swing.JOptionPane;
23 import javax.swing.JPanel;
24 import javax.swing.SwingUtilities;
25 import javax.swing.border.TitledBorder;
26
27 import org.scilab.modules.graphic_export.FileExporter;
28 import org.scilab.modules.gui.SwingView;
29 import org.scilab.modules.gui.bridge.tab.SwingScilabTab;
30 import org.scilab.modules.gui.tab.SimpleTab;
31 import org.scilab.modules.gui.utils.ConfigManager;
32 import org.scilab.modules.localization.Messages;
33 import org.scilab.modules.renderer.JoGLView.DrawerVisitor;
34
35 /**
36  * This is the son of the usual Scilab file chooser,
37  * it have been customized for the graphic export
38  * @author Sylvestre Koumar
39  *
40  */
41 @SuppressWarnings(value = { "serial" })
42 public class SwingScilabExportFileChooser extends SwingScilabFileChooser {
43
44     private static final int NB_FILE_MASKS = 12;
45
46     private final String bmpDesc = Messages.gettext("Windows BMP image");
47     private final String gifDesc = Messages.gettext("GIF image");
48     private final String jpgDesc = Messages.gettext("JPEG image");
49     private final String pngDesc = Messages.gettext("PNG image");
50     private final String ppmDesc = Messages.gettext("PPM image");
51     private final String emfDesc = Messages.gettext("Enhanced Metafile image (EMF)");
52     private final String epsDesc = Messages.gettext("Encapsulated PostScript image (EPS)");
53     private final String figDesc = Messages.gettext("FIG image");
54     private final String pdfDesc = Messages.gettext("PDF image");
55     private final String svgDesc = Messages.gettext("SVG image");
56     private final String allFilesDesc = Messages.gettext("All files");
57
58     private final String bmp = "bmp";
59     private final String gif = "gif";
60     private final String[] jpg = {"jpg", "jpeg"};
61     private final String png = "png";
62     private final String ppm = "ppm";
63     private final String emf = "emf";
64     private final String eps = "eps";
65     private final String fig = "fig";
66     private final String pdf = "pdf";
67     private final String svg = "svg";
68     private final String allFiles = "*";
69
70     private String exportName;
71     private String extensionSelected;
72     private Integer figureUID;
73
74     /**
75      * Default constructor
76      * @param figureId id of the exported figure
77      */
78     public SwingScilabExportFileChooser(Integer figureUID) {
79         super();
80         this.figureUID = figureUID;
81         SwingScilabTab tab = (SwingScilabTab) SwingView.getFromId(figureUID);
82         setParentFrame(tab.getParentWindow());
83         exportCustomFileChooser(figureUID);
84     }
85
86     /**
87      * We customize the file chooser for the graphic export
88      * by adding format selection
89      * @param figureId exported figure number
90      */
91     public void exportCustomFileChooser(Integer figureUID) {
92         ArrayList<FileMask> v = new ArrayList<FileMask>(NB_FILE_MASKS);  /* The order does matter */
93         v.add(new FileMask(png, pngDesc));
94         v.add(new FileMask(jpg, jpgDesc));
95         v.add(new FileMask(eps, epsDesc));
96         v.add(new FileMask(pdf, pdfDesc));
97         v.add(new FileMask(svg, svgDesc));
98         v.add(new FileMask(emf, emfDesc));
99         v.add(new FileMask(gif, gifDesc));
100         v.add(new FileMask(bmp, bmpDesc));
101         v.add(new FileMask(ppm, ppmDesc));
102         v.add(new FileMask(fig, figDesc));
103         v.add(new FileMask(allFiles, allFilesDesc)); // should always be at the last position
104
105         super.setDialogTitle(Messages.gettext("Export"));
106         super.setApproveButtonText(Messages.gettext("Export"));
107         File exportFile = new File(Messages.gettext("Untitled-export"));
108         super.setSelectedFile(exportFile);
109         super.setAcceptAllFileFilterUsed(false);
110
111         this.figureUID = figureUID;
112
113         for (int i = 0; i < v.size(); i++) {
114             FileMask fm = v.get(i);
115             if (i == v.size() - 1) { /* Last case ... all files, remove the extension */
116                 fm.clearExtensions();
117             }
118             super.addChoosableFileFilter(fm);
119         }
120
121         //Preview panel
122         JPanel panelPreview = new JPanel();
123
124         //Title for preview panel
125         TitledBorder titlePreview;
126         titlePreview = BorderFactory.createTitledBorder(Messages.gettext("Preview"));
127         panelPreview.setBorder(titlePreview);
128
129         //add preview image
130         panelPreview.add(new ImagePreview(this));
131
132         //Main panel contains extensionTable panel & preview panel
133         JPanel accessoryPanel = new JPanel();
134
135         //accessoryPanel.add(scrollPane);
136         accessoryPanel.add(panelPreview);
137         accessoryPanel.setVisible(true);
138         super.setAccessory(accessoryPanel);
139
140         Component c = DrawerVisitor.getVisitor(figureUID).getComponent();
141         Window parentWindow = (Window) SwingUtilities.getAncestorOfClass(Window.class, c);
142
143         int selection = super.showSaveDialog(parentWindow);
144         if (selection == JFileChooser.APPROVE_OPTION) {
145
146             this.exportName = super.getSelectedFile().getAbsolutePath();
147
148             //Test if there is a file with the same name
149             if (new File(this.exportName).exists()) {
150                 int actionDialog = JOptionPane.showConfirmDialog(
151                                        this, Messages.gettext("Replace existing file?"),
152                                        Messages.gettext("File already exists"),
153                                        JOptionPane.YES_NO_OPTION);
154
155                 if (actionDialog == JOptionPane.YES_OPTION) {
156
157                 } else {
158                     return;
159                 }
160             }
161
162             /* Bug 3849 fix */
163             ConfigManager.saveLastOpenedDirectory(new File(exportName).getParentFile().getPath());
164
165             String extensionCombo = new String();
166             try {
167                 // The try catch is necessary here when the user input the full
168                 // filename (foo.jpg) and press tab. It is going to update
169                 // the filter causing the following line to fail (cannot cast)
170                 // Therefor, we switch back to the allFiles (*) case.
171                 FileMask ft = (FileMask) super.getFileFilter();
172                 //get the extension from the Filter
173                 extensionCombo = ft.getExtensionFromFilter();
174                 if (extensionCombo == null) {
175                     extensionCombo = allFiles;
176                 }
177             } catch (java.lang.ClassCastException e) {
178                 extensionCombo = allFiles;
179             }
180
181             if (extensionCombo.equals(allFiles)) {
182                 exportManager();
183             } else if (extensionCombo.equals(emf) || extensionCombo.equals(eps) || extensionCombo.equals(fig)
184                        || extensionCombo.equals(pdf) || extensionCombo.equals(svg)) {
185                 vectorialExport(extensionCombo);
186
187             } else {
188                 bitmapExport(extensionCombo);
189             }
190         } else {
191             ;    // no file chosen
192         }
193     }
194
195     /**
196      * Return the file extension
197      * @param fileName Name of the file
198      * @return the extension
199      */
200     public String getExtension(String fileName) {
201         if (fileName != null) {
202             int i = fileName.lastIndexOf('.');
203             if (i > 0 && i < fileName.length() - 1) {
204                 return fileName.substring(i + 1).toLowerCase();
205             }
206         }
207         return null;
208     }
209
210     /**
211      * Manage the export (bitmap/vectorial format) and export errors
212      */
213     public void exportManager() {
214         //get the extension of the fileName chosen by the user (can be 'null')
215         String userExtension = getExtension(this.exportName);
216
217         if (userExtension == null) {
218             //fileName without extension + "by extension (.*)" selected
219             JOptionPane.showMessageDialog(
220                 this, Messages.gettext("Please specify a file format"),
221                 Messages.gettext("Error on export"), JOptionPane.ERROR_MESSAGE);
222             return;
223         } else if (userExtension.equals(bmp)) {
224             bitmapExport(userExtension);
225
226         } else if (userExtension.equals(gif)) {
227             bitmapExport(userExtension);
228
229         } else if (userExtension.equals(jpg[0]) || userExtension.equals(jpg[1])) {
230             bitmapExport(userExtension);
231
232         } else if (userExtension.equals(png)) {
233             bitmapExport(userExtension);
234
235         } else if (userExtension.equals(ppm)) {
236             bitmapExport(userExtension);
237
238         } else if (userExtension.equals(emf)) {
239             vectorialExport(userExtension);
240
241         } else if (userExtension.equals(eps)) {
242             vectorialExport(userExtension);
243
244         } else if (userExtension.equals(fig)) {
245             vectorialExport(userExtension);
246
247         } else if (userExtension.equals(pdf)) {
248             vectorialExport(userExtension);
249
250         } else if (userExtension.equals(svg)) {
251             vectorialExport(userExtension);
252
253         } else {
254             //fileName with a wrong extension + "by extension (.*)" selected
255             JOptionPane.showMessageDialog(
256                 this, Messages.gettext("Unrecognized extension '")
257                 + userExtension + Messages.gettext("'.\n Please specify a valid file format."),
258                 Messages.gettext("Error on export"), JOptionPane.ERROR_MESSAGE);
259             return;
260         }
261     }
262
263     /**
264      * Export an bitmap file
265      * @param userExtension extension caught by the user
266      */
267     public void bitmapExport(String userExtension) {
268         ExportData exportData = new ExportData(figureUID, this.exportName, userExtension, null);
269
270         String actualFilename = exportData.getExportName();
271         if (this.getExtension(actualFilename) == null) {
272             // Could not get the extension from the user input
273             // take the one from the list
274             actualFilename += "." + userExtension;
275         }
276
277         FileExporter.fileExport(figureUID, actualFilename, exportData.getExportExtension(), -1, 0);
278     }
279
280     /**
281      * Export a vectorial file
282      * @param userExtension extension caught by the user
283      */
284     public void vectorialExport(String userExtension) {
285         Component c = DrawerVisitor.getVisitor(figureUID).getComponent();
286         ExportData exportData = new ExportData(figureUID, this.exportName, userExtension, null);
287
288         String actualFilename = exportData.getExportName();
289         if (this.getExtension(actualFilename) == null) {
290             // Could not get the extension from the user input
291             // take the one from the list
292             actualFilename += "." + userExtension;
293         }
294
295         FileExporter.fileExport(figureUID, actualFilename, exportData.getExportExtension(), -1, 0);
296     }
297 }