2012-03-29 25 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