package de.ralfebert.imageassert.compare.swing;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Transparency;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JScrollPane;
public class ImageCompareDialog extends JDialog {
private BufferedImage currentImage;
private boolean applied = false;
public ImageCompareDialog(BufferedImage expected, BufferedImage actual) {
setTitle("1: expected, 2: Actual");
// Create compatible images for fast scrolling
final BufferedImage expectedImage = makeCompatible(expected);
final BufferedImage actualImage = makeCompatible(actual);
this.currentImage = expectedImage;
final JComponent panel = new JComponent() {
@Override
public void paint(Graphics g) {
g.drawImage(currentImage, 0, 0, Color.WHITE, null);
}
};
panel.setPreferredSize(new Dimension(expectedImage.getWidth(), expectedImage.getHeight()));
JScrollPane scrollPane = new JScrollPane(panel);
add(scrollPane);
JButton applyButton = new JButton("Apply: Save actual PDF");
applyButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();
if (fileChooser.showSaveDialog(ImageCompareDialog.this) == JFileChooser.APPROVE_OPTION) {
onApply(fileChooser.getSelectedFile());
}
applied = true;
setVisible(false);
}
});
add(applyButton, BorderLayout.PAGE_END);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
if (!applied) {
onReject();
}
}
});
setBackground(Color.WHITE);
applyButton.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyChar() == '1') {
currentImage = expectedImage;
ImageCompareDialog.this.repaint();
}
if (e.getKeyChar() == '2') {
currentImage = actualImage;
ImageCompareDialog.this.repaint();
}
}
});
setSize(expectedImage.getWidth() + 30, expectedImage.getHeight());
}
private BufferedImage makeCompatible(BufferedImage image) {
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice device = env.getDefaultScreenDevice();
GraphicsConfiguration config = device.getDefaultConfiguration();
final BufferedImage compatibleImage = config.createCompatibleImage(image.getWidth(),
image.getHeight(), Transparency.TRANSLUCENT);
compatibleImage.getGraphics().drawImage(image, 0, 0, null);
return compatibleImage;
}
protected void onApply(File file) {
}
protected void onReject() {
}
public void open() {
setModal(true);
setVisible(true);
}
}