package net.seninp.grammarviz.view; import java.util.ArrayList; import java.util.Arrays; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.JTableHeader; import javax.swing.table.TableRowSorter; import org.jdesktop.swingx.JXTable; import org.jdesktop.swingx.JXTableHeader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import net.seninp.grammarviz.session.UserSession; import net.seninp.grammarviz.view.table.AnomalyTableModel; import net.seninp.grammarviz.view.table.CellDoubleRenderer; import net.seninp.grammarviz.view.table.GrammarvizRulesTableColumns; public class GrammarVizAnomaliesPanel extends JPanel implements ListSelectionListener { /** Fancy serial. */ private static final long serialVersionUID = -2710973845672981568L; public static final String FIRING_PROPERTY_ANOMALY = "selectedRow_anomaly"; private UserSession session; private AnomalyTableModel anomalyTableModel; private JXTable anomalyTable; private JScrollPane anomaliesPane; private ArrayList<String> selectedAnomalies; private boolean acceptListEvents; // static block - we instantiate the logger // private static final Logger LOGGER = LoggerFactory.getLogger(GrammarRulesPanel.class); /** * Constructor. */ public GrammarVizAnomaliesPanel() { super(); this.anomalyTableModel = new AnomalyTableModel(); this.anomalyTable = new JXTable() { private static final long serialVersionUID = 3L; @Override protected JTableHeader createDefaultTableHeader() { return new JXTableHeader(columnModel) { private static final long serialVersionUID = 1L; @Override public void updateUI() { super.updateUI(); // need to do in updateUI to survive toggling of LAF if (getDefaultRenderer() instanceof JLabel) { ((JLabel) getDefaultRenderer()).setHorizontalAlignment(JLabel.CENTER); } } }; } }; this.anomalyTable.setModel(anomalyTableModel); // this.anomalyTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); this.anomalyTable.getSelectionModel() .setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); this.anomalyTable.setShowGrid(false); this.anomalyTable.setDefaultRenderer(Double.class, new CellDoubleRenderer()); this.anomalyTable.getSelectionModel().addListSelectionListener(this); @SuppressWarnings("unused") org.jdesktop.swingx.renderer.DefaultTableRenderer renderer = (org.jdesktop.swingx.renderer.DefaultTableRenderer) anomalyTable .getDefaultRenderer(String.class); TableRowSorter<AnomalyTableModel> sorter = new TableRowSorter<AnomalyTableModel>( anomalyTableModel); anomalyTable.setRowSorter(sorter); // sorter.setComparator(PackedTableColumns.CLASS_NUMBER.ordinal(), // expandedRuleComparator); this.anomaliesPane = new JScrollPane(anomalyTable); } /** * create the panel with the sequitur rules table * * @return sequitur panel */ public void resetPanel() { // cleanup all the content this.removeAll(); this.add(anomaliesPane); this.validate(); this.repaint(); } /** * @return packed table model */ public AnomalyTableModel getPeriodicityTableModel() { return anomalyTableModel; } /** * @return sequitur table */ public JTable getAnomalyTable() { return anomalyTable; } @Override public void valueChanged(ListSelectionEvent arg) { if (!arg.getValueIsAdjusting() && this.acceptListEvents) { int[] rows = anomalyTable.getSelectedRows(); LOGGER.debug("Selected ROWS: " + Arrays.toString(rows)); ArrayList<String> rules = new ArrayList<String>(rows.length); for (int i = 0; i < rows.length; i++) { int ridx = rows[i]; String rule = String.valueOf( anomalyTable.getValueAt(ridx, GrammarvizRulesTableColumns.RULE_NUMBER.ordinal())); rules.add(rule); } this.firePropertyChange(FIRING_PROPERTY_ANOMALY, this.selectedAnomalies, rules); } } public void updateAnomalies() { this.acceptListEvents = false; anomalyTableModel.update(this.session.chartData.getAnomalies()); this.acceptListEvents = true; } /** * Clears the panel. */ public void clear() { this.acceptListEvents = false; this.removeAll(); this.session = null; anomalyTableModel.update(null); this.validate(); this.repaint(); this.acceptListEvents = true; } public void setChartData(UserSession session) { this.session = session; updateAnomalies(); } }