/*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 07.10.2004
*/
package freemind.modes.mindmapmode.actions;
import java.awt.event.ActionEvent;
import java.util.List;
import freemind.controller.actions.generated.instance.AddArrowLinkXmlAction;
import freemind.controller.actions.generated.instance.RemoveArrowLinkXmlAction;
import freemind.controller.actions.generated.instance.XmlAction;
import freemind.main.Tools;
import freemind.modes.MindMapLinkRegistry;
import freemind.modes.MindMapNode;
import freemind.modes.mindmapmode.MindMapArrowLinkModel;
import freemind.modes.mindmapmode.MindMapController;
import freemind.modes.mindmapmode.actions.xml.ActionPair;
import freemind.modes.mindmapmode.actions.xml.ActorXml;
/**
* @author foltin
*
*/
public class AddArrowLinkAction extends FreemindAction implements ActorXml {
private final MindMapController modeController;
private RemoveArrowLinkAction removeAction;
/**
* @param removeAction
* The removeAction to set.
*/
public void setRemoveAction(RemoveArrowLinkAction removeAction) {
this.removeAction = removeAction;
}
/**
*/
public AddArrowLinkAction(MindMapController modeController) {
super("add_link", "images/designer.png", modeController);
this.modeController = modeController;
addActor(this);
}
public void actionPerformed(ActionEvent e) {
// assert that at least two nodes are selected. draw an arrow link in
// between.
List selecteds = modeController.getSelecteds();
if (selecteds.size() < 2) {
modeController.getController().errorMessage(
modeController.getText("less_than_two_selected_nodes"));
return;
}
for (int i = 1; i < selecteds.size(); i++) {
addLink((MindMapNode) selecteds.get(i),
(MindMapNode) selecteds.get(0));
}
}
public void act(XmlAction action) {
if (action instanceof AddArrowLinkXmlAction) {
AddArrowLinkXmlAction arrowAction = (AddArrowLinkXmlAction) action;
MindMapNode source = modeController.getNodeFromID(arrowAction
.getNode());
MindMapNode target = modeController.getNodeFromID(arrowAction
.getDestination());
String proposedId = arrowAction.getNewId();
if (getLinkRegistry().getLabel(target) == null) {
// call registry to give new label
getLinkRegistry().registerLinkTarget(target);
}
MindMapArrowLinkModel linkModel = new MindMapArrowLinkModel(source,
target, modeController.getFrame());
linkModel.setDestinationLabel(getLinkRegistry().getLabel(target));
// give label:
linkModel.setUniqueId(getLinkRegistry().generateUniqueLinkId(
proposedId));
// check for other attributes:
if (arrowAction.getColor() != null) {
linkModel.setColor(Tools.xmlToColor(arrowAction.getColor()));
}
if (arrowAction.getEndArrow() != null) {
linkModel.setEndArrow(arrowAction.getEndArrow());
}
if (arrowAction.getEndInclination() != null) {
linkModel.setEndInclination(Tools.xmlToPoint(arrowAction
.getEndInclination()));
}
if (arrowAction.getStartArrow() != null) {
linkModel.setStartArrow(arrowAction.getStartArrow());
}
if (arrowAction.getStartInclination() != null) {
linkModel.setStartInclination(Tools.xmlToPoint(arrowAction
.getStartInclination()));
}
// register link.
getLinkRegistry().registerLink(linkModel);
modeController.nodeChanged(target);
modeController.nodeChanged(source);
}
}
public Class getDoActionClass() {
return AddArrowLinkXmlAction.class;
}
private ActionPair getActionPair(MindMapNode source, MindMapNode target) {
AddArrowLinkXmlAction doAction = createAddArrowLinkXmlAction(source,
target, getLinkRegistry().generateUniqueLinkId(null));
// now, the id is clear:
RemoveArrowLinkXmlAction undoAction = removeAction
.createRemoveArrowLinkXmlAction(doAction.getNewId());
return new ActionPair(doAction, undoAction);
}
public AddArrowLinkXmlAction createAddArrowLinkXmlAction(
MindMapNode source, MindMapNode target, String proposedID) {
AddArrowLinkXmlAction action = new AddArrowLinkXmlAction();
action.setNode(source.getObjectId(modeController));
action.setDestination(target.getObjectId(modeController));
action.setNewId(proposedID);
return action;
}
/**
* Source holds the MindMapArrowLinkModel and points to the id placed in
* target.
*/
public void addLink(MindMapNode source, MindMapNode target) {
modeController.doTransaction(
(String) getValue(NAME), getActionPair(source, target));
}
/**
*/
private MindMapLinkRegistry getLinkRegistry() {
return modeController.getMap().getLinkRegistry();
}
}