Пользовательская панель инструментов переключателя перспективы: как ее динамически обновить?

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

У меня есть панель инструментов, отображающая следующий подход, но я не могу понять, как ее динамически обновлять. Обходная инструкция, чтобы позвонить ContributionItem#fill(CoolBar, int) от моего WorkbenchControlContributionItem метод обновления вместо заполнения createControl метод.

Я не знаю, кто должен звонить update, но это никогда не вызывается независимо от того, что я делаю. У меня есть перспективный слушатель, который знает, когда обновить панель инструментов, поэтому из обратного вызова этого слушателя я звоню fill(CoolBar, int), Но я не был уверен, как получить CoolBar перейти к этому методу, поэтому я создал один на текущей оболочке.

Конечным результатом всего этого является то, что на панели инструментов изначально отображается правильное количество элементов, но когда мне нужно добавить элемент, это не имеет никакого эффекта. Я звоню fill(CoolBar, int) и он добавляет новый элемент на панель инструментов, но все, что я пытался сделать CoolBar а также ToolBar обновление не работает. Когда я перезапускаю приложение, на панели инструментов появляется добавленный элемент.

Я уверен, что я делаю это неправильно, но я не могу понять правильный путь. Вот элидируемое представление моего кода (без учета методов, кода макета и т. Д., Не связанных с проблемой обновления).

public class PerspectiveSwitcherToolbar extends WorkbenchWindowControlContribution implements IPerspectiveListener {
...
@Override
    protected Control createControl(Composite parent) {
        this.parent = parent;
        IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
        page.getWorkbenchWindow().addPerspectiveListener(this);
        toolBarManager = (ToolBarManager)parent.getParent().getData();
        fTopControl = new Composite(parent, SWT.BORDER);
        fill(new CoolBar(page.getWorkbenchWindow().getShell(), SWT.HORIZONTAL), -1);
        return fTopControl;
}

@Override
    public void fill(CoolBar coolbar, int index) {
        IPerspectiveDescriptor[] openPerspectives = page.getOpenPerspectives();
        String activePerspective = getPerspectiveId();
        ToolBar toolbar = new ToolBar(fTopControl, SWT.NONE);
        for(IPerspectiveDescriptor descriptor : openPerspectives) {
            ToolItem item = new ToolItem(toolbar, SWT.RADIO);
        //overkill here, trying to find some way to upate the toolbar
        toolbar.update();
        parent.update();
        parent.layout(true);
        parent.getParent().update();
        parent.getParent().layout(true);
        coolbar.layout(true);
}

//PerspectiveListener callback
@Override
    public void perspectiveActivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) {
        fill(new CoolBar(page.getWorkbenchWindow().getShell(), SWT.HORIZONTAL), -1);
        if (page.getWorkbenchWindow() instanceof WorkbenchWindow){
            //this non-API call doesn't help either
            ((WorkbenchWindow) page.getWorkbenchWindow()).updateActionBars();
        }
}
...
}

0 ответов

Другие вопросы по тегам