How to get another context menu displayed in the TreeViewers title

I want users to switch column visibility in TreeViewer. I already have a context menu associated with right-clicking my TreeViewer with.

MenuManager.addMenuListener( new IMenuListener() ... );

.. but I cannot find a way to detect when the right click is in the table header, and not on the currently selected node. Down at the SWT level, everything is possible, as this snippet shows: http://dev.eclipse.org/viewcvs/viewvc.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet312.java The JFace level, however, may not reveal it as long as I see.

Your hints and other thoughts are welcome.

M.

+3
source share
2

, , ...

import org.eclipse.jface.viewers.TreeViewer;

public class HeaderClickDetector implements Listener
{
    TreeViewer viewer;
    private boolean headerClicked;

    public HeaderClickDetector( TreeViewer viewer )
    {
        this.viewer = viewer;
    }

    public void handleEvent(Event event)
    {
        Point pt = Display.getCurrent().map(null, viewer.getControl(), new Point(event.x, event.y));
        Rectangle clientArea = viewer.getTree().getClientArea();
        headerClicked = (clientArea.y <= pt.y && pt.y < (clientArea.y + viewer.getTree().getHeaderHeight()));       
    }

    public boolean isHeaderClicked()
    {
        return headerClicked;
    }

}
+1

, . , , ( , ):

import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.events.MenuDetectEvent;
import org.eclipse.swt.events.MenuDetectListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Tree;

public class TreeColumnHeaderMenuDetectListener implements MenuDetectListener {
    private Tree fTree;
    private TreeViewer fTreeViewer;

    public TreeColumnHeaderMenuDetectListener(TreeViewer treeViewer)
    {
        fTree = treeViewer.getTree();
        fTreeViewer = treeViewer;
    }

    @Override
    public void menuDetected(MenuDetectEvent event) {
        Point curLoc = Display.getCurrent().map(null, fTreeViewer.getControl(), new Point(event.x, event.y));
        Rectangle clientArea = fTree.getClientArea();

        if (clientArea.y <= curLoc.y && curLoc.y < (clientArea.y + fTree.getHeaderHeight()) &&
            clientArea.x <= curLoc.x && curLoc.x < (clientArea.x + clientArea.width)) {
            int xOffset = 0;    // Accumulates previous column widths
            for (int colIdx : fTree.getColumnOrder()) {
                int colWidth = fTree.getColumn(colIdx).getWidth();
                // Check if cursor location lies within the current column
                if (xOffset <= curLoc.x && curLoc.x < (xOffset + colWidth)) {
                    System.out.println("column header "+colIdx);    // Your code goes here
                    break;
                }
                xOffset += colWidth;
            }
        }
    }
}

,

tree.addMenuDetectListener(new TreeColumnHeaderMenuDetectListener(treeViewer))

treeViewer.

+2

All Articles