import org.eclipse.swt.*; import org.eclipse.swt.events.*; import org.eclipse.swt.graphics.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; /** * @author Thomas Singer */ public class VirtualOwnerDrawnTable { // Static ================================================================= public static void main(String[] args) { System.getProperties().put("org.eclipse.swt.display.useSystemTheme", "true"); final Display display = new Display(); final Color background = display.getSystemColor(SWT.COLOR_LIST_SELECTION); final Color foreground = display.getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT); System.out.println("background = " + background); System.out.println("foreground = " + foreground); final Shell shell = new Shell(display); shell.setLayout(new FillLayout(SWT.VERTICAL)); final Table table = new Table(shell, SWT.VIRTUAL | SWT.BORDER | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL); table.setHeaderVisible(true); final Listener listener = new Listener() { @Override public void handleEvent(Event event) { final TableItem item = (TableItem)event.item; if (event.type == SWT.EraseItem) { if ((event.detail & SWT.SELECTED) > 0) { event.gc.setBackground(background); event.gc.fillRectangle(event.x, event.y, event.width, event.height); } event.detail = 0; } else if (event.type == SWT.PaintItem) { if ((event.detail & SWT.SELECTED) > 0) { event.gc.setForeground(foreground); } event.gc.drawText((String)item.getData(), event.x, event.y, true); } else if (event.type == SWT.MeasureItem) { final String text = (String)item.getData(); final Point point = event.gc.textExtent(text); event.height = point.y * 2; event.width = Math.max(event.width, point.x); } else if (event.type == SWT.SetData) { final int index = table.indexOf(item); final String data = "Item " + index; item.setText(2, data); item.setData(data); } } }; table.addListener(SWT.EraseItem, listener); table.addListener(SWT.SetData, listener); table.addListener(SWT.MeasureItem, listener); table.addListener(SWT.PaintItem, listener); createColumn(SWT.LEFT, "OD Left", table); createColumn(SWT.RIGHT, "OD Right", table); createColumn(SWT.LEFT, "Primitive", table); table.setItemCount(100); table.setTopIndex(50000); shell.setSize(400, 500); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } private static void createColumn(int style, String text, Table table) { final TableColumn tableColumn = new TableColumn(table, style); tableColumn.setText(text); tableColumn.setMoveable(true); tableColumn.setWidth(100); } }