/*FreeMind - A Program for creating and viewing Mindmaps *Copyright (C) 2000-2006 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitri Polivaev and others. * *See COPYING for Details * *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, write to the Free Software *Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* * Created on 19.04.2004 * */ package accessories.plugins; import java.awt.EventQueue; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import java.util.List; import java.util.ListIterator; import javax.swing.text.BadLocationException; import javax.swing.text.Element; import javax.swing.text.html.HTMLDocument; import javax.swing.text.html.HTMLEditorKit; import freemind.main.FixedHTMLWriter; import freemind.modes.MindMapNode; import freemind.modes.mindmapmode.MindMapController; import freemind.modes.mindmapmode.hooks.MindMapNodeHookAdapter; import freemind.view.mindmapview.MapView; /** * @author Dimitri Polivaev * */ public class SplitNode extends MindMapNodeHookAdapter { /** * */ public SplitNode() { super(); } /* * (non-Javadoc) * * @see freemind.extensions.NodeHook#invoke(freemind.modes.MindMapNode, * java.util.List) */ public void invoke(MindMapNode node) { super.invoke(node); final List list = getMindMapController().getSelecteds(); final ListIterator listIterator = list.listIterator(); while (listIterator.hasNext()) { MindMapNode next = (MindMapNode) listIterator.next(); splitNode(next); } } private void splitNode(MindMapNode node) { if (node.isRoot()) { return; } String text = node.toString(); String[] parts = splitNode(text); if (parts == null || parts.length == 1) { return; } final MindMapController c = getMindMapController(); int firstPartNumber = 0; while (parts[firstPartNumber] == null) { firstPartNumber++; } c.setNodeText(node, parts[firstPartNumber]); MindMapNode parent = node.getParentNode(); final int nodePosition = parent.getChildPosition(node) + 1; for (int i = parts.length - 1; i > firstPartNumber; i--) { final MindMapNode lowerNode = c.addNewNode(parent, nodePosition, node.isLeft()); final String part = parts[i]; if (part == null) { continue; } lowerNode.setColor(node.getColor()); lowerNode.setFont(node.getFont()); c.setNodeText(lowerNode, part); EventQueue.invokeLater(new Runnable() { public void run() { final MapView mapView = c.getView(); mapView.toggleSelected(mapView.getNodeView(lowerNode)); } }); } } private String[] splitNode(String text) { if (text.startsWith("<html>")) { String[] parts = null; HTMLEditorKit kit = new HTMLEditorKit(); HTMLDocument doc = new HTMLDocument(); StringReader buf = new StringReader(text); try { kit.read(buf, doc, 0); Element parent = getParentElement(doc); if (parent == null) { return null; } final int elementCount = parent.getElementCount(); int notEmptyElementCount = 0; parts = new String[elementCount]; for (int i = 0; i < elementCount; i++) { Element current = parent.getElement(i); final int start = current.getStartOffset(); final int end = current.getEndOffset(); final String paragraphText = doc .getText(start, end - start).trim(); if (paragraphText.length() > 0) { StringWriter out = new StringWriter(); new FixedHTMLWriter(out, doc, start, end - start) .write(); final String string = out.toString(); if (!string.equals("")) { parts[i] = string; notEmptyElementCount++; } else { parts[i] = null; } } } if (notEmptyElementCount <= 1) { return null; } } catch (IOException e) { freemind.main.Resources.getInstance().logException(e); } catch (BadLocationException e) { freemind.main.Resources.getInstance().logException(e); } return parts; } return text.split("\n"); } private Element getParentElement(HTMLDocument doc) { final Element htmlRoot = doc.getDefaultRootElement(); Element parentCandidate = htmlRoot.getElement(htmlRoot .getElementCount() - 1); do { if (parentCandidate.getElementCount() > 1) { return parentCandidate; } parentCandidate = parentCandidate.getElement(0); } while (!(parentCandidate.isLeaf() || parentCandidate.getName() .equalsIgnoreCase("p-implied"))); return null; } }