2014-02-13 47 views
2

我写了非常大的懒汉树模型,并不能给出路径编程展开如何扩展SWT/Tree和/或JFace/TreeViewer中的给定路径?

下面是整个ViewPart代码。

树以交互方式良好工作,即我可以打开所有级别高达10.但我不能以编程方式。

我写了自定义ViewElementComparer来比较元素。

package try_13_expandtreeview; 

import org.eclipse.jface.action.Action; 
import org.eclipse.jface.viewers.IElementComparer; 
import org.eclipse.jface.viewers.ITreeContentProvider; 
import org.eclipse.jface.viewers.LabelProvider; 
import org.eclipse.jface.viewers.TreePath; 
import org.eclipse.jface.viewers.TreeViewer; 
import org.eclipse.jface.viewers.Viewer; 
import org.eclipse.swt.SWT; 
import org.eclipse.swt.widgets.Composite; 
import org.eclipse.ui.ISharedImages; 
import org.eclipse.ui.PlatformUI; 
import org.eclipse.ui.part.ViewPart; 

public class View extends ViewPart { 

    public static final String ID = "Try_13_ExpandTreeView.view"; 

    private TreeViewer viewer; 

    private Action action1; 

    /** 
    * Each model element is a "triad", i.e. new Object[3] 
    * 
    * First element of a triad is a parent element 
    * 
    * Second number is a level, numbered from leafs to root 
    * 
    * Third number is numeric value (content) of an element 
    * 
    * @author dims 
    * 
    */ 
    class ViewContentProvider implements ITreeContentProvider { 
     public void inputChanged(Viewer v, Object oldInput, Object newInput) { 
     } 

     public void dispose() { 
     } 

     public Object[] getElements(Object parent) { 
      return getChildren(parent); 
     } 

     @Override 
     public Object[] getChildren(Object parent) { 
      Object[] triade = (Object[]) parent; 
      if(((int)triade[1]) > 0) { 
       Object[] children = new Object[10]; 
       Object[] child; 
       for(int i=0; i<10; ++i) { 
        child = new Object[3]; 
        child[0] = parent; 
        child[1] = ((int)triade[1])-1; 
        child[2] = i; 
        children[i] = child; 
       } 
       return children; 
      } 
      else { 
       return new Object[0]; 
      } 
     } 

     @Override 
     public Object getParent(Object element) { 
      Object[] triade = (Object[]) element; 
      return triade[0]; 
     } 

     @Override 
     public boolean hasChildren(Object element) { 
      Object[] triade = (Object[]) element; 
      return ((int)triade[1]) > 0; 
     } 
    } 

    class ViewLabelProvider extends LabelProvider { 
     @Override 
     public String getText(Object element) { 
      Object[] triade = (Object[]) element; 
      return ((Integer)triade[2]).toString(); 
     } 
    } 

    class ViewElementComparer implements IElementComparer { 

     @Override 
     public boolean equals(Object a, Object b) { 
      Object[] triade_a = (Object[]) a; 
      Object[] triade_b = (Object[]) b; 
      return ((int)triade_a[2]) == ((int)triade_b[2]); 
     } 

     @Override 
     public int hashCode(Object element) { 
      Object[] triade = (Object[]) element; 
      return ((int)triade[2]); 
     } 

    } 

    /** 
    * This is a callback that will allow us to create the viewer and initialize 
    * it. 
    */ 
    public void createPartControl(Composite parent) { 
     viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL 
       | SWT.V_SCROLL); 

     viewer.setContentProvider(new ViewContentProvider()); 
     viewer.setLabelProvider(new ViewLabelProvider()); 
     viewer.setComparer(new ViewElementComparer()); 

     viewer.setInput(new Object[] {null, 10, 0}); 

     action1 = new Action() { 
      public void run() { 


       TreePath[] treePaths = { 
         new TreePath(new Object[] { 
           new Object[] {null, 0, 2}, 
           new Object[] {null, 0, 7}, 
           new Object[] {null, 0, 4} 
         }) 
       }; 

       // viewer.setExpandedTreePaths(treePaths); // does not work 
       viewer.expandToLevel(treePaths[0], TreeViewer.ALL_LEVELS); 





       //viewer.setExpandedElements(new Object[] { viewer.getTree().getItems()[3].getData()}); 
      } 
     }; 
     action1.setText("Action 1"); 
     action1.setToolTipText("Action 1 tooltip"); 
     action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages(). 
      getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK)); 

     getViewSite().getActionBars().getToolBarManager().add(action1); 
    } 

    /** 
    * Passing the focus request to the viewer's control. 
    */ 
    public void setFocus() { 
     viewer.getControl().setFocus(); 
    } 

} 

回答

0

TreePath参数这些呼叫是刚刚从对象模型的对象(如由内容提供者提供的)的阵列。该数组从树中顶层对象开始(由内容提供者getElements调用返回的一个对象)。数组中的第二个条目是顶级元素的子项,对于每个要扩展的子项都是如此。

您显示的getTreePathFromItem代码是以树的'叶'开始的,它想要扩展并通过父项到树的顶部工作。由于树形路径需要从顶部到底部,因此建立的列表是相反的。

调用TreeViewer.setUseHashlookup(true)可帮助查看器查看这些对象。

更新:有TreePath输入internalGetWidgetToSelect操作,检查空路径之后,我们有电话:

Widget[] candidates = findItems(treePath.getLastSegment()); 

这似乎从注释中,它可能具有相同的模型对象的多个树项目 - 我不确定何时使用,但我不认为这是正常的。如果您确实有多个树项目,那么TreePath不明确,因此代码依次查看每个项目的父树路径以查找匹配项。

因此,在模型对象只有一个叶子项的正常情况下,这可能比从树的根路径开始并查找每个子树更快,因为搜索与树模型对象匹配的树项的次数更少。

+0

好吧我理解了方法的正确性,但不明白它的有效性。假设我有明确的路径,但末尾有许多相同的叶子。为什么从最后开始搜索?这将会给无数的候选人!为什么不从根到叶搜索? – Dims

+0

添加了一些关于如何阅读内部操作的更多信息 –

+0

它对我无效。库代码看起来很奇怪;就好像它浏览的不是我的树层次结构,而是视觉控件层次结构。有时'org.eclipse.jface.viewers.StructuredViewer.findItems(Object)'不起作用。 – Dims