Пользовательская панель инструментов переключателя перспективы: как ее динамически обновить?
Я пытаюсь реализовать собственную панель инструментов переключателя перспективы, чтобы заменить встроенную в 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();
}
}
...
}