Custom Perspective Switcher工具栏:如何动态更新它?

时间:2016-03-07 03:01:51

标签: eclipse-rcp toolbar perspective

我正在尝试实现自定义透视切换器工具栏来替换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)并将新项目添加到工具栏,但我尝试进行CoolBarToolBar更新的所有内容均无效。当我重新启动应用程序时,工具栏中有添加的项目。

我确定我做错了,但我无法找到正确的方法。这是我的代码的省略表示(省略与更新问题无关的方法,布局代码等)。

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 个答案:

没有答案