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