2012-03-29 29 views
1

我有一個TreeViewer中關於這一點我必須落實重命名編輯應該能夠以兩種方式調用:由F2關鍵 重命名的TreeViewer節點與SWT

  • 通過

    1. 如果選擇了一個節點,單擊鼠標。

      更多功能Windows允許重命名文件夾。 對此,我使用了ICellModifier,但它沒有給出預期的結果。

    通過以下代碼,我已經實現了點編號2,但是如果選擇了節點,它會在雙擊時打開編輯器時產生問題。主要關心的是允許重命名的密鑰仍然未決。我必須使用我在keyListener中編寫的相同代碼,但它不起作用......我真的不認爲下面的代碼是優化的解決方案,但它可以工作。對於第二種選擇,是否有解決方案允許重命名密鑰,以及如何優化以下代碼?

    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

    你真的在使用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