package iiuf.jai;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.RenderedImage;
import java.util.ArrayList;
import java.util.ListIterator;
import javax.media.jai.PlanarImage;
import javax.swing.JLabel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.SwingConstants;

/**
   (c) 2000, 2001, IIUF, DIUF<p>

   Panel for displaying JAI images.
 
   @author $Author: hassan $
   @version $Revision: 1.1 $
*/

public class DisplayImagePanel extends JScrollPane {

  protected DisplayImage image;

  private int lastMouseX;
  private int lastMouseY;

  public DisplayImagePanel() {
    addMouseMotionListener(new MouseMotionAdapter() {
	public void mouseDragged(MouseEvent e) {
	  if (0 != (e.getModifiers() & InputEvent.BUTTON2_MASK)) {
	    JScrollBar hb = getHorizontalScrollBar();
	    JScrollBar vb = getVerticalScrollBar();
	    
	    int x = e.getX();
	    int y = e.getY();
	    
	    hb.setValue(hb.getValue()+x - lastMouseX);
	    vb.setValue(vb.getValue()+y - lastMouseY);

	    lastMouseX = x;
	    lastMouseY = y;
	  }
	}
      });
    
    addMouseListener(new MouseAdapter() {
	public void mousePressed(MouseEvent e) {
	  if (0 != (e.getModifiers() & InputEvent.BUTTON2_MASK)) {
	    lastMouseX = e.getX();
	    lastMouseY = e.getY();
	  }
	}
      });
  }

  public DisplayImagePanel(PlanarImage image) {
    this();
    init(image);
  }

  protected void init(PlanarImage image) {
    setImage(image);
  }

  public void setImage(PlanarImage img) {
    image = new DisplayImage(img, true, true);
    JLabel imageLabel = new JLabel(image) {
	protected void paintChildren(Graphics graphics) {
	  super.paintChildren(graphics);

	  if (!(graphics instanceof Graphics2D)) {
	    throw new RuntimeException("DisplayImagePanel requires Graphics2D.");
	  }
	  Graphics2D g2d = (Graphics2D) graphics;
	  Rectangle clipBounds = g2d.getClipBounds();
	  
	  if (layers != null) {
	    ListIterator layerIter = layers.listIterator();
	    while (layerIter.hasNext()) {
	      DisplayImageLayer layer = (DisplayImageLayer) layerIter.next();
	      layer.paintLayer(g2d, clipBounds);
	    }
	  }
	}
      };

    imageLabel.setHorizontalAlignment(SwingConstants.LEFT);
    imageLabel.setVerticalAlignment(SwingConstants.TOP);

    setViewportView(imageLabel);
  }

  public Rectangle getViewRect() {
    return getViewport().getViewRect();
  }

  public PlanarImage getImage() {
    return image.getImage();
  }

  protected ArrayList layers = null;
  
  public void addLayer(DisplayImageLayer layer) {
    if (layers == null) {
      layers = new ArrayList();
    }
    layers.add(layer);
  }
}