1
/*FreeMind - A Program for creating and viewing Mindmaps
2
*Copyright (C) 2000-2006 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitri Polivaev and others.
4
*See COPYING for Details
6
*This program is free software; you can redistribute it and/or
7
*modify it under the terms of the GNU General Public License
8
*as published by the Free Software Foundation; either version 2
9
*of the License, or (at your option) any later version.
11
*This program is distributed in the hope that it will be useful,
12
*but WITHOUT ANY WARRANTY; without even the implied warranty of
13
*MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
*GNU General Public License for more details.
16
*You should have received a copy of the GNU General Public License
17
*along with this program; if not, write to the Free Software
18
*Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21
* Created on 08.04.2004
23
* To change the template for this generated file go to
24
* Window>Preferences>Java>Code Generation>Code and Comments
26
package accessories.plugins;
28
import java.awt.image.BufferedImage;
29
import java.io.BufferedWriter;
31
import java.io.FileOutputStream;
32
import java.io.FilenameFilter;
33
import java.io.IOException;
34
import java.io.InputStream;
35
import java.io.OutputStreamWriter;
36
import java.io.StringReader;
37
import java.io.StringWriter;
38
import java.net.MalformedURLException;
40
import java.util.StringTokenizer;
41
import java.util.Vector;
43
import javax.imageio.ImageIO;
44
import javax.swing.JOptionPane;
45
import javax.xml.transform.Result;
46
import javax.xml.transform.Source;
47
import javax.xml.transform.Transformer;
48
import javax.xml.transform.TransformerFactory;
49
import javax.xml.transform.stream.StreamResult;
50
import javax.xml.transform.stream.StreamSource;
52
import accessories.plugins.util.html.ClickableImageCreator;
53
import accessories.plugins.util.xslt.ExportDialog;
54
import freemind.extensions.ExportHook;
55
import freemind.main.Resources;
56
import freemind.main.Tools;
57
import freemind.modes.MindIcon;
58
import freemind.modes.MindMap;
59
import freemind.modes.MindMapNode;
60
import freemind.modes.ModeController;
64
* Exports the map using an XSLT script. The parameterization is described
65
* in the corresponding Export... .xml-file.
67
public class ExportWithXSLT extends ExportHook {
68
private static final String NAME_EXTENSION_PROPERTY = "name_extension";
70
* For test purposes. True=no error
72
private boolean mTransformResultWithoutError = false;
74
protected File chooseFile() {
76
String nameExtension = null;
77
if (getProperties().containsKey(NAME_EXTENSION_PROPERTY)) {
78
nameExtension = getResourceString(NAME_EXTENSION_PROPERTY);
80
return chooseFile(getResourceString("file_type"), getTranslatableResourceString("file_description"), nameExtension);
86
public ExportWithXSLT() {
91
* @see freemind.extensions.MindMapHook#startupMapHook()
93
public void startupMapHook() {
94
super.startupMapHook();
95
ModeController mc = getController();
96
MindMap model = getController().getMap();
97
if (Tools.safeEquals(getResourceString("file_type"), "user")) {
99
return; // there may be no map open
100
if((model.getFile() == null) || model.isReadOnly()) {
102
export(model.getFile());
109
export(model.getFile());
111
File saveFile = chooseFile();
123
public void transform(File saveFile) {
125
mTransformResultWithoutError=true;
127
// create HTML image?
128
boolean create_image = Tools.safeEquals(getResourceString("create_html_linked_image"), "true");
129
String areaCode = getAreaCode(create_image);
130
// XSLT Transformation
131
String xsltFileName = getResourceString("xslt_file");
132
boolean success = transformMapWithXslt(xsltFileName, saveFile, areaCode);
134
JOptionPane.showMessageDialog(null,
135
getResourceString("error_applying_template"),
136
"Freemind", JOptionPane.ERROR_MESSAGE);
140
if(success && Tools.safeEquals(getResourceString("create_dir"), "true")) {
141
String directoryName = saveFile.getAbsolutePath()+"_files";
142
success = createDirectory(directoryName);
144
// copy files from the resources to the file system:
146
String files = getResourceString("files_to_copy");
147
String filePrefix = getResourceString("file_prefix");
148
copyFilesFromResourcesToDirectory(directoryName, files, filePrefix);
151
if(success && Tools.safeEquals(getResourceString("copy_icons"),"true")) {
152
success = copyIcons(directoryName);
154
if(success && Tools.safeEquals(getResourceString("copy_map"),"true")) {
155
success = copyMap(directoryName);
157
if(success && create_image) {
158
createImageFromMap(directoryName);
162
JOptionPane.showMessageDialog(null, getResourceString("error_creating_directory"), "Freemind", JOptionPane.ERROR_MESSAGE);
165
if(Tools.safeEquals(getResourceString("load_file"), "true")) {
166
getController().getFrame().openDocument(Tools.fileToUrl(saveFile));
168
} catch (Exception e) {
169
freemind.main.Resources.getInstance().logException(e);
170
mTransformResultWithoutError = false;
174
private boolean copyMap(String pDirectoryName) throws IOException
176
boolean success = true;
177
// Generating output Stream
178
BufferedWriter fileout = new BufferedWriter( new OutputStreamWriter( new FileOutputStream(pDirectoryName+File.separator + "map.mm") ) );
179
getController().getMap().getFilteredXml(fileout);
185
private boolean copyIcons(String directoryName)
188
String iconDirectoryName = directoryName + File.separatorChar + "icons";
190
success = createDirectory(iconDirectoryName);
192
copyIconsToDirectory(iconDirectoryName);
199
private void createImageFromMap(String directoryName)
201
// in the test case, we don't have a viewer and skip the image.
202
if(getController().getView() == null)
205
BufferedImage image = createBufferedImage();
207
FileOutputStream out = new FileOutputStream(directoryName+File.separator+"image.png");
208
ImageIO.write(image, "png", out);
210
} catch (IOException e1) {
211
freemind.main.Resources.getInstance().logException( e1);
217
private void copyIconsToDirectory(String directoryName2)
219
Vector iconNames = MindIcon.getAllIconNames();
220
for ( int i = 0 ; i < iconNames.size(); ++i ) {
221
String iconName = ((String) iconNames.get(i));
222
MindIcon myIcon = MindIcon.factory(iconName);
223
copyFromResource(MindIcon.getIconsPath(), myIcon.getIconBaseFileName(), directoryName2);
225
File iconDir = new File (Resources.getInstance().getFreemindDirectory(),"icons");
226
if (iconDir.exists()){
227
String[] userIconArray = iconDir.list(new FilenameFilter(){
228
public boolean accept(File dir, String name) {
229
return name.matches(".*\\.png");
232
for ( int i = 0 ; i < userIconArray.length; ++i ) {
233
String iconName = userIconArray[i];
234
if(iconName.length() == 4){
237
copyFromFile(iconDir.getAbsolutePath(), iconName, directoryName2);
245
private void copyFilesFromResourcesToDirectory(String directoryName, String files, String filePrefix)
247
StringTokenizer tokenizer = new StringTokenizer(files, ",");
248
while(tokenizer.hasMoreTokens()) {
249
String next = tokenizer.nextToken();
250
copyFromResource(filePrefix, next, directoryName);
256
private boolean createDirectory(String directoryName)
258
File dir = new File(directoryName);
259
// create directory, if not exists:
267
* @throws IOException
269
private boolean transformMapWithXslt(String xsltFileName, File saveFile, String areaCode) throws IOException
271
StringWriter writer = getMapXml();
272
StringReader reader = new StringReader(writer.getBuffer().toString());
273
// search for xslt file:
274
URL xsltUrl = getResource(xsltFileName);
275
if(xsltUrl == null) {
276
logger.severe("Can't find " + xsltFileName + " as resource.");
277
throw new IllegalArgumentException("Can't find " + xsltFileName + " as resource.");
279
InputStream xsltFile = xsltUrl.openStream();
280
return transform(new StreamSource(reader), xsltFile, saveFile, areaCode);
284
* @throws IOException
286
private StringWriter getMapXml() throws IOException
289
StringWriter writer = new StringWriter();
291
getController().getMap().getFilteredXml(writer);
296
* @param create_image
298
private String getAreaCode(boolean create_image)
302
MindMapNode root = getController().getMap().getRootNode();
303
ClickableImageCreator creator = new ClickableImageCreator(root, getController(),
304
getResourceString("link_replacement_regexp"));
305
areaCode = creator.generateHtml();
310
private void export(File file) {
311
ExportDialog exp = new ExportDialog(file, getController());
312
exp.setVisible(true);
315
public boolean transform(Source xmlSource, InputStream xsltStream, File resultFile, String areaCode)
317
//System.out.println("set xsl");
318
Source xsltSource = new StreamSource(xsltStream);
319
//System.out.println("set result");
320
Result result = new StreamResult(resultFile);
322
// create an instance of TransformerFactory
324
//System.out.println("make transform instance");
325
TransformerFactory transFact = TransformerFactory.newInstance( );
327
Transformer trans = transFact.newTransformer(xsltSource);
329
// relative directory <filename>_files
330
trans.setParameter("destination_dir", resultFile.getName()+"_files/");
331
trans.setParameter("area_code", areaCode);
332
trans.setParameter("folding_type", getController().getFrame().getProperty("html_export_folding"));
333
trans.transform(xmlSource, result);
336
//System.err.println("error applying the xslt file "+e);
337
freemind.main.Resources.getInstance().logException(e);
343
public boolean isTransformResultWithoutError() {
344
return mTransformResultWithoutError;