2011-03-10 35 views
3

我希望讓用戶在TreeViewer中切換列的可見性。我已經綁定到使用我的TreeViewer中的右鍵快捷菜單..如何獲取TreeViewers標題上顯示的不同上下文菜單

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

..但我找不到任何的檢測方式,當右鍵單擊在桌子上的,而比在當前選擇的節點上。在SWT級別下,這一切都是可能的,如以下片段所示:http://dev.eclipse.org/viewcvs/viewvc.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet312.java但是JFace層可能不會像我看到的那樣暴露它。

您的線索和其他冥想者居多

M.

回答

1

最後,我寫了這個類來聽下面的樹對象,並告訴我,當被點擊了列標題。 ..

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

} 
2

感謝你的例子,它幫助了很多。因爲我確實需要知道所單擊列標題,我建立在你的代碼,並來到了以下解決方案(這也適用的情況下,原始列排序是通過拖動更改):

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。