18f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggipackage aurelienribon.utils.swing;
28f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
38f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport java.awt.Color;
48f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport java.awt.Graphics;
58f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport java.awt.Graphics2D;
68f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport java.awt.Rectangle;
78f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport java.awt.TexturePaint;
88f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport java.awt.image.BufferedImage;
98f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport java.io.File;
108f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport java.io.IOException;
118f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport java.net.URL;
128f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport java.util.logging.Level;
138f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport java.util.logging.Logger;
148f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport javax.imageio.ImageIO;
158f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport javax.swing.JPanel;
168f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
178f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi/**
188f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi * @author Aurelien Ribon | http://www.aurelienribon.com
198f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi */
208f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggipublic class ImagePanel extends JPanel {
218f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	private BufferedImage background;
228f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	private BufferedImage image;
238f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	private boolean useRegion;
248f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	private int x, y, width, height;
258f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
268f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	public void setBackground(URL bgURL) {
278f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		try {
288f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi			background = ImageIO.read(bgURL);
298f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		} catch (IOException ex) {
308f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		}
318f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	}
328f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
338f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	public void clearImage() {
348f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		image = null;
358f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		repaint();
368f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	}
378f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
388f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	public void setImage(BufferedImage img) {
398f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		image = img;
408f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		repaint();
418f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	}
428f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
438f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	public void setImage(File img) {
448f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		setImage(img, 0, 0, 0, 0);
458f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		useRegion = false;
468f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	}
478f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
488f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	public void setImage(URL imgUrl) {
498f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		setImage(imgUrl, 0, 0, 0, 0);
508f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		useRegion = false;
518f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	}
528f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
538f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	public void setImage(File img, int x, int y, int width, int height) {
548f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		this.x = x;
558f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		this.y = y;
568f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		this.width = width;
578f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		this.height = height;
588f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		useRegion = true;
598f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
608f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		try {
618f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi			image = img != null ? ImageIO.read(img) : null;
628f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi			repaint();
638f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		} catch (IOException ex) {
648f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi			Logger.getLogger(ImagePanel.class.getName()).log(Level.SEVERE, null, ex);
658f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		}
668f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	}
678f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
688f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	public void setImage(URL imgUrl, int x, int y, int width, int height) {
698f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		this.x = x;
708f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		this.y = y;
718f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		this.width = width;
728f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		this.height = height;
738f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		useRegion = true;
748f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
758f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		try {
768f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi			image = imgUrl != null ? ImageIO.read(imgUrl) : null;
778f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi			repaint();
788f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		} catch (IOException ex) {
798f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi			Logger.getLogger(ImagePanel.class.getName()).log(Level.SEVERE, null, ex);
808f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		}
818f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	}
828f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
838f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	@Override
848f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	protected void paintComponent(Graphics g) {
858f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		Graphics2D gg = (Graphics2D)g;
868f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		gg.setColor(Color.LIGHT_GRAY);
878f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		gg.fillRect(0, 0, getWidth(), getHeight());
888f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
898f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		if (background != null) {
908f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi			TexturePaint paint = new TexturePaint(background, new Rectangle(0, 0, background.getWidth(), background.getHeight()));
918f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi			gg.setPaint(paint);
928f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi			gg.fillRect(0, 0, getWidth(), getHeight());
938f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi			gg.setPaint(null);
948f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		}
958f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
968f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		if (image != null && !useRegion) {
978f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi			float panelRatio = (float)getWidth() / (float)getHeight();
988f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi			float imgRatio = (float)image.getWidth() / (float)image.getHeight();
998f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
1008f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi			if (imgRatio > panelRatio) {
1018f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi				float tw = (float)getWidth();
1028f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi				float th = (float)getWidth() / imgRatio;
1038f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi				gg.drawImage(image, 0, (int)(getHeight()/2 - th/2), (int) tw, (int) th, null);
1048f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi			} else {
1058f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi				float tw = (float)getHeight() * imgRatio;
1068f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi				float th = (float)getHeight();
1078f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi				gg.drawImage(image, (int)((float)getWidth()/2 - tw/2), 0, (int) tw, (int) th, null);
1088f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi			}
1098f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
1108f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		} else if (image != null && useRegion) {
1118f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi			float panelRatio = (float)getWidth() / (float)getHeight();
1128f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi			float imgRatio = (float)width / (float)height;
1138f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
1148f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi			if (imgRatio > panelRatio) {
1158f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi				int tw = getWidth();
1168f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi				int th = (int) (getWidth() / imgRatio);
1178f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi				int tx = 0;
1188f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi				int ty = getHeight()/2 - th/2;
1198f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi				gg.drawImage(image, tx, ty, tx + tw, ty + th, x, y, x + width, y + width, null);
1208f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi			} else {
1218f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi				int tw = (int) (getHeight() * imgRatio);
1228f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi				int th = getHeight();
1238f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi				int tx = getWidth()/2 - tw/2;
1248f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi				int ty = 0;
1258f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi				gg.drawImage(image, tx, ty, tx + tw, ty + th, x, y, x + width, y + width, null);
1268f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi			}
1278f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		}
1288f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	}
1298f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi}
130