/*
* FreeMind - A Program for creating and viewing Mindmaps Copyright (C)
* 2000-2004 Joerg Mueller, Daniel Polansky, Christian Foltin 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 05.10.2004
*/
/*
* $Id: ApplyPatternAction.java,v 1.16.10.1 05.10.2004 11:32:42 christianfoltin
* Exp $
*/
package freemind.modes.mindmapmode.actions;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import freemind.controller.actions.generated.instance.Pattern;
import freemind.controller.actions.generated.instance.PatternEdgeWidth;
import freemind.main.Tools;
import freemind.modes.EdgeAdapter;
import freemind.modes.MindIcon;
import freemind.modes.MindMapNode;
import freemind.modes.NodeAdapter;
import freemind.modes.mindmapmode.MindMapController;
import freemind.modes.mindmapmode.MindMapController.MindMapControllerPlugin;
import freemind.modes.mindmapmode.MindMapMapModel;
import freemind.modes.mindmapmode.MindMapNodeModel;
public class ApplyPatternAction extends NodeGeneralAction implements
SingleNodeOperation {
public interface ExternalPatternAction extends MindMapControllerPlugin {
public void act(MindMapNode node, Pattern pattern);
}
private Pattern mpattern;
public ApplyPatternAction(MindMapController controller, Pattern pattern) {
super(controller, null /* no text */, null /* = no icon */);
setName(pattern.getName());
this.mpattern = pattern;
setSingleNodeOperation(this);
}
public void apply(MindMapMapModel map, MindMapNodeModel node) {
applyPattern(node, mpattern);
}
public void applyPattern(MindMapNode node, Pattern pattern) {
if (pattern.getPatternNodeText() != null) {
if (pattern.getPatternNodeText().getValue() != null) {
getMindMapController().setNodeText(node,
pattern.getPatternNodeText().getValue());
} else {
// clear text:
getMindMapController().setNodeText(node, "");
}
}
if (pattern.getPatternNodeColor() != null) {
getMindMapController().setNodeColor(node,
Tools.xmlToColor(pattern.getPatternNodeColor().getValue()));
}
if (pattern.getPatternNodeBackgroundColor() != null) {
getMindMapController().setNodeBackgroundColor(
node,
Tools.xmlToColor(pattern.getPatternNodeBackgroundColor()
.getValue()));
}
// Perhaps already fixed?:
// FIXME: fc, 3.1.2004: setting the style to "null" causes strange
// behaviour.
// see
// https://sourceforge.net/tracker/?func=detail&atid=107118&aid=1094623&group_id=7118
if (pattern.getPatternNodeStyle() != null) {
getMindMapController().setNodeStyle(node,
pattern.getPatternNodeStyle().getValue());
}
if (pattern.getPatternIcon() != null) {
String iconName = pattern.getPatternIcon().getValue();
if (iconName == null) {
while (getMindMapController().removeLastIcon(node) > 0) {
}
} else {
// check if icon is already present:
List icons = node.getIcons();
boolean found = false;
for (Iterator iterator = icons.iterator(); iterator.hasNext();) {
MindIcon icon = (MindIcon) iterator.next();
if (icon.getName() != null
&& icon.getName().equals(iconName)) {
found = true;
break;
}
}
if (!found) {
getMindMapController().addIcon(node,
MindIcon.factory(iconName));
}
}
} // fc, 28.9.2003
if (pattern.getPatternNodeFontName() != null) {
String nodeFontFamily = pattern.getPatternNodeFontName().getValue();
if (nodeFontFamily == null) {
nodeFontFamily = getMindMapController().getController()
.getDefaultFontFamilyName();
}
getMindMapController().setFontFamily(node, nodeFontFamily);
}
if (pattern.getPatternNodeFontSize() != null) {
String nodeFontSize = pattern.getPatternNodeFontSize().getValue();
if (nodeFontSize == null) {
nodeFontSize = ""
+ getMindMapController().getController()
.getDefaultFontSize();
}
getMindMapController().setFontSize(node,
String.valueOf(nodeFontSize));
}
if (pattern.getPatternNodeFontItalic() != null) {
getMindMapController()
.setItalic(
node,
"true".equals(pattern.getPatternNodeFontItalic()
.getValue()));
}
if (pattern.getPatternNodeFontBold() != null) {
getMindMapController().setBold(node,
"true".equals(pattern.getPatternNodeFontBold().getValue()));
}
if (pattern.getPatternEdgeColor() != null) {
getMindMapController().setEdgeColor(node,
Tools.xmlToColor(pattern.getPatternEdgeColor().getValue()));
}
if (pattern.getPatternEdgeStyle() != null) {
getMindMapController().setEdgeStyle(node,
pattern.getPatternEdgeStyle().getValue());
}
PatternEdgeWidth patternEdgeWidth = pattern.getPatternEdgeWidth();
if (patternEdgeWidth != null) {
if (patternEdgeWidth.getValue() != null) {
getMindMapController().setEdgeWidth(node,
edgeWidthStringToInt(patternEdgeWidth.getValue()));
} else {
getMindMapController().setEdgeWidth(node,
EdgeAdapter.DEFAULT_WIDTH);
}
}
if (pattern.getPatternChild() != null
&& pattern.getPatternChild().getValue() != null) {
// find children among all patterns:
String searchedPatternName = pattern.getPatternChild().getValue();
ApplyPatternAction[] patterns = getMindMapController().patterns;
for (int i = 0; i < patterns.length; i++) {
ApplyPatternAction action = patterns[i];
if (action.getPattern().getName().equals(searchedPatternName)) {
for (ListIterator j = node.childrenUnfolded(); j.hasNext();) {
NodeAdapter child = (NodeAdapter) j.next();
applyPattern(child, action.getPattern());
}
break;
}
}
}
for (Iterator i = getMindMapController().getPlugins().iterator(); i
.hasNext();) {
MindMapControllerPlugin action = (MindMapControllerPlugin) i.next();
if (action instanceof ExternalPatternAction) {
ExternalPatternAction externalAction = (ExternalPatternAction) action;
externalAction.act(node, pattern);
}
}
}
/**
*/
public static int edgeWidthStringToInt(String value) {
if (value == null) {
return EdgeAdapter.DEFAULT_WIDTH;
}
if (value.equals(EdgeAdapter.EDGE_WIDTH_THIN_STRING)) {
return EdgeAdapter.WIDTH_THIN;
}
return Integer.valueOf(value).intValue();
}
/**
*/
public static String edgeWidthIntToString(int value) {
if (value == EdgeAdapter.DEFAULT_WIDTH) {
return null;
}
if (value == EdgeAdapter.WIDTH_THIN) {
return EdgeAdapter.EDGE_WIDTH_THIN_STRING;
}
return Integer.toString(value);
}
/**
* @return Returns the pattern.
*/
public Pattern getPattern() {
return mpattern;
}
}