使用预设区域创建的 SWT TreeCursor 小部件

SWT TreeCursor widget created with a preset area

请参阅Attachment_TreeCursor。 TreeCursor 是为 FormPage 中的树创建的(对于 FormEditor)。

创建表单编辑器:

package test.treecursor.handlers;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.forms.editor.FormEditor;

public class TestEditor extends FormEditor {

private TestEditorPage page;

@Override
protected Composite createPageContainer(final Composite parent) {
  return super.createPageContainer(parent);
}

@Override
protected void addPages() {
try {
  this.page = new TestEditorPage(this);
  addPage(this.page);
}
catch (PartInitException e) {
  e.printStackTrace();
  }
}

 @Override
  public void doSave(final IProgressMonitor monitor) {    
 }

 @Override
   public void doSaveAs() {   
 }

 @Override
 public boolean isSaveAsAllowed() {  
   return false;
 }
}

创建表单页面:

package test.treecursor.handlers;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TreeCursor;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.FormPage;

public class TestEditorPage extends FormPage {

 public TestEditorPage(final TestEditor testEditor) {
   super(testEditor, "1", "MyTitle");
 }

 @Override
 protected void createFormContent(final IManagedForm managedForm) {
   Composite composite = managedForm.getForm().getBody();
   composite.setLayout(new GridLayout());
   composite.setLayoutData(new GridData(GridData.FILL_BOTH));
   Tree tree = createTree(composite);
   createTreeColumns(tree);
   final TreeCursor cursor = new TreeCursor(tree, SWT.BORDER);
 }

 private Tree createTree(final Composite composite) {
  Tree tree = new Tree(composite, SWT.MULTI | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);
   tree.setLayout(composite.getLayout());
   tree.setLayoutData(composite.getLayoutData());
   tree.setHeaderVisible(true);
   tree.setLinesVisible(true);
   return tree;
 }

 private void createTreeColumns(final Tree tree) {
   TreeColumn column1 = new TreeColumn(tree, SWT.LEFT);
   column1.setText("First column");
   column1.setWidth(300);
   TreeColumn column2 = new TreeColumn(tree, SWT.LEFT);
   column2.setText("Second column");
   column2.setWidth(300);
 }
}

将此编辑器添加到编辑器扩展点:org.eclipse.ui.editors

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
   <extension
         point="org.eclipse.ui.editors">
     <editor
           class="test.treecursor.handlers.TestEditor"
           default="false"
           id="test.treecursor.editor1"
           name="TestEditor">
     </editor>
   </extension>
</plugin>

如果我将 SWT 样式设置为 SWT.TRANSPARENT,我将不再看到此 'patch',但我仍然无法 select 该区域中树中的行。 看起来光标是从其 Form/ScrollableForm 的父组合中拾取这个大小的。在 tree.getDisplay() 的显示对象上,我可以看到字段 RECT clickRect 具有左、右、下和上的值。可以选择这些来创建游标吗?我怎样才能摆脱这个?

我发现 createTree 方法中有 2 个问题:

  1. tree.setLayout(composite.getLayout());:在Tree上设置布局没有意义;布局对于正确定位子项很有用,但在 Tree 中你不必这样做;这也在 Tree documentation:

    中指定

    Note that although this class is a subclass of Composite, it does not normally make sense to add Control children to it, or set a layout on it

    因此您应该删除该指令。

  2. tree.setLayoutData(composite.getLayoutData());:您正在尝试 re-use CompositeGridData,您不能那样做;来自 GridData documentation

    NOTE: Do not reuse GridData objects. Every control in a Composite that is managed by a GridLayout must have a unique GridData object.

    您应该创建另一个 GridData 对象以仅在 Tree.

  3. 中使用

解决这些问题后,您看到的区域应该会消失。