2016-12-29 2 views
1

У меня есть несколько редакторов с некоторыми подробными видами, которые не имеют отношения к другим редакторам. На самом деле, клиент не хочет их там, потому что они путают их.Дайте каждому редактору свою собственную перспективу

Так что я хочу переключить видимость просмотров и подумал, что встроенные перспективы в Eclipse могут сделать трюк. Я создал IPartListener так:

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

Я struggeling с методом cloneEditorPerspective() потому Allmost все методы не реализованы в E4 или простом багги.

То, что я хочу сделать, это просто клонировать существующую перспективу, как это (хорошо если честно, я бы предпочел использовать IPerspectiveRegistry#clonePerspective но ... 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); 

Но бросает следующее исключение (очевидно, поле PerspectiveDescriptor.configElement является нулевым для клонированного точки зрения):

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

Я мог бы добавить page.savePerspectiveAs(clone) удалить исключение, но по причинам, которые полностью вне меня не перспектива по умолчанию клонирована, а активна в настоящий момент.

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

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); 

Этот код работает, но clones all views.

Если закрыть точку вручную весь ад потерять что-то вроде, что:

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

Все варианты, которые я попытался, похоже, сводятся к следующим трем: NPE, клонирует неправильную перспективу или дублирует взгляды.

Есть ли способ дать каждому редактору свою собственную перспективу? Если да, то как?

ответ

0

Очевидно, трюк заключается лишь в клонировании активной в настоящее время перспективы. Это означает, чтобы переключиться на пустую точку, а затем клонировать:

// 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); 

Есть еще куча случайных неработающие, поскольку перспектива равна нуль, но это, как Е4 роллов.

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