/*
* This file is part of JGAP.
*
* JGAP offers a dual license model containing the LGPL as well as the MPL.
*
* For licensing information please see the file license.txt included with JGAP
* or have a look at the top of class org.jgap.Chromosome which representatively
* includes the JGAP license policy applicable for any file delivered with JGAP.
*/
package examples.gp.monalisa.gui;
import java.io.*;
import javax.imageio.*;
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
import org.jdesktop.application.*;
import org.jdesktop.application.Action;
import org.jfree.chart.*;
import org.jfree.data.xy.*;
import org.jgap.util.*;
/**
* The application's main frame.
*
* @author Yann N. Dauphin
* @since 3.4
*/
public class GeneticDrawingView
extends FrameView {
/** String containing the CVS revision. Read out via reflection!*/
private final static String CVS_REVISION = "$Revision: 1.2 $";
public GeneticDrawingView(SingleFrameApplication app) {
super(app);
initComponents();
ResourceMap resourceMap = getResourceMap();
ImageIcon imageIcon = resourceMap.getImageIcon("targetImageLabel.icon");
targetImage = new BufferedImage(imageIcon.getIconWidth(),
imageIcon.getIconHeight(),
BufferedImage.TYPE_INT_ARGB);
imageIcon.paintIcon(null, targetImage.getGraphics(), 0, 0);
fittestDrawingView = new FittestDrawingView();
fittestDrawingView.setVisible(false);
fittestDrawingView.setSize(targetImage.getWidth(), targetImage.getHeight());
}
@Action
public void showAboutBox() {
if (aboutBox == null) {
JFrame mainFrame = GeneticDrawingApp.getApplication().getMainFrame();
aboutBox = new GeneticDrawingAboutBox(mainFrame);
aboutBox.setLocationRelativeTo(mainFrame);
}
GeneticDrawingApp.getApplication().show(aboutBox);
}
@Action
public void chooseImage()
throws IOException {
JFileChooser fc = new JFileChooser();
fc.setCurrentDirectory(new File("."));
fc.showOpenDialog(mainPanel);
File file = fc.getSelectedFile();
targetImage = ImageIO.read(file);
targetImageLabel.setIcon(scaleToImageLabel(targetImage));
fittestDrawingView.setSize(targetImage.getWidth(), targetImage.getHeight());
}
@Action
public void startEvolution() {
if (targetImage == null) {
return;
}
ResourceMap resourceMap = getResourceMap();
if (isEvolutionActivated == false) {
startEvolution.setText(resourceMap.getString("stopEvolution.text"));
fittestDrawingView.setVisible(true);
isEvolutionActivated = true;
Thread t = new Thread(new EvolutionRunnable(this));
t.start();
}
else {
startEvolution.setText(resourceMap.getString("startEvolution.text"));
isEvolutionActivated = false;
}
}
/**
* Scale an image to fit the size of the targetImageLabel.
*/
public ImageIcon scaleToImageLabel(Image image) {
ImageIcon scaled = new ImageIcon(image);
if (scaled.getIconHeight() > targetImageLabel.getHeight()) {
scaled = new ImageIcon(image.getScaledInstance(
-1, targetImageLabel.getHeight(), Image.SCALE_FAST));
}
if (scaled.getIconWidth() > targetImageLabel.getWidth()) {
scaled = new ImageIcon(image.getScaledInstance(
targetImageLabel.getWidth(), -1, Image.SCALE_FAST));
}
return scaled;
}
public BufferedImage getTargetImage() {
return targetImage;
}
public boolean isEvolutionActivated() {
return isEvolutionActivated;
}
public boolean isSaveToFile() {
return saveCheckBox.isSelected();
}
public FittestDrawingView getFittestDrawingView() {
return fittestDrawingView;
}
public JFreeChart getChart() {
ChartPanel cp = (ChartPanel) chartPanel;
return cp.getChart();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
mainPanel = new javax.swing.JPanel();
chooseImage = new javax.swing.JButton();
startEvolution = new javax.swing.JToggleButton();
targetImageLabel = new javax.swing.JLabel();
saveCheckBox = new JCheckBox();
saveCheckBox.setText("Save every fittest result to file");
targetSaveDirLabel = new JLabel("Target directory:");
try {
targetSaveDirEdit = new JLabel(FileKit.getCurrentDir());
} catch (IOException ex) {
targetSaveDirEdit = new JLabel();
}
JFreeChart chart = ChartFactory.createXYLineChart(
"Fitness versus Generation",
"Generation",
"Fitness",
new XYSeriesCollection(new XYSeries("")),
org.jfree.chart.plot.PlotOrientation.VERTICAL,
false,
false,
false);
chartPanel = new ChartPanel(chart);
menuBar = new javax.swing.JMenuBar();
javax.swing.JMenu fileMenu = new javax.swing.JMenu();
javax.swing.JMenuItem exitMenuItem = new javax.swing.JMenuItem();
javax.swing.JMenu helpMenu = new javax.swing.JMenu();
javax.swing.JMenuItem aboutMenuItem = new javax.swing.JMenuItem();
mainPanel.setName("mainPanel"); // NOI18N
javax.swing.ActionMap actionMap = org.jdesktop.application.Application.
getInstance(examples.gp.monalisa.gui.GeneticDrawingApp.class).
getContext().getActionMap(GeneticDrawingView.class, this);
chooseImage.setAction(actionMap.get("chooseImage")); // NOI18N
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.
Application.getInstance(examples.gp.monalisa.gui.GeneticDrawingApp.class).
getContext().getResourceMap(GeneticDrawingView.class);
chooseImage.setText(resourceMap.getString("chooseImage.text")); // NOI18N
chooseImage.setName("chooseImage"); // NOI18N
startEvolution.setAction(actionMap.get("startEvolution")); // NOI18N
startEvolution.setText(resourceMap.getString("startEvolution.text")); // NOI18N
startEvolution.setName("startEvolution"); // NOI18N
targetImageLabel.setIcon(resourceMap.getIcon("targetImageLabel.icon")); // NOI18N
targetImageLabel.setText(resourceMap.getString("targetImageLabel.text")); // NOI18N
targetImageLabel.setName("targetImageLabel"); // NOI18N
chartPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder());
chartPanel.setName("chartPanel"); // NOI18N
org.jdesktop.layout.GroupLayout chartPanelLayout = new org.jdesktop.layout.
GroupLayout(chartPanel);
chartPanel.setLayout(chartPanelLayout);
chartPanelLayout.setHorizontalGroup(
chartPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.
LEADING)
.add(0, 399, Short.MAX_VALUE)
);
chartPanelLayout.setVerticalGroup(
chartPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.
LEADING)
.add(0, 234, Short.MAX_VALUE)
);
org.jdesktop.layout.GroupLayout mainPanelLayout = new org.jdesktop.layout.
GroupLayout(mainPanel);
mainPanel.setLayout(mainPanelLayout);
mainPanelLayout.setHorizontalGroup(
mainPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.
LEADING)
.add(mainPanelLayout.createSequentialGroup()
.add(mainPanelLayout.createParallelGroup(org.jdesktop.layout.
GroupLayout.LEADING, false)
.add(mainPanelLayout.createSequentialGroup()
.add(47, 47, 47)
.add(chooseImage)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.
UNRELATED)
.add(startEvolution)
.add(38, 38, 38))
.add(mainPanelLayout.createSequentialGroup()
.add(47, 47, 47)
.add(saveCheckBox)
.add(140, 140, 140))
.add(mainPanelLayout.createSequentialGroup()
.add(47, 47, 47)
.add(targetSaveDirLabel)
.add(targetSaveDirEdit)
.add(47, 47, 47))
.add(org.jdesktop.layout.GroupLayout.TRAILING,
mainPanelLayout.createSequentialGroup()
.addContainerGap(org.jdesktop.layout.GroupLayout.
DEFAULT_SIZE, Short.MAX_VALUE)
.add(targetImageLabel,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 200,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(80, 80, 80)))
.add(chartPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap())
);
mainPanelLayout.setVerticalGroup(
mainPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.
LEADING)
.add(org.jdesktop.layout.GroupLayout.TRAILING,
mainPanelLayout.createSequentialGroup()
.addContainerGap()
.add(mainPanelLayout.createParallelGroup(org.jdesktop.layout.
GroupLayout.TRAILING)
.add(org.jdesktop.layout.GroupLayout.LEADING, chartPanel,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE)
.add(mainPanelLayout.createSequentialGroup()
.add(saveCheckBox)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(targetSaveDirLabel)
.add(targetSaveDirEdit)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(targetImageLabel,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 202,
Short.MAX_VALUE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(mainPanelLayout.createParallelGroup(org.jdesktop.
layout.GroupLayout.BASELINE)
.add(startEvolution)
.add(chooseImage))))
.addContainerGap())
);
chooseImage.getAccessibleContext().setAccessibleName(resourceMap.getString(
"jButton1.AccessibleContext.accessibleName")); // NOI18N
menuBar.setName("menuBar"); // NOI18N
fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N
fileMenu.setName("fileMenu"); // NOI18N
exitMenuItem.setAction(actionMap.get("quit")); // NOI18N
exitMenuItem.setName("exitMenuItem"); // NOI18N
fileMenu.add(exitMenuItem);
menuBar.add(fileMenu);
helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N
helpMenu.setName("helpMenu"); // NOI18N
aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N
aboutMenuItem.setName("aboutMenuItem"); // NOI18N
helpMenu.add(aboutMenuItem);
menuBar.add(helpMenu);
setComponent(mainPanel);
setMenuBar(menuBar);
} // </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel chartPanel;
private javax.swing.JButton chooseImage;
private javax.swing.JPanel mainPanel;
private javax.swing.JMenuBar menuBar;
private javax.swing.JToggleButton startEvolution;
private javax.swing.JLabel targetImageLabel;
// End of variables declaration//GEN-END:variables
private JDialog aboutBox;
private javax.swing.JCheckBox saveCheckBox;
private javax.swing.JLabel targetSaveDirLabel;
private javax.swing.JLabel targetSaveDirEdit;
private BufferedImage targetImage = null;
private boolean isEvolutionActivated = false;
private FittestDrawingView fittestDrawingView = null;
}