Help compilation: - Fix warnings and detect doc with no examples
[scilab.git] / scilab / modules / helptools / src / java / org / scilab / modules / helptools / image / ImageConverter.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - Calixte DENIZET
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 package org.scilab.modules.helptools.image;
14
15 import java.awt.Graphics2D;
16 import java.awt.Color;
17 import java.awt.image.BufferedImage;
18 import java.io.File;
19 import java.io.FileInputStream;
20 import java.io.FileOutputStream;
21 import java.io.IOException;
22 import java.io.OutputStream;
23 import java.io.StringReader;
24 import java.net.URI;
25 import java.net.URISyntaxException;
26 import java.nio.channels.FileChannel;
27 import java.util.HashMap;
28 import java.util.Map;
29
30 import javax.activation.MimetypesFileTypeMap;
31 import javax.imageio.ImageIO;
32 import javax.swing.Icon;
33 import javax.swing.ImageIcon;
34 import javax.swing.JLabel;
35
36 /**
37  * Class to handle the image conversion
38  * @author Calixte DENIZET
39  */
40 public final class ImageConverter {
41
42     private static Map<String, ExternalImageConverter> externalConverters = new HashMap<String, ExternalImageConverter>();
43     private static MimetypesFileTypeMap mimeMap = new MimetypesFileTypeMap();
44
45     static {
46         mimeMap.addMimeTypes("type=image/latex exts=tex,latex");
47         mimeMap.addMimeTypes("type=image/mathml exts=mml,mathml");
48         mimeMap.addMimeTypes("type=image/svg exts=svg");
49         mimeMap.addMimeTypes("type=image/scilab exts=sce");
50     }
51
52     /**
53      * Register a new ExternalImageConverter
54      * @param c the converter to register
55      */
56     public static void registerExternalImageConverter(ExternalImageConverter c) {
57         if (c != null) {
58             externalConverters.put(c.getMimeType(), c);
59         }
60     }
61
62     /**
63      * @param attrs the attribute of the image
64      * @param path the current XML file which is parsed
65      * @param image the filename
66      * @param destDir the destination directory
67      * @return the HTML code to insert the image
68      */
69     public static String getImageByFile(Map<String, String> attrs, String path, String image, String outputDir, String destDir) {
70         File f = new File(image);
71         if (!f.isAbsolute()) {
72             f = new File(path + File.separator + image);
73         }
74
75         String destFile = outputDir + File.separator + destDir + File.separator + f.getName();
76
77         ExternalImageConverter conv = externalConverters.get(mimeMap.getContentType(f));
78         if (conv != null) {
79             destFile += ".png";
80         }
81         File imageFile = new File(destFile);
82         String imageName = destDir + "/" + imageFile.getName();
83
84         if (f.lastModified() > imageFile.lastModified()) {
85             if (conv != null) {
86                 return conv.convertToImage(f, attrs, imageFile, imageName);
87             }
88             copyImageFile(f, destDir);
89         }
90
91         return "<img src=\'" + imageName + "\'/>";
92     }
93
94
95     /**
96      * @param code the code to translate
97      * @param attrs the attribute of the image
98      * @param mime type
99      * @param imageFile the filename
100      * @return the HTML code to insert the image
101      */
102     public static String getImageByCode(String currentFile, String code, Map<String, String> attrs, String mime, File imageFile, String imageName) {
103         File current = null;
104         try {
105             current = new File(new URI(currentFile));
106         } catch (URISyntaxException e) { }
107
108         ExternalImageConverter conv = externalConverters.get(mime);
109         if (conv == null) {
110             System.err.println("In file " + currentFile + "invalid code:\n" + code);
111             return null;
112         }
113
114         if (conv.mustRegenerate() || current == null || current.lastModified() > imageFile.lastModified()) {
115             return conv.convertToImage(currentFile, code, attrs, imageFile, imageName);
116         }
117
118         return "<img src=\'" + imageName + "\'/>";
119     }
120
121     /**
122      * @param code the code to translate
123      * @param img image informations
124      * @param fileName the filename
125      * @param attrs the attribute of the image
126      * @return the HTML code to insert the image
127      */
128     public static String generateCode(Image img, String fileName, Map<String, String> attrs) {
129         String style = attrs.get("style");
130         String top = "";
131         boolean display = style != null && style.equals("display");
132
133         if (!display) {
134             top = "top:" + img.descent + "px;";
135         }
136
137         String alignAttr = attrs.get("align");
138         String align = "";
139         String div = "div";
140         if (alignAttr != null) {
141             align = " style=\'text-align:" + alignAttr + "\'";
142         } else if (display) {
143             align = " style=\'text-align:center\'";
144         } else {
145             div = "span";
146         }
147
148         return "<" + div + align + "><img src=\'" + fileName + "\' style=\'position:relative;" + top  + "width:" + img.width + "px;height:" + img.height + "px\'/></" + div + ">";
149     }
150
151     /**
152      * Test if an image file exists.
153      * @param path of the parsed file
154      * @param image the image name
155      * @return true if the image exists
156      */
157     public static boolean imageExists(String path, String image) {
158         File f = new File(image);
159         if (!f.isAbsolute()) {
160             f = new File(path + File.separator + image);
161         }
162
163         return f.exists();
164     }
165
166     /**
167      * @param f the file to copy
168      * @param destDir the destination directory
169      */
170     public static void copyImageFile(File f, String destDir) {
171         FileChannel src = null;
172         FileChannel dest = null;
173         try {
174             File destFile = new File(destDir + File.separator + f.getName());
175             if (!destFile.exists()) {
176                 destFile.createNewFile();
177             } else if (f.lastModified() <= destFile.lastModified()) {
178                 return;
179             }
180
181             src = new FileInputStream(f).getChannel();
182             dest = new FileOutputStream(destFile).getChannel();
183             dest.transferFrom(src, 0, src.size());
184         } catch (IOException e) {
185             System.err.println(e);
186         } finally {
187             try {
188                 if (src != null) {
189                     src.close();
190                 }
191                 if (dest != null) {
192                     dest.close();
193                 }
194             } catch (IOException e) {
195                 System.err.println(e);
196             }
197         }
198     }
199
200     /**
201      * @param icon the icon to convert into PNG
202      * @param imageFile the destination file
203      * @return true if all is ok
204      */
205     public static boolean convertIconToPNG(Icon icon, File imageFile) {
206         BufferedImage image = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
207         Graphics2D g2d = image.createGraphics();
208         icon.paintIcon(null, g2d, 0, 0);
209
210         try {
211             ImageIO.write(image, "png", imageFile.getAbsoluteFile());
212         } catch (IOException ex) {
213             return false;
214         }
215
216         g2d.dispose();
217
218         return true;
219     }
220 }