package net.seninp.grammarviz.view;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
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.logic.GrammarVizChartData;
import net.seninp.grammarviz.view.table.GrammarvizRulesTableColumns;
import net.seninp.grammarviz.view.table.PrunedRulesTableModel;
/**
*
* handling the chart panel and sequitur rules table
*
*
*/
public class PackedRulesPanel extends JPanel
implements ListSelectionListener, PropertyChangeListener {
/** Fancy serial. */
private static final long serialVersionUID = -2710973854572981568L;
public static final String FIRING_PROPERTY_PACKED = "selectedRow_packed";
private PrunedRulesTableModel packedTableModel = new PrunedRulesTableModel();
private JXTable packedTable;
private GrammarVizChartData chartData;
private JScrollPane packedRulesPane;
// private String selectedRule;
private ArrayList<String> selectedRules;
private boolean acceptListEvents;
// static block - we instantiate the logger
//
private static final Logger LOGGER = LoggerFactory.getLogger(PackedRulesPanel.class);
// private Comparator<String> expandedRuleComparator = new Comparator<String>() {
// public int compare(String s1, String s2) {
// return s1.length() - s2.length();
// }
// };
/**
* Constructor.
*/
public PackedRulesPanel() {
super();
this.packedTableModel = new PrunedRulesTableModel();
this.packedTable = 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.packedTable.setModel(packedTableModel);
this.packedTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
this.packedTable.setShowGrid(false);
this.packedTable.getSelectionModel().addListSelectionListener(this);
@SuppressWarnings("unused")
org.jdesktop.swingx.renderer.DefaultTableRenderer renderer = (org.jdesktop.swingx.renderer.DefaultTableRenderer) packedTable
.getDefaultRenderer(String.class);
TableRowSorter<PrunedRulesTableModel> sorter = new TableRowSorter<PrunedRulesTableModel>(
packedTableModel);
packedTable.setRowSorter(sorter);
// sorter.setComparator(PackedTableColumns.CLASS_NUMBER.ordinal(),
// expandedRuleComparator);
this.packedRulesPane = new JScrollPane(packedTable);
}
/**
* Set the new data.
*
* @param chartData the new data.
*/
public void setChartData(GrammarVizChartData chartData) {
this.acceptListEvents = false;
// save the data
this.chartData = chartData;
// update
packedTableModel.update(this.chartData.getArrPackedRuleRecords());
// put new data on show
resetPanel();
this.acceptListEvents = true;
}
/**
* create the panel with the sequitur rules table
*
* @return sequitur panel
*/
public void resetPanel() {
// cleanup all the content
this.removeAll();
this.add(packedRulesPane);
this.validate();
this.repaint();
}
/**
* @return packed table model
*/
public PrunedRulesTableModel getPackedTableModel() {
return packedTableModel;
}
/**
* @return sequitur table
*/
public JTable getSequiturTable() {
return packedTable;
}
@Override
public void valueChanged(ListSelectionEvent arg) {
if (!arg.getValueIsAdjusting() && this.acceptListEvents) {
int[] rows = packedTable.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(
packedTable.getValueAt(ridx, GrammarvizRulesTableColumns.RULE_NUMBER.ordinal()));
rules.add(rule);
}
this.firePropertyChange(FIRING_PROPERTY_PACKED, this.selectedRules, rules);
this.selectedRules = rules;
}
// if (!arg.getValueIsAdjusting() && this.acceptListEvents) {
// int col = packedTable.getSelectedColumn();
// int row = packedTable.getSelectedRow();
// consoleLogger.debug("Selected ROW: " + row + " - COL: " + col);
// String rule = String.valueOf(packedTable.getValueAt(row,
// PrunedRulesTableColumns.CLASS_NUMBER.ordinal()));
// this.firePropertyChange(FIRING_PROPERTY_PACKED, this.selectedRule, rule);
// this.selectedRule = rule;
// }
}
/**
* Resets the selection and resorts the table by the Rules.
*/
public void resetSelection() {
// TODO: there is the bug. commented out.
// sequiturTable.getSelectionModel().clearSelection();
// sequiturTable.setSortOrder(0, SortOrder.ASCENDING);
}
@Override
public void propertyChange(PropertyChangeEvent arg0) {
// TODO Auto-generated method stub
}
// public void propertyChange(PropertyChangeEvent event) {
// String prop = event.getPropertyName();
//
// if (prop.equalsIgnoreCase(SequiturMessage.MAIN_CHART_CLICKED_MESSAGE)) {
// String rule = (String) event.getNewValue();
// for (int row = 0; row <= sequiturTable.getRowCount() - 1; row++) {
// for (int col = 0; col <= sequiturTable.getColumnCount() - 1; col++) {
// if (rule.equals(chartData.convert2OriginalSAXAlphabet('1',
// sequiturTable.getValueAt(row, col).toString()))) {
// sequiturTable.scrollRectToVisible(sequiturTable.getCellRect(row, 0, true));
// sequiturTable.setRowSelectionInterval(row, row);
// }
// }
// }
// }
// }
}