
/**
 * ImagePanel.java
 * A simple plugin for generating more custormized data plots from X.Y data
 * Created: July 4, 2005
 *
 * @author Nathan Stevens
 * @version 0.1 7-10-2005
 */
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

// EPR Image Panel class
public class EPRImagePanel extends JPanel {
  private Rectangle currentRect = null;
  private Rectangle rectToDraw = null;
  private Rectangle previousRectDrawn = new Rectangle();
  private Image image;
  private EPRViewPlugin eprViewPlugin;
  private int w;
  private int h;
  //private int direction = -1;
  //private int spacing = 0;
  
  // default constructor
  public EPRImagePanel() { }
  
  public EPRImagePanel(EPRViewPlugin eprViewPlugin, Image image, int w, int h) {
    this.eprViewPlugin = eprViewPlugin;
    this.image = image;
    //this.w = w/2;
    //this.h = h/2;
    this.w = w;
    this.h = h;
    
    // set the preferred size to the size of the image
    setPreferredSize(new Dimension(this.w, this.h));
    
    MyListener myListener = new MyListener();
    addMouseListener(myListener);
    addMouseMotionListener(myListener);
  }
  
  class MyListener extends MouseInputAdapter {
    public void mousePressed(MouseEvent e) {
      int x = e.getX();
      int y = e.getY();
      currentRect = new Rectangle(x, y, 0, 0);
      updateDrawableRect(getWidth(), getHeight());
      repaint();
    }
    
    public void mouseDragged(MouseEvent e) {
      updateSize(e);
    }
    
    public void mouseReleased(MouseEvent e) {
      updateSize(e);
    }
    
    /*
    * Update the size of the current rectangle
    * and call repaint.  Because currentRect
    * always has the same origin, translate it
    * if the width or height is negative.
    *
    * For efficiency (though
    * that isn't an issue for this program),
    * specify the painting region using arguments
    * to the repaint() call.
    *
    */
    public void updateSize(MouseEvent e) {
      int x = e.getX();
      int y = e.getY();
      currentRect.setSize(x - currentRect.x, y - currentRect.y);
      updateDrawableRect(getWidth(), getHeight());
      Rectangle totalRepaint = rectToDraw.union(previousRectDrawn);
      repaint(totalRepaint.x, totalRepaint.y,
      totalRepaint.width, totalRepaint.height);
    }
  }
  
  public void paintComponent(Graphics g) {
    super.paintComponent(g); //paint background
    
    //Draw image at half it's natural size
    g.drawImage(image, 0, 0, w, h, this);
    
    //If currentRect exists, paint a box on top.
    if (currentRect != null) {
      //Draw a rectangle on top of the image.
	    g.setColor(Color.white);
      g.drawRect(rectToDraw.x, rectToDraw.y,
      rectToDraw.width - 1, rectToDraw.height - 1);
    }
    
    // tell the streak view dialog what was drawn
    if(rectToDraw != null) {
      eprViewPlugin.updateROI(rectToDraw);
    }
  }
  
  public void updateDrawableRect(int compWidth, int compHeight) {
    int x = currentRect.x;
    int y = currentRect.y;
    int width = currentRect.width;
    int height = currentRect.height;
    
    //Make the width and height positive, if necessary.
    if (width < 0) {
      width = 0 - width;
      x = x - width + 1;
      if (x < 0) {
        width += x;
        x = 0;
      }
    }
    if (height < 0) {
      height = 0 - height;
      y = y - height + 1;
      if (y < 0) {
        height += y;
        y = 0;
      }
    }
    
    //The rectangle shouldn't extend past the drawing area.
    if ((x + width) > compWidth) {
      width = compWidth - x;
    }
    if ((y + height) > compHeight) {
      height = compHeight - y;
    }
    
    //Update rectToDraw after saving old value.
    if (rectToDraw != null) {
      previousRectDrawn.setBounds(
      rectToDraw.x, rectToDraw.y,
      rectToDraw.width, rectToDraw.height);
      rectToDraw.setBounds(x, y, width, height);
    } else {
      rectToDraw = new Rectangle(x, y, width, height);
    }
  }
  
  // Method to set the lines to be drawn either vertical or horizontal
  public void drawROI(Rectangle rectangle) {
    rectToDraw = rectangle;
    repaint();
  }
}//--end class EPRImagePanel
