2017-02-16 14 views
0

См. Attachment_TreeCursor. TreeCursor создан для дерева внутри FormPage (для FormEditor).SWT TreeCursor виджет, созданный с предустановленной областью

Создать 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; 
} 
} 

Создать FormPage:

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, я больше не вижу этот «патч», но я все еще не могу выбрать строки i n дерево в этой области. Похоже, что курсор выбирает этот размер из его родительского составного элемента Form/ScrollableForm. На отображаемом объекте tree.getDisplay() я вижу поле RECT clickRect, имеющее значения для левого, правого, нижнего и верхнего. Могут ли они быть подняты для создания курсора? Как я могу избавиться от этого?

+0

Невозможно воспроизвести без остальной части кода, вы должны предоставить [MCVE] (http://stackoverflow.com/help/mcve) –

+0

@Loris Securo: я обновил исходный код, с которым вы можете воспроизвести проблема. – Vrinda

ответ

0

Я вижу 2 проблемы в методе createTree:

  1. tree.setLayout(composite.getLayout());: это не имеет смысла, чтобы установить раскладку на Tree; макет полезен для правильной установки детей, но в Tree вам не нужно этого делать; это также указано в Tree documentation:

    Обратите внимание, что, хотя этот класс является подклассом Composite, он не обычно имеет смысл добавить детей управления к нему, или установить раскладку на это

    Поэтому вы должны удалить инструкцию.

  2. tree.setLayoutData(composite.getLayoutData());: вы пытаетесь повторно использовать GridDataComposite, вы не можете этого сделать; от GridData documentation:

    ПРИМЕЧАНИЕ. Не следует повторно использовать объекты GridData. Каждый элемент управления в Composite, который управляется GridLayout, должен иметь уникальный объект GridData.

    Вы должны создать другой GridData объект для использования только в Tree.

Площадь, которую вы видите, должна исчезнуть после устранения этих проблем.

+0

Удивительный! Это сделал трюк ... Большое спасибо :) – Vrinda