blob: d142f3b708dd6703ce7805c3f21172e6ba0a319a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.draw2d.examples.tree;
import java.util.*;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Viewport;
import org.eclipse.draw2d.geometry.*;
/**
* @author hudsonr
* Created on Apr 28, 2003
*/
public class Animation {
static final long DURATION = 210;
static long current;
static double progress;
static long start = -1;
static long finish;
static Viewport viewport;
static IFigure trackMe;
static IFigure showMe;
static Point trackLocation;
static boolean PLAYBACK;
static boolean RECORDING;
static Map initialStates;
static Map finalStates;
static void end() {
Iterator iter = initialStates.keySet().iterator();
while (iter.hasNext())
((IFigure)iter.next()).revalidate();
initialStates = null;
finalStates = null;
PLAYBACK = false;
trackMe = null;
showMe = null;
viewport = null;
}
static void mark(IFigure figure) {
trackMe = figure;
trackLocation = trackMe.getBounds().getLocation();
while (!(figure instanceof Viewport))
figure = figure.getParent();
viewport = (Viewport)figure;
initialStates = new HashMap();
finalStates = new HashMap();
start = System.currentTimeMillis();
finish = start + DURATION;
current = start + 20;
}
static void captureLayout(IFigure root) {
RECORDING = true;
while (root.getParent()!= null)
root = root.getParent();
root.validate();
Iterator iter = initialStates.keySet().iterator();
while (iter.hasNext())
recordFinalStates((IFigure)iter.next());
RECORDING = false;
PLAYBACK = true;
}
static boolean playbackState(IFigure container) {
if (!PLAYBACK)
return false;
List initial = (List)initialStates.get(container);
if (initial == null) {
System.out.println("Error playing back state");
return false;
}
List target = (List)finalStates.get(container);
List children = container.getChildren();
Rectangle rect1, rect2;
for (int i = 0; i < children.size(); i++) {
IFigure child = (IFigure)children.get(i);
rect1 = (Rectangle)initial.get(i);
rect2 = (Rectangle)target.get(i);
child.setBounds(new Rectangle(
(int)Math.round(progress * rect2.x + (1-progress) * rect1.x),
(int)Math.round(progress * rect2.y + (1-progress) * rect1.y),
(int)Math.round(progress * rect2.width + (1-progress) * rect1.width),
(int)Math.round(progress * rect2.height + (1-progress) * rect1.height)
));
// child.invalidate();
}
return true;
}
static void recordFinalStates(IFigure container) {
List list = new ArrayList();
finalStates.put(container, list);
List children = container.getChildren();
list.clear();
for (int i=0; i<children.size();i++)
list.add(((IFigure)children.get(i)).getBounds().getCopy());
}
static void recordInitialState(IFigure container) {
if (!RECORDING)
return;
List list = (List)initialStates.get(container);
if (list != null)
return;
// System.out.println("Error recording initial state");
initialStates.put(container, list = new ArrayList());
List children = container.getChildren();
list.clear();
for (int i=0; i<children.size();i++)
list.add(((IFigure)children.get(i)).getBounds().getCopy());
}
static void swap() {
Map temp = finalStates;
finalStates = initialStates;
initialStates = temp;
}
static boolean step() {
current = System.currentTimeMillis() + 30;
progress = (double)(current - start)/(finish - start);
progress = Math.min(progress, 0.999);
Iterator iter = initialStates.keySet().iterator();
while (iter.hasNext())
((IFigure)iter.next()).revalidate();
viewport.validate();
Point loc = viewport.getViewLocation();
loc.translate(trackMe.getBounds().getLocation().getDifference(trackLocation));
viewport.setViewLocation(loc);
trackLocation = trackMe.getBounds().getLocation();
return current < finish;
}
}