/*
* 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.test;
import java.util.List;
import net.sf.jame.core.DefaultTree;
import net.sf.jame.core.config.ConfigContext;
import net.sf.jame.core.config.DefaultConfigContext;
import net.sf.jame.core.tree.DefaultNodeSession;
import net.sf.jame.core.tree.NodeAction;
import net.sf.jame.core.tree.NodeActionValue;
import net.sf.jame.twister.ControllerListener;
import net.sf.jame.twister.TwisterClip;
import net.sf.jame.twister.TwisterClipController;
import net.sf.jame.twister.TwisterConfig;
import net.sf.jame.twister.TwisterConfigBuilder;
import net.sf.jame.twister.TwisterConfigNodeBuilder;
import net.sf.jame.twister.TwisterSequence;
import org.junit.Test;
/**
* @author Andrea Medeghini
*/
public class TestClipController {
@Test
public void testUndoRedoAction() throws Exception {
final TwisterConfigBuilder configBuilder = new TwisterConfigBuilder();
final ConfigContext context = new DefaultConfigContext();
final TwisterConfig config = configBuilder.createDefaultConfig();
final TwisterConfigNodeBuilder builder = new TwisterConfigNodeBuilder(config);
config.setContext(context);
DefaultTree tree = null;
TwisterSequence sequence = null;
List<NodeAction> actions = null;
TwisterClipController controller = null;
long refTimestamp = 0;
long time = 0;
final TwisterClip clip = new TwisterClip();
sequence = new TwisterSequence();
sequence.setInitialConfig(config.clone());
sequence.setFinalConfig(config.clone());
time = System.currentTimeMillis();
time = System.currentTimeMillis() - time;
sequence.setDuration(time);
clip.addSequence(sequence);
tree = new DefaultTree();
builder.createNodes(tree.getRootNode());
tree.getRootNode().setContext(context);
tree.getRootNode().setSession(new DefaultNodeSession("clip"));
time = System.currentTimeMillis();
sequence = new TwisterSequence();
sequence.setInitialConfig(config.clone());
refTimestamp = time;
Thread.sleep(500);
context.updateTimestamp();
config.getFrameConfigElement().getLayerConfigElement(0).setVisible(false);
Thread.sleep(500);
context.updateTimestamp();
config.getFrameConfigElement().getLayerConfigElement(0).setVisible(true);
Thread.sleep(500);
config.getFrameConfigElement().getLayerConfigElement(0).setVisible(false);
Thread.sleep(500);
context.updateTimestamp();
config.getFrameConfigElement().getLayerConfigElement(0).setVisible(true);
Thread.sleep(1000);
sequence.setFinalConfig(config.clone());
time = System.currentTimeMillis() - time;
sequence.setDuration(time);
clip.addSequence(sequence);
actions = tree.getRootNode().getSession().getActions();
for (NodeAction action : actions) {
final NodeActionValue value = action.toActionValue();
value.setTimestamp(value.getTimestamp() - refTimestamp);
action = new NodeAction(value);
sequence.addAction(action);
System.out.println(action);
}
tree = new DefaultTree();
builder.createNodes(tree.getRootNode());
tree.getRootNode().setContext(context);
tree.getRootNode().setSession(new DefaultNodeSession("clip"));
time = System.currentTimeMillis();
sequence = new TwisterSequence();
sequence.setInitialConfig(config.clone());
refTimestamp = time;
Thread.sleep(500);
context.updateTimestamp();
config.getFrameConfigElement().getLayerConfigElement(0).setVisible(false);
Thread.sleep(500);
context.updateTimestamp();
config.getFrameConfigElement().getLayerConfigElement(0).setVisible(true);
Thread.sleep(500);
context.updateTimestamp();
config.getFrameConfigElement().getLayerConfigElement(0).setVisible(false);
Thread.sleep(500);
config.getFrameConfigElement().getLayerConfigElement(0).setVisible(true);
Thread.sleep(1000);
sequence.setFinalConfig(config.clone());
time = System.currentTimeMillis() - time;
sequence.setDuration(time);
clip.addSequence(sequence);
actions = tree.getRootNode().getSession().getActions();
for (NodeAction action : actions) {
final NodeActionValue value = action.toActionValue();
value.setTimestamp(value.getTimestamp() - refTimestamp);
action = new NodeAction(value);
sequence.addAction(action);
System.out.println(action);
}
sequence = new TwisterSequence();
sequence.setInitialConfig(config.clone());
sequence.setFinalConfig(config.clone());
time = System.currentTimeMillis();
time = System.currentTimeMillis() - time;
sequence.setDuration(time);
clip.addSequence(sequence);
controller = new DebugClipConroller(clip);
controller.init();
System.out.println("controller.redoAction(true)");
time = System.currentTimeMillis();
for (int i = 0; i < 12; i++) {
redoAction(controller, time, true);
}
controller.redoAll();
System.out.println("controller.undoAction(true)");
time = System.currentTimeMillis();
for (int i = 0; i < 12; i++) {
undoAction(controller, time, true);
}
controller.init();
System.out.println("controller.redoAction(false)");
time = System.currentTimeMillis();
for (int i = 0; i < 12; i++) {
redoAction(controller, time, false);
}
controller.redoAll();
System.out.println("controller.undoAction(false)");
time = System.currentTimeMillis();
for (int i = 0; i < 12; i++) {
undoAction(controller, time, false);
}
controller.init();
System.out.println("controller.redoActionAndSleep()");
time = System.currentTimeMillis();
for (int i = 0; i < 12; i++) {
redoActionAndSleep(controller, time);
}
controller.redoAll();
System.out.println("controller.undoActionAndSleep()");
time = System.currentTimeMillis();
for (int i = 0; i < 12; i++) {
undoActionAndSleep(controller, time);
}
controller.init();
System.out.println("controller.redoAction(500)");
time = System.currentTimeMillis();
for (int i = 0; i < 12; i++) {
redoAction(controller, time, 500);
}
controller.redoAll();
System.out.println("controller.undoAction(500)");
time = System.currentTimeMillis();
for (int i = 0; i < 12; i++) {
undoAction(controller, time, 500);
}
// controller.init();
// System.out.println("controller.undoAll()");
// controller.undoAll();
// System.out.println("controller.redoAll()");
// controller.redoAll();
}
private void print(final TwisterClipController controller, final long time, final long tvalue, final boolean value) {
System.out.println((System.currentTimeMillis() - time) + ": " + (value ? tvalue : "-"));
}
private void redoAction(final TwisterClipController controller, final long time, final long timestamp) {
final boolean value = controller.redoAction(timestamp, true);
final long tvalue = controller.getTime();
print(controller, time, tvalue, value);
}
private void undoAction(final TwisterClipController controller, final long time, final long timestamp) {
final boolean value = controller.undoAction(timestamp, true);
final long tvalue = controller.getTime();
print(controller, time, tvalue, value);
}
private void redoActionAndSleep(final TwisterClipController controller, final long time) {
final boolean value = controller.redoActionAndSleep();
final long tvalue = controller.getTime();
print(controller, time, tvalue, value);
}
private void undoActionAndSleep(final TwisterClipController controller, final long time) {
final boolean value = controller.undoActionAndSleep();
final long tvalue = controller.getTime();
print(controller, time, tvalue, value);
}
private void redoAction(final TwisterClipController controller, final long time, final boolean sameTimestamp) {
final boolean value = controller.redoAction(sameTimestamp);
final long tvalue = controller.getTime();
print(controller, time, tvalue, value);
}
private void undoAction(final TwisterClipController controller, final long time, final boolean sameTimestamp) {
final boolean value = controller.undoAction(sameTimestamp);
final long tvalue = controller.getTime();
print(controller, time, tvalue, value);
}
private class DebugClipConroller extends TwisterClipController {
public DebugClipConroller(final TwisterClip clip) {
super(clip);
addControllerListener(new ControllerListener() {
public void actionRedone(final NodeAction action) {
System.out.println("Redo: " + action);
}
public void actionUndone(final NodeAction action) {
System.out.println("Undo: " + action);
}
public void configChanged() {
System.out.println("Config changed");
}
});
}
}
}