RectangleAnimationImageFeedback.java :  » IDE-Eclipse » ui-workbench » org » eclipse » ui » internal » Java Open Source

Java Open Source » IDE Eclipse » ui workbench 
ui workbench » org » eclipse » ui » internal » RectangleAnimationImageFeedback.java
/*******************************************************************************
 * 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.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;
import org.eclipse.ui.internal.AnimationEngine;

/**
 * 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.
 * 
 * @since 3.3
 *
 */
public class RectangleAnimationImageFeedback extends
    RectangleAnimationFeedbackBase {
  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 Image backingStore;
  private Shell theShell;
  private Display display;
  private List controls = new ArrayList();


  public RectangleAnimationImageFeedback(Shell parentShell, Rectangle start,
      Rectangle end) {
    super(parentShell, start, end);
  }

  public void dispose() {
    backingStore.dispose();
    for (Iterator ctrlIter = controls.iterator(); ctrlIter.hasNext();) {
      ImageCanvas canvas = (ImageCanvas) ctrlIter.next();
      canvas.dispose();
    }

    theShell.setVisible(false);
    theShell.dispose();
  }

  public void initialize(AnimationEngine engine) {
    display = getAnimationShell().getDisplay();

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

    // Capture the background image    
    backingStore = new Image(theShell.getDisplay(), psRect);
    GC gc = new GC(display);
    gc.copyArea(backingStore, psRect.x, psRect.y);
    gc.dispose();
//    changeCoordinates();
//    captureImages();
    theShell.setBackgroundImage(backingStore);
    theShell.setVisible(true);
    display.update();

  }
    
  /* (non-Javadoc)
   * @see org.eclipse.ui.internal.RectangleAnimationFeedbackBase#jobInit(org.eclipse.ui.internal.AnimationEngine)
   */
  public boolean jobInit(AnimationEngine engine) {
    changeCoordinates();
    captureImages();
    return super.jobInit(engine);
  }
  
  public void addStartRect(Rectangle rect) {
    if (rect == null)
      return;

    //  Rectangle start = Geometry.toControl(getAnimationShell(), rect);
    super.addStartRect(rect);

  }

  public void addEndRect(Rectangle rect) {
    if (rect != null) {
      //  Rectangle end = Geometry.toControl(getAnimationShell(), rect);
      super.addEndRect(rect);
    }
  }

  public void renderStep(AnimationEngine engine) {
    Iterator ctrlIter = controls.iterator();
    Iterator currentRects = getCurrentRects(engine.amount()).iterator();
    while (currentRects.hasNext()) {
      ImageCanvas canvas = (ImageCanvas) ctrlIter.next();
      canvas.setBounds((Rectangle) currentRects.next());
    }
    display.update();

  }

  public void changeCoordinates() {
    Iterator startRectIter = getStartRects().iterator();
    Iterator endRectIter = getEndRects().iterator();
    while (startRectIter.hasNext()) {
      Rectangle startRect = (Rectangle) startRectIter.next();
      Rectangle mapStartRect = Geometry.toControl(theShell, startRect);
      startRect.x = mapStartRect.x;
      startRect.y = mapStartRect.y;
      Rectangle endRect = (Rectangle) endRectIter.next();
      Rectangle mapEndRect = Geometry.toControl(theShell, endRect);
      endRect.x = mapEndRect.x;
      endRect.y = mapEndRect.y;
    }
  }

  private void captureImages() {

    for (Iterator iterator = getStartRects().iterator(); iterator.hasNext();) {
      Rectangle rect = (Rectangle) iterator.next();
      Image image = new Image(display, rect.width, rect.height);
      GC gc = new GC(backingStore);
      gc.copyArea(image, rect.x, rect.y);
      gc.dispose();
      ImageCanvas canvas = new ImageCanvas(theShell, SWT.BORDER
          | SWT.NO_BACKGROUND, image);
      controls.add(canvas);

    }
  }

}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.