/*
* 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.DetectorMode;
import de.fub.maps.project.detector.model.Detector;
import de.fub.maps.project.detector.model.xmls.Profile;
import de.fub.utilsmodule.Collections.ObservableArrayList;
import de.fub.utilsmodule.components.CustomListView;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ListSelectionModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.openide.explorer.ExplorerManager;
import org.openide.explorer.ExplorerUtils;
import org.openide.nodes.AbstractNode;
import org.openide.nodes.ChildFactory;
import org.openide.nodes.Children;
import org.openide.nodes.Node;
import org.openide.util.Exceptions;
import org.openide.util.Lookup;
import org.openide.util.WeakListeners;
import org.openide.util.lookup.Lookups;
/**
*
* @author Serdar
*/
public class ProfileComponent extends javax.swing.JPanel implements ExplorerManager.Provider, Lookup.Provider, PropertyChangeListener {
private static final long serialVersionUID = 1L;
private final ExplorerManager explorerManager = new ExplorerManager();
private Profile profile;
private Lookup lookup;
private Detector detector;
// private static final Profile EMPTY_PROFILE = createEmptyProfile();
private final ObservableArrayList<Profile> profileList = new ObservableArrayList<Profile>();
/**
* Creates new form ProfileComponent
*/
public ProfileComponent() {
initComponents();
listView1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
}
public ProfileComponent(Lookup lkp) {
this();
assert lkp != null;
detector = lkp.lookup(Detector.class);
assert detector != null : "Lookup does not contain a detector instance!";
lookup = ExplorerUtils.createLookup(explorerManager, getActionMap());
profileList.addAll(detector.getDetectorDescriptor().getProfiles().getProfileList());
explorerManager.setRootContext(new AbstractNode(Children.create(new ProfileNodeFactory(profileList), true)));
explorerManager.addPropertyChangeListener(WeakListeners.propertyChange(ProfileComponent.this, explorerManager));
this.profile = createEmptyProfile();
init();
}
private static Profile createEmptyProfile() {
Profile emptyProfile = new Profile();
emptyProfile.getPreprocess().setActive(false);
emptyProfile.getPreprocess().setMode(DetectorMode.INFERENCE);
emptyProfile.getPostprocess().setActive(false);
emptyProfile.getPostprocess().setMode(DetectorMode.INFERENCE);
return emptyProfile;
}
private void init() {
this.profileName.setText(this.profile.getName());
this.preprocessActive.setSelected(this.profile.getPreprocess().isActive());
if (this.profile.getPreprocess().getMode() != null) {
this.preprocessMode.setSelectedItem(this.profile.getPreprocess().getMode());
} else {
this.preprocessMode.setSelectedIndex(0);
}
this.postprocessActive.setSelected(this.profile.getPostprocess().isActive());
if (this.profile.getPostprocess().getMode() != null) {
this.postprocessMode.setSelectedItem(this.profile.getPostprocess().getMode());
} else {
this.postprocessMode.setSelectedIndex(0);
}
}
@SuppressWarnings("unchecked")
private void readValues() {
this.profile.setName(this.profileName.getText());
this.profile.getPreprocess().setActive(this.preprocessActive.isSelected());
this.profile.getPreprocess().setMode((DetectorMode) this.preprocessMode.getSelectedItem());
this.profile.getPostprocess().setActive(this.postprocessActive.isSelected());
this.profile.getPostprocess().setMode((DetectorMode) this.postprocessMode.getSelectedItem());
}
public Profile getProfile() {
readValues();
return profile;
}
private ComboBoxModel<DetectorMode> getDefaultModel() {
ComboBoxModel<DetectorMode> model = new DefaultComboBoxModel<DetectorMode>(DetectorMode.values());
return model;
}
private ComboBoxModel<DetectorMode> getReadOnlyModel() {
return new DefaultComboBoxModel<DetectorMode>(new DetectorMode[]{DetectorMode.INFERENCE});
}
/**
* 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() {
jPanel4 = new javax.swing.JPanel();
jPanel6 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
jPanel3 = new javax.swing.JPanel();
postprocessActive = new javax.swing.JCheckBox();
postprocessMode = new javax.swing.JComboBox();
jLabel4 = new javax.swing.JLabel();
profileName = new javax.swing.JTextField();
jPanel1 = new javax.swing.JPanel();
preprocessActive = new javax.swing.JCheckBox();
preprocessMode = new javax.swing.JComboBox();
jLabel2 = new javax.swing.JLabel();
deleteButton = new javax.swing.JButton();
editButton = new javax.swing.JButton();
addButton = new javax.swing.JButton();
jPanel5 = new javax.swing.JPanel();
listView1 = new CustomListView();
jLabel5 = new javax.swing.JLabel();
setMinimumSize(new java.awt.Dimension(460, 0));
setPreferredSize(new java.awt.Dimension(460, 370));
setLayout(new java.awt.BorderLayout());
jPanel4.setBorder(javax.swing.BorderFactory.createEmptyBorder(14, 1, 1, 8));
jPanel4.setLayout(new java.awt.BorderLayout());
org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(ProfileComponent.class, "ProfileComponent.jLabel1.text")); // NOI18N
jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(ProfileComponent.class, "ProfileComponent.jPanel3.border.title"))); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(postprocessActive, org.openide.util.NbBundle.getMessage(ProfileComponent.class, "ProfileComponent.postprocessActive.text")); // NOI18N
postprocessActive.setIconTextGap(30);
postprocessActive.setMargin(new java.awt.Insets(2, -2, 2, 2));
postprocessMode.setModel(getReadOnlyModel());
postprocessMode.setEnabled(false);
org.openide.awt.Mnemonics.setLocalizedText(jLabel4, org.openide.util.NbBundle.getMessage(ProfileComponent.class, "ProfileComponent.jLabel4.text")); // NOI18N
javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
jPanel3.setLayout(jPanel3Layout);
jPanel3Layout.setHorizontalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addComponent(postprocessActive)
.addGap(0, 0, Short.MAX_VALUE))
.addGroup(jPanel3Layout.createSequentialGroup()
.addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(postprocessMode, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
.addContainerGap())
);
jPanel3Layout.setVerticalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addContainerGap()
.addComponent(postprocessActive)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(postprocessMode, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel4))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
profileName.setText(org.openide.util.NbBundle.getMessage(ProfileComponent.class, "ProfileComponent.profileName.text")); // NOI18N
jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(ProfileComponent.class, "ProfileComponent.jPanel1.border.title"))); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(preprocessActive, org.openide.util.NbBundle.getMessage(ProfileComponent.class, "ProfileComponent.preprocessActive.text")); // NOI18N
preprocessActive.setIconTextGap(30);
preprocessActive.setMargin(new java.awt.Insets(2, -2, 2, 2));
preprocessMode.setModel(getDefaultModel());
org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(ProfileComponent.class, "ProfileComponent.jLabel2.text")); // NOI18N
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addComponent(preprocessActive)
.addGap(0, 0, Short.MAX_VALUE))
.addGroup(jPanel1Layout.createSequentialGroup()
.addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(preprocessMode, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
.addContainerGap())
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addComponent(preprocessActive)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(preprocessMode, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel2))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
org.openide.awt.Mnemonics.setLocalizedText(deleteButton, org.openide.util.NbBundle.getMessage(ProfileComponent.class, "ProfileComponent.deleteButton.text")); // NOI18N
deleteButton.setEnabled(false);
deleteButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
deleteButtonActionPerformed(evt);
}
});
org.openide.awt.Mnemonics.setLocalizedText(editButton, org.openide.util.NbBundle.getMessage(ProfileComponent.class, "ProfileComponent.editButton.text")); // NOI18N
editButton.setEnabled(false);
editButton.setMaximumSize(new java.awt.Dimension(63, 23));
editButton.setMinimumSize(new java.awt.Dimension(63, 23));
editButton.setPreferredSize(new java.awt.Dimension(63, 23));
editButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
editButtonActionPerformed(evt);
}
});
org.openide.awt.Mnemonics.setLocalizedText(addButton, org.openide.util.NbBundle.getMessage(ProfileComponent.class, "ProfileComponent.addButton.text")); // NOI18N
addButton.setActionCommand(org.openide.util.NbBundle.getMessage(ProfileComponent.class, "ProfileComponent.addButton.actionCommand")); // NOI18N
addButton.setMaximumSize(new java.awt.Dimension(63, 23));
addButton.setMinimumSize(new java.awt.Dimension(63, 23));
addButton.setPreferredSize(new java.awt.Dimension(63, 23));
addButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addButtonActionPerformed(evt);
}
});
javax.swing.GroupLayout jPanel6Layout = new javax.swing.GroupLayout(jPanel6);
jPanel6.setLayout(jPanel6Layout);
jPanel6Layout.setHorizontalGroup(
jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel6Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(jPanel6Layout.createSequentialGroup()
.addGap(16, 16, 16)
.addGroup(jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel6Layout.createSequentialGroup()
.addComponent(addButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(editButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(deleteButton))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel6Layout.createSequentialGroup()
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(profileName, javax.swing.GroupLayout.DEFAULT_SIZE, 191, Short.MAX_VALUE)))))
.addContainerGap())
);
jPanel6Layout.setVerticalGroup(
jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel6Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(profileName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel1))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(deleteButton)
.addComponent(editButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(addButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap())
);
jPanel4.add(jPanel6, java.awt.BorderLayout.CENTER);
add(jPanel4, java.awt.BorderLayout.CENTER);
jPanel5.setPreferredSize(new java.awt.Dimension(200, 344));
listView1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(204, 204, 204)));
org.openide.awt.Mnemonics.setLocalizedText(jLabel5, org.openide.util.NbBundle.getMessage(ProfileComponent.class, "ProfileComponent.jLabel5.text")); // NOI18N
jLabel5.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 4, 1, 4));
javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);
jPanel5.setLayout(jPanel5Layout);
jPanel5Layout.setHorizontalGroup(
jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel5Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(listView1, javax.swing.GroupLayout.DEFAULT_SIZE, 180, Short.MAX_VALUE)
.addComponent(jLabel5, javax.swing.GroupLayout.DEFAULT_SIZE, 180, Short.MAX_VALUE))
.addContainerGap())
);
jPanel5Layout.setVerticalGroup(
jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel5Layout.createSequentialGroup()
.addComponent(jLabel5)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(listView1, javax.swing.GroupLayout.DEFAULT_SIZE, 247, Short.MAX_VALUE))
);
add(jPanel5, java.awt.BorderLayout.WEST);
}// </editor-fold>//GEN-END:initComponents
private void addButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addButtonActionPerformed
this.profile = createEmptyProfile();
readValues();
detector.getDetectorDescriptor().getProfiles().getProfileList().add(this.profile);
profileList.add(this.profile);
try {
explorerManager.setSelectedNodes(new Node[]{});
} catch (PropertyVetoException ex) {
Exceptions.printStackTrace(ex);
}
}//GEN-LAST:event_addButtonActionPerformed
private void editButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editButtonActionPerformed
profile = getExplorerManager().getSelectedNodes()[0].getLookup().lookup(Profile.class);
if (this.profile != null && detector.getDetectorDescriptor().getProfiles().getProfileList().contains(this.profile)) {
readValues();
}
}//GEN-LAST:event_editButtonActionPerformed
private void deleteButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteButtonActionPerformed
if (this.profile != null && detector.getDetectorDescriptor().getProfiles().getProfileList().contains(this.profile)) {
this.detector.getDetectorDescriptor().getProfiles().getProfileList().remove(this.profile);
profileList.remove(this.profile);
}
}//GEN-LAST:event_deleteButtonActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton addButton;
private javax.swing.JButton deleteButton;
private javax.swing.JButton editButton;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel4;
private javax.swing.JPanel jPanel5;
private javax.swing.JPanel jPanel6;
private org.openide.explorer.view.ListView listView1;
private javax.swing.JCheckBox postprocessActive;
private javax.swing.JComboBox postprocessMode;
private javax.swing.JCheckBox preprocessActive;
private javax.swing.JComboBox preprocessMode;
private javax.swing.JTextField profileName;
// End of variables declaration//GEN-END:variables
@Override
public ExplorerManager getExplorerManager() {
return explorerManager;
}
@Override
public Lookup getLookup() {
return lookup;
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (ExplorerManager.PROP_SELECTED_NODES.equals(evt.getPropertyName())) {
Node[] selectedNodes = explorerManager.getSelectedNodes();
if (selectedNodes.length == 1) {
this.profile = selectedNodes[0].getLookup().lookup(Profile.class);
editButton.setEnabled(true);
deleteButton.setEnabled(true);
} else if (selectedNodes.length == 0) {
profile = createEmptyProfile();
editButton.setEnabled(false);
deleteButton.setEnabled(false);
}
init();
}
}
private static class ProfileNodeFactory extends ChildFactory<Profile> implements ChangeListener {
private final ObservableArrayList<Profile> profileList;
private ProfileNodeFactory(ObservableArrayList<Profile> profileList) {
this.profileList = profileList;
profileList.addChangeListener(WeakListeners.change(ProfileNodeFactory.this, profileList));
}
@Override
protected boolean createKeys(List<Profile> toPopulate) {
ArrayList<Profile> arrayList = new ArrayList<Profile>(profileList);
Collections.sort(arrayList, new Comparator<Profile>() {
@Override
public int compare(Profile profile1, Profile profile2) {
return profile1.getName().compareToIgnoreCase(profile2.getName());
}
});
toPopulate.addAll(arrayList);
return true;
}
@Override
protected Node createNodeForKey(Profile profile) {
return new ProfileNode(profile);
}
@Override
public void stateChanged(ChangeEvent e) {
refresh(true);
}
}
private static class ProfileNode extends AbstractNode {
private final Profile profile;
public ProfileNode(Profile profile) {
super(Children.LEAF, Lookups.singleton(profile));
this.profile = profile;
setDisplayName(profile.getName());
}
}
}