2016-06-15 8 views
1

をFormEditorするFormPage追加時:でjava.lang.StackOverflowErrorを にStackOverflowError私は本当に基本的な<code>FormEditor</code>を持っており、<code>FormPage</code>

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) { } 

} 

をこれ確かに複雑でエキゾチックなユースケースは、次の例外をもたらしますorg.eclipse.swt.widgets.Widget.getData(Widget.java:525) at org.eclipse.ui.part.MultiPageEditorPart.getEditor(MultiPageEditorPart.java:599) at org.eclipse.ui.part.MultiPageEditorPar t.getActiveEditor(MultiPageEditorPart.java:523) at org.eclipse.ui.forms.editor.FormAditor.getActiveEditor(FormEditor.java:430) at org.eclipse.ui.forms.editor.FormEditor $ FormEditorSelectionProvider.getSelection FormEditor.java:84)org.eclipse.ui.forms.editor.FormEditor $ FormEditorSelectionProvider.getSelectionでorg.eclipse.ui.forms.editor.FormEditor $ FormEditorSelectionProvider.getSelection(FormEditor.java:89) で (FormEditor。 Javaの:89)org.eclipse.ui.forms.editor.FormEditor $ FormEditorSelectionProvider.getSelection(FormEditor.java:89) で ...

しかし、私はaddPage(IFormPage)の代わりを使用している場合addPage(IEditorPart, IEditorInput)それは動作します。この問題の「バグ」レポートもあります:Bug 283039(これはバグではありません。理由はありません)。

私はこれがバグかどうか議論する必要はありませんが、私が知りたいことは:IEditorInputを定義しながらFormEditorFormPageを追加するにはどうすればいいですか?

答えて

1

FormPageは、FormEditorと同じIEditorSiteで2回、初期化されています。この結果、同じ選択プロバイダがFormPageのメインエディタとして使用され、この選択プロバイダはこれを期待せずループに入ります。

あなたはFormPageisEditorメソッドをオーバーライドすることにより、第2の初期化を停止し、trueを返すことができます。

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

も限り(あなたがaddPage(IFormPage)コールを使用している場合、ページがまだエディタ入力で初期化されることに注意してくださいisEditorfalseを返します)。

関連する問題