/*
Copyright 2008-2010 Gephi
Authors : Martin Škurla
Website : http://www.gephi.org
This file is part of Gephi.
Gephi is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
Gephi 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with Gephi. If not, see <http://www.gnu.org/licenses/>.
*/
package org.gephi.desktop.neo4j.ui;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.LinkedList;
import java.util.List;
import javax.swing.AbstractButton;
import javax.swing.DefaultComboBoxModel;
import javax.swing.table.AbstractTableModel;
import org.gephi.desktop.neo4j.ui.util.Neo4jUtils;
import org.gephi.neo4j.plugin.api.FilterDescription;
import org.gephi.neo4j.plugin.api.RelationshipDescription;
import org.gephi.neo4j.plugin.api.TraversalOrder;
import org.neo4j.graphdb.Direction;
import org.neo4j.graphdb.DynamicRelationshipType;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;
import org.neo4j.index.IndexService;
import org.neo4j.index.lucene.LuceneIndexService;
import org.netbeans.validation.api.ui.ValidationPanel;
/**
*
* @author Martin Škurla
*/
public class TraversalImportPanel extends javax.swing.JPanel {
private final GraphDatabaseService graphDB;
private final RelationshipsTableModel relationshipsTableModel;
private int relationshipsSelectedRow;
public TraversalImportPanel(GraphDatabaseService graphDB) {
this.graphDB = graphDB;
this.relationshipsTableModel = new RelationshipsTableModel();
initComponents();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
orderButtonGroup = new javax.swing.ButtonGroup();
maxDepthButtonGroup = new javax.swing.ButtonGroup();
startNodeButtonGroup = new javax.swing.ButtonGroup();
relationshipsButtonGroup = new javax.swing.ButtonGroup();
traversePanel = new javax.swing.JPanel();
orderPanel = new javax.swing.JPanel();
breadthFirstOrderRadioButton = new javax.swing.JRadioButton();
depthFirstOrderRadioButton = new javax.swing.JRadioButton();
maxDepthPanel = new javax.swing.JPanel();
concreteMaxDepthRadioButton = new javax.swing.JRadioButton();
endOfGraphMaxDepthRadioButton = new javax.swing.JRadioButton();
maxDepthSpinner = new javax.swing.JSpinner();
relationshipsPanel = new javax.swing.JPanel();
relationshipTypeLabel = new javax.swing.JLabel();
directionLabel = new javax.swing.JLabel();
addRelationshipsButton = new javax.swing.JButton();
removeRelationshipsButton = new javax.swing.JButton();
relationshipsScrollPane = new javax.swing.JScrollPane();
relationshipsTable = new javax.swing.JTable();
relationshipTypeComboBox = new javax.swing.JComboBox();
outcomingRelationshipsRadioButton = new javax.swing.JRadioButton();
bothRelationshipsRadioButton = new javax.swing.JRadioButton();
incomingRelationshipsRadioButton = new javax.swing.JRadioButton();
startNodePanel = new javax.swing.JPanel();
idStartNodeRadioButton = new javax.swing.JRadioButton();
indexStartNodeRadioButton = new javax.swing.JRadioButton();
indexValueStartNodeTextField = new javax.swing.JTextField();
indexKeyStartNodeTextField = new javax.swing.JTextField();
indexValueStartNodeLabel = new javax.swing.JLabel();
idStartNodeTextField = new javax.swing.JTextField();
filterPanel = new org.gephi.desktop.neo4j.ui.TraversalFilterPanel();
traversePanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(TraversalImportPanel.class, "TraversalImportPanel.traversePanel.border.title"))); // NOI18N
orderPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(TraversalImportPanel.class, "TraversalImportPanel.orderPanel.border.title"))); // NOI18N
orderButtonGroup.add(breadthFirstOrderRadioButton);
breadthFirstOrderRadioButton.setText(org.openide.util.NbBundle.getMessage(TraversalImportPanel.class, "TraversalImportPanel.breadthFirstOrderRadioButton.text")); // NOI18N
orderButtonGroup.add(depthFirstOrderRadioButton);
depthFirstOrderRadioButton.setSelected(true);
depthFirstOrderRadioButton.setText(org.openide.util.NbBundle.getMessage(TraversalImportPanel.class, "TraversalImportPanel.depthFirstOrderRadioButton.text")); // NOI18N
javax.swing.GroupLayout orderPanelLayout = new javax.swing.GroupLayout(orderPanel);
orderPanel.setLayout(orderPanelLayout);
orderPanelLayout.setHorizontalGroup(
orderPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(orderPanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(orderPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(depthFirstOrderRadioButton)
.addComponent(breadthFirstOrderRadioButton))
.addContainerGap(30, Short.MAX_VALUE))
);
orderPanelLayout.setVerticalGroup(
orderPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(orderPanelLayout.createSequentialGroup()
.addContainerGap()
.addComponent(depthFirstOrderRadioButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(breadthFirstOrderRadioButton)
.addContainerGap(33, Short.MAX_VALUE))
);
maxDepthPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(TraversalImportPanel.class, "TraversalImportPanel.maxDepthPanel.border.title"))); // NOI18N
maxDepthButtonGroup.add(concreteMaxDepthRadioButton);
concreteMaxDepthRadioButton.setText(org.openide.util.NbBundle.getMessage(TraversalImportPanel.class, "TraversalImportPanel.concreteMaxDepthRadioButton.text")); // NOI18N
maxDepthButtonGroup.add(endOfGraphMaxDepthRadioButton);
endOfGraphMaxDepthRadioButton.setSelected(true);
endOfGraphMaxDepthRadioButton.setText(org.openide.util.NbBundle.getMessage(TraversalImportPanel.class, "TraversalImportPanel.endOfGraphMaxDepthRadioButton.text")); // NOI18N
javax.swing.GroupLayout maxDepthPanelLayout = new javax.swing.GroupLayout(maxDepthPanel);
maxDepthPanel.setLayout(maxDepthPanelLayout);
maxDepthPanelLayout.setHorizontalGroup(
maxDepthPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(maxDepthPanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(maxDepthPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addGroup(maxDepthPanelLayout.createSequentialGroup()
.addComponent(concreteMaxDepthRadioButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(maxDepthSpinner))
.addComponent(endOfGraphMaxDepthRadioButton))
.addContainerGap(28, Short.MAX_VALUE))
);
maxDepthPanelLayout.setVerticalGroup(
maxDepthPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(maxDepthPanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(maxDepthPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(concreteMaxDepthRadioButton)
.addComponent(maxDepthSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(endOfGraphMaxDepthRadioButton)
.addContainerGap(30, Short.MAX_VALUE))
);
relationshipsPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(TraversalImportPanel.class, "TraversalImportPanel.relationshipsPanel.border.title"))); // NOI18N
relationshipTypeLabel.setText(org.openide.util.NbBundle.getMessage(TraversalImportPanel.class, "TraversalImportPanel.relationshipTypeLabel.text")); // NOI18N
directionLabel.setText(org.openide.util.NbBundle.getMessage(TraversalImportPanel.class, "TraversalImportPanel.directionLabel.text")); // NOI18N
addRelationshipsButton.setText(org.openide.util.NbBundle.getMessage(TraversalImportPanel.class, "TraversalImportPanel.addRelationshipsButton.text")); // NOI18N
addRelationshipsButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addRelationshipsButtonActionPerformed(evt);
}
});
removeRelationshipsButton.setText(org.openide.util.NbBundle.getMessage(TraversalImportPanel.class, "TraversalImportPanel.removeRelationshipsButton.text")); // NOI18N
removeRelationshipsButton.setEnabled(false);
removeRelationshipsButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
removeRelationshipsButtonActionPerformed(evt);
}
});
relationshipsTable.setModel(relationshipsTableModel);
relationshipsTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
relationshipsTable.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
relationshipsTableMouseClicked(evt);
}
});
relationshipsScrollPane.setViewportView(relationshipsTable);
relationshipTypeComboBox.setModel(new DefaultComboBoxModel(Neo4jUtils.relationshipTypeNames(graphDB)));
relationshipsButtonGroup.add(outcomingRelationshipsRadioButton);
outcomingRelationshipsRadioButton.setText(org.openide.util.NbBundle.getMessage(TraversalImportPanel.class, "TraversalImportPanel.outcomingRelationshipsRadioButton.text")); // NOI18N
relationshipsButtonGroup.add(bothRelationshipsRadioButton);
bothRelationshipsRadioButton.setSelected(true);
bothRelationshipsRadioButton.setText(org.openide.util.NbBundle.getMessage(TraversalImportPanel.class, "TraversalImportPanel.bothRelationshipsRadioButton.text")); // NOI18N
relationshipsButtonGroup.add(incomingRelationshipsRadioButton);
incomingRelationshipsRadioButton.setText(org.openide.util.NbBundle.getMessage(TraversalImportPanel.class, "TraversalImportPanel.incomingRelationshipsRadioButton.text")); // NOI18N
javax.swing.GroupLayout relationshipsPanelLayout = new javax.swing.GroupLayout(relationshipsPanel);
relationshipsPanel.setLayout(relationshipsPanelLayout);
relationshipsPanelLayout.setHorizontalGroup(
relationshipsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(relationshipsPanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(relationshipsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(directionLabel, javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(relationshipTypeLabel, javax.swing.GroupLayout.Alignment.TRAILING))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(relationshipsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(bothRelationshipsRadioButton)
.addComponent(outcomingRelationshipsRadioButton)
.addComponent(incomingRelationshipsRadioButton)
.addGroup(relationshipsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(relationshipTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 106, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(relationshipsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(removeRelationshipsButton, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(addRelationshipsButton, javax.swing.GroupLayout.Alignment.TRAILING))))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(relationshipsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 275, Short.MAX_VALUE)
.addContainerGap())
);
relationshipsPanelLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {addRelationshipsButton, removeRelationshipsButton});
relationshipsPanelLayout.setVerticalGroup(
relationshipsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(relationshipsPanelLayout.createSequentialGroup()
.addGroup(relationshipsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(relationshipsScrollPane, javax.swing.GroupLayout.Alignment.LEADING, 0, 0, Short.MAX_VALUE)
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, relationshipsPanelLayout.createSequentialGroup()
.addGroup(relationshipsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(relationshipsPanelLayout.createSequentialGroup()
.addGroup(relationshipsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(directionLabel)
.addComponent(incomingRelationshipsRadioButton))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(outcomingRelationshipsRadioButton)
.addGap(25, 25, 25)
.addGroup(relationshipsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(relationshipTypeLabel)
.addComponent(relationshipTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGroup(relationshipsPanelLayout.createSequentialGroup()
.addGap(46, 46, 46)
.addComponent(bothRelationshipsRadioButton)))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(addRelationshipsButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(removeRelationshipsButton)))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
startNodePanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(TraversalImportPanel.class, "TraversalImportPanel.startNodePanel.border.title"))); // NOI18N
startNodeButtonGroup.add(idStartNodeRadioButton);
idStartNodeRadioButton.setSelected(true);
idStartNodeRadioButton.setText(org.openide.util.NbBundle.getMessage(TraversalImportPanel.class, "TraversalImportPanel.idStartNodeRadioButton.text")); // NOI18N
idStartNodeRadioButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
idStartNodeRadioButtonActionPerformed(evt);
}
});
startNodeButtonGroup.add(indexStartNodeRadioButton);
indexStartNodeRadioButton.setText(org.openide.util.NbBundle.getMessage(TraversalImportPanel.class, "TraversalImportPanel.indexStartNodeRadioButton.text")); // NOI18N
indexStartNodeRadioButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
indexStartNodeRadioButtonActionPerformed(evt);
}
});
indexValueStartNodeTextField.setText(org.openide.util.NbBundle.getMessage(TraversalImportPanel.class, "TraversalPanel.index value.text")); // NOI18N
indexValueStartNodeTextField.setEnabled(false);
indexValueStartNodeTextField.setName("index value"); // NOI18N
indexKeyStartNodeTextField.setText(org.openide.util.NbBundle.getMessage(TraversalImportPanel.class, "TraversalPanel.index key.text")); // NOI18N
indexKeyStartNodeTextField.setEnabled(false);
indexKeyStartNodeTextField.setName("index key"); // NOI18N
indexValueStartNodeLabel.setText(org.openide.util.NbBundle.getMessage(TraversalImportPanel.class, "TraversalImportPanel.indexValueStartNodeLabel.text")); // NOI18N
idStartNodeTextField.setText(org.openide.util.NbBundle.getMessage(TraversalImportPanel.class, "TraversalPanel.node id.text")); // NOI18N
idStartNodeTextField.setName("node id"); // NOI18N
javax.swing.GroupLayout startNodePanelLayout = new javax.swing.GroupLayout(startNodePanel);
startNodePanel.setLayout(startNodePanelLayout);
startNodePanelLayout.setHorizontalGroup(
startNodePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(startNodePanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(startNodePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(idStartNodeRadioButton)
.addGroup(startNodePanelLayout.createSequentialGroup()
.addGap(21, 21, 21)
.addComponent(indexValueStartNodeLabel))
.addComponent(indexStartNodeRadioButton))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(startNodePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(indexValueStartNodeTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 121, Short.MAX_VALUE)
.addComponent(indexKeyStartNodeTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 121, Short.MAX_VALUE)
.addComponent(idStartNodeTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 121, Short.MAX_VALUE))
.addContainerGap())
);
startNodePanelLayout.setVerticalGroup(
startNodePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(startNodePanelLayout.createSequentialGroup()
.addGroup(startNodePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addGroup(startNodePanelLayout.createSequentialGroup()
.addGap(3, 3, 3)
.addComponent(idStartNodeTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(idStartNodeRadioButton))
.addGap(3, 3, 3)
.addGroup(startNodePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addGroup(startNodePanelLayout.createSequentialGroup()
.addGap(3, 3, 3)
.addComponent(indexKeyStartNodeTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(indexStartNodeRadioButton))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(startNodePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE, false)
.addComponent(indexValueStartNodeLabel)
.addComponent(indexValueStartNodeTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap())
);
filterPanel.setPreferredSize(new java.awt.Dimension(513, 187));
javax.swing.GroupLayout traversePanelLayout = new javax.swing.GroupLayout(traversePanel);
traversePanel.setLayout(traversePanelLayout);
traversePanelLayout.setHorizontalGroup(
traversePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(traversePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
.addComponent(relationshipsPanel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, traversePanelLayout.createSequentialGroup()
.addComponent(startNodePanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(orderPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(maxDepthPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addComponent(filterPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
);
traversePanelLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {maxDepthPanel, orderPanel});
traversePanelLayout.setVerticalGroup(
traversePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(traversePanelLayout.createSequentialGroup()
.addGroup(traversePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(maxDepthPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(orderPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(startNodePanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(relationshipsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(filterPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
);
traversePanelLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {maxDepthPanel, orderPanel, startNodePanel});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(traversePanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(traversePanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
);
}// </editor-fold>//GEN-END:initComponents
private void idStartNodeRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_idStartNodeRadioButtonActionPerformed
idStartNodeTextField.setEnabled(true);
indexKeyStartNodeTextField.setEnabled(false);
indexValueStartNodeTextField.setEnabled(false);
}//GEN-LAST:event_idStartNodeRadioButtonActionPerformed
private void indexStartNodeRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_indexStartNodeRadioButtonActionPerformed
idStartNodeTextField.setEnabled(false);
indexKeyStartNodeTextField.setEnabled(true);
indexValueStartNodeTextField.setEnabled(true);
}//GEN-LAST:event_indexStartNodeRadioButtonActionPerformed
private void addRelationshipsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addRelationshipsButtonActionPerformed
String relationshipType = (String) relationshipTypeComboBox.getSelectedItem();
String direction = null;
for (Enumeration<AbstractButton> e = relationshipsButtonGroup.getElements(); e.hasMoreElements();) {
AbstractButton button = e.nextElement();
if (button.isSelected()) {
direction = button.getText();
break;
}
}
relationshipsTableModel.addData(relationshipType, direction);
}//GEN-LAST:event_addRelationshipsButtonActionPerformed
private void removeRelationshipsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeRelationshipsButtonActionPerformed
removeRelationshipsButton.setEnabled(false);
relationshipsTable.removeRowSelectionInterval(relationshipsSelectedRow, relationshipsSelectedRow);
relationshipsTableModel.removeData(relationshipsSelectedRow);
}//GEN-LAST:event_removeRelationshipsButtonActionPerformed
private void relationshipsTableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_relationshipsTableMouseClicked
removeRelationshipsButton.setEnabled(true);
this.relationshipsSelectedRow = relationshipsTable.getSelectedRow();
}//GEN-LAST:event_relationshipsTableMouseClicked
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton addRelationshipsButton;
private javax.swing.JRadioButton bothRelationshipsRadioButton;
private javax.swing.JRadioButton breadthFirstOrderRadioButton;
private javax.swing.JRadioButton concreteMaxDepthRadioButton;
private javax.swing.JRadioButton depthFirstOrderRadioButton;
private javax.swing.JLabel directionLabel;
private javax.swing.JRadioButton endOfGraphMaxDepthRadioButton;
private javax.swing.JPanel filterPanel;
private javax.swing.JRadioButton idStartNodeRadioButton;
private javax.swing.JTextField idStartNodeTextField;
private javax.swing.JRadioButton incomingRelationshipsRadioButton;
private javax.swing.JTextField indexKeyStartNodeTextField;
private javax.swing.JRadioButton indexStartNodeRadioButton;
private javax.swing.JLabel indexValueStartNodeLabel;
private javax.swing.JTextField indexValueStartNodeTextField;
private javax.swing.ButtonGroup maxDepthButtonGroup;
private javax.swing.JPanel maxDepthPanel;
private javax.swing.JSpinner maxDepthSpinner;
private javax.swing.ButtonGroup orderButtonGroup;
private javax.swing.JPanel orderPanel;
private javax.swing.JRadioButton outcomingRelationshipsRadioButton;
private javax.swing.JComboBox relationshipTypeComboBox;
private javax.swing.JLabel relationshipTypeLabel;
private javax.swing.ButtonGroup relationshipsButtonGroup;
private javax.swing.JPanel relationshipsPanel;
private javax.swing.JScrollPane relationshipsScrollPane;
private javax.swing.JTable relationshipsTable;
private javax.swing.JButton removeRelationshipsButton;
private javax.swing.ButtonGroup startNodeButtonGroup;
private javax.swing.JPanel startNodePanel;
private javax.swing.JPanel traversePanel;
// End of variables declaration//GEN-END:variables
public int getMaxDepth() {
return endOfGraphMaxDepthRadioButton.isSelected() ? Integer.MAX_VALUE
: (Integer) maxDepthSpinner.getValue();
}
public TraversalOrder getOrder() {
return depthFirstOrderRadioButton.isSelected() ? TraversalOrder.DEPTH_FIRST
: TraversalOrder.BREADTH_FIRST;
}
public long getStartNodeId() {
if (idStartNodeRadioButton.isSelected()) {
return Integer.parseInt(idStartNodeTextField.getText().trim());
} else {
IndexService indexService = new LuceneIndexService(graphDB);
Node node = indexService.getSingleNode(indexKeyStartNodeTextField.getText().trim(),
indexValueStartNodeTextField.getText().trim());
return node.getId();
}
}
public Collection<RelationshipDescription> getRelationshipDescriptions() {
List<RelationshipDescription> relationshipDescriptions = new LinkedList<RelationshipDescription>();
for (String[] data : relationshipsTableModel.data) {
relationshipDescriptions.add(new RelationshipDescription(DynamicRelationshipType.withName(data[0]),
Direction.valueOf(data[1].toUpperCase())));
}
return relationshipDescriptions;
}
public Collection<FilterDescription> getFilterDescriptions() {
return ((TraversalFilterPanel) filterPanel).getFilterDescriptions();
}
public boolean isMatchCaseEnabled() {
return ((TraversalFilterPanel) filterPanel).isMatchCaseEnabled();
}
public boolean isRestrictModeEnabled() {
return ((TraversalFilterPanel) filterPanel).isRestrictModeEnabled();
}
public ValidationPanel createValidationPanel() {
ValidationPanel validationPanel = new ValidationPanel();
validationPanel.setInnerComponent(this);
// ValidationGroup group = validationPanel.getValidationGroup();
//Validators
// group.add(this.idStartNodeTextField, ValidationStrategy.ON_FOCUS_LOSS, new NodeIdValidator());
// group.add(this.idStartNodeTextField, ValidationStrategy.ON_CHANGE_OR_ACTION, new NodeIdValidator());
return validationPanel;
}
//TODO >>> finish validation
// private class NodeIdValidator implements Validator<String>{
// private int counter = 0;
//
// @Override
// public boolean validate(Problems problems, String string, String value) {
// System.out.println("focus lost: " + focusLost);
//// if (idStartNodeRadioButton.isSelected()) {
// if (!focusLost) {
// int nodeId;
//
// try {
// nodeId = Integer.parseInt(value);
// }
// catch (NumberFormatException nfe) {
// problems.add("not number...");
// return false;
// }
//
// try {
// graphDB.getNodeById(nodeId);
// }
// catch (NotFoundException nfe) {
// problems.add("Node with id '" + nodeId + "' doesn't exist");
// return false;
// }
// }
//
// if (focusLost) {
// counter++;
//
// if (counter == 2) {
// counter = 0;
// focusLost = false;
// }
// }
//
// return true;
// }
// }
private static class RelationshipsTableModel extends AbstractTableModel {
@SuppressWarnings("rawtypes")
private final Class[] columnTypes = {String.class, String.class};
private final String[] columnNames = {"Relationship type", "Direction"};
private final List<String[]> data;
RelationshipsTableModel() {
data = new ArrayList<String[]>();
}
public void addData(String relationshipType, String direction) {
data.add(new String[]{relationshipType, direction});
fireTableDataChanged();
}
public void removeData(int index) {
data.remove(index);
fireTableDataChanged();
}
@Override
public int getRowCount() {
return data.size();
}
@Override
public int getColumnCount() {
return columnTypes.length;
}
@Override
public String getColumnName(int columnIndex) {
return columnNames[columnIndex];
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return columnTypes[columnIndex];
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return data.get(rowIndex)[columnIndex];
}
}
}