Eclipse RCP: clonePerspective возвращает ноль

1

Я хочу клонировать перспективу и сохранять ее клонированную. Тем не менее, вызов 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?

Теги:
eclipse-rcp
perspective

2 ответа

3

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

  • 0
    И вместо того, чтобы бросить исключение, он молча записывает это - как подло! Есть ли способ обойти это, или мы должны ждать исправления ошибки?
  • 0
    Ошибка более двух лет, поэтому она вряд ли будет исправлена в ближайшее время. Возможно, вы могли бы что-то сделать, используя Eclipse e4 EModelService, EPartService, ... лично я не смотрел на перспективы в e4.
Показать ещё 1 комментарий
0

Я смог сделать обходной путь для "клонирования" перспективы без переписывания всего для 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);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню