/* 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.LinkedList; import java.util.List; import javax.swing.DefaultComboBoxModel; import javax.swing.table.AbstractTableModel; import org.gephi.neo4j.plugin.api.FilterDescription; import org.gephi.neo4j.plugin.api.FilterOperator; import org.netbeans.validation.api.ui.ValidationPanel; /** * * @author Martin Škurla */ public class TraversalFilterPanel extends javax.swing.JPanel { private final FilterTableModel filterTableModel; private int filterSelectedRow; public TraversalFilterPanel() { filterTableModel = new FilterTableModel(); initComponents(); } @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { filterScrollPane = new javax.swing.JScrollPane(); filterTable = new javax.swing.JTable(); propertyKeyLabel = new javax.swing.JLabel(); propertyKeyFilterTextField = new javax.swing.JTextField(); propertyValueLabel = new javax.swing.JLabel(); propertyValueFilterTextField = new javax.swing.JTextField(); operatorLabel = new javax.swing.JLabel(); operatorComboBox = new javax.swing.JComboBox(); addFilterButton = new javax.swing.JButton(); removeFilterButton = new javax.swing.JButton(); restrictModeCheckBox = new javax.swing.JCheckBox(); matchCaseCheckBox = new javax.swing.JCheckBox(); setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(TraversalFilterPanel.class, "TraversalFilterPanel.border.title"))); // NOI18N setPreferredSize(new java.awt.Dimension(513, 187)); filterTable.setModel(filterTableModel); filterTable.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { filterTableMouseClicked(evt); } }); filterScrollPane.setViewportView(filterTable); propertyKeyLabel.setText(org.openide.util.NbBundle.getMessage(TraversalFilterPanel.class, "TraversalFilterPanel.propertyKeyLabel.text")); // NOI18N propertyKeyFilterTextField.setText(org.openide.util.NbBundle.getMessage(TraversalFilterPanel.class, "TraversalFilterPanel.propertyKeyFilterTextField.text")); // NOI18N propertyValueLabel.setText(org.openide.util.NbBundle.getMessage(TraversalFilterPanel.class, "TraversalFilterPanel.propertyValueLabel.text")); // NOI18N propertyValueFilterTextField.setText(org.openide.util.NbBundle.getMessage(TraversalFilterPanel.class, "TraversalFilterPanel.propertyValueFilterTextField.text")); // NOI18N operatorLabel.setText(org.openide.util.NbBundle.getMessage(TraversalFilterPanel.class, "TraversalFilterPanel.operatorLabel.text")); // NOI18N operatorComboBox.setModel(new DefaultComboBoxModel(FilterOperator.getTextRepresentations())); addFilterButton.setText(org.openide.util.NbBundle.getMessage(TraversalFilterPanel.class, "TraversalFilterPanel.addFilterButton.text")); // NOI18N addFilterButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { addFilterButtonActionPerformed(evt); } }); removeFilterButton.setText(org.openide.util.NbBundle.getMessage(TraversalFilterPanel.class, "TraversalFilterPanel.removeFilterButton.text")); // NOI18N removeFilterButton.setEnabled(false); removeFilterButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { removeFilterButtonActionPerformed(evt); } }); restrictModeCheckBox.setText(org.openide.util.NbBundle.getMessage(TraversalFilterPanel.class, "TraversalFilterPanel.restrictModeCheckBox.text")); // NOI18N matchCaseCheckBox.setText(org.openide.util.NbBundle.getMessage(TraversalFilterPanel.class, "TraversalFilterPanel.matchCaseCheckBox.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() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(propertyKeyLabel) .addComponent(operatorLabel) .addComponent(propertyValueLabel)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(addFilterButton) .addComponent(propertyKeyFilterTextField, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 118, Short.MAX_VALUE) .addComponent(propertyValueFilterTextField, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 118, Short.MAX_VALUE) .addComponent(operatorComboBox, javax.swing.GroupLayout.Alignment.LEADING, 0, 118, Short.MAX_VALUE))) .addComponent(removeFilterButton)) .addGap(10, 10, 10) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addComponent(filterScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 274, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(layout.createSequentialGroup() .addComponent(restrictModeCheckBox) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(matchCaseCheckBox))) .addContainerGap()) ); layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {addFilterButton, removeFilterButton}); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addComponent(filterScrollPane, javax.swing.GroupLayout.Alignment.LEADING, 0, 0, Short.MAX_VALUE) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(propertyKeyLabel) .addComponent(propertyKeyFilterTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(6, 6, 6) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(propertyValueLabel) .addComponent(propertyValueFilterTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(operatorLabel) .addComponent(operatorComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(addFilterButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(removeFilterButton))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(matchCaseCheckBox) .addComponent(restrictModeCheckBox))) ); }// </editor-fold>//GEN-END:initComponents private void addFilterButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addFilterButtonActionPerformed filterTableModel.addData(propertyKeyFilterTextField.getText().trim(), (String) operatorComboBox.getSelectedItem(), propertyValueFilterTextField.getText().trim()); }//GEN-LAST:event_addFilterButtonActionPerformed private void removeFilterButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeFilterButtonActionPerformed removeFilterButton.setEnabled(false); filterTable.removeRowSelectionInterval(filterSelectedRow, filterSelectedRow); filterTableModel.removeData(filterSelectedRow); }//GEN-LAST:event_removeFilterButtonActionPerformed private void filterTableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_filterTableMouseClicked removeFilterButton.setEnabled(true); this.filterSelectedRow = filterTable.getSelectedRow(); }//GEN-LAST:event_filterTableMouseClicked // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton addFilterButton; private javax.swing.JScrollPane filterScrollPane; private javax.swing.JTable filterTable; private javax.swing.JCheckBox matchCaseCheckBox; private javax.swing.JComboBox operatorComboBox; private javax.swing.JLabel operatorLabel; private javax.swing.JTextField propertyKeyFilterTextField; private javax.swing.JLabel propertyKeyLabel; private javax.swing.JTextField propertyValueFilterTextField; private javax.swing.JLabel propertyValueLabel; private javax.swing.JButton removeFilterButton; private javax.swing.JCheckBox restrictModeCheckBox; // End of variables declaration//GEN-END:variables public Collection<FilterDescription> getFilterDescriptions() { List<FilterDescription> filterDescriptions = new LinkedList<FilterDescription>(); for (String[] data : filterTableModel.data) { filterDescriptions.add(new FilterDescription(data[0], FilterOperator.fromTextRepresentation(data[1]), data[2])); } return filterDescriptions; } public boolean isMatchCaseEnabled() { return matchCaseCheckBox.isSelected(); } public boolean isRestrictModeEnabled() { return restrictModeCheckBox.isSelected(); } public ValidationPanel createValidationPanel() { ValidationPanel validationPanel = new ValidationPanel(); validationPanel.setInnerComponent(this); return validationPanel; } private static class FilterTableModel extends AbstractTableModel { @SuppressWarnings("rawtypes") private final Class[] columnTypes = {String.class, String.class, String.class}; private final String[] columnNames = {"Property key", "Operator", "Property value"}; private final List<String[]> data; FilterTableModel() { data = new ArrayList<String[]>(); } public void addData(String key, String operator, String value) { data.add(new String[]{key, operator, value}); 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]; } } }