Eclipse插件开发现在很冷门,就在这里写个总结吧。也许有人能用到。
(1)获取AcivePage返回NULL。
如果是反常的返回空值,有可能是没在界面线程中使用。用以下方法可能有用:
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
...
}
(2)复用Handler和Command
Command不像Action那么容易复用,但也不是不可以。需要使用下面的代码:
ICommandService cs = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart().getSite().getService(ICommandService.class);
Command cmd = cs.getCommand("DeviceManager.connectHost");
try {
Map<String, Object> map = new HashMap<>();
map.put("device.view.connectHost.connectMethod", "fast");
cmd.executeWithChecks(new ExecutionEvent(null, map, null, null));
} catch (ExecutionException | NotDefinedException | NotEnabledException | NotHandledException e) {
e.printStackTrace();
}
基本思路就是找到ICommandService,然后根据CommandID找到对应的Commnad,然后生成一个ExecutionEvent参数调用时传进去即可。
(3)如何使用状态栏(StatusLine)
Eclipse RCP应用的状态栏感觉比较复杂,整个状态栏分了3个区域,而且不同的视图或者编辑器还拥有自己的状态栏。比较简单的方法是直接使用自己的状态栏,在视图或者编辑器的createPartControl方法中:
IStatusLineManager slm = getViewSite().getActionBars().getStatusLineManager();
slm.add(new StatuslineContributionItem());
...
但是这样的状态栏只有在编辑器打开或者激活时才会出现。如果你希望得到一个“常驻”的状态栏,可以在RCP程序中添加,也可以在插件中使用下面的代码实现:
IStatusLineManager slm = getViewSite().getActionBars().getStatusLineManager();
if(slm instanceof SubStatusLineManager) {
slm = (IStatusLineManager) ((SubStatusLineManager) slm).getParent();
}
DeviceStatusLineContributionItem cti;
cti = (DeviceStatusLineContributionItem) slm.find(ID);
if(cti == null) {
cti = new DeviceStatusLineContributionItem(ID);
slm.appendToGroup(StatusLineManager.BEGIN_GROUP, cti);
slm.appendToGroup(StatusLineManager.BEGIN_GROUP, new OpenDeviceTreeViewAction());
}
上面代码中的DeviceStatusLineContributionItem是我自己写的一个类,继承自ContributionItem,参考StatuslineContributionItem写的。
(4)ConsoleView或其它视图的工具栏状态更新
在自己开发视图上通常会有自己的工具栏,这个工具栏可以用Action来添加,也可以在Plugin利用菜单扩展点来添加,具体不说了,网上很多资料。但是添加的工具栏按钮状态(是否使能)并不会主动更新,而是在切换视图或者有选择变化的时候才会更新,有点时候就很烦。例如点击一个按钮后,执行完功能,该按钮就应该禁用,同时另一个按钮会使能。尽管实现了handler的isEnabled方法,但它就是不调用,如何?
其实有一个办法可以主动刷新的,很少有文档提到。可以在执行命令后调用下面的代码实现:
consoleView.getViewSite().getActionBars().updateActionBars();
Q.E.D.
Comments | 0 条评论