2016-06-15 2 views
1

У меня есть на самом деле основной FormEditor и FormPage:StackOverflowError Хотя Добавление FormPage к FormEditor

public class CustomFieldSetVersionEditor extends FormEditor { 

    @Override 
    protected void addPages() { 
     try { 
      addPage(new MyFormPage(this), getEditorInput()); 
     } catch (final PartInitException ex) { 
      ex.printStackTrace(); 
     } 
    } 

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

    @Override 
    public void doSaveAs() {} 

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

class MyFormPage extends FormPage { 

    public MyFormPage(final FormEditor editor) { 
     super(editor, "id", "Title"); 
    } 

    @Override 
    protected void createFormContent(final IManagedForm managedForm) { } 

} 

Это правда, сложный и экзотический случай использования приносит следующее исключение:

java.lang.StackOverflowError в org.eclipse.swt.widgets.Widget.getData (Widget.java:525) на org.eclipse.ui.part.MultiPageEditorPart.getEditor (MultiPageEditorPart.java:599) на org.eclipse.ui.part.MultiPageEditorPar t.getActiveEditor (MultiPageEditorPart.java:523) на org.eclipse.ui.forms.editor.FormEditor.getActiveEditor (FormEditor.java:430) на org.eclipse.ui.forms.editor.FormEditor $ FormEditorSelectionProvider.getSelection (FormEditor.java:84) at org.eclipse.ui.forms.editor.FormEditor $ FormEditorSelectionProvider.getSelection (FormEditor.java:89) at org.eclipse.ui.forms.editor.FormEditor $ FormEditorSelectionProvider.getSelection (FormEditor. Java: 89) в org.eclipse.ui.forms.editor.FormEditor $ FormEditorSelectionProvider.getSelection (FormEditor.java:89) ...

Однако, если я использую addPage(IFormPage) вместо addPage(IEditorPart, IEditorInput) работает. Для этой проблемы есть даже «ошибка»: Bug 283039 (это не ошибка, потому что ... нет причин).

Нам не нужно обсуждать, если это ошибка, но то, что я хочу знать: Как добавить FormPage к FormEditor в то же время определения IEditorInput?

ответ

1

FormPage инициализируется дважды, второй раз с тем же IEditorSite в качестве основного FormEditor. Это приводит к тому, что один и тот же поставщик выбора используется для FormPage в качестве главного редактора, этот поставщик выбора не ожидает этого и попадает в цикл.

Вы можете остановить второй инициализацию перекрывая isEditor метод FormPage и возвращает истину:

@Override 
public boolean isEditor() { 
    return true; 
} 

отметить также, что при использовании addPage(IFormPage) вызова страницы еще инициализируется со входом редактора (до тех пор, isEditorfalse).

Смежные вопросы