1

2つの方法で呼び出すことができるはずの名前変更のための編集を実装する必要があるtreeViewerがあります。

  1. F2キーで
  2. ノードが選択されている場合は、マウスを1回クリックします。

    Windowsがフォルダの名前変更を許可するにつれて、これまで以上に。 このために、を使用ICellModifierしましたが、期待した結果が得られていません。

次のコードで、ノードが選択されている場合にダブルクリックでエディターを開く際に問題が発生しますが、ポイント番号2を達成しました。F2主な懸念事項は、まだ保留中の名前変更のキーを許可することです。keyListenerで以下に記述したものと同じコードを使用する必要がありますが、機能しません...この次のコードは最適化されたソリューションではないと思いますが、機能します。2番目のオプションについては、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;
        }
    });
4

1 に答える 1

2

本当に jface の TreeViewer を使っていますか? コード スニペットは、単純な SWT ツリー ウィジェットを使用していることを示しています。したがって、コードの多くはボイラープレート コードです。TreeViewer を実際に使用している場合は、jface の EditingSupport を見てください。これは非常に便利で柔軟性があり、解決しようとしているものを手動で達成できます。

手短に言うと、次のスニペットを見てください。

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

于 2012-10-23T19:39:27.213 に答える