在前面编写 Demo 项目时,我们邀请了 Action 大神出场,但貌似对他很陌生。本讲的主角就是他。
Action 有多神秘?官网文档地址:http://www.jetbrains.org/intellij/sdk/docs/basics/action_system.html
本文中,我会忽略一些技术不讲,比喻注册 Action Group、Action 代码方式注册等,几乎用不到。
Action 如何创建,前面也说过,请翻阅前面的 Hello World 那篇文章。
在 IntelliJ Platform,Action 组件主要用户接受用户的动作行为。我们开发时创建的 Action 都是派生自 AnAction。
在官方文档中,可以通过这个链接了解 AnAction 的源码,IDEA 中看到的源码都是混效果的。
核心方法:
1、actionPerformed():
在 AnAction 类中,有一个核心且必须实现的方法 actionPerformed,在选择菜单项或工具栏按钮时调用其方法。
回头看看前面的 Demo 文章,我为什么把 Messages.showDialog() 写在 actionPerformed 方法中?!
2、update():
IDEA 会定期的调用 AnAction 的 update() 方法,用户更新当前 Action 菜单的状态,比喻可见性、可操作性。
常见的观测状态比喻:项目是否被打开、是否有文件编辑器打开、选中文本等。
@Override
public void update(@NotNull AnActionEvent e) {
super.update(e);
// Project project = e.getData(PlatformDataKeys.PROJECT);
Editor editor = e.getData(PlatformDataKeys.EDITOR);
// 设置当前 action 菜单的可见性
e.getPresentation().setVisible(editor == null);
// 设置当前 action 菜单的可用性,
// 如果不可用,则 actionPreformed() 方法收不到点击事件
e.getPresentation().setEnabled(editor == null);
// 同时设置当前 action 菜单的可见性和可用性
e.getPresentation().setEnabledAndVisible(editor == null);
}
Action 的生命周期:
Action 与 Application 同生命周期(由系统会定期调用 update() 得知),所以不建议在 Action 的实例中保存短生命周期的对象,避免造成内存泄漏。
Action 相关的内容差不多就这些了,重点要注意两个核心方法的理解和使用。
接下来,我顺带介绍下 Action 中常用的一些 API:
1、前提:注意所有 Intellij Plugin 开发相关的 API,都是 com.intellij.openapi 包中的。
尤其是在写 Demo 时用到的 Messages,如果导错包,则找不到你想要的调用方法。
2、在 update 和 actionPerformed 方法中的形参 AnActionEvent ,其中提供了上下文信息和与当前项目有关的众多数据。
比喻:Project、Editor、Navigatable 等,可以动过 anActionEvent.getData() 方法获取,需要传递的参数为 PlatformDataKeys 类中的常量值。Demo 如前文代码。
Project:表示当前打开或者操作的 project,可以从中获取当前 project 的路径等数据。
Editor:编辑器对象。只有在打开了文件,且处于编辑模式时,此对象才会不为 null。好获取编辑器中选中的文本功能,就是从这个对象中获取的,后文会讲到。
差不多了。至此,你已经非常了解了 Action 的用法。继续关注后续文章,还有好戏等着你。