单击 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);
}
}
}
}
我们可以在调用处理程序之前将焦点设置在正确的视图上。这解决了问题。
在 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);
}
}
}
}
我们可以在调用处理程序之前将焦点设置在正确的视图上。这解决了问题。