Eclipse RCP: Могу ли я удалить осиротевшие перспективы из панели перспектив?

Я разрабатываю RCP с двумя версиями продукта, основным приложением и одной с некоторыми расширениями. Если пользователь открывает основное приложение после открытия расширенного приложения в той же рабочей области, eclipse обнаруживает перспективу, используемую только в расширенном приложении, и создает ее локальную копию, поэтому она отображается на панели инструментов перспективы как потерянное расширение.

Я создал действие, чтобы скрыть расширенную перспективу приложения при запуске основного приложения. Это скрывает его от меню перспективы и контекстного меню перспективы, но не удаляет его с панели инструментов перспективы. Я также попытался обнаружить осиротевшие перспективы на активной странице окна активного рабочего места (путем поиска угловых скобок в метке) и удаляя их PlatformUI.getWorkbench().getPerspectiveRegistry().deletePerspective(perspective), но это также не влияет на панель инструментов перспективы. Перспектива, которую я удаляю, отсутствует в основном приложении.

Есть ли способ, которым я могу получить доступ к панели инструментов перспективы программно, чтобы я мог удалить любые потерянные перспективы? Или любой другой подход, который будет работать?

1 ответ

Я думал, что хорошим решением было бы создание собственного переключателя перспективы, но этот путь был заблокирован ошибкой затмения. Предлагается обходной путь, но он не работает для меня. Я создал настраиваемую панель инструментов переключателя перспективы, но не смог найти способа обновить ее при открытии или активации перспектив. Мои попытки документированы здесь.

Я удалил бесхозные перспективы в хуке закрытия рабочего пространства, но по какой-то причине в E4 выбрасывается NPE (LazyStackRenderer строка 238) при выборе перспективы в переключателе, который был открыт, но не выбран при запуске приложения.

Я заставил его работать по своему усмотрению, закрыв все открытые перспективы при завершении работы, сохранив их идентификаторы в значении предпочтения, а затем открыв их снова при запуске приложения в WorkbenchWindowAdvisor, Это что-то вроде хака, но я смог найти единственный способ избежать NPE рабочего места E4, которое также предотвращает настройку перспективы с панели инструментов до тех пор, пока она не будет закрыта и повторно открыта из Window меню.

Вот мой код

...

IWorkbench workbench = ...
static final String PERPSECTIVE_ID_1 = ...
static fnal String PERSPECTIVE_ID_2 = ...
static final String PREFERENCE_KEY = ...

workbench.addWorkbenchListener( new IWorkbenchListener() {
        public boolean preShutdown( IWorkbench workbench, boolean forced ) {

            IPerspectiveDescriptor[] openPerspectives = page.getOpenPerspectives();
            page.closeAllPerspectives(false, false);
            StringBuilder sb = new StringBuilder();
            String delim = "";
            for (IPerspectiveDescriptor persp : openPerspectives) {
                if (!persp.getId().equals(PERSPECTIVE_ID_1) && !persp.getId().equals(PERSPECTIVE_ID_2) {
                    sb.append(delim + persp.getId());
                    delim = ";";
                }
            }
            getPreferenceStore().setValue(PREF_KEY, sb.toString());

            return true;
        }

        public void postShutdown( IWorkbench workbench ) {

        }
});

class MyWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {

    static final String PRODUCT_ID_1 = ...
    static final String PRODUCT_ID_2 = ...
    static final String PREFERENCE_KEY = ...

    ...

    @Override
    public void postWindowOpen() {

        IWorkbenchPage page = getWindowConfigurer().getWindow().getActivePage();
        String savedOpenPerspectiveStr = getPreferenceStore().getString(PREFERENCE_KEY);
        if (!"".equals(savedOpenPerspectiveStr)) {
            List<IPerspectiveDescriptor> openPerspectives = new ArrayList<IPerspectiveDescriptor>();
            String[] perspectiveIds = savedOpenPerspectiveStr.split(";");
            if (perspectiveIds.length == 0) {
               openPerspectives.add(PlatformUI.getWorkbench().getPerspectiveRegistry().findPerspectiveWithId(savedOpenPerspectiveStr));
            } else {
                for (String id : perspectiveIds) {
                   openPerspectives.add(PlatformUI.getWorkbench().getPerspectiveRegistry().findPerspectiveWithId(id));
                }
            }
            //successively setting perspectives causes them to appear in the perspective switcher toolbar
            for (IPerspectiveDescriptor persp : openPerspectives) {
                page.setPerspective(persp);
            }
        }

        //now we set the appropriate perspective
        if (Platform.getProduct().getId().equals(PRODUCT_ID_1)) {
            page.setPerspective(PlatformUI.getWorkbench().getPerspectiveRegistry().findPerspectiveWithId(PERSPECTIVE_ID_1));
        } else if (Platform.getProduct().getId().equals(PRODUCT_ID_2)) {
            page.setPerspective(PlatformUI.getWorkbench().getPerspectiveRegistry().findPerspectiveWithId(PERSPECTIVE_ID_2));
        }
    }
    ...
}
Другие вопросы по тегам