package org.openpnp.vision.pipeline.ui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Point;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.HierarchyEvent;
import java.awt.event.HierarchyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextPane;
import javax.swing.JToolBar;
import javax.swing.SwingConstants;
import org.opencv.core.Mat;
import org.openpnp.gui.support.Icons;
import org.openpnp.vision.pipeline.CvStage;
import org.openpnp.vision.pipeline.CvStage.Result;
public class ResultsPanel extends JPanel {
private final CvPipelineEditor editor;
private CvStage selectedStage;
private Robot robot;
public ResultsPanel(CvPipelineEditor editor) {
this.editor = editor;
try {
robot = new Robot();
}
catch (Exception e) {
}
JSplitPane splitPane = new JSplitPane();
splitPane.setContinuousLayout(true);
splitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);
setLayout(new BorderLayout(0, 0));
JPanel headerPanel = new JPanel();
add(headerPanel, BorderLayout.NORTH);
headerPanel.setLayout(new BorderLayout(0, 0));
resultStageNameLabel = new JLabel("New label");
headerPanel.add(resultStageNameLabel, BorderLayout.NORTH);
resultStageNameLabel.setHorizontalAlignment(SwingConstants.CENTER);
JPanel panel = new JPanel();
headerPanel.add(panel, BorderLayout.SOUTH);
JToolBar toolBar = new JToolBar();
panel.add(toolBar);
JButton firstResultButton = new JButton(firstResultAction);
firstResultButton.setHideActionText(true);
toolBar.add(firstResultButton);
JButton previousResultButton = new JButton(previousResultAction);
previousResultButton.setHideActionText(true);
toolBar.add(previousResultButton);
JButton nextResultButton = new JButton(nextResultAction);
toolBar.add(nextResultButton);
JButton lastResultButton = new JButton(lastResultAction);
lastResultButton.setHideActionText(true);
toolBar.add(lastResultButton);
JPanel modelPanel = new JPanel();
modelPanel.setLayout(new BorderLayout(0, 0));
modelTextPane = new JTextPane();
modelPanel.add(new JScrollPane(modelTextPane));
add(splitPane, BorderLayout.CENTER);
splitPane.setRightComponent(modelPanel);
splitPane.setDividerLocation(200);
JPanel panel_1 = new JPanel();
panel_1.setLayout(new BorderLayout(0, 0));
matView = new MatView();
panel_1.add(matView, BorderLayout.CENTER);
splitPane.setLeftComponent(panel_1);
JLabel matStatusLabel = new JLabel("New label");
panel_1.add(matStatusLabel, BorderLayout.SOUTH);
matView.addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
Color color = robot.getPixelColor(e.getXOnScreen(), e.getYOnScreen());
float[] hsb = Color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), null);
Point p = matView.scalePoint(e.getPoint());
matStatusLabel.setText(String.format("RGB: %03d, %03d, %03d HSB: %03d, %03d, %03d XY: %d, %d",
color.getRed(),
color.getGreen(),
color.getBlue(),
(int) (255.0 * hsb[0]),
(int) (255.0 * hsb[1]),
(int) (255.0 * hsb[2]),
p.x,
p.y));
}
});
addHierarchyListener(new HierarchyListener() {
@Override
public void hierarchyChanged(HierarchyEvent e) {
splitPane.setDividerLocation(0.8);
}
});
}
public void refresh() {
List<CvStage> stages = editor.getPipeline().getStages();
// If there are no stages we can't have anything selected, so clear it.
if (stages.isEmpty()) {
selectedStage = null;
}
// Otherwise if nothing is selected or if the previously selected stage is no longer in the
// pipeline replace the selection with the first stage.
else if (selectedStage == null || !stages.contains(selectedStage)) {
selectedStage = stages.get(0);
}
updateAllEverything();
}
public void setSelectedStage(CvStage stage) {
this.selectedStage = stage;
updateAllEverything();
}
private void updateAllEverything() {
List<CvStage> stages = editor.getPipeline().getStages();
Result result = null;
Mat image = null;
Object model = null;
if (selectedStage != null) {
result = editor.getPipeline().getResult(selectedStage);
if (result != null) {
image = result.image;
model = result.model;
}
}
if (model instanceof List) {
String s = "";
for (Object o : ((List) model)) {
if (o != null) {
s += o.toString();
}
s += "\n";
}
modelTextPane.setText(s);
}
else {
modelTextPane.setText(model == null ? "" : model.toString());
}
matView.setMat(image);
resultStageNameLabel.setText(result == null || selectedStage == null ? ""
: (selectedStage.getName() + " (" + (result.processingTimeNs / 1000000.0)
+ " ms)"));
if (selectedStage == null) {
firstResultAction.setEnabled(false);
previousResultAction.setEnabled(false);
nextResultAction.setEnabled(false);
lastResultAction.setEnabled(false);
}
else {
int index = stages.indexOf(selectedStage);
firstResultAction.setEnabled(index > 0);
previousResultAction.setEnabled(index > 0);
nextResultAction.setEnabled(index < stages.size() - 1);
lastResultAction.setEnabled(index < stages.size() - 1);
}
}
public final Action firstResultAction = new AbstractAction() {
{
putValue(SMALL_ICON, Icons.navigateFirst);
putValue(NAME, "");
putValue(SHORT_DESCRIPTION, "");
}
@Override
public void actionPerformed(ActionEvent arg0) {
List<CvStage> stages = editor.getPipeline().getStages();
selectedStage = stages.get(0);
updateAllEverything();
}
};
public final Action previousResultAction = new AbstractAction() {
{
putValue(SMALL_ICON, Icons.navigatePrevious);
putValue(NAME, "");
putValue(SHORT_DESCRIPTION, "");
}
@Override
public void actionPerformed(ActionEvent arg0) {
List<CvStage> stages = editor.getPipeline().getStages();
int index = stages.indexOf(selectedStage);
selectedStage = stages.get(index - 1);
updateAllEverything();
}
};
public final Action nextResultAction = new AbstractAction() {
{
putValue(SMALL_ICON, Icons.navigateNext);
putValue(NAME, "");
putValue(SHORT_DESCRIPTION, "");
}
@Override
public void actionPerformed(ActionEvent arg0) {
List<CvStage> stages = editor.getPipeline().getStages();
int index = stages.indexOf(selectedStage);
selectedStage = stages.get(index + 1);
updateAllEverything();
}
};
public final Action lastResultAction = new AbstractAction() {
{
putValue(SMALL_ICON, Icons.navigateLast);
putValue(NAME, "");
putValue(SHORT_DESCRIPTION, "");
}
@Override
public void actionPerformed(ActionEvent arg0) {
List<CvStage> stages = editor.getPipeline().getStages();
selectedStage = stages.get(stages.size() - 1);
updateAllEverything();
}
};
private JTextPane modelTextPane;
private JLabel resultStageNameLabel;
private MatView matView;
}