Переименуйте узел TreeViewer с помощью SWT - PullRequest
1 голос
/ 29 марта 2012

У меня есть treeViewer, в котором я должен реализовать редактирование для переименования, которое должно вызываться двумя способами:

  1. клавишей F2
  2. одним щелчком мыши, если выбран узел.

    Более того, когда Windows позволяет переименовывать папки. Для этого я использовал ICellModifier, но он не дал ожидаемого результата.

С помощью следующего кода я достиг точки № 2, хотя это создает проблему для открытия редактора при двойном щелчке, если выбран узел. Основная проблема заключается в разрешении клавиши F2 для переименования, которая все еще находится на рассмотрении. Я должен использовать тот же код, который я написал ниже в keyListener, но он не работает ... Я действительно не думаю, что следующий код является оптимизированным решением, но он работает. Что касается второго варианта, существует ли решение, позволяющее использовать клавишу F2 для переименования, и как можно оптимизировать следующий код?

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

1 Ответ

2 голосов
/ 23 октября 2012

Вы действительно используете Treefaceer jface?Ваш фрагмент кода показывает, что вы используете простой виджет SWT Tree.Следовательно, большая часть вашего кода является стандартным кодом.Если вы действительно используете TreeViewer, взгляните на EditingSupport от jface, который очень удобен и гибок и позволяет вам достичь того, что вы пытаетесь решить вручную.

Чтобы сделать его коротким, взгляните на этот фрагмент:

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

...