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