| /******************************************************************************* |
| * Copyright (c) 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.Iterator; |
| |
| 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; |
| |
| /** |
| * Creates an animation feedback that will morph the start rectangle to the end rectangle |
| * for AnimationEngine. |
| * |
| * @since 3.3 |
| * |
| */ |
| public class LegacyAnimationFeedback extends RectangleAnimationFeedbackBase { |
| private static final int LINE_WIDTH = 1; |
| |
| private Display display; |
| private Region shellRegion; |
| |
| private Shell theShell; |
| |
| public LegacyAnimationFeedback(Shell parentShell, Rectangle start, |
| Rectangle end) { |
| super(parentShell, start, end); |
| } |
| |
| public void renderStep(AnimationEngine engine) { |
| if (shellRegion != null) { |
| shellRegion.dispose(); |
| shellRegion = new Region(display); |
| } |
| |
| // Iterate across the set of start/end rects |
| Iterator currentRects = getCurrentRects(engine.amount()).iterator(); |
| while (currentRects.hasNext()) { |
| Rectangle curRect = (Rectangle) currentRects.next(); |
| 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(); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.internal.AnimationFeedbackBase#initialize(org.eclipse.ui.internal.AnimationEngine) |
| */ |
| public void initialize(AnimationEngine engine) { |
| |
| theShell = new Shell(getAnimationShell(), SWT.NO_TRIM | SWT.ON_TOP); |
| display = theShell.getDisplay(); |
| Color color = display.getSystemColor(SWT.COLOR_WIDGET_DARK_SHADOW); |
| theShell.setBackground(color); |
| |
| // Ensure that the background won't show on the initial display |
| shellRegion = new Region(display); |
| theShell.setRegion(shellRegion); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.internal.AnimationFeedbackBase#dispose() |
| */ |
| public void dispose() { |
| theShell.setVisible(false); |
| theShell.dispose(); |
| shellRegion.dispose(); |
| } |
| |
| /** |
| * Perform any initialization you want to have happen -before- the |
| * amination starts |
| */ |
| public boolean jobInit(AnimationEngine engine) { |
| if (!super.jobInit(engine)) |
| return false; |
| |
| // Compute the shell's bounds |
| Rectangle shellBounds = Geometry.copy((Rectangle) getStartRects() |
| .get(0)); |
| Iterator startIter = getStartRects().iterator(); |
| Iterator endIter = getEndRects().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); |
| |
| return true; // OK to go... |
| } |
| |
| } |