/* * Freeplane - mind map editor * Copyright (C) 2008 Dimitry Polivaev * * This file author is Dimitry Polivaev * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.freeplane.features.map; import java.io.IOException; import java.io.Writer; import java.util.Arrays; import org.freeplane.core.extension.IExtension; import org.freeplane.core.io.IAttributeWriter; import org.freeplane.core.io.IElementWriter; import org.freeplane.core.io.ITreeWriter; import org.freeplane.core.io.WriteManager; import org.freeplane.core.io.xml.TreeXmlWriter; import org.freeplane.core.util.FreeplaneVersion; import org.freeplane.n3.nanoxml.XMLElement; /** * @author Dimitry Polivaev * 07.12.2008 */ public class MapWriter implements IElementWriter, IAttributeWriter { public enum WriterHint { FORCE_FORMATTING } private static final String USAGE_COMMENT = "<!--To view this file," + " download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->" + System.getProperty("line.separator"); public enum Hint { MODE }; public enum Mode { CLIPBOARD, FILE, EXPORT, STYLE }; private NodeWriter currentNodeWriter; final private MapController mapController; private boolean saveInvisible; final private WriteManager writeManager; public MapWriter(final MapController mapController) { this.mapController = mapController; writeManager = mapController.getWriteManager(); } public boolean isSaveInvisible() { return saveInvisible; } public void setSaveInvisible(final boolean saveInvisible) { this.saveInvisible = saveInvisible; } public void writeAttributes(final ITreeWriter writer, final Object userObject, final String tag) { final MapModel map = (MapModel) userObject; writer.addAttribute("version", FreeplaneVersion.XML_VERSION); writer.addExtensionAttributes(map, Arrays.asList(map.getExtensions().values().toArray(new IExtension[] {}))); } public void writeContent(final ITreeWriter writer, final Object node, final String tag) throws IOException { writer.addElementContent(USAGE_COMMENT); final MapModel map = (MapModel) node; writer.addExtensionNodes(map, Arrays.asList(map.getExtensions().values().toArray(new IExtension[] {}))); final NodeModel rootNode = map.getRootNode(); writeNode(writer, rootNode, saveInvisible, true); } public void writeMapAsXml(final MapModel map, final Writer fileout, final Mode mode, final boolean saveInvisible, final boolean forceFormat) throws IOException { final TreeXmlWriter xmlWriter = new TreeXmlWriter(writeManager, fileout); xmlWriter.setHint(Hint.MODE, mode); if (forceFormat) { xmlWriter.setHint(WriterHint.FORCE_FORMATTING); } final XMLElement xmlMap = new XMLElement("map"); setSaveInvisible(saveInvisible); xmlWriter.addElement(map, xmlMap); xmlWriter.flush(); fileout.close(); } protected void writeNode(final ITreeWriter xmlWriter, final NodeModel node, final boolean writeInvisible, final boolean writeChildren) throws IOException { final NodeWriter oldNodeWriter = currentNodeWriter; final Object mode = xmlWriter.getHint(Hint.MODE); final String nodeTag; if (Mode.STYLE.equals(mode)) { nodeTag = NodeBuilder.XML_STYLENODE; } else { nodeTag = NodeBuilder.XML_NODE; } if (oldNodeWriter != null) { writeManager.removeElementWriter(oldNodeWriter.getNodeTag(), oldNodeWriter); writeManager.removeAttributeWriter(oldNodeWriter.getNodeTag(), oldNodeWriter); } currentNodeWriter = new NodeWriter(mapController, nodeTag, writeChildren, writeInvisible); try { writeManager.addElementWriter(nodeTag, currentNodeWriter); writeManager.addAttributeWriter(nodeTag, currentNodeWriter); xmlWriter.addElement(node, nodeTag); } finally { writeManager.removeElementWriter(nodeTag, currentNodeWriter); writeManager.removeAttributeWriter(nodeTag, currentNodeWriter); if (oldNodeWriter != null) { writeManager.addElementWriter(oldNodeWriter.getNodeTag(), oldNodeWriter); writeManager.addAttributeWriter(oldNodeWriter.getNodeTag(), oldNodeWriter); } currentNodeWriter = oldNodeWriter; } } public void writeNodeAsXml(final Writer writer, final NodeModel node, final Mode mode, final boolean writeInvisible, final boolean writeChildren, boolean forceFormat) throws IOException { final TreeXmlWriter xmlWriter = new TreeXmlWriter(writeManager, writer); xmlWriter.setHint(Hint.MODE, mode); if (forceFormat) { xmlWriter.setHint(WriterHint.FORCE_FORMATTING); } writeNode(xmlWriter, node, writeInvisible, writeChildren); xmlWriter.flush(); } }