总结:Eclipse插件开发

2024-04-15   162 次阅读


Eclipse插件开发现在很冷门,就在这里写个总结吧。也许有人能用到。

(1)获取AcivePage返回NULL。

微信图片_20240415162323.png

如果是反常的返回空值,有可能是没在界面线程中使用。用以下方法可能有用:

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.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

No PAINS No GAINS.