/* * JAME 6.2.1 * http://jame.sourceforge.net * * Copyright 2001, 2016 Andrea Medeghini * * This file is part of JAME. * * JAME is an application for creating fractals and other graphics artifacts. * * JAME 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 3 of the License, or * (at your option) any later version. * * JAME 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 JAME. If not, see <http://www.gnu.org/licenses/>. * */ package net.sf.jame.core.tree; import net.sf.jame.core.config.ConfigElement; import net.sf.jame.core.extension.ExtensionReference; import java.io.Serializable; /** * @author Andrea Medeghini */ public final class NodeAction implements Serializable { private static final long serialVersionUID = 1L; public static final int ACTION_SET_VALUE = 0; public static final int ACTION_APPEND_NODE = 1; public static final int ACTION_INSERT_NODE_BEFORE = 2; public static final int ACTION_INSERT_NODE_AFTER = 3; public static final int ACTION_REMOVE_NODE = 4; public static final int ACTION_MOVE_UP_NODE = 5; public static final int ACTION_MOVE_DOWN_NODE = 6; public static final int ACTION_CHANGE_NODE = 7; public static final String[] actionNames = { "ACTION_SET_VALUE", "ACTION_APPEND_NODE", "ACTION_INSERT_NODE_BEFORE", "ACTION_INSERT_NODE_AFTER", "ACTION_REMOVE_NODE", "ACTION_MOVE_UP_NODE", "ACTION_MOVE_DOWN_NODE", "ACTION_CHANGE_NODE" }; private final String actionId; private final int actionType; private final long timestamp; private final boolean refreshRequired; private final NodePath actionTarget; private final Serializable[] actionParams; private NodeAction(final String actionId, final int actionType, final long timestamp, final boolean refreshRequired, final NodePath actionTarget, final Serializable[] actionParams) { this.actionId = actionId; this.actionType = actionType; this.timestamp = timestamp; this.refreshRequired = refreshRequired; this.actionTarget = actionTarget; this.actionParams = actionParams; } /** * @param actionId * @param actionType * @param timestamp * @param refreshRequired * @param actionTarget * @param actionParam0 */ public NodeAction(final String actionId, final int actionType, final long timestamp, final boolean refreshRequired, final NodePath actionTarget, final Serializable actionParam0) { this(actionId, actionType, timestamp, refreshRequired, actionTarget, new Serializable[] { actionParam0 }); } /** * @param actionId * @param actionType * @param timestamp * @param refreshRequired * @param actionTarget * @param actionParam0 * @param actionParam1 */ public NodeAction(final String actionId, final int actionType, final long timestamp, final boolean refreshRequired, final NodePath actionTarget, final Serializable actionParam0, final Serializable actionParam1) { this(actionId, actionType, timestamp, refreshRequired, actionTarget, new Serializable[] { actionParam0, actionParam1 }); } /** * @param actionId * @param actionType * @param timestamp * @param actionTarget * @param actionParam0 */ public NodeAction(final String actionId, final int actionType, final long timestamp, final NodePath actionTarget, final Serializable actionParam0) { this(actionId, actionType, timestamp, true, actionTarget, new Serializable[] { actionParam0 }); } /** * @param actionId * @param actionType * @param timestamp * @param actionTarget * @param actionParam0 * @param actionParam1 */ public NodeAction(final String actionId, final int actionType, final long timestamp, final NodePath actionTarget, final Serializable actionParam0, final Serializable actionParam1) { this(actionId, actionType, timestamp, true, actionTarget, new Serializable[] { actionParam0, actionParam1 }); } /** * @param value */ public NodeAction(final NodeActionValue value) { this(value.getActionId(), value.getActionType(), value.getTimestamp(), value.isRefreshRequired(), value.getActionTarget(), value.getActionParams()); } /** * @see net.sf.jame.core.tree.NodeAction#redo(net.sf.jame.core.tree.NodeEditor) */ public void redo(final NodeEditor editor) { switch (actionType) { case ACTION_SET_VALUE: { if ((actionParams[0] != null) && (actionParams[0] instanceof ConfigElement)) { editor.setNodeValue(editor.createNodeValue(((ConfigElement) actionParams[0]).clone())); } else if ((actionParams[0] != null) && (actionParams[0] instanceof ExtensionReference)) { editor.setNodeValue(editor.createNodeValue(((ExtensionReference) actionParams[0]).clone())); } else { editor.setNodeValue(editor.createNodeValue(actionParams[0])); } break; } case ACTION_APPEND_NODE: { if ((actionParams[1] != null) && (actionParams[1] instanceof ConfigElement)) { editor.appendChildNode(editor.createNodeValue(((ConfigElement) actionParams[1]).clone())); } else if ((actionParams[1] != null) && (actionParams[1] instanceof ExtensionReference)) { editor.appendChildNode(editor.createNodeValue(((ExtensionReference) actionParams[1]).clone())); } else { editor.appendChildNode(editor.createNodeValue(actionParams[1])); } break; } case ACTION_INSERT_NODE_AFTER: { if ((actionParams[1] != null) && (actionParams[1] instanceof ConfigElement)) { editor.insertChildNodeAfter((Integer) actionParams[0], editor.createNodeValue(((ConfigElement) actionParams[1]).clone())); } else if ((actionParams[1] != null) && (actionParams[1] instanceof ExtensionReference)) { editor.insertChildNodeAfter((Integer) actionParams[0], editor.createNodeValue(((ExtensionReference) actionParams[1]).clone())); } else { editor.insertChildNodeAfter((Integer) actionParams[0], editor.createNodeValue(actionParams[1])); } break; } case ACTION_INSERT_NODE_BEFORE: { if ((actionParams[1] != null) && (actionParams[1] instanceof ConfigElement)) { editor.insertChildNodeBefore((Integer) actionParams[0], editor.createNodeValue(((ConfigElement) actionParams[1]).clone())); } else if ((actionParams[1] != null) && (actionParams[1] instanceof ExtensionReference)) { editor.insertChildNodeBefore((Integer) actionParams[0], editor.createNodeValue(((ExtensionReference) actionParams[1]).clone())); } else { editor.insertChildNodeBefore((Integer) actionParams[0], editor.createNodeValue(actionParams[1])); } break; } case ACTION_REMOVE_NODE: { editor.removeChildNode((Integer) actionParams[0]); break; } case ACTION_MOVE_UP_NODE: { editor.moveUpChildNode((Integer) actionParams[0]); break; } case ACTION_MOVE_DOWN_NODE: { editor.moveDownChildNode((Integer) actionParams[0]); break; } case ACTION_CHANGE_NODE: { if ((actionParams[0] != null) && (actionParams[0] instanceof ConfigElement)) { editor.setNodeValue(editor.createNodeValue(((ConfigElement) actionParams[0]).clone())); } else if ((actionParams[0] != null) && (actionParams[0] instanceof ExtensionReference)) { editor.setNodeValue(editor.createNodeValue(((ExtensionReference) actionParams[0]).clone())); } else { editor.setNodeValue(editor.createNodeValue(actionParams[0])); } break; } default: { break; } } } /** * @see net.sf.jame.core.tree.NodeAction#undo(net.sf.jame.core.tree.NodeEditor) */ public void undo(final NodeEditor editor) { switch (actionType) { case ACTION_SET_VALUE: { if ((actionParams[1] != null) && (actionParams[1] instanceof ConfigElement)) { editor.setNodeValue(editor.createNodeValue(((ConfigElement) actionParams[1]).clone())); } else if ((actionParams[1] != null) && (actionParams[1] instanceof ExtensionReference)) { editor.setNodeValue(editor.createNodeValue(((ExtensionReference) actionParams[1]).clone())); } else { editor.setNodeValue(editor.createNodeValue(actionParams[1])); } break; } case ACTION_APPEND_NODE: { editor.removeChildNode((Integer) actionParams[0]); break; } case ACTION_INSERT_NODE_BEFORE: { editor.removeChildNode((Integer) actionParams[0]); break; } case ACTION_INSERT_NODE_AFTER: { editor.removeChildNode((Integer) actionParams[0] + 1); break; } case ACTION_REMOVE_NODE: { if ((actionParams[1] != null) && (actionParams[1] instanceof ConfigElement)) { editor.insertChildNodeAt((Integer) actionParams[0], editor.createNodeValue(((ConfigElement) actionParams[1]).clone())); } else if ((actionParams[1] != null) && (actionParams[1] instanceof ExtensionReference)) { editor.insertChildNodeAt((Integer) actionParams[0], editor.createNodeValue(((ExtensionReference) actionParams[1]).clone())); } else { editor.insertChildNodeAt((Integer) actionParams[0], editor.createNodeValue(actionParams[1])); } break; } case ACTION_MOVE_UP_NODE: { editor.moveDownChildNode((Integer) actionParams[0] - 1); break; } case ACTION_MOVE_DOWN_NODE: { editor.moveUpChildNode((Integer) actionParams[0] + 1); break; } case ACTION_CHANGE_NODE: { if ((actionParams[1] != null) && (actionParams[1] instanceof ConfigElement)) { editor.setNodeValue(editor.createNodeValue(((ConfigElement) actionParams[1]).clone())); } else if ((actionParams[1] != null) && (actionParams[1] instanceof ExtensionReference)) { editor.setNodeValue(editor.createNodeValue(((ExtensionReference) actionParams[1]).clone())); } else { editor.setNodeValue(editor.createNodeValue(actionParams[1])); } break; } default: { break; } } } /** * @see java.lang.Object#toString() */ @Override public String toString() { final StringBuilder builder = new StringBuilder(); builder.append("actionId = \""); builder.append(actionId); builder.append("\", actionType = \""); builder.append(NodeAction.actionNames[actionType]); builder.append("\", timestamp = [ "); builder.append(timestamp); builder.append(", actionTarget = [ "); builder.append(actionTarget.toString()); builder.append(", actionParams = [ "); builder.append(actionParams[0]); for (int i = 1; i < actionParams.length; i++) { builder.append(", "); builder.append(actionParams[i]); } builder.append(" ] "); return builder.toString(); } /** * @return */ public Serializable[] getActionParams() { return actionParams; } /** * @return */ public NodePath getActionTarget() { return actionTarget; } /** * @return */ public int getActionType() { return actionType; } /** * @return the actionId */ public String getActionId() { return actionId; } /** * @return */ public NodeActionValue toActionValue() { final NodeActionValue value = new NodeActionValue(); value.setActionId(actionId); value.setActionType(actionType); value.setTimestamp(timestamp); value.setRefreshRequired(refreshRequired); value.setActionTarget(actionTarget); value.setActionParams(actionParams); return value; } /** * @return */ public long getTimestamp() { return timestamp; } /** * @return */ public boolean isRefreshRequired() { return refreshRequired; } }