You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
SIPRP/trunk/SIPRPSoft/src/siprp/clientes/ImagePanel.java

219 lines
4.7 KiB

package siprp.clientes;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import com.evolute.utils.dataui.ControllableComponent;
public class ImagePanel extends JPanel implements MouseListener, ControllableComponent
{
private static final long serialVersionUID = 1L;
public static final int WIDTH_THUMBNAIL = 64;
public static final int HEIGHT_THUMBNAIL = 64;
public static final int WIDTH_FULL = 512;
public static final int HEIGHT_FULL = 512;
private final int w;
private final int h;
private boolean thumb = false;
private BufferedImage scaledImage = null;
private BufferedImage image = null;
public ImagePanel( boolean thumbnail )
{
thumb = thumbnail;
w = thumb ? WIDTH_THUMBNAIL : WIDTH_FULL;
h = thumb ? HEIGHT_THUMBNAIL : HEIGHT_FULL;
this.setSize( new Dimension(w,h) );
this.setPreferredSize( new Dimension(w,h) );
this.setOpaque( false );
this.setLayout( new BorderLayout() );
this.addMouseListener( this );
this.setToolTipText( "Alterar logotipo " );
fill( null );
}
public void fill( Object object )
{
byte[] array = (byte[]) object;
image = null;
scaledImage = null;
try
{
if( array != null )
{
ByteArrayInputStream input = new ByteArrayInputStream( array );
scaledImage = ImageIO.read( input );
input = new ByteArrayInputStream( array );
image = ImageIO.read( input );
}
} catch( IOException e )
{
e.printStackTrace();
}
refresh();
}
private void changeImage( File file )
{
image = null;
scaledImage = null;
try
{
if( file != null && file.exists() )
{
scaledImage = ImageIO.read( file );
image = ImageIO.read( file );
}
} catch( IOException e )
{
e.printStackTrace();
}
refresh();
}
private void scaleImage()
{
if( scaledImage != null )
{
this.setBorder( BorderFactory.createEmptyBorder() );
if( scaledImage.getWidth() > w )
{
AffineTransform af = AffineTransform.getScaleInstance( ( (double) w) / ( (double) scaledImage.getWidth() ), ( (double) w ) / ( (double) scaledImage.getWidth() ) );
AffineTransformOp afOp = new AffineTransformOp( af, AffineTransformOp.TYPE_BILINEAR );
scaledImage = afOp.filter( scaledImage, null );
}
if( scaledImage.getHeight() > h )
{
AffineTransform af = AffineTransform.getScaleInstance( ( (double) h) / ( (double) scaledImage.getHeight() ), ( (double) h ) / ( (double) scaledImage.getHeight() ) );
AffineTransformOp afOp = new AffineTransformOp( af, AffineTransformOp.TYPE_BILINEAR );
scaledImage = afOp.filter( scaledImage, null );
}
}
else
{
this.setBorder( BorderFactory.createLineBorder( Color.GRAY, 1 ) );
}
}
private void refresh()
{
scaleImage();
repaint();
}
@Override
public boolean imageUpdate( Image img, int infoflags, int x, int y, int w, int h )
{
boolean loaded = !imageUpdate( img, infoflags, x, y, w, h );
if( !loaded )
{
refresh();
}
return !loaded;
}
@Override
protected void paintComponent( Graphics g )
{
super.paintComponent( g );
if( scaledImage != null )
{
int shiftX = ( w - scaledImage.getWidth() ) / 2;
int shiftY = ( h - scaledImage.getHeight() ) / 2;
g.drawImage( scaledImage, 0 + shiftX, 0 + shiftY, w - shiftX, h - shiftY, this );
}
}
@Override
public void mouseClicked( MouseEvent e )
{
if( this.isEnabled() )
{
JFileChooser fc = new JFileChooser();
int returned = fc.showOpenDialog( this );
if( JFileChooser.APPROVE_OPTION == returned )
{
changeImage( fc.getSelectedFile() );
}
}
}
@Override
public void mouseEntered( MouseEvent e )
{
this.setCursor( new Cursor( Cursor.HAND_CURSOR ) );
}
@Override
public void mouseExited( MouseEvent e )
{
this.setCursor( new Cursor( Cursor.DEFAULT_CURSOR ) );
}
@Override
public void mousePressed( MouseEvent e )
{
}
@Override
public void mouseReleased( MouseEvent e )
{
}
@Override
public void clear()
{
fill( null );
}
@Override
public Object save()
{
byte [] result = null;
try
{
if( image != null )
{
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write( image, "PNG", out );
result = out.toByteArray();
}
}
catch( IOException e )
{
e.printStackTrace();
}
return result;
}
}