Package org.eclipse.ui.internal

Source Code of org.eclipse.ui.internal.ImageAnimationFeedback

/*******************************************************************************
* Copyright (c) 2006 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.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

/**
* @since 3.3
*
*/
public class ImageAnimationFeedback extends DefaultAnimationFeedback {
  private class ImageCanvas extends Canvas {
    private Image image;
    /**
     * @param parent
     * @param style
     */
    public ImageCanvas(Composite parent, int style, Image image) {
      super(parent, style);
      this.image = image;
     
      addPaintListener(new PaintListener() {
        public void paintControl(PaintEvent e) {
          paintImage(e.gc);
        }
      });
    }
    /**
     * @param gc
     */
    protected void paintImage(GC gc) {
      gc.drawImage(image, 0, 0, image.getBounds().width, image.getBounds().height, 0, 0, getBounds().width, getBounds().height);
    }
   
    /* (non-Javadoc)
     * @see org.eclipse.swt.widgets.Widget#dispose()
     */
    public void dispose() {
      super.dispose();
      image.dispose();
    }
  }
 
  private Display display;
  private Shell theShell;
 
  private List startRects = new ArrayList();
  private List endRects = new ArrayList();
  private List controls = new ArrayList();
 
  private Image backingStore;
 
  /**
   * Creates an animation effect where the interpolated rectangles are displayed using Canvas
   * controls that show an image of the bits that were originally occupied by the various
   * 'start' rectangles.
   */
  public ImageAnimationFeedback() {}

    /**
   * @param parentShell
   */
  public void initialize(Shell parentShell, Rectangle startRect, Rectangle endRect) {
    display = parentShell.getDisplay();

    Rectangle psRect = parentShell.getBounds();
    theShell = new Shell(parentShell, SWT.NO_TRIM | SWT.ON_TOP);
    theShell.setBounds(parentShell.getBounds());

    addStartRect(startRect);
    addEndRect(endRect);
   
    // Capture the background image   
    backingStore = new Image(theShell.getDisplay(), psRect);
    GC gc = new GC(display);
      gc.copyArea(backingStore, psRect.x, psRect.y);
    gc.dispose();
   
    theShell.setBackgroundImage(backingStore);
    theShell.setVisible(true);
    display.update();
  }
 
  public void addStartRect(Rectangle rect) {
    if (rect != null) {
      Rectangle start = Geometry.toControl(theShell, rect);
      startRects.add(start);
     
      Image image = new Image(display, rect.width, rect.height);
      GC gc = new GC(display);
      gc.copyArea(image, rect.x, rect.y);
      gc.dispose();
     
      ImageCanvas canvas = new ImageCanvas(theShell, SWT.BORDER | SWT.NO_BACKGROUND, image);
      controls.add(canvas);
    }
  }
 
  public void addEndRect(Rectangle rect) {
    if (rect != null) {
      Rectangle end = Geometry.toControl(theShell, rect);
      endRects.add(end);
    }
  }
 
  public void renderStep(double amount) {
    // Move the controls to the new interpolation position
    Iterator startIter = startRects.iterator();
    Iterator endIter = endRects.iterator();
    Iterator ctrlIter = controls.iterator();
    while (startIter.hasNext()) {
      Rectangle start = (Rectangle) startIter.next();
      Rectangle end = (Rectangle) endIter.next();
      ImageCanvas canvas = (ImageCanvas) ctrlIter.next();

      // Get the bounds of the interpolated rect
      Rectangle curRect = RectangleAnimation.interpolate(start, end, amount);
      canvas.setBounds(curRect);
    }
       
        display.update();
  }

  public void jobInit() {
  }

  /**
   *
   */
  public void dispose() {
    backingStore.dispose();
    for (Iterator ctrlIter = controls.iterator(); ctrlIter.hasNext();) {
      ImageCanvas canvas = (ImageCanvas) ctrlIter.next();
      canvas.dispose();
    }
   
    theShell.setVisible(false);
    theShell.dispose();
  }
}
TOP

Related Classes of org.eclipse.ui.internal.ImageAnimationFeedback

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.