import org.eclipse.swt.*; import org.eclipse.swt.graphics.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; /** * @author Thomas Singer */ public class VirtualOwnerDrawTree { // Static ================================================================= public static void main(String[] args) { final Display display = new Display(); final Shell shell = new Shell(display); shell.setLayout(new FillLayout()); final Tree tree = new Tree(shell, SWT.MULTI | SWT.FULL_SELECTION | SWT.VIRTUAL); final int itemCount = 5; for (int i = 0; i < itemCount; i++) { final TreeItem item1 = new TreeItem(tree, SWT.NONE); for (int j = 0; j < i; j++) { final TreeItem item2 = new TreeItem(item1, SWT.NONE); for (int k = 0; k < j; k++) { new TreeItem(item2, SWT.NONE); } } } tree.addListener(SWT.SetData, event -> { final TreeItem item = (TreeItem)event.item; final TreeItem parentItem = item.getParentItem(); final String text; if (parentItem != null) { final String parentText = (String)parentItem.getData(); text = parentText + event.index + "/"; } else { text = "/"; } item.setData(text); }); tree.addListener(SWT.MeasureItem, event -> { final TreeItem item = (TreeItem)event.item; final String text = (String)item.getData(); final Point size = event.gc.stringExtent(text); event.width = size.x; event.height = size.y; }); tree.addListener(SWT.EraseItem, event -> { event.gc.setClipping((Rectangle)null); final Rectangle clientArea = tree.getClientArea(); int colorConstant = SWT.COLOR_WHITE; if ((event.detail & SWT.SELECTED) > 0) { colorConstant = SWT.COLOR_YELLOW; } else if ((event.detail & SWT.HOT) > 0) { colorConstant = SWT.COLOR_GRAY; } event.gc.setBackground(event.display.getSystemColor(colorConstant)); event.gc.fillRectangle(clientArea.x, event.y, clientArea.width, event.height); event.detail &= ~(SWT.FOREGROUND | SWT.BACKGROUND | SWT.HOT | SWT.SELECTED); }); tree.addListener(SWT.PaintItem, event -> { final TreeItem item = (TreeItem)event.item; final String text = (String)item.getData(); final int colorConstant = (event.detail & SWT.HOT) > 0 ? SWT.COLOR_RED : SWT.COLOR_BLACK; event.gc.setForeground(event.display.getSystemColor(colorConstant)); event.gc.drawString(text, event.x, event.y, true); }); tree.setSelection(tree.getItem(0)); shell.setSize(200, 200); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } }