在一個 Eclipse RCP/RAP 專案中,我們使用了幾個帶有 IActionBars 的視圖和使用 E4 貢獻的 Actions(在 plugin.xml 檔案中定義的 xml Actions/Commands)。
假設我們打開了兩個視圖(IWorkbenchPart)(A 和 B),其中都有一個帶有 Actions 的 ActionBar。如果 View A 獲得焦點,而我們直接點擊 View B 的某個 Action,則焦點不會更改為 View B。該操作的 Handler 代碼如下所示:
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 的點擊或里面的動作,以便在呼叫 Handler 之前將焦點設定在正確的視圖上,但沒有成功。
任何幫助表示贊賞。
謝謝
uj5u.com熱心網友回復:
我終于通過使用命令將焦點設定到包含操作欄的視圖來解決了這個問題:
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);
}
}
}
}
我們可以在呼叫處理程式之前將焦點設定在正確的視圖上。這解決了問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/457475.html