package com.redhat.ceylon.eclipse.code.outline; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseMoveListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Item; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; public final class TreeViewMouseListener implements MouseMoveListener { private final Tree tree; private final TreeViewer treeViewer; private TreeItem fLastItem = null; public TreeViewMouseListener(TreeViewer treeViewer) { this.treeViewer = treeViewer; this.tree = treeViewer.getTree(); } public void mouseMove(MouseEvent e) { if (tree.equals(e.getSource())) { Object o = tree.getItem(new Point(e.x, e.y)); if (fLastItem == null ^ o == null) { tree.setCursor(o == null ? null : tree.getDisplay().getSystemCursor(SWT.CURSOR_HAND)); } if (o instanceof TreeItem) { Rectangle clientArea = tree.getClientArea(); if (!o.equals(fLastItem)) { fLastItem = (TreeItem)o; tree.setSelection(new TreeItem[] { fLastItem }); } else if (e.y - clientArea.y < tree.getItemHeight() / 4) { // Scroll up Point p = tree.toDisplay(e.x, e.y); Item item = treeViewer.scrollUp(p.x, p.y); if (item instanceof TreeItem) { fLastItem = (TreeItem)item; tree.setSelection(new TreeItem[] { fLastItem }); } } else if (clientArea.y + clientArea.height - e.y < tree.getItemHeight() / 4) { // Scroll down Point p = tree.toDisplay(e.x, e.y); Item item = treeViewer.scrollDown(p.x, p.y); if (item instanceof TreeItem) { fLastItem = (TreeItem)item; tree.setSelection(new TreeItem[] { fLastItem }); } } } else if (o == null) { fLastItem = null; } } } }