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