package studio.kdb;
import java.awt.Component;
import java.awt.Insets;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.*;
import javax.swing.event.MouseInputAdapter;
public class TableRowHeader extends JList {
private JTable table;
public void recalcWidth() {
Insets i = new RowHeaderRenderer().getInsets();
int w = i.left + i.right;
int width = SwingUtilities.computeStringWidth(table.getFontMetrics(getFont()),
(table.getRowCount() < 9999 ? "9999" : "" + (table.getRowCount() - 1)));
// used to be rowcount - 1 as 0 based index
setFixedCellWidth(w + width);
}
public TableRowHeader(final JTable table) {
// super();
this.table = table;
table.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent propertyChangeEvent) {
if ("zoom".equals(propertyChangeEvent.getPropertyName())) {
setFont(table.getFont());
setFixedCellHeight(table.getRowHeight());
recalcWidth();
setCellRenderer(new RowHeaderRenderer());
}
}
});
setAutoscrolls(false);
setCellRenderer(new RowHeaderRenderer());
setFixedCellHeight(table.getRowHeight());
setFont(table.getFont());
recalcWidth();
//setPreferredSize(new Dimension(w+width,table.getRowHeight()));
// setPreferredSize(new Dimension(width, 0));
setFocusable(false);
setModel(new TableListModel());
setOpaque(false);
setSelectionModel(table.getSelectionModel());
if (table.getRowCount() > 0) {
MouseInputAdapter mia = new MouseInputAdapter() {
int startIndex = 0;
public void mousePressed(MouseEvent e) {
int index = locationToIndex(e.getPoint());
startIndex = index;
table.setColumnSelectionInterval(0,table.getColumnCount() - 1);
table.setRowSelectionInterval(index,index);
table.requestFocus();
}
public void mouseReleased(MouseEvent e) {
int index = locationToIndex(e.getPoint());
table.setColumnSelectionInterval(0,table.getColumnCount() - 1);
table.setRowSelectionInterval(startIndex,index);
table.requestFocus();
}
public void mouseDragged(MouseEvent e) {
int index = locationToIndex(e.getPoint());
table.setColumnSelectionInterval(0,table.getColumnCount() - 1);
table.setRowSelectionInterval(startIndex,index);
table.requestFocus();
}
/*
public void mouseMoved(MouseEvent e)
{
System.out.println("moved");
int index= locationToIndex(e.getPoint());
table.setColumnSelectionInterval(0,table.getColumnCount()-1);
table.setRowSelectionInterval(startIndex, index);
table.requestFocus();
}
**/
};
addMouseListener(mia);
addMouseMotionListener(mia);
}
}
/*
public void updateUI()
{
super.updateUI();
setCellRenderer(new RowHeaderRenderer());
// setHeight(getFontMetrics(UIManager.getFont("TableHeader.font")).getHeight());
if(table != null)
setFixedCellHeight( table.getRowHeight());
}
**/
class TableListModel extends AbstractListModel {
public int getSize() {
return table.getRowCount();
}
public Object getElementAt(int index) {
return String.valueOf(index);
}
}
class RowHeaderRenderer extends JLabel implements ListCellRenderer {
RowHeaderRenderer() {
super();
setHorizontalAlignment(RIGHT);
setVerticalAlignment(CENTER);
setOpaque(true);
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
//setFont(UIManager.getFont("Table.font"));
setFont(table.getFont());
setBackground(UIManager.getColor("TableHeader.background"));
setForeground(UIManager.getColor("TableHeader.foreground"));
}
public Component getListCellRendererComponent(JList list,Object value,int index,boolean isSelected,boolean cellHasFocus) {
setText((value == null) ? "" : value.toString());
return this;
}
/* public void updateUI()
{
super.updateUI();
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
setFont(UIManager.getFont("Table.font"));
setBackground(UIManager.getColor("TableHeader.background"));
setForeground(UIManager.getColor("TableHeader.foreground"));
//setHeight(getFontMetrics(getFont()).getHeight());
}
**/
}
}