Search code examples
javaswtjfacetreeviewer

Jface TreeViewer add right click menu, depending on clicked node


There is a good thread on how to correctly hook up a right-click menu to a Jface TreeViewer depending on the selected item.

I would like to show the right click menu depending on: if the right-click was on a node or into "empty space". The problem is that TreeViewer does not automatically clear the selection if you click into empty space. Is there any clean way how to achieve this?

My current approach would be to simply hook up a MouseListener to the tree with the following mouseDown method:

@Override
public void mouseDown(MouseEvent e) {
    TreeItem item = treeViewer.getTree().getItem(new Point(e.x, e.y));
    if (item == null) {
        treeViewer.getTree().deselectAll();
    }
}

This seems to work quite well. What do you think of this?


Solution

  • Ok, I found a dirty workaround. So if you really want to do it, here is a possible solution:

    final Tree tree = viewer.getTree();
    
    final Menu menu = new Menu(tree);
    tree.setMenu(menu);
    menu.addMenuListener(new MenuAdapter()
    {
        @Override
        public void menuShown(MenuEvent e)
        {
            Point point = tree.toControl(Display.getDefault().getCursorLocation());
            boolean found = false;
            for (TreeItem item : tree.getItems())
            {
                for (int i = 0; i < tree.getColumnCount(); i++)
                    if (item.getBounds(i).contains(point))
                        found = true;
            }
    
            System.out.println(found);
        }
    });