Я хочу клонировать перспективу и сохранять ее клонированную. Тем не менее, вызов PerspectiveRegistry.clonePerspective(...)
возвращает null, и у меня заканчиваются идеи, что может быть неправильно с моими значениями параметров.
public void savePerspectiveAs(String label) {
IWorkbenchPage page = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getActivePage();
IPerspectiveDescriptor perspectiveDescriptor = perspectiveRegistry
.findPerspectiveWithLabel(label);
// if the perspective doesn't exist, create a new one
// by cloning the current perspective
if (perspectiveDescriptor == null) {
IPerspectiveDescriptor currentPerspectiveDescriptor =
perspectiveRegistry.findPerspectiveWithId(currentPerspective);
// after this line, perspectiveDescriptor is still null
perspectiveDescriptor = perspectiveRegistry
.clonePerspective(currentPerspective + "."
+ label.replaceAll(" ", "_"), label,
currentPerspectiveDescriptor);
// hence I get a NullPointerException here...
connectedPerspectives.add(perspectiveDescriptor.getId());
}
page.savePerspectiveAs(perspectiveDescriptor);
}
Все остальные значения кажутся прекрасными. currentPerspectiveDescriptor
- действительный объект, так что это perspectiveRegistry
.
label
- это что-то вроде "Connected Perspective 2"
. И это еще не существует, и мой созданный идентификатор перспективы.
Есть идеи? Что может быть неправильным здесь для clonePerspective(...)
для возврата null?
clonePerspective
не поддерживается в Eclipse 4.x.
Это код для PerspectiveRegistry.clonePerspective
:
public IPerspectiveDescriptor clonePerspective(String id, String label,
IPerspectiveDescriptor desc) throws IllegalArgumentException {
// FIXME: compat clonePerspective. Not called in 3.8
E4Util.unsupported("clonePerspective"); //$NON-NLS-1$
return null;
}
Ошибка Eclipse для этого - 382209
Я смог сделать обходной путь для "клонирования" перспективы без переписывания всего для e4. Тем не менее, это довольно грязный взломать, и я не рекомендую его, потому что он использует неконтролируемые приведения к классам реализации Eclipse, а не к его интерфейсам.
@SuppressWarnings("restriction")
public void savePerspectiveAs(String label) {
IWorkbenchPage page = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getActivePage();
IPerspectiveDescriptor perspectiveDescriptor = perspectiveRegistry
.findPerspectiveWithLabel(label);
// if the perspective doesn't exist, create a new one
// by cloning the current perspective
if (perspectiveDescriptor == null) {
// Note: this is a dirty hack.
// It is not recommended to cast to PerspectiveDescriptor
// or PerspectiveRegistry.
PerspectiveDescriptor currentPerspectiveDescriptor =
(PerspectiveDescriptor) perspectiveRegistry.findPerspectiveWithId(currentPerspective);
perspectiveDescriptor =
((PerspectiveRegistry) perspectiveRegistry)
.createPerspective(label, currentPerspectiveDescriptor);
connectedPerspectives.add(perspectiveDescriptor.getId());
}
page.savePerspectiveAs(perspectiveDescriptor);
}