| /******************************************************************************* |
| * 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); |
| } |
| } |