/*FreeMind - A Program for creating and viewing Mindmaps *Copyright (C) 2000-2001 Joerg Mueller <joergmueller@bigfoot.com> *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. */ package freemind.modes; import java.awt.Color; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.Reader; import java.util.Enumeration; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import freemind.main.Tools; import freemind.main.XMLElement; // Daniel: this seems like a description of what pattern should do rather // than of that what it actually does. /** * THIS CLASS IS NO LONGER USED! * * This class represents a StylePattern than can be applied to a node or a whole * branch. The properties of the nodes are replaced with the properties saved in * the pattern. If a property "text" is given, this pattern is automatically * applied to all nodes that contain the String saved in "text". */ public class StylePattern { private String name; /** * NOT USED: The idea of recursive is redundant. You have a possibility to * select all nodes in a branch easily. */ private boolean recursive; private String text; private Color nodeColor; private Color nodeBackgroundColor; private String nodeStyle; private String nodeFontFamily = null; private Integer nodeFontSize = null; private Boolean nodeFontBold = null; private Boolean nodeFontItalic = null; private MindIcon nodeIcon; private Color edgeColor; private String edgeStyle; private Integer edgeWidth; /** Inhertitable patterns, fc, 3.12.2003. */ private StylePattern mChildrenStylePattern; /** * Empty constructor */ public StylePattern() { } public StylePattern(XMLElement elm, List justConstructedPatterns) { loadPattern(elm, justConstructedPatterns); } /** * Constructs a style pattern from a node: */ public StylePattern(MindMapNode node) { nodeColor = node.getColor(); nodeBackgroundColor = node.getBackgroundColor(); nodeStyle = node.getStyle(); nodeFontBold = new Boolean(node.isBold()); nodeFontItalic = new Boolean(node.isItalic()); nodeFontSize = node.getFontSize() == null ? null : Integer.valueOf(node .getFontSize()); nodeFontFamily = node.getFontFamilyName(); nodeIcon = null; // appliesToNodeIcon = node.getIcons().size()>0; // nodeIcon = (MindIcon) // (node.getIcons().size()==0?null:node.getIcons().get(0)); edgeColor = node.getEdge().getColor(); edgeStyle = node.getEdge().getStyle(); edgeWidth = new Integer(node.getEdge().getWidth()); } public String toString() { return "node: " + nodeColor + ", " + nodeBackgroundColor + ", " + nodeStyle + ", " + nodeFontFamily + ", " + nodeFontSize + ", " + nodeIcon + ", " + text + ", " + "\nedge: " + edgeColor + ", " + edgeStyle + ", " + edgeWidth; } public boolean getAppliesToEdge() { return edgeColor != null || edgeStyle != null || edgeWidth != null; } public boolean getAppliesToNode() { return nodeBackgroundColor != null || nodeColor != null || nodeStyle != null; } public boolean getAppliesToNodeFont() { return nodeFontBold != null || nodeFontFamily != null || nodeFontItalic != null || nodeFontSize != null; } public boolean getAppliesToNodeIcon() { return nodeIcon != null; } public boolean getAppliesToChildren() { return mChildrenStylePattern != null; } /** * Get the value of name. * * @return Value of name. */ public String getName() { return name; } /** * Set the value of name. * * @param v * Value to assign to name. */ public void setName(String v) { this.name = v; } /** * Determine if the properies of this pattern, of course except the "text" * attribute, apply to all the child nodes of this node. * * @return Value of recursive. */ public boolean getRecursive() { return recursive; } /** * Set the value of recursive. * * @param v * Value to assign to recursive. */ public void setRecursive(boolean v) { this.recursive = v; } /** * Get the value of text. * * @return Value of text. */ public String getText() { return text; } /** * Set the value of text. * * @param v * Value to assign to text. */ public void setText(String v) { this.text = v; } /** * Get the value of nodeColor. * * @return Value of nodeColor. */ public Color getNodeColor() { return nodeColor; } /** * Set the value of nodeColor. * * @param v * Value to assign to nodeColor. */ public void setNodeColor(Color v) { this.nodeColor = v; } public Color getNodeBackgroundColor() { return nodeBackgroundColor; } public void setNodeBackgroundColor(Color nodeBackgroundColor) { this.nodeBackgroundColor = nodeBackgroundColor; } /** * Get the value of nodeStyle. * * @return Value of nodeStyle. */ public String getNodeStyle() { return nodeStyle; } /** * Set the value of nodeStyle. * * @param nodeStyle * Value to assign to nodeStyle. */ public void setNodeStyle(String nodeStyle) { this.nodeStyle = nodeStyle; } /** * @return Returns the nodeFontFamily. */ public String getNodeFontFamily() { return nodeFontFamily; } /** * @param nodeFontFamily * The nodeFontFamily to set. */ public void setNodeFontFamily(String nodeFontFamily) { this.nodeFontFamily = nodeFontFamily; } /** * @return Returns the nodeFontSize. */ public Integer getNodeFontSize() { return nodeFontSize; } /** * @param nodeFontSize * The nodeFontSize to set. */ public void setNodeFontSize(Integer nodeFontSize) { this.nodeFontSize = nodeFontSize; } /** * Get the value of icon. * * @return Value of icon. */ public MindIcon getNodeIcon() { return nodeIcon; } /** * Set the value of icon. * * @param nodeIcon * Value to assign to icon. */ public void setNodeIcon(MindIcon nodeIcon) { this.nodeIcon = nodeIcon; } /** * Get the value of edgeColor. * * @return Value of edgeColor. */ public Color getEdgeColor() { return edgeColor; } /** * Set the value of edgeColor. * * @param edgeColor * Value to assign to edgeColor. */ public void setEdgeColor(Color edgeColor) { this.edgeColor = edgeColor; } /** * Get the value of edgeStyle. * * @return Value of edgeStyle. */ public String getEdgeStyle() { return edgeStyle; } /** * Set the value of edgeStyle. * * @param edgeStyle * Value to assign to edgeStyle. */ public void setEdgeStyle(String edgeStyle) { this.edgeStyle = edgeStyle; } /** * Get the value of edgeWidth. * * @return Value of edgeWidth. */ public Integer getEdgeWidth() { return edgeWidth; } /** * Set the value of edgeWidth. * * @param edgeWidth * Value to assign to edgeWidth. */ public void setEdgeWidth(Integer edgeWidth) { this.edgeWidth = edgeWidth; } /** * Get the value of ChildrenStylePattern. * * @return Value of ChildrenStylePattern. */ public StylePattern getChildrenStylePattern() { return mChildrenStylePattern; } /** * Set the value of ChildrenStylePattern. * * @param pChildrenStylePattern * Value to assign to ChildrenStylePattern. */ public void setChildrenStylePattern(StylePattern pChildrenStylePattern) { this.mChildrenStylePattern = pChildrenStylePattern; } public static List loadPatterns(File file) throws Exception { return loadPatterns(new BufferedReader(new FileReader(file))); } public static List loadPatterns(Reader reader) throws Exception { List list = new LinkedList(); XMLElement parser = new XMLElement(); parser.parseFromReader(reader); for (Enumeration e = parser.enumerateChildren(); e.hasMoreElements();) { list.add(new StylePattern((XMLElement) e.nextElement(), list)); } return list; } protected void loadPattern(XMLElement pattern, List justConstructedPatterns) { // PATTERN if (pattern.getStringAttribute("name") != null) { setName(pattern.getStringAttribute("name")); } if (Tools.safeEquals(pattern.getStringAttribute("recursive"), "true")) { setRecursive(true); } for (Iterator i = pattern.getChildren().iterator(); i.hasNext();) { // this has to be improved! // NODE XMLElement child = (XMLElement) i.next(); if (child.getName().equals("node")) { if (child.getStringAttribute("color") != null && child.getStringAttribute("color").length() == 7) { setNodeColor(Tools.xmlToColor(child .getStringAttribute("color"))); } if (child.getStringAttribute("background_color") != null && child.getStringAttribute("background_color") .length() == 7) { setNodeBackgroundColor(Tools.xmlToColor(child .getStringAttribute("background_color"))); } if (child.getStringAttribute("style") != null) { setNodeStyle(child.getStringAttribute("style")); } if (child.getStringAttribute("icon") != null) { setNodeIcon(child.getStringAttribute("icon").equals("none") ? null : MindIcon .factory(child.getStringAttribute("icon"))); } setText(child.getStringAttribute("text")); for (Iterator j = child.getChildren().iterator(); j.hasNext();) { XMLElement nodeChild = (XMLElement) j.next(); // FONT if (nodeChild.getName().equals("font")) { if (nodeChild.getStringAttribute("name") != null) { setNodeFontFamily(nodeChild .getStringAttribute("name")); } if (Tools.safeEquals( nodeChild.getStringAttribute("bold"), "true")) { setNodeFontBold(Boolean.TRUE); } if (Tools.safeEquals( nodeChild.getStringAttribute("italic"), "true")) { setNodeFontItalic(Boolean.TRUE); } // if (font.getProperty("underline")!=null && // nodeChild.getProperty("underline").equals("true")) // setUnderlined(true); if (nodeChild.getStringAttribute("size") != null) { setNodeFontSize(Integer.valueOf(nodeChild .getStringAttribute("size"))); } } } } // EDGE if (child.getName().equals("edge")) { if (child.getStringAttribute("style") != null) { setEdgeStyle(child.getStringAttribute("style")); } if (child.getStringAttribute("color") != null) { setEdgeColor(Tools.xmlToColor(child .getStringAttribute("color"))); } if (child.getStringAttribute("width") != null) { if (child.getStringAttribute("width").equals("thin")) { setEdgeWidth(new Integer( freemind.modes.EdgeAdapter.WIDTH_THIN)); } else { setEdgeWidth(new Integer(Integer.parseInt(child .getStringAttribute("width")))); } } } // CHILD if (child.getName().equals("child")) { if (child.getStringAttribute("pattern") != null) { // find name in list of justConstructedPatterns: String searchName = child.getStringAttribute("pattern"); boolean anythingFound = false; for (ListIterator e = justConstructedPatterns .listIterator(); e.hasNext();) { StylePattern patternFound = (StylePattern) e.next(); if (patternFound.getName().equals(searchName)) { setChildrenStylePattern(patternFound); anythingFound = true; break; } } // perhaps our own pattern? if (getName().equals(searchName)) { setChildrenStylePattern(this); anythingFound = true; } if (anythingFound == false) System.err.println("Cannot find the children " + searchName + " to the pattern " + getName()); } } } } /** * @return Returns the nodeFontBold. */ public Boolean getNodeFontBold() { return nodeFontBold; } /** * @param nodeFontBold * The nodeFontBold to set. */ public void setNodeFontBold(Boolean nodeFontBold) { this.nodeFontBold = nodeFontBold; } /** * @return Returns the nodeFontItalic. */ public Boolean getNodeFontItalic() { return nodeFontItalic; } /** * @param nodeFontItalic * The nodeFontItalic to set. */ public void setNodeFontItalic(Boolean nodeFontItalic) { this.nodeFontItalic = nodeFontItalic; } } /* * Is saving necessary? public void savePattern(File file) { try { //CODE FOR * NANOXML XMLElement pattern = new XMLElement(); pattern.setTagName("pattern"); * XMLElement node = new XMLElement(); node.setTagName("node"); * pattern.addChild(node); XMLElement edge = new XMLElement(); * edge.setTagName("edge"); pattern.addChild(edge); * * * pattern.addChild(((MindMapNodeModel)getRoot()).save()); * * XMLElement node = new XMLElement(); node.setTagName("node"); * * node.addProperty("text",this.toString()); * * // ((MindMapEdgeModel)getEdge()).save(doc,node); * * XMLElement edge = ((MindMapEdgeModel)getEdge()).save(); if (edge != null) { * node.addChild(edge); } * * if (isFolded()) { node.addProperty("folded","true"); } * * if (color != null) { node.addProperty("color", Tools.colorToXml(getColor())); * } * * if (style != null) { node.addProperty("style", getStyle()); } * * //link if (getLink() != null) { node.addProperty("link", getLink()); } * * //font if (font!=null || font.getSize()!=0 || isBold() || isItalic() || * isUnderlined() ) { XMLElement fontElement = new XMLElement(); * fontElement.setTagName("font"); * * if (font != null) { fontElement.addProperty("name",getFont().getFontName()); * } if (font.getSize() != 0) { * fontElement.addProperty("size",Integer.toString(getFont().getSize())); } if * (isBold()) { fontElement.addProperty("bold","true"); } if (isItalic()) { * fontElement.addProperty("italic","true"); } if (isUnderlined()) { * fontElement.addProperty("underline","true"); } node.addChild(fontElement); } * * * * //Generating output Stream BufferedWriter fileout = new BufferedWriter( new * OutputStreamWriter( new FileOutputStream(file) ) ); pattern.write(fileout); * * fileout.close(); * * } catch(Exception e) { * System.err.println("Error in MindMapMapModel.saveXML(): "); * freemind.main.Resources.getInstance().logExecption(e); } } */