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