package org.freeplane.features.export.mindmapmode; import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Properties; import javax.swing.filechooser.FileFilter; import org.freeplane.core.extension.IExtension; import org.freeplane.core.resources.ResourceController; import org.freeplane.core.ui.components.UITools; import org.freeplane.core.util.FileUtils; import org.freeplane.core.util.LogUtils; import org.freeplane.core.util.TextUtils; import org.freeplane.features.map.MapModel; import org.freeplane.features.mode.Controller; import org.freeplane.features.mode.ModeController; import org.freeplane.n3.nanoxml.IXMLParser; import org.freeplane.n3.nanoxml.IXMLReader; import org.freeplane.n3.nanoxml.StdXMLReader; import org.freeplane.n3.nanoxml.XMLElement; import org.freeplane.n3.nanoxml.XMLParserFactory; /** * A registry of all XSLT scripts that are available to transform a .mm file into another format. * The XSLT file directories are scanned anew by each instance of this class to account for changes during uptime. * The filterMap maps descriptions onto a XSLT file. This enables multiple filters for one file extension. */ public class ExportController implements IExtension{ /** a hash where the key is the file extension and the value the filename of * the corresponding XSLT sheet. */ final private HashMap<FileFilter, IExportEngine> filterMap = new HashMap<FileFilter, IExportEngine>(); final private ArrayList<FileFilter> fileFilters = new ArrayList<FileFilter>(); public static void install(ExportController exportController) { Controller.getCurrentModeController().addExtension(ExportController.class, exportController); } public ExportController(final String xmlDescriptorFile) { final ModeController modeController = Controller.getCurrentModeController(); final ExportAction action = new ExportAction(); modeController.addAction(action); final ExportToHTMLAction exportToHTMLAction = new ExportToHTMLAction(); addExportEngine(exportToHTMLAction.getFileFilter(), exportToHTMLAction); final ExportBranchToHTMLAction exportBranchToHTMLAction = new ExportBranchToHTMLAction(); addExportEngine(exportBranchToHTMLAction.getFileFilter(), exportBranchToHTMLAction); final ExportToOoWriter exportToOoWriter = new ExportToOoWriter(); addExportEngine(exportToOoWriter.getFileFilter(), exportToOoWriter); createImageExporters(); createXSLTExportActions(xmlDescriptorFile); new XsltExportEngineFactory().gatherXsltScripts(this); Collections.sort(fileFilters, new Comparator<FileFilter>() { public int compare(FileFilter f1, FileFilter f2) { return f1.getDescription().compareToIgnoreCase(f2.getDescription()); } }); } public void createImageExporters() { final ExportToImage pngExport = new ExportToImage("png","Portable Network Graphic (PNG)"); addExportEngine(pngExport.getFileFilter(), pngExport); final ExportToImage jpgExport = new ExportToImage("jpg","Compressed image (JPEG)"); addExportEngine(jpgExport.getFileFilter(), jpgExport); } private void createXSLTExportActions( final String xmlDescriptorFile) { InputStream xmlDescriptorStream = null; try { final IXMLParser parser = XMLParserFactory.createDefaultXMLParser(); final URL resource = ResourceController.getResourceController().getResource(xmlDescriptorFile); xmlDescriptorStream = resource.openStream(); final IXMLReader reader = new StdXMLReader(xmlDescriptorStream); parser.setReader(reader); final XMLElement xml = (XMLElement) parser.parse(); final Enumeration<XMLElement> actionDescriptors = xml.enumerateChildren(); while (actionDescriptors.hasMoreElements()) { final XMLElement descriptor = actionDescriptors.nextElement(); final String name = descriptor.getAttribute("name", null); final XMLElement xmlProperties = descriptor.getFirstChildNamed("properties"); final Properties properties = xmlProperties.getAttributes(); final ExportWithXSLT action = new ExportWithXSLT(name, properties); addExportEngine(action.getFileFilter(), action); } } catch (final Exception e) { LogUtils.severe(e); } finally { FileUtils.silentlyClose(xmlDescriptorStream); } } public void addExportEngine(final FileFilter filter, final IExportEngine exporter) { fileFilters.add(filter); filterMap.put(filter, exporter); } /** returns a Map(description -> xsltFile). */ public HashMap<FileFilter, IExportEngine> getFilterMap() { return filterMap; } /** returns a list of all appropriate FileFilters for a FileChooser. */ public List<FileFilter> getFileFilters() { return fileFilters; } public static ExportController getContoller() { return getController(Controller.getCurrentModeController()); } public static ExportController getController(ModeController modeController) { return (ExportController) modeController.getExtension(ExportController.class); } public boolean checkCurrentMap(MapModel map) { if(map.equals(Controller.getCurrentController().getMap())){ return true; } UITools.errorMessage(TextUtils.getText("export_works_for_current_map_only")); return false; } }