使用SWT重命名treeViewer节点 [英] Rename a treeViewer Node with SWT

查看:205
本文介绍了使用SWT重命名treeViewer节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个treeViewer,我必须在其上实现重命名的编辑,应该可以通过两种方式调用:


  1. by F2

  2. 如果选择了一个节点,单击鼠标。




    为此,我使用了 ICellModifier ,但没有给出预期的结果。 / p>


通过以下代码,我已经实现了点数2,尽管它创建了一个双重打开编辑器的问题如果选择了节点,请单击。主要关注的是允许重新命名的 F2 密钥尚待处理。我必须使用与在以下的keyListener中编写的相同的代码,但它不起作用...我真的不认为这个以下代码是一个优化的解决方案,但它是有效的。对于第二个选项,是否有解决方案允许 F2 键重命名,以及如何优化以下代码?

 $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 



最终TreeItem项=(TreeItem) event.item;
if(item!= null&& item == lastItem [0])
{
boolean showBorder = true;
//它不会允许重命名root
if(item.getParentItem()== null)
return;
final Composite composite = new Composite(tree,SWT.NONE);
if(showBorder)
composite.setBackground(black);
final text text = new Text(composite,SWT.NONE);
final int inset = showBorder?1:0;
composite.addListener (SWT.Resize,新Listener()
{
public void handleEvent(Event e)
{
Rectangle rect = composite.getClientArea();
text.setBounds(rect.x + inset,rect.y + inset,
rect.width - inset * 2,rect.height - inset * 2);
}
});
textListener = new Listener()
{
boolean focusOutOnce = false;
public void handleEvent(final Event e)
{
String newText;
模型数据=(模型)item.getData();
boolean caseType = false;
//如果nodeType是case
if(data.getNodeType()== Model.TestType.CASE)
caseType = true;

String oldText = item.getText();
switch(e.type)
{
case SWT.FocusOut:
//验证重命名的文本,并更新
//模型以获取转储到文件。
newText = text.getText();
if(Utils.length(newText)!= 0)
newText = newText.trim();

if(!focusOutOnce&& newText.equals(oldText))
{
item.setText(newText);
composite.dispose();
break;
}

if(!focusOutOnce&&
(Model.containsAction(newText)|| Model.containsCase(newText)))
{
composite.dispose();
break;
}

if(!focusOutOnce)
{
//动作编辑名称
}
else if(!focusOutOnce)
{

}

composite.dispose();
break;
case SWT.Verify:
newText = text.getText();
String leftText = newText.substring(0,e.start);
String rightText =
newText.substring(e.end,
newText.length());
GC gc = new GC(text);
点大小=
gc.textExtent(leftText + e.text
+ rightText);
gc.dispose();
size = text.computeSize(size.x,SWT.DEFAULT);
editor.horizo​​ntalAlignment = SWT.LEFT;
Rectangle itemRect = item.getBounds(),
rect = tree.getClientArea();
editor.minimumWidth =
Math.max(size.x,itemRect.width)
+ inset * 2;
int left = itemRect.x,
right = rect.x + rect.width;
editor.minimumWidth =
Math.min(editor.minimumWidth,right
- left);
editor.minimumHeight = size.y + inset * 2;
editor.layout();
break;
case SWT.Traverse:
switch(e.detail)
{
case SWT.TRAVERSE_RETURN:
composite.dispose();
break;
case SWT.TRAVERSE_ESCAPE:
composite.dispose();
e.doit = false;
}
break;
}
}
};

text.addListener(SWT.Verify,textListener);
text.addListener(SWT.Traverse,textListener);
text.addListener(SWT.FocusOut,textListener);
editor.setEditor(composite,item);
text.setText(item.getText());
text.selectAll();
text.setFocus();
}
lastItem [0] = item;
}
});


解决方案

你真的在使用jface的TreeViewer吗?您的代码片断显示您正在使用简单的SWT Tree小部件。因此,您的大部分代码都是样板代码。
如果你真的使用TreeViewer,那么看看jface的EditingSupport是非常方便和灵活的,可以实现你手动解决的问题。





http://git.eclipse .ORG / C /平台/ eclipse.platform.ui.git /树/例子/ org.eclipse.jface.snippets / Eclipse的%20JFace%20Snippets /组织/日蚀/ JFace的/段/观众/ Snippet026TreeViewerTabEditing.java


I have a treeViewer on which I have to implement editing for renaming that should be able to be invoked in two ways:

  1. by the F2 key
  2. by a single mouse click if a node is selected.

    More ever as Windows allows folder rename. For this, I have used ICellModifier, but it has not given the expected result.

By the following code, I have achieved point number 2 though it is creating a problem for opening the editor on a double click if a node is selected. The main concern is to allow the F2 key for renaming which is still pending. I have to use the same code that I have written in the following in a keyListener, but it does't work... I really don't think this following code is an optimized solution, but it works. For the second option, is there a solution to allow the F2 key for renaming and how can the following code be optimized?

tree.addListener(SWT.Selection, new Listener()
    {
        public void handleEvent(Event event)
        {
            final TreeItem item = (TreeItem)event.item;
            if (item != null && item == lastItem[0])
            {
                boolean showBorder = true;
                //it will not allow to rename root
                if (item.getParentItem() == null)
                    return;
                final Composite composite = new Composite(tree, SWT.NONE);
                if (showBorder)
                    composite.setBackground(black);
                final Text text = new Text(composite, SWT.NONE);
                final int inset = showBorder ? 1 : 0;
                composite.addListener(SWT.Resize, new Listener()
                {
                    public void handleEvent(Event e)
                    {
                        Rectangle rect = composite.getClientArea();
                        text.setBounds(rect.x + inset, rect.y + inset,
                            rect.width - inset * 2, rect.height - inset * 2);
                    }
                });
                textListener = new Listener()
                {
                    boolean focusOutOnce  = false;
                    public void handleEvent(final Event e)
                    {
                        String newText ;
                        Model data = (Model)item.getData();
                        boolean caseType = false;
                        //if nodeType is case
                        if(data.getNodeType() == Model.TestType.CASE)
                            caseType = true;

                        String oldText = item.getText();
                        switch (e.type)
                        {
                            case SWT.FocusOut:
                                //validate the renamed text and update
                                //model to get dump in to file.
                                newText = text.getText();
                                if(Utils.length(newText) != 0)
                                    newText = newText.trim();

                                if(!focusOutOnce && newText.equals(oldText))
                                {
                                    item.setText(newText);
                                    composite.dispose();
                                    break;
                                }

                                if (!focusOutOnce &&
                                      (Model.containsAction(newText) || Model.containsCase(newText) ) )
                                {
                                    composite.dispose();
                                    break;
                                }

                                if (!focusOutOnce )
                                {
                                    //action edit name
                                }
                                else if(!focusOutOnce)
                                {

                                }

                                composite.dispose();
                                break;
                            case SWT.Verify:
                                newText = text.getText();
                                String leftText = newText.substring(0, e.start);
                                String rightText =
                                        newText.substring(e.end,
                                            newText.length());
                                GC gc = new GC(text);
                                Point size =
                                        gc.textExtent(leftText + e.text
                                                + rightText);
                                gc.dispose();
                                size = text.computeSize(size.x, SWT.DEFAULT);
                                editor.horizontalAlignment = SWT.LEFT;
                                Rectangle itemRect = item.getBounds(),
                                rect = tree.getClientArea();
                                editor.minimumWidth =
                                        Math.max(size.x, itemRect.width)
                                                + inset * 2;
                                int left = itemRect.x,
                                right = rect.x + rect.width;
                                editor.minimumWidth =
                                        Math.min(editor.minimumWidth, right
                                                - left);
                                editor.minimumHeight = size.y + inset * 2;
                                editor.layout();
                                break;
                            case SWT.Traverse:
                                switch (e.detail)
                                {
                                    case SWT.TRAVERSE_RETURN:
                                        composite.dispose();
                                        break;
                                    case SWT.TRAVERSE_ESCAPE:
                                        composite.dispose();
                                        e.doit = false;
                                }
                                break;
                            }
                    }
                };

                text.addListener(SWT.Verify, textListener);
                text.addListener(SWT.Traverse, textListener);
                text.addListener(SWT.FocusOut, textListener);
                editor.setEditor(composite, item);
                text.setText(item.getText());
                text.selectAll();
                text.setFocus();
            }
            lastItem[0] = item;
        }
    });

解决方案

Are you really using jface's TreeViewer? Your code snippet does show that you are using the simple SWT Tree widget. Hence, much of your code is boilerplate code. If you are really using TreeViewer, then have a look at jface's EditingSupport which is very convenient and flexible allowing you to achieve what you are trying to solve manually.

To make it short, have a look at this snippet:

http://git.eclipse.org/c/platform/eclipse.platform.ui.git/tree/examples/org.eclipse.jface.snippets/Eclipse%20JFace%20Snippets/org/eclipse/jface/snippets/viewers/Snippet026TreeViewerTabEditing.java

这篇关于使用SWT重命名treeViewer节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆