我正在尝试实现自定义透视切换器工具栏来替换eclipse的内置工具栏。我无法显示工具栏,it was shown to me由于a bug with the dynamic elemen t菜单贡献,我必须改为使用控制元素,如the workaround to the dynamic bug中所述。
我有一个显示以下方法的工具栏,但我无法弄清楚如何动态更新它。解决方法说明是从我的ContributionItem#fill(CoolBar, int)
更新方法中调用WorkbenchControlContributionItem
,而不是填写createControl
方法。
我不知道应该叫谁update
,但无论我做什么,它都不会被调用。我有一个透视监听器,知道何时更新工具栏,因此从该监听器的回调中我调用fill(CoolBar, int)
。但是我不确定如何让CoolBar
传递给该方法,所以我在当前的shell上创建了一个。
所有这一切的最终结果是工具栏最初显示正确的项目数,但是当我需要添加项目时,它没有任何效果。我致电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();
}
}
...
}