简体   繁体   English

SWT双击展开

[英]SWT double-click expansion

I have implemented a double click listener on a tree viewer and my example code snippet is below.我在树查看器上实现了一个双击侦听器,我的示例代码片段如下。

private class DoubleClickListener implements IDoubleClickListener
{
    @Override
    public void doubleClick(final DoubleClickEvent event)
    {
        final IStructuredSelection selection = (IStructuredSelection)event.getSelection();
        if (selection == null || selection.isEmpty())
            return;

        final Object sel = selection.getFirstElement();

        final ITreeContentProvider provider = (ITreeContentProvider)treeViewer.getContentProvider();

        if (!provider.hasChildren(sel))
              return;

        if (treeViewer.getExpandedState(sel))
            treeViewer.collapseToLevel(sel, AbstractTreeViewer.ALL_LEVELS);
        else
            treeViewer.expandToLevel(sel, 1);
    }
}

I have an issue now.我现在有一个问题。 I pass the tree viewer's object from different classes which needs double click functionality.我从需要双击功能的不同类传递树查看器的对象。 So instead of passing tree viewer's object from different classes is there a way I could use event.getSource() which returns the object on which the event occurred?因此,不是从不同的类传递树查看器的对象,有没有一种方法可以使用event.getSource()返回发生事件的对象? I tried implementing it but in vain.我尝试实施它但徒劳无功。 Can someone please suggest on how to proceed?有人可以建议如何进行吗? I do not want to use tree viewer's object everywhere because event.getSource() returns the respective tree viewer's object.我不想到处使用树查看器的对象,因为event.getSource()返回相应的树查看器的对象。

UPDATE更新

Yes I agree to your point but I do not want to pass tree viewer as a parameter.是的,我同意您的观点,但我不想将树查看器作为参数传递。 So I have implemented it this way:所以我是这样实现的:

public class doubleClickListener implements IDoubleClickListener
{
    public void doubleClick(DoubleClickEvent event) 
    {
        Object obj = event.getSource();
        if (obj instanceof TreeViewer) 
        {
            TreeViewer eventSrc = (TreeViewer) obj;
            ITreeSelection selec = (ITreeSelection) eventSrc.getSelection();
            if (selec != null && !selec.isEmpty() && selec instanceof IStructuredSelection) 
            {
                IStructuredSelection selection = selec;
                Object item = selection.getFirstElement();              
                if (eventSrc.getExpandedState(item)) 
                {
                    eventSrc.collapseToLevel(item, AbstractTreeViewer.ALL_LEVELS);
                } 
                else 
                {
                    eventSrc.expandToLevel(item, 1);
                }
            }
        }
    }
}

Is there an enhancement to my above code?我上面的代码有改进吗? I mean is creating an object of ITreeSelection and checking that object is an instaceof IStructuredSelection the right way to do?我的意思是创建ITreeSelection的对象并检查该对象是IStructuredSelection的实例是正确的方法吗? If not what could be the right way to check instanceof IStructuredSelection ?如果不是,检查 instanceof IStructuredSelection的正确方法是什么?

Just pass the tree viewer as a parameter to the double click constructor:只需将树查看器作为参数传递给双击构造函数:

public class DoubleClickListener implements IDoubleClickListener
{
   // The tree viewer to work with
   private final TreeViewer treeViewer;


   public DoubleClickListener(TreeViewer viewer)
   {
     treeViewer = viwer;
   }

   ... no change needed to doubleClick code
}

To use:使用:

treeViewer.addDoubleClickListener(new DoubleClickListener(treeViewer));

Update:更新:

Alternatively the DoubleClickEvent getSource() method will be the TreeViewer (as long as the the listener is installed on a tree viewer!).或者DoubleClickEvent getSource()方法将是TreeViewer (只要侦听器安装在树查看器上!)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM