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