/*
* Copyright (C) 2013 Serdar
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package de.fub.maps.project.detector.ui;
import de.fub.maps.project.detector.model.Detector;
import de.fub.maps.project.detector.model.inference.AbstractInferenceModel;
import de.fub.maps.project.detector.model.xmls.InferenceModelDescriptor;
import de.fub.maps.project.detector.utils.DetectorUtils;
import de.fub.utilsmodule.components.CustomListView;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import javax.swing.Action;
import javax.swing.JComponent;
import javax.swing.ListSelectionModel;
import org.openide.explorer.ExplorerManager;
import org.openide.nodes.AbstractNode;
import org.openide.nodes.ChildFactory;
import org.openide.nodes.Children;
import org.openide.nodes.FilterNode;
import org.openide.nodes.Node;
import org.openide.util.Exceptions;
import org.openide.util.Lookup;
/**
*
* @author Serdar
*/
public class InferenceModelComponent extends javax.swing.JPanel implements ExplorerManager.Provider, PropertyChangeListener, ActionListener {
private static final long serialVersionUID = 1L;
private Detector detector;
private final ExplorerManager explorerManager = new ExplorerManager();
private final ArrayList<AbstractInferenceModel> registeredModels = new ArrayList<AbstractInferenceModel>();
private static BufferedImage EMPTY_IMAGE = null;
/**
* Creates new form InferenceModelComponent
*/
public InferenceModelComponent() {
initComponents();
listView.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
getExplorerManager().addPropertyChangeListener(InferenceModelComponent.this);
applyButton.addActionListener(InferenceModelComponent.this);
}
public InferenceModelComponent(Lookup lookup) {
this();
detector = lookup.lookup(Detector.class);
assert detector != null;
init();
}
private void init() {
AbstractInferenceModel currentInferenceModel = detector.getInferenceModel();
Set<Class<? extends AbstractInferenceModel>> allClasses = Lookup.getDefault().lookupResult(AbstractInferenceModel.class).allClasses();
for (Class<? extends AbstractInferenceModel> modelClass : allClasses) {
AbstractInferenceModel inferenceModel = DetectorUtils.createInstance(modelClass, modelClass.getName());
if (inferenceModel != null) {
if (currentInferenceModel != null) {
if (inferenceModel.getClass().equals(currentInferenceModel.getClass())) {
registeredModels.add(currentInferenceModel);
} else {
registeredModels.add(inferenceModel);
}
} else {
registeredModels.add(inferenceModel);
}
}
}
getExplorerManager().setRootContext(new AbstractNode(Children.create(new InferenceModelNodeFactory(registeredModels), true)));
initializeSelection();
}
private void initializeSelection() {
Node[] nodes = getExplorerManager().getRootContext().getChildren().getNodes(true);
AbstractInferenceModel inferenceModel = detector.getInferenceModel();
Node selectedNode = null;
if (inferenceModel != null) {
for (Node node : nodes) {
AbstractInferenceModel abstractInferenceModel = node.getLookup().lookup(AbstractInferenceModel.class);
if (abstractInferenceModel != null && abstractInferenceModel.equals(inferenceModel)) {
selectedNode = node;
selectedInferenceModel.setText(abstractInferenceModel.getName());
break;
}
}
if (selectedNode != null) {
try {
getExplorerManager().setSelectedNodes(new Node[]{selectedNode});
} catch (PropertyVetoException ex) {
Exceptions.printStackTrace(ex);
}
}
}
}
/**
* 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() {
jLabel1 = new javax.swing.JLabel();
listView = new CustomListView();
jScrollPane1 = new javax.swing.JScrollPane();
settingsPanelContainer = new javax.swing.JPanel();
applyButton = new javax.swing.JButton();
selectedInferenceModel = new javax.swing.JTextField();
jLabel2 = new javax.swing.JLabel();
org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(InferenceModelComponent.class, "InferenceModelComponent.jLabel1.text")); // NOI18N
jLabel1.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 5, 1, 5));
jLabel1.setMaximumSize(new java.awt.Dimension(34, 32));
jLabel1.setPreferredSize(new java.awt.Dimension(34, 32));
listView.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(204, 204, 204)));
settingsPanelContainer.setPreferredSize(new java.awt.Dimension(390, 240));
settingsPanelContainer.setLayout(new java.awt.BorderLayout());
jScrollPane1.setViewportView(settingsPanelContainer);
org.openide.awt.Mnemonics.setLocalizedText(applyButton, org.openide.util.NbBundle.getMessage(InferenceModelComponent.class, "InferenceModelComponent.applyButton.text")); // NOI18N
applyButton.setActionCommand(org.openide.util.NbBundle.getMessage(InferenceModelComponent.class, "InferenceModelComponent.applyButton.actionCommand")); // NOI18N
applyButton.setEnabled(false);
selectedInferenceModel.setEditable(false);
selectedInferenceModel.setText(org.openide.util.NbBundle.getMessage(InferenceModelComponent.class, "InferenceModelComponent.selectedInferenceModel.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(InferenceModelComponent.class, "InferenceModelComponent.jLabel2.text")); // NOI18N
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(listView, javax.swing.GroupLayout.PREFERRED_SIZE, 186, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 186, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 458, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(selectedInferenceModel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(applyButton))))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 271, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(applyButton)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(selectedInferenceModel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel2))))
.addComponent(listView, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton applyButton;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JScrollPane jScrollPane1;
private org.openide.explorer.view.ListView listView;
private javax.swing.JTextField selectedInferenceModel;
private javax.swing.JPanel settingsPanelContainer;
// End of variables declaration//GEN-END:variables
@Override
public final ExplorerManager getExplorerManager() {
return explorerManager;
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (ExplorerManager.PROP_SELECTED_NODES.equals(evt.getPropertyName())) {
settingsPanelContainer.removeAll();
Node[] selectedNodes = getExplorerManager().getSelectedNodes();
if (selectedNodes.length == 1) {
AbstractInferenceModel abstractInferenceModel = selectedNodes[0].getLookup().lookup(AbstractInferenceModel.class);
if (abstractInferenceModel != null) {
JComponent visualRepresenter = abstractInferenceModel.getSettingsView();
if (visualRepresenter != null) {
settingsPanelContainer.add(visualRepresenter, BorderLayout.CENTER);
}
}
applyButton.setEnabled(true);
} else {
applyButton.setEnabled(false);
}
settingsPanelContainer.revalidate();
repaint();
}
}
@Override
public void actionPerformed(ActionEvent e) {
Node[] selectedNodes = getExplorerManager().getSelectedNodes();
if (selectedNodes.length == 1) {
AbstractInferenceModel abstractInferenceModel = selectedNodes[0].getLookup().lookup(AbstractInferenceModel.class);
if (abstractInferenceModel != null) {
InferenceModelDescriptor inferenceModelDescriptor = abstractInferenceModel.getInferenceModelDescriptor();
if (inferenceModelDescriptor != null) {
selectedInferenceModel.setText(abstractInferenceModel.getName());
detector.getDetectorDescriptor().setInferenceModel(inferenceModelDescriptor);
} else {
throw new IllegalStateException("Inferene model doesn't have a inferenceModelDescriptor!");
}
} else {
throw new IllegalStateException("Node doesn't contain an inference model");
}
}
}
private static class InferenceModelNodeFactory extends ChildFactory<AbstractInferenceModel> {
private final List<AbstractInferenceModel> registeredInferenceModels;
public InferenceModelNodeFactory(List<AbstractInferenceModel> inferenceModels) {
this.registeredInferenceModels = inferenceModels;
}
@Override
protected boolean createKeys(List<AbstractInferenceModel> toPopulate) {
toPopulate.addAll(registeredInferenceModels);
Collections.sort(toPopulate);
return true;
}
@Override
protected Node createNodeForKey(AbstractInferenceModel inferenceModel) {
return new InferenceModelFilterNode(inferenceModel.getNodeDelegate());
}
}
private static class InferenceModelFilterNode extends FilterNode {
public InferenceModelFilterNode(Node original) {
super(original, Children.LEAF);
}
@Override
public Action[] getActions(boolean context) {
return new Action[0];
}
@Override
public Image getIcon(int type) {
return getEmptyImage();
}
@Override
public Image getOpenedIcon(int type) {
return getIcon(type); //To change body of generated methods, choose Tools | Templates.
}
private static BufferedImage getEmptyImage() {
if (EMPTY_IMAGE == null) {
EMPTY_IMAGE = new BufferedImage(16, 16, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g2d = EMPTY_IMAGE.createGraphics();
g2d.setPaint(new Color(1, 1, 1, 0));
g2d.fill(new Rectangle(EMPTY_IMAGE.getWidth(), EMPTY_IMAGE.getHeight()));
g2d.dispose();
}
return EMPTY_IMAGE;
}
}
}