2016-12-29 7 views
1

Ich habe ein paar Editoren mit einigen Detailansichten jeder, die nicht relevant für die anderen Editoren sind. Tatsächlich will der Kunde sie nicht dort, weil sie sie verwirren.Geben Sie jedem Editor seine eigene Perspektive

Also ich möchte die Sichtbarkeit der Ansichten ändern und dachte, die integrierten Perspektiven in Eclipse könnten den Trick tun. Ich habe ein IPartListener wie folgt aus:

public class ToEachTheirOwnPartListener implements IPartListener { 

    private final Map<IWorkbenchPart, String> partToPerspectiveId = new IdentityHashMap<>(5); 

    @Override 
    public void partOpened(IWorkbenchPart part) { 
     if (hasOwnPerspective(part)) { 
      String perspectiveId = cloneEditorPerspective(part); 
      this.partToPerspectiveId.put(part, perspectiveId); 
     } 
    } 

    private static boolean hasOwnPerspective(IWorkbenchPart part) { 
     return part instanceof IEditorPart; 
    } 

    String cloneEditorPerspective(IWorkbenchPart part) { 
     final IPerspectiveRegistry registry = PlatformUI.getWorkbench().getPerspectiveRegistry(); 
     IWorkbenchPage page = part.getSite().getPage(); 
     // more later 
    } 

    @Override 
    public void partBroughtToTop(IWorkbenchPart part) { 
     if (hasOwnPerspective(part)) { 
      final IPerspectiveRegistry registry = PlatformUI.getWorkbench().getPerspectiveRegistry(); 
      part.getSite().getPage().setPerspective(registry.findPerspectiveWithId(this.partToPerspectiveId.get(part))); 
     } 
    } 

    @Override 
    public void partClosed(IWorkbenchPart part) { 
     if (hasOwnPerspective(part)) { 
      final IPerspectiveRegistry registry = PlatformUI.getWorkbench().getPerspectiveRegistry(); 
      registry.deletePerspective(registry.findPerspectiveWithId(this.partToPerspectiveId.get(part))); 
      this.partToPerspectiveId.remove(part); 
     } 
    } 
} 

ich mit dem cloneEditorPerspective() Methode bin struggeling weil allmost alle Methoden nicht in E4 oder schlicht Buggy umgesetzt werden.

Was ich tun mag, ist nur eine vorhandene Perspektive wie diese zu klonen (okay ehrlich würde ich eher IPerspectiveRegistry#clonePerspective verwenden, aber ... E4):

page.savePerspectiveAs(page.getPerspective()); 

String defaultPerspectiveId = PlatformUI.getWorkbench().getPerspectiveRegistry().getDefaultPerspective(); 
final IPerspectiveDescriptor defaultPerspective = registry.findPerspectiveWithId(defaultPerspectiveId); 
IPerspectiveDescriptor clone = ((PerspectiveRegistry) registry).createPerspective(UUID.randomUUID().toString(), 
     (PerspectiveDescriptor) defaultPerspective); 

Aber das wirft die folgende Ausnahme (offenbar das Feld PerspectiveDescriptor.configElement ist null für die geklonten Perspektive):

java.lang.NullPointerException bei org.eclipse.ui.internal.registry.PerspectiveDescriptor.createFactory (PerspectiveDescriptor.java:74) bei org.eclipse. ui.internal.WorkbenchPage.setPerspective (WorkbenchPage.java:4053) bei ToEachTheirOwnPartListener.partBroughtToTop (ToEachTheirOwnPartListener.java:65)

ich page.savePerspectiveAs(clone) hinzufügen könnte die Ausnahme zu entfernen, aber dann aus Gründen, die vollständig über mich sind Nicht die Standardperspektive wird geklont, sondern die aktuell aktive.

Also noch ein Versuch; setzen wir die Anwendung auf eine leere Perspektive, dann ist diese klonen ein:

IPerspectiveDescriptor perspective = registry.findPerspectiveWithId("org.acme.plugin.perspective"); 
window.getActivePage().setPerspective(perspective); 
IPerspectiveDescriptor clone = ((PerspectiveRegistry) registry).createPerspective(UUID.randomUUID().toString(), 
     (PerspectiveDescriptor) page.getPerspective()); 
page.savePerspectiveAs(clone); 

Dieser Code funktioniert, aber clones all views.

Wenn ich die Ansichten manuell alle Pausen verlieren Hölle schließen mit etwas wie folgt aus:

java.lang.NullPointerException bei org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.canExecuteItem (HandledContributionItem.java:808) bei org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.access $ 1 (HandledContributionItem.java:802) bei org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem $ 3.run (HandledContributionItem.java:167) bei org.eclipse.core.runtime.SafeRunner.run (SafeRunner.java:42)

Alle Varianten, die ich versucht habe, scheinen auf diese drei zu kommen: NPE, Klonen der falschen Perspektive oder Duplizieren der Ansichten.

Gibt es eine Möglichkeit, jedem Redakteur eine eigene Perspektive zu geben? Wenn das so ist, wie?

Antwort

0

Offensichtlich besteht der Trick darin, nur die gerade aktive Perspektive zu klonen. Das bedeutet, auf eine leere Perspektive zu wechseln und dann klonen:

// we save the current perspective 
    IPerspectiveDescriptor currentPerspective = page.getPerspective(); 
    if (currentPerspective != null) { 
     // E4 sometimes lacks perspective 
     page.savePerspectiveAs(currentPerspective); 
    } 

    // switch to the default one (should never have views) 
    String defaultPerspectiveId = PlatformUI.getWorkbench().getPerspectiveRegistry().getDefaultPerspective(); 
    final IPerspectiveDescriptor defaultPerspective = registry.findPerspectiveWithId(defaultPerspectiveId); 
    page.setPerspective(defaultPerspective); 

    // clone it 
    IPerspectiveDescriptor clone = ((PerspectiveRegistry) registry).createPerspective(String.valueOf(this.nextId++), 
      (PerspectiveDescriptor) defaultPerspective); 
    page.savePerspectiveAs(clone); 

Es gibt immer noch eine Reihe von zufälligen NPE ist, weil die Perspektive null ist, aber das ist, wie E4 Rollen.

Verwandte Themen