blob: 55f4c50921953981669f431b4cfcd521722eb323 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2007 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.ui.internal;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jface.util.Geometry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.graphics.Region;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
/**
* @since 3.3
*
*/
public class DefaultAnimationFeedback {
private static final int LINE_WIDTH = 1;
private Display display;
private Shell theShell;
private Region shellRegion;
private List startRects = new ArrayList();
private List endRects = new ArrayList();
public DefaultAnimationFeedback() {}
/**
* @param parentShell
*/
public void initialize(Shell parentShell, Rectangle startRect, Rectangle endRect) {
addStartRect(startRect);
addEndRect(endRect);
theShell = new Shell(parentShell, SWT.NO_TRIM | SWT.ON_TOP);
display = theShell.getDisplay();
Color color = display.getSystemColor(SWT.COLOR_WIDGET_FOREGROUND);
theShell.setBackground(color);
// Ensure that the background won't show on the initial display
shellRegion = new Region(display);
theShell.setRegion(shellRegion);
}
public void addStartRect(Rectangle rect) {
if (rect != null) {
startRects.add(rect);
}
}
public void addEndRect(Rectangle rect) {
if (rect != null) {
endRects.add(rect);
}
}
public List getStartRects() {
return startRects;
}
public List getEndRects() {
return endRects;
}
public void renderStep(double amount) {
if (shellRegion != null) {
shellRegion.dispose();
shellRegion = new Region(display);
}
// Iterate across the set of start/end rects
Iterator startIter = startRects.iterator();
Iterator endIter = endRects.iterator();
while (startIter.hasNext()) {
Rectangle start = (Rectangle) startIter.next();
Rectangle end = (Rectangle) endIter.next();
// Get the bounds of the interpolated rect
Rectangle curRect = RectangleAnimation.interpolate(start, end, amount);
Rectangle rect = Geometry.toControl(theShell, curRect);
shellRegion.add(rect);
rect.x += LINE_WIDTH;
rect.y += LINE_WIDTH;
rect.width = Math.max(0, rect.width - 2 * LINE_WIDTH);
rect.height = Math.max(0, rect.height - 2 * LINE_WIDTH);
shellRegion.subtract(rect);
}
theShell.setRegion(shellRegion);
display.update();
}
/**
*
*/
public void dispose() {
theShell.setVisible(false);
theShell.dispose();
shellRegion.dispose();
}
/**
* Perform any initialization you want to have happen -before- the
* amination starts
*/
public void jobInit() {
// Compute the shell's bounds
Rectangle shellBounds = Geometry.copy((Rectangle) startRects.get(0));
Iterator startIter = startRects.iterator();
Iterator endIter = endRects.iterator();
while (startIter.hasNext()) {
shellBounds.add((Rectangle) startIter.next());
shellBounds.add((Rectangle) endIter.next());
}
theShell.setBounds(shellBounds);
// Making the shell visible will be slow on old video cards, so only start
// the timer once it is visible.
theShell.setVisible(true);
}
}