001: /*******************************************************************************
002: * Copyright (c) 2007 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: ******************************************************************************/package org.eclipse.ui.internal;
011:
012: import java.util.ArrayList;
013: import java.util.Iterator;
014: import java.util.List;
015:
016: import org.eclipse.jface.util.Geometry;
017: import org.eclipse.swt.graphics.Rectangle;
018: import org.eclipse.swt.widgets.Control;
019: import org.eclipse.swt.widgets.Shell;
020: import org.eclipse.ui.internal.AnimationEngine;
021: import org.eclipse.ui.internal.AnimationFeedbackBase;
022:
023: /**
024: * RectangleAnimationFeedbackBase is an abstract base class for all the
025: * rectangle animations.
026: * @since 3.3
027: *
028: */
029: public abstract class RectangleAnimationFeedbackBase extends
030: AnimationFeedbackBase {
031:
032: private List startRects = new ArrayList();
033: private List endRects = new ArrayList();
034:
035: /**
036: * Creates a Rectangle Animation Feedback
037: *
038: * @param parentShell specifies the composite where the animation will be drawn
039: * @param start initial rectangle (display coordinates)
040: * @param end final rectangle (display coordinates)
041: */
042: public RectangleAnimationFeedbackBase(Shell parentShell,
043: Rectangle start, Rectangle end) {
044: super (parentShell);
045: addStartRect(start);
046: addEndRect(end);
047: }
048:
049: /* (non-Javadoc)
050: * @see org.eclipse.ui.internal.AnimationFeedbackBase#jobInit(org.eclipse.ui.internal.AnimationEngine)
051: *
052: * Prevent execution if there are no rects to draw or there's a mismatch in the count
053: */
054: public boolean jobInit(AnimationEngine engine) {
055: if (!super .jobInit(engine))
056: return false;
057:
058: return startRects.size() > 0
059: && startRects.size() == endRects.size();
060: }
061:
062: public void addStartRect(Rectangle rect) {
063: if (rect != null) {
064: startRects.add(rect);
065: }
066: }
067:
068: public void addEndRect(Rectangle rect) {
069: if (rect != null) {
070: endRects.add(rect);
071: }
072: }
073:
074: public void addStartRect(Control ctrl) {
075: Rectangle ctrlBounds = ctrl.getBounds();
076: Rectangle startRect = Geometry.toDisplay(ctrl.getParent(),
077: ctrlBounds);
078: addStartRect(startRect);
079: }
080:
081: public void addEndRect(Control ctrl) {
082: Rectangle ctrlBounds = ctrl.getBounds();
083: Rectangle endRect = Geometry.toDisplay(ctrl.getParent(),
084: ctrlBounds);
085: addEndRect(endRect);
086: }
087:
088: public static Rectangle interpolate(Rectangle start, Rectangle end,
089: double amount) {
090: double initialWeight = 1.0 - amount;
091:
092: Rectangle result = new Rectangle(
093: (int) (start.x * initialWeight + end.x * amount),
094: (int) (start.y * initialWeight + end.y * amount),
095: (int) (start.width * initialWeight + end.width * amount),
096: (int) (start.height * initialWeight + end.height
097: * amount));
098:
099: return result;
100: }
101:
102: public List getStartRects() {
103: return startRects;
104: }
105:
106: public List getEndRects() {
107: return endRects;
108: }
109:
110: public List getCurrentRects(double amount) {
111: List currentRects = new ArrayList();
112: Iterator startIter = getStartRects().iterator();
113: Iterator endIter = getEndRects().iterator();
114: while (startIter.hasNext()) {
115: Rectangle start = (Rectangle) startIter.next();
116: Rectangle end = (Rectangle) endIter.next();
117:
118: // Get the bounds of the interpolated rect
119: Rectangle curRect = interpolate(start, end, amount);
120: currentRects.add(curRect);
121: }
122: return currentRects;
123: }
124:
125: }
|