2016-06-15 7 views
1

Ich habe eine wirklich grundlegende FormEditor und FormPage:Stackoverflow Während formpage Hinzufügen 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) { } 

} 

Diese zugegebenermaßen komplexe und exotische Anwendungsfall bringt die folgende Ausnahme:

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

wenn ich jedoch addPage(IFormPage) stattverwendenes funktioniert. Es gibt sogar einen "Bug" -Bericht für dieses Problem: Bug 283039 (es ist kein Bug, weil ... es gibt keinen Grund gegeben).

Wir müssen nicht diskutieren, ob das ein Fehler ist, aber was ich wissen will ist: Wie füge ich eine FormPage zu einer FormEditor hinzu, während ich noch die IEditorInput definiere?

Antwort

1

Das FormPage wird zweimal initialisiert, das zweite Mal mit dem gleichen IEditorSite wie das Haupt FormEditor. Dies führt dazu, dass der selbe Selektionsanbieter für den FormPage als Hauptredakteur verwendet wird, dieser Selektionsanbieter erwartet dies nicht und gerät in eine Schleife.

Sie können durch Überschreiben der isEditor Methode der FormPage die zweite Initialisierung stoppen und return true:

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

Beachten Sie auch, dass, wenn Sie die addPage(IFormPage) Aufruf der Seite noch mit dem Editor-Eingang (so lange initialisiert wird als isEditor gibt false zurück).