У меня есть несколько редакторов с некоторыми подробными видами, которые не имеют отношения к другим редакторам. На самом деле, клиент не хочет их там, потому что они путают их.Дайте каждому редактору свою собственную перспективу
Так что я хочу переключить видимость просмотров и подумал, что встроенные перспективы в 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, клонирует неправильную перспективу или дублирует взгляды.
Есть ли способ дать каждому редактору свою собственную перспективу? Если да, то как?