/*
* Freeplane - mind map editor
* Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
*
* This file is created by Dimitry Polivaev in 2008.
*
* 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.cloud.mindmapmode;
import java.awt.Color;
import org.freeplane.core.undo.IActor;
import org.freeplane.features.cloud.CloudController;
import org.freeplane.features.cloud.CloudModel;
import org.freeplane.features.cloud.CloudModel.Shape;
import org.freeplane.features.map.IExtensionCopier;
import org.freeplane.features.map.MapController;
import org.freeplane.features.map.NodeModel;
import org.freeplane.features.mode.Controller;
import org.freeplane.features.mode.ModeController;
import org.freeplane.features.styles.LogicalStyleKeys;
/**
* @author Dimitry Polivaev
*/
public class MCloudController extends CloudController {
private static class ExtensionCopier implements IExtensionCopier {
public void copy(final Object key, final NodeModel from, final NodeModel to) {
if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
return;
}
copy(from, to);
}
public void copy(final NodeModel from, final NodeModel to) {
final CloudModel fromStyle = (CloudModel) from.getExtension(CloudModel.class);
if (fromStyle == null) {
return;
}
final CloudModel toStyle = CloudModel.createModel(to);
final Color color = fromStyle.getColor();
if(color != null)
toStyle.setColor(color);
final Shape shape = fromStyle.getShape();
if(shape != null)
toStyle.setShape(shape);
}
public void remove(final Object key, final NodeModel from) {
if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
return;
}
from.removeExtension(CloudModel.class);
}
public void remove(final Object key, final NodeModel from, final NodeModel which) {
if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
return;
}
final CloudModel whichStyle = (CloudModel) which.getExtension(CloudModel.class);
if (whichStyle == null) {
return;
}
final CloudModel fromStyle = (CloudModel) from.getExtension(CloudModel.class);
if (fromStyle == null) {
return;
}
from.removeExtension(fromStyle);
}
public void resolveParentExtensions(Object key, NodeModel to) {
}
}
public MCloudController(final ModeController modeController) {
super(modeController);
modeController.registerExtensionCopier(new ExtensionCopier());
modeController.addAction(new CloudAction());
modeController.addAction(new CloudColorAction());
for(Shape shape : Shape.values()){
modeController.addAction(new CloudShapeAction(shape));
}
}
public void setCloud(final NodeModel node, final boolean enable) {
final CloudModel cloud = CloudModel.getModel(node);
if ((cloud != null) == enable) {
return;
}
final Color color = cloud != null ? cloud.getColor() : CloudController.getStandardColor();
final ModeController modeController = Controller.getCurrentModeController();
final IActor actor = new IActor() {
public void act() {
if (enable) {
enable();
}
else {
disable();
}
}
private void disable() {
final MapController mapController = modeController.getMapController();
CloudModel.setModel(node, null);
mapController.nodeChanged(node);
}
private void enable() {
final CloudModel cloud = new CloudModel();
cloud.setColor(color);
final MapController mapController = modeController.getMapController();
CloudModel.setModel(node, cloud);
mapController.nodeChanged(node);
}
public String getDescription() {
return "setCloud";
}
public void undo() {
if (enable) {
disable();
}
else {
enable();
}
}
};
modeController.execute(actor, node.getMap());
}
public void setColor(final NodeModel node, final Color color) {
setCloud(node, true);
final ModeController modeController = Controller.getCurrentModeController();
final Color oldColor = CloudModel.getModel(node).getColor();
if (color == oldColor || color != null && color.equals(oldColor)) {
return;
}
final IActor actor = new IActor() {
public void act() {
CloudModel.getModel(node).setColor(color);
modeController.getMapController().nodeChanged(node);
}
public String getDescription() {
return "setColor";
}
public void undo() {
CloudModel.getModel(node).setColor(oldColor);
modeController.getMapController().nodeChanged(node);
}
};
modeController.execute(actor, node.getMap());
}
public void setShape(final NodeModel node, final CloudModel.Shape shape) {
setCloud(node, true);
final ModeController modeController = Controller.getCurrentModeController();
final CloudModel.Shape oldShape = CloudModel.getModel(node).getShape();
if (shape == oldShape || shape != null && shape.equals(oldShape)) {
return;
}
final IActor actor = new IActor() {
public void act() {
CloudModel.getModel(node).setShape(shape);
modeController.getMapController().nodeChanged(node);
}
public String getDescription() {
return "setShape";
}
public void undo() {
CloudModel.getModel(node).setShape(oldShape);
modeController.getMapController().nodeChanged(node);
}
};
modeController.execute(actor, node.getMap());
}
}