/* * ParametersEditor.java * * Created on 1. Juli 2009, 09:00 */ package net.sf.jailer.ui; import java.awt.Color; import java.awt.Component; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.text.JTextComponent; import net.sf.jailer.datamodel.ParameterHandler; /** * Parameter selector. * * @author Ralf Wisser */ public class ParameterSelector extends javax.swing.JPanel { public static interface ParametersGetter { Set<String> getParameters(); } /** * Gets current parameters. */ private final ParametersGetter parametersGetter; /** * Parameters list. */ private List<String> parameters; /** Creates new form ParametersEditor */ public ParameterSelector(final Component parent, final JTextComponent textArea, ParametersGetter parametersGetter) { this.parametersGetter = parametersGetter; parameters = new ArrayList<String>(); initComponents(); final TableCellRenderer defaultTableCellRenderer = paramTable.getDefaultRenderer(String.class); paramTable.setShowGrid(false); paramTable.setDefaultRenderer(Object.class, new TableCellRenderer() { public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component render = defaultTableCellRenderer .getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); if (render instanceof JLabel && !isSelected) { final Color BG1 = new Color(255, 255, 255); final Color BG2 = new Color(230, 255, 255); ((JLabel) render) .setBackground((row % 2 == 0) ? BG1 : BG2); } return render; } }); paramTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); paramTable.getSelectionModel().addListSelectionListener( new ListSelectionListener() { int lastRow = -2; @Override public void valueChanged(ListSelectionEvent evt) { int row = paramTable.getSelectedRow(); if (lastRow == row) { return; } lastRow = row; if (row == 0) { String newParameter = JOptionPane.showInputDialog(parent, "Parameter", "New Parameter", JOptionPane.QUESTION_MESSAGE); if (newParameter != null) { newParameter = newParameter.trim(); String np = ""; for (int i = 0; i < newParameter.length(); ++i) { char c = newParameter.charAt(i); if (ParameterHandler.VALID_CHARS.indexOf(c) >= 0) { np = np + c; } } newParameter = np; if (newParameter.length() > 0) { if (!parameters.contains(newParameter)) { parameters.add(newParameter); } textArea.replaceSelection("${" + newParameter + "}"); textArea.grabFocus(); refresh(); } } } else if (row > 0) { textArea.replaceSelection("${" + parameters.get(row - 1) + "}"); textArea.grabFocus(); } paramTable.getSelectionModel().clearSelection(); } }); updateParameters(); refresh(); } /** * Reads current parameters and updates internal parameter list. */ public void updateParameters() { parameters.clear(); parameters.addAll(parametersGetter.getParameters()); refresh(); } /** * Refreshes table. */ private void refresh() { Collections.sort(parameters); Object[][] data = new Object[parameters.size() + 1][]; int i = 0; data[i++] = new Object[] { "<new parameter>" }; for (String s: parameters) { data[i++] = new Object[] { s }; } paramTable.setModel(new DefaultTableModel(data, new Object[] { "Parameter" }) { @Override public boolean isCellEditable(int row, int column) { return false; } private static final long serialVersionUID = 2703862797772451362L; }); } /** 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. */ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; jPanel1 = new javax.swing.JPanel(); jScrollPane2 = new javax.swing.JScrollPane(); paramTable = new javax.swing.JTable(); setLayout(new java.awt.GridLayout(1, 1)); jPanel1.setBorder(null); jPanel1.setLayout(new java.awt.GridBagLayout()); paramTable.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { {null, null, null, null}, {null, null, null, null}, {null, null, null, null}, {null, null, null, null} }, new String [] { "Title 1", "Title 2", "Title 3", "Title 4" } )); jScrollPane2.setViewportView(paramTable); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; jPanel1.add(jScrollPane2, gridBagConstraints); add(jPanel1); }// </editor-fold>//GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables javax.swing.JPanel jPanel1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JTable paramTable; // End of variables declaration//GEN-END:variables private static final long serialVersionUID = 5153763345779925099L; }