package studio.ui; import studio.kdb.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.*; public class WidthAdjuster extends MouseAdapter { public WidthAdjuster(JTable table) { this.table = table; table.getTableHeader().addMouseListener(this); } public void mousePressed(MouseEvent evt) { if (evt.getClickCount() > 1 && usingResizeCursor()) if ((table.getSelectedRowCount() == table.getRowCount()) && (table.getSelectedColumnCount() == table.getColumnCount())) resizeAllColumns(); else resize(getLeftColumn(evt.getPoint())); } public void mouseClicked(final MouseEvent e) { if (!usingResizeCursor()) { JTableHeader h = (JTableHeader) e.getSource(); TableColumnModel columnModel = h.getColumnModel(); int viewColumn = columnModel.getColumnIndexAtX(e.getX()); if (viewColumn >= 0) { final int column = columnModel.getColumn(viewColumn).getModelIndex(); KTableModel ktm = (KTableModel) table.getModel(); // if(Sorter.isSortable(ktm.getColumn(column))) { if (ktm.isSortedAsc()) ktm.desc(column); else if (ktm.isSortedDesc()) ktm.removeSort(); else ktm.asc(column); ktm.fireTableDataChanged(); if (h != null) h.repaint(); } } } } private JTableHeader getTableHeader() { return table.getTableHeader(); } private boolean usingResizeCursor() { Cursor cursor = getTableHeader().getCursor(); return cursor.equals(EAST) || cursor.equals(WEST); } private static final Cursor EAST = Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR); private static final Cursor WEST = Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR); //if near the boundary, will choose left column private int getLeftColumn(Point pt) { pt.x -= EPSILON; return getTableHeader().columnAtPoint(pt); } public void resizeAllColumns() { for (int i = 0;i < table.getColumnCount();i++) resize(i); } private void resize(int col) { TableColumnModel tcm = table.getColumnModel(); TableColumn tc = tcm.getColumn(col); TableCellRenderer tcr = tc.getHeaderRenderer(); if (tcr == null) tcr = table.getTableHeader().getDefaultRenderer(); int maxWidth = 0; Component comp = tcr.getTableCellRendererComponent(table,tc.getHeaderValue(),false,false,0,col); maxWidth = comp.getPreferredSize().width; int ub = table.getRowCount(); int stepSize = ub / 1000; if (stepSize == 0) stepSize = 1; for (int i = 0;i < ub;i += stepSize) { tcr = table.getCellRenderer(i,col); Object obj = table.getValueAt(i,col); comp = tcr.getTableCellRendererComponent(table,obj,false,false,i,col); maxWidth = Math.max(maxWidth,comp.getPreferredSize().width); } maxWidth += 10; //and room to grow... tc.setPreferredWidth(maxWidth); //remembers the value tc.setWidth(maxWidth); //forces layout, repaint } private JTable table; private static final int EPSILON = 5; //boundary sensitivity }