Как получить другое контекстное меню, отображаемое в заголовке TreeViewers - PullRequest
3 голосов
/ 10 марта 2011

Я хочу позволить пользователям переключать видимость столбца в TreeViewer. У меня уже есть контекстное меню, связанное с правой кнопкой мыши моего TreeViewer с помощью ..

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

.. но я не могу найти способа обнаружить, когда щелчок правой кнопкой мыши находится на заголовке таблицы, а не на текущем выбранном узле. На уровне SWT это все возможно, что продемонстрировано в следующем фрагменте кода: http://dev.eclipse.org/viewcvs/viewvc.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet312.java Однако слой JFace может не раскрывать его, насколько я вижу.

Ваши подсказки и другие размышления приветствуются

М.

Ответы [ 2 ]

2 голосов
/ 19 апреля 2012

Спасибо за ваш пример, это очень помогло. Поскольку мне действительно нужно было знать, какой заголовок столбца был нажат, я основался на вашем коде и пришел к следующему решению (которое также работает в случае, если перетаскивание исходного порядка столбцов было изменено):

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.

1 голос
/ 30 марта 2011

В конце я написал этот класс для прослушивания базового объекта дерева и рассказал мне, когда щелкнули заголовки столбцов ...

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;
    }

}
...