64038021f68936339f6387f95d19247a4f91c57d
[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 psDesc = Messages.gettext("PostScript image (PS)");
54     private final String figDesc = Messages.gettext("FIG image");
55     private final String pdfDesc = Messages.gettext("PDF image");
56     private final String svgDesc = Messages.gettext("SVG image");
57     private final String allFilesDesc = Messages.gettext("All files");
58
59     private final String bmp = "bmp";
60     private final String gif = "gif";
61     private final String[] jpg = {"jpg", "jpeg"};
62     private final String png = "png";
63     private final String ppm = "ppm";
64     private final String emf = "emf";
65     private final String eps = "eps";
66     private final String ps = "ps";
67     private final String fig = "fig";
68     private final String pdf = "pdf";
69     private final String svg = "svg";
70     private final String allFiles = "*";
71
72     private String exportName;
73     private String extensionSelected;
74     private Integer figureUID;
75
76     /**
77      * Default constructor
78      * @param figureId id of the exported figure
79      */
80     public SwingScilabExportFileChooser(Integer figureUID) {
81         super();
82         this.figureUID = figureUID;
83         SwingScilabTab tab = (SwingScilabTab) SwingView.getFromId(figureUID);
84         setParentFrame(tab.getParentWindow());
85         exportCustomFileChooser(figureUID);
86     }
87
88     /**
89      * We customize the file chooser for the graphic export
90      * by adding format selection
91      * @param figureId exported figure number
92      */
93     public void exportCustomFileChooser(Integer figureUID) {
94         ArrayList<FileMask> v = new ArrayList<FileMask>(NB_FILE_MASKS);  /* The order does matter */
95         v.add(new FileMask(png, pngDesc));
96         v.add(new FileMask(jpg, jpgDesc));
97         v.add(new FileMask(eps, epsDesc));
98         v.add(new FileMask(ps, psDesc));
99         v.add(new FileMask(pdf, pdfDesc));
100         v.add(new FileMask(svg, svgDesc));
101         v.add(new FileMask(emf, emfDesc));
102         v.add(new FileMask(gif, gifDesc));
103         v.add(new FileMask(bmp, bmpDesc));
104         v.add(new FileMask(ppm, ppmDesc));
105         v.add(new FileMask(fig, figDesc));
106         v.add(new FileMask(allFiles, allFilesDesc)); // should always be at the last position
107
108         super.setDialogTitle(Messages.gettext("Export"));
109         super.setApproveButtonText(Messages.gettext("Export"));
110         File exportFile = new File(Messages.gettext("Untitled-export"));
111         super.setSelectedFile(exportFile);
112         super.setAcceptAllFileFilterUsed(false);
113
114         this.figureUID = figureUID;
115
116         for (int i = 0; i < v.size(); i++) {
117             FileMask fm = v.get(i);
118             if (i == v.size() - 1) { /* Last case ... all files, remove the extension */
119                 fm.clearExtensions();
120             }
121             super.addChoosableFileFilter(fm);
122         }
123
124         //Preview panel
125         JPanel panelPreview = new JPanel();
126
127         //Title for preview panel
128         TitledBorder titlePreview;
129         titlePreview = BorderFactory.createTitledBorder(Messages.gettext("Preview"));
130         panelPreview.setBorder(titlePreview);
131
132         //add preview image
133         panelPreview.add(new ImagePreview(this));
134
135         //Main panel contains extensionTable panel & preview panel
136         JPanel accessoryPanel = new JPanel();
137
138         //accessoryPanel.add(scrollPane);
139         accessoryPanel.add(panelPreview);
140         accessoryPanel.setVisible(true);
141         super.setAccessory(accessoryPanel);
142
143         Component c = DrawerVisitor.getVisitor(figureUID).getComponent();
144         Window parentWindow = (Window) SwingUtilities.getAncestorOfClass(Window.class, c);
145
146         int selection = super.showSaveDialog(parentWindow);
147         if (selection == JFileChooser.APPROVE_OPTION && super.getSelectedFile() != null) {
148             this.exportName = super.getSelectedFile().getAbsolutePath();
149
150             //Test if there is a file with the same name
151             if (new File(this.exportName).exists()) {
152                 int actionDialog = JOptionPane.showConfirmDialog(
153                                        parentWindow, Messages.gettext("Replace existing file?"),
154                                        Messages.gettext("File already exists"),
155                                        JOptionPane.YES_NO_OPTION);
156
157                 if (actionDialog != JOptionPane.YES_OPTION) {
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(ps) || extensionCombo.equals(fig) || extensionCombo.equals(pdf) || extensionCombo.equals(svg)) {
184                 vectorialExport(extensionCombo);
185             } else {
186                 bitmapExport(extensionCombo);
187             }
188         } else {
189             ;    // no file chosen
190         }
191     }
192
193     /**
194      * Return the file extension
195      * @param fileName Name of the file
196      * @return the extension
197      */
198     public String getExtension(String fileName) {
199         if (fileName != null) {
200             int i = fileName.lastIndexOf('.');
201             if (i > 0 && i < fileName.length() - 1) {
202                 return fileName.substring(i + 1).toLowerCase();
203             }
204         }
205         return null;
206     }
207
208     /**
209      * Manage the export (bitmap/vectorial format) and export errors
210      */
211     public void exportManager() {
212         //get the extension of the fileName chosen by the user (can be 'null')
213         String userExtension = getExtension(this.exportName);
214
215         if (userExtension == null) {
216             //fileName without extension + "by extension (.*)" selected
217             JOptionPane.showMessageDialog(
218                 this, Messages.gettext("Please specify a file format"),
219                 Messages.gettext("Error on export"), JOptionPane.ERROR_MESSAGE);
220             return;
221         } else if (userExtension.equals(bmp)) {
222             bitmapExport(userExtension);
223
224         } else if (userExtension.equals(gif)) {
225             bitmapExport(userExtension);
226
227         } else if (userExtension.equals(jpg[0]) || userExtension.equals(jpg[1])) {
228             bitmapExport(userExtension);
229
230         } else if (userExtension.equals(png)) {
231             bitmapExport(userExtension);
232
233         } else if (userExtension.equals(ppm)) {
234             bitmapExport(userExtension);
235
236         } else if (userExtension.equals(emf)) {
237             vectorialExport(userExtension);
238
239         } else if (userExtension.equals(eps)) {
240             vectorialExport(userExtension);
241
242         } else if (userExtension.equals(fig)) {
243             vectorialExport(userExtension);
244
245         } else if (userExtension.equals(pdf)) {
246             vectorialExport(userExtension);
247
248         } else if (userExtension.equals(svg)) {
249             vectorialExport(userExtension);
250
251         } else {
252             //fileName with a wrong extension + "by extension (.*)" selected
253             JOptionPane.showMessageDialog(
254                 this, String.format(Messages.gettext("Unrecognized extension '%s'.\n Please specify a valid file format."), userExtension), Messages.gettext("Error on export"), JOptionPane.ERROR_MESSAGE);
255             return;
256         }
257     }
258
259     /**
260      * Export an bitmap file
261      * @param userExtension extension caught by the user
262      */
263     public void bitmapExport(String userExtension) {
264         ExportData exportData = new ExportData(figureUID, this.exportName, userExtension, null);
265
266         String actualFilename = exportData.getExportName();
267         if (this.getExtension(actualFilename) == null) {
268             // Could not get the extension from the user input
269             // take the one from the list
270             actualFilename += "." + userExtension;
271         }
272
273         FileExporter.fileExport(figureUID, actualFilename, exportData.getExportExtension(), -1, 0);
274     }
275
276     /**
277      * Export a vectorial file
278      * @param userExtension extension caught by the user
279      */
280     public void vectorialExport(String userExtension) {
281         SwingScilabTab tab = (SwingScilabTab) SwingView.getFromId(figureUID);
282         Component c = DrawerVisitor.getVisitor(figureUID).getComponent();
283         ExportData exportData = new ExportData(figureUID, this.exportName, userExtension, null);
284
285         ExportOptionWindow exportOptionWindow = new ExportOptionWindow(exportData);
286         exportOptionWindow.displayOptionWindow(tab);
287         exportOptionWindow.landscapePortraitOption();
288     }
289 }