package uk.co.mmscomputing.device.sane.gui;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import javax.swing.event.*;
import uk.co.mmscomputing.device.sane.*;
public class SanePreviewImage extends JComponent{
protected BufferedImage image=new BufferedImage(1,1,BufferedImage.TYPE_INT_RGB);
protected Rectangle roi =new Rectangle(-1,-1,0,0);
protected SanePreviewPanel spp =null;
public SanePreviewImage(SanePreviewPanel spp){
MIA mia=new MIA();
addMouseListener(mia);
addMouseMotionListener(mia);
setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
this.spp=spp;
}
public BufferedImage getImage(){
return image;
}
public void setImage(BufferedImage img){
image=(img!=null)?img:new BufferedImage(1,1,BufferedImage.TYPE_INT_RGB);
roi.setBounds(-1,-1,0,0);
setSize(image.getWidth(),image.getHeight());
validate();
}
public void paint(Graphics gc){
try{
Graphics2D g=(Graphics2D)gc;
g.drawImage(image,0,0,null);
if((roi.width>0)&&(roi.height>0)){
g.drawRect(roi.x,roi.y,roi.width,roi.height);
}
}catch(Error err){ // probably out of memory error
setImage(null);
System.gc();
System.err.println(getClass().getName()+".paint:\n\t"+err);
err.printStackTrace();
System.out.println("9\b"+getClass().getName()+".paint:\n\t"+err);
}
}
public Dimension getPreferredSize(){
return new Dimension(image.getWidth(),image.getHeight());
}
class MIA extends MouseInputAdapter{
public void mouseClicked(MouseEvent e){
roi.setBounds(-1,-1,0,0);
repaint();
}
public void mousePressed(MouseEvent e){
Point t=e.getPoint();
roi.setBounds(t.x,t.y,0,0);
spp.setTopLeft(t);
}
public void mouseReleased(MouseEvent e){
if((roi.width>0)&&(roi.height>0)){
try{
spp.setROI(roi);
}catch(SaneIOException sioe){
sioe.printStackTrace();
}
}
}
public void mouseMoved(MouseEvent e){
spp.setXY(e.getPoint());
}
public void mouseDragged(MouseEvent e){
Point b=e.getPoint();
roi.setBounds(roi.x,roi.y,b.x-roi.x+1,b.y-roi.y+1);
spp.setBottomRight(b);
repaint();
}
}
}