package net.seninp.grammarviz.view;
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.CellDoubleRenderer;
import net.seninp.grammarviz.view.table.PeriodicityTableModel;
import net.seninp.grammarviz.view.table.PrunedRulesTableColumns;
/**
*
* handling the chart panel and sequitur rules table
*
*
*/
public class RulesPeriodicityPanel extends JPanel implements ListSelectionListener {
/** Fancy serial. */
private static final long serialVersionUID = -2710973854572981568L;
public static final String FIRING_PROPERTY_PERIOD = "selectedRow_periodicity";
private PeriodicityTableModel periodicityTableModel = new PeriodicityTableModel();
private JXTable periodicityTable;
private UserSession session;
private JScrollPane periodicityRulesPane;
private String selectedRule;
private boolean acceptListEvents;
// static block - we instantiate the logger
//
private static final Logger LOGGER = LoggerFactory.getLogger(RulesPeriodicityPanel.class);
/**
* Constructor.
*/
public RulesPeriodicityPanel() {
super();
this.periodicityTableModel = new PeriodicityTableModel();
this.periodicityTable = new JXTable() {
private static final long serialVersionUID = 2L;
@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.periodicityTable.setModel(periodicityTableModel);
this.periodicityTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
this.periodicityTable.setShowGrid(false);
this.periodicityTable.setDefaultRenderer(Double.class, new CellDoubleRenderer());
this.periodicityTable.getSelectionModel().addListSelectionListener(this);
@SuppressWarnings("unused")
org.jdesktop.swingx.renderer.DefaultTableRenderer renderer = (org.jdesktop.swingx.renderer.DefaultTableRenderer) periodicityTable
.getDefaultRenderer(String.class);
TableRowSorter<PeriodicityTableModel> sorter = new TableRowSorter<PeriodicityTableModel>(
periodicityTableModel);
periodicityTable.setRowSorter(sorter);
// sorter.setComparator(PackedTableColumns.CLASS_NUMBER.ordinal(),
// expandedRuleComparator);
this.periodicityRulesPane = new JScrollPane(periodicityTable);
}
/**
* create the panel with the sequitur rules table
*
* @return sequitur panel
*/
public void resetPanel() {
// cleanup all the content
this.removeAll();
this.add(periodicityRulesPane);
this.acceptListEvents = false;
periodicityTableModel.update(this.session.chartData.getGrammarRules());
this.acceptListEvents = true;
this.validate();
this.repaint();
}
/**
* @return packed table model
*/
public PeriodicityTableModel getPeriodicityTableModel() {
return periodicityTableModel;
}
/**
* @return sequitur table
*/
public JTable getPeriodicityTable() {
return periodicityTable;
}
@Override
public void valueChanged(ListSelectionEvent arg) {
if (!arg.getValueIsAdjusting() && this.acceptListEvents) {
int col = periodicityTable.getSelectedColumn();
int row = periodicityTable.getSelectedRow();
String rule = String.valueOf(
periodicityTable.getValueAt(row, PrunedRulesTableColumns.CLASS_NUMBER.ordinal()));
LOGGER.debug("Selected ROW: " + row + " - COL: " + col + "; rule: " + rule);
this.firePropertyChange(FIRING_PROPERTY_PERIOD, this.selectedRule, rule);
this.selectedRule = rule;
}
}
/**
* Clears the panel.
*/
public void clear() {
this.acceptListEvents = false;
this.removeAll();
this.session = null;
periodicityTableModel.update(null);
this.validate();
this.repaint();
this.acceptListEvents = true;
}
public void setChartData(UserSession session) {
this.session = session;
resetPanel();
}
}