package org.limewire.ui.swing.table;
import java.util.Vector;
import javax.swing.ListSelectionModel;
import javax.swing.SizeSequence;
import javax.swing.event.TableModelEvent;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;
import org.jdesktop.swingx.decorator.FilterPipeline;
import org.jdesktop.swingx.decorator.SelectionMapper;
import org.jdesktop.swingx.decorator.SizeSequenceMapper;
import org.jdesktop.swingx.decorator.SortController;
/**
* A JXTable for use with glazed lists event models. See
* http://sites.google.com/site/glazedlists/documentation/swingx for issues with
* SwingX.
*/
public class GlazedJXTable extends BasicJXTable {
private SizeSequenceMapper simpleRowModelMapper;
private SelectionMapper simpleSelectionMapper;
private SortController sortController;
/** A hack required for pretending that there's no row heights while calling tableChanged. */
private boolean inTableChangeRowHeightHack;
public GlazedJXTable() {
super();
initialize();
}
public GlazedJXTable(int numRows, int numColumns) {
super(numRows, numColumns);
initialize();
}
public GlazedJXTable(Object[][] rowData, Object[] columnNames) {
super(rowData, columnNames);
initialize();
}
public GlazedJXTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm) {
super(dm, cm, sm);
initialize();
}
public GlazedJXTable(TableModel dm, TableColumnModel cm) {
super(dm, cm);
initialize();
}
public GlazedJXTable(TableModel dm) {
super(dm);
initialize();
}
public GlazedJXTable(Vector rowData, Vector columnNames) {
super(rowData, columnNames);
initialize();
}
private void initialize() {
// Add initialization steps here.
}
// overriden to return false while doing a tableChanged event,
// so that we don't null out the parent's SizeSequence,
// this is designed to allow JTable to properly control its SizeSequence
// instead of requiring a mapper between model/view, where
// we have no model distinction.
@Override
public boolean isRowHeightEnabled() {
if(inTableChangeRowHeightHack) {
return false;
} else {
return super.isRowHeightEnabled();
}
}
// overriden to to turn off isRowHeightEnabled while doing a tableChanged,
// so that we don't null out the parent's SizeSequence,
// this is designed to allow JTable to properly control its SizeSequence
// instead of requiring a mapper between model/view, where
// we have no model distinction.
@Override
public void tableChanged(TableModelEvent e) {
inTableChangeRowHeightHack = true;
try {
super.tableChanged(e);
} finally {
inTableChangeRowHeightHack = false;
}
}
@Override
protected SizeSequenceMapper getRowModelMapper() {
if(simpleRowModelMapper == null) {
simpleRowModelMapper = new SimpleSizeSequenceMapper();
}
return simpleRowModelMapper;
}
@Override
public SelectionMapper getSelectionMapper() {
if(simpleSelectionMapper == null) {
simpleSelectionMapper = new SimpleSelectionMapper();
}
return simpleSelectionMapper;
}
@Override
protected boolean shouldSortOnChange(TableModelEvent e) {
return false;
}
@Override
public void setFilters(FilterPipeline pipeline) {
if(pipeline != null) {
throw new UnsupportedOperationException("do not use filters.");
}
}
@Override
public FilterPipeline getFilters() {
return null;
}
@Override
public SortController getSortController() {
return sortController;
}
public void setSortController(SortController sortController) {
this.sortController = sortController;
}
/** Stub out all size sequence mapping. */
private static class SimpleSizeSequenceMapper extends SizeSequenceMapper {
@Override public void setViewSizeSequence(SizeSequence selection, int height) {}
@Override public SizeSequence getViewSizeSequence() { return null; }
@Override public void setFilters(FilterPipeline pipeline) {}
@Override public void clearModelSizes() {}
@Override public void insertIndexInterval(int start, int length, int value) {}
@Override public void removeIndexInterval(int start, int length) {}
@Override public void restoreSelection() {}
@Override protected void updateFromPipelineChanged() {}
}
/** Don't do any selection mapping. */
private static class SimpleSelectionMapper implements SelectionMapper {
@Override public ListSelectionModel getViewSelectionModel() { return null; }
@Override public boolean isEnabled() { return false; }
@Override public void setViewSelectionModel(ListSelectionModel viewSelectionModel) {}
@Override public void setFilters(FilterPipeline pipeline) {}
@Override public void setEnabled(boolean enabled) {}
@Override public void clearModelSelection() {}
@Override public void insertIndexInterval(int start, int length, boolean before) {}
@Override public void removeIndexInterval(int start, int end) {}
}
}