package org.chesmapper.view.gui.table;
import java.awt.Color;
import java.awt.Component;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import javax.swing.JComponent;
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.table.TableRowSorter;
import org.chesmapper.map.dataInterface.CompoundProperty;
import org.chesmapper.view.cluster.Cluster;
import org.chesmapper.view.cluster.ClusterController;
import org.chesmapper.view.cluster.Clustering;
import org.chesmapper.view.cluster.Clustering.SelectionListener;
import org.chesmapper.view.gui.ViewControler;
import org.chesmapper.view.gui.swing.ComponentFactory;
import org.mg.javalib.gui.ClickMouseOverTable;
import org.mg.javalib.gui.ClickMouseOverTable.ClickMouseOverRenderer;
import org.mg.javalib.util.StringUtil;
public class ClusterTable extends CCDataTable
{
ClusterTable(ViewControler viewControler, ClusterController clusterControler, Clustering clustering,
List<CompoundProperty> props)
{
super(viewControler, clusterControler, clustering, props);
}
@Override
protected JTable createTable()
{
table = new ClickMouseOverTable(tableModel)
{
public Component prepareRenderer(TableCellRenderer renderer, int row, int column)
{
Component c = super.prepareRenderer(renderer, row, column);
if (c instanceof JComponent)
{
JComponent jc = (JComponent) c;
jc.setToolTipText(getValueAt(row, 1).toString());
}
return c;
}
};
sorter = new TableRowSorter<DefaultTableModel>();
table.setRowSorter(sorter);
sorter.setModel(tableModel);
table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
int count = 0;
for (Cluster c : clustering.getClusters())
{
Object o[] = new Object[tableModel.getColumnCount()];
int i = 0;
o[i++] = ++count;
o[i++] = c;
o[i++] = c.getNumCompounds();
if (i != nonPropColumns)
throw new Error();
for (CompoundProperty p : props)
o[i++] = c.getSummaryStringValue(p, false);
// if (p instanceof NumericProperty)
// o[i++] = c.getDoubleValue((NumericProperty) p);
// else
// o[i++] = c.getStringValue((NominalProperty) p);
tableModel.addRow(o);
}
clustering.addSelectionListener(new SelectionListener()
{
@Override
public void clusterWatchedChanged(Cluster c)
{
if (!isVisible())
return;
updateTableFromSelection(false, clustering.getWatchedClusterIdx());
}
@Override
public void clusterActiveChanged(Cluster c)
{
if (!isVisible())
return;
updateTableFromSelection(true, clustering.getActiveClusterIdx());
}
});
viewControler.addViewListener(new PropertyChangeListener()
{
@Override
public void propertyChange(PropertyChangeEvent evt)
{
if (!isVisible())
return;
if (evt.getPropertyName().equals(ViewControler.PROPERTY_HIGHLIGHT_CHANGED))
table.repaint();
}
});
table.getClickSelectionModel().addListener(new PropertyChangeListener()
{
@Override
public void propertyChange(PropertyChangeEvent e)
{
updateClusterFromTable(table.getClickSelectionModel().getSelected(), true);
}
});
table.getSelectionModel().addListSelectionListener(new ListSelectionListener()
{
@Override
public void valueChanged(ListSelectionEvent e)
{
if (e.getValueIsAdjusting())
return;
updateClusterFromTable(table.getSelectedRow(), false);
}
});
ClickMouseOverRenderer renderer = new ClickMouseOverTable.ClickMouseOverRenderer(table)
{
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column)
{
Object val;
//Compound m = ((Compound) table.getValueAt(sorter.convertRowIndexToView(row), 1));
Cluster c = ((Cluster) table.getValueAt(row, 1));
// System.out.println(row + " " + m);
CompoundProperty p = null;
if (column >= nonPropColumns)
{
p = props.get(column - nonPropColumns);
if (addSpecificityInfo())
val = c.getFormattedValue(p) + " (" + StringUtil.formatDouble(clustering.getSpecificity(c, p))
+ ")";
else
val = c.getFormattedValue(p);
}
else
val = value;
Component comp = super.getTableCellRendererComponent(table, val, isSelected, hasFocus, row, column);
if (column >= nonPropColumns)
{
Color col = viewControler.getHighlightColor(c, p, true, false);
setForeground(col);
}
else
{
setForeground(Color.BLACK);
}
return comp;
}
};
renderer.clickSelectedBackground = ComponentFactory.LIST_ACTIVE_BACKGROUND_WHITE;
renderer.mouseOverSelectedBackground = ComponentFactory.LIST_WATCH_BACKGROUND_WHITE;
// renderer.clickSelectedBackground = ComponentFactory.LIST_ACTIVE_BACKGROUND;
// renderer.mouseOverSelectedBackground = ComponentFactory.LIST_WATCH_BACKGROUND;
// renderer.background = ComponentFactory.BACKGROUND;
// renderer.clickSelectedForeground = ComponentFactory.LIST_SELECTION_FOREGROUND;
// renderer.mouseOverSelectedForeground = ComponentFactory.LIST_SELECTION_FOREGROUND;
// renderer.foreground = ComponentFactory.FOREGROUND;
table.setDefaultRenderer(Object.class, renderer);
table.setDefaultRenderer(Integer.class, renderer);
table.setDefaultRenderer(Double.class, renderer);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.setGridColor(ComponentFactory.BACKGROUND);
updateTableFromSelection(true, clustering.getActiveClusterIdx());
updateTableFromSelection(false, clustering.getWatchedClusterIdx());
updateFeatureSelection();
return table;
}
@Override
protected boolean addSpecificityInfo()
{
return false;
}
@Override
protected String getItemName()
{
return "cluster";
}
@Override
public String getExtraColumn()
{
return "Size";
}
@Override
public boolean addAdditionalProperties()
{
return false;
}
@Override
protected String getShortName()
{
return "cluster-table";
}
private void updateClusterFromTable(int tableSelection, final boolean active)
{
if (selfUpdate)
return;
selfUpdate = true;
int row = tableSelection;
final Cluster c;
if (row != -1)
c = clustering.getCluster(sorter.convertRowIndexToModel(row));
else
c = null;
Thread th = new Thread(new Runnable()
{
public void run()
{
if (active)
{
if (c == null)
clusterControler.clearClusterActive(true, true);
else
clusterControler.setClusterActive(c, true, true);
}
else
{
if (c == null)
clusterControler.clearClusterWatched();
else
clusterControler.setClusterWatched(c);
}
selfUpdate = false;
}
});
th.start();
}
}