Eclipse RCP: clonePerspective возвращает значение null

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


person Terry    schedule 15.10.2014    source источник


Ответы (2)


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.

person greg-449    schedule 15.10.2014
comment
И вместо того, чтобы генерировать исключение, он молча регистрирует его в журнале — как подло! Есть ли способ обойти это, или нам нужно ждать исправления ошибки? - person Terry; 15.10.2014
comment
Ошибке уже больше двух лет, так что вряд ли в ближайшее время она будет исправлена. Вероятно, вы могли бы что-то сделать, используя Eclipse e4 EModelService, EPartService, ... лично я не рассматривал перспективы в e4. - person greg-449; 15.10.2014
comment
К вашему сведению: я спросил их, и они сказали мне, что, к сожалению, не планируют исправлять ошибку в следующем выпуске. - person Terry; 22.10.2014

Мне удалось найти обходной путь для «клонирования» перспективы, не переписывая все для 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);
}
person Terry    schedule 22.10.2014