单击 ActionsBars 中的 Actions 时 Eclipse SWT 中的焦点问题

Problem with the focus in Eclipse SWT when clicking on Actions in ActionsBars

在 Eclipse RCP/RAP 项目中,我们使用了几个带有 IActionBars 的视图和使用 E4 贡献的操作(xml Actions/Commands 在 plugin.xml 文件中定义)。

假设我们打开了两个视图 (IWorkbenchPart)(A 和 B),它们都有一个带有 Actions 的 ActionBar。如果视图 A 获得焦点并且我们直接单击视图 B 的某个操作,则焦点不会更改为视图 B。操作的处理程序代码如下所示:

public class DefineFilterHandler extends AbstractHandler
{
    /** {@inheritDoc} */
    @Override
    public Object execute(ExecutionEvent event) throws ExecutionException
    {
        IWorkbenchPart part = HandlerUtil.getActivePart(event);

        if (part == null || !(part instanceof ViewB))
        {
            return null;
        }

        ViewB view = (ViewB) part;

        // open filter dialog
        view.showSetFilterDialog();

        return null;
    }

}

只有当我们先点击ViewB设置焦点时才会显示对话框。在其他情况下,例如我们正在显示 ViewB 的两个实例、对话框或任何操作,正在 ViewB1 而不是 ViewB2 中执行(只是因为 ViewB1 是焦点)。

我一直在尝试检测对 IActionBars 或内部操作的点击,以在调用处理程序之前将焦点设置在正确的视图上,但没有成功。

感谢任何帮助。

谢谢

我终于解决了这个问题,方法是将焦点设置到包含带有命令的操作栏的视图:

IActionBars bars = getViewSite().getActionBars();
    
    IContributionItem [] items = bars.getToolBarManager().getItems();        
    for(IContributionItem item : items)
    {
        if(item instanceof HandledContributionItem)
        {
            HandledContributionItem handledContributionItem = (HandledContributionItem)item;                
            ParameterizedCommand c = handledContributionItem.getModel().getWbCommand();
            c.getCommand().removeExecutionListener(this);
            c.getCommand().addExecutionListener(this);
        }
    }

以上代码放在View的“doCreatePartControl”方法中。此代码设置执行侦听器。所以视图现在实现 org.eclipse.core.commands.IExecutionListener

像这样实现“preExecute”方法:

@Override
public void preExecute(String commandId, ExecutionEvent event) 
{
    String secondaryId = ActivityView.this.getViewSite().getSecondaryId();
    IWorkbench workbench = PlatformUI.getWorkbench();
    for(IWorkbenchPage page : workbench.getActiveWorkbenchWindow().getPages())
    {
        IViewReference viewReference = page.findViewReference(ActivityView.this.getViewID(), secondaryId);
        if(viewReference != null)
        {
            try 
            {
                page.showView(ActivityView.this.getViewID(), secondaryId, IWorkbenchPage.VIEW_ACTIVATE);
            } 
            catch (PartInitException e) 
            {
                ActivityDisplayPlugin.getPlugin().logError("Problem getting Activity View", e);
            }
        }
    }
}

我们可以在调用处理程序之前将焦点设置在正确的视图上。这解决了问题。