博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Idea 插件开发常用的方法
阅读量:6568 次
发布时间:2019-06-24

本文共 4435 字,大约阅读时间需要 14 分钟。

创建文件时用到的方法

获取常用工具类

myFactory = JavaPsiFacade.getElementFactory(mProject);复制代码

获取鼠标选中的目录

通过AnActionEvent获取到Ideview,然后调用getOrChooseDiretory() 获取鼠标右击选中的目录

IdeView ideView = anActionEvent.getRequiredData(LangDataKeys.IDE_VIEW);PsiDirectory directory = ideView.getOrChooseDirectory();复制代码

创建Java类

通过DirectoryService创建Java类

myDirectoryService = JavaDirectoryService.getInstance();PsiClass psiClass = myDirectoryService.createClass(directory, "Text", JavaTemplateUtil.INTERNAL_CLASS_TEMPLATE_NAME);复制代码

设置包名

PsiJavaFile javaFile = (PsiJavaFile) psiClass.getContainingFile();PsiPackage psiPackage = myDirectoryService.getPackage(directory);javaFile.setPackageName(psiPackage.getQualifiedName());复制代码

设置类的权限

psiClass.getModifierList().setModifierProperty(PsiModifier.PUBLIC,true);复制代码

psiClass类中添加接口

PsiClass view = myFactory.createInterface("View");psiClass.add(view);复制代码

根据名字全局查找PsiClass

private PsiClass getPsiClassByName(String name) {        PsiClass[] psiClasses = myShortNamesCache.getClassesByName(name, myProjectScope);//NotNull        PsiClass psiClass = null;        if (psiClasses.length != 0) {//if the class already exist.            psiClass = psiClasses[0];        }//and        return psiClass;    }复制代码

根据PsiFile查找PsiClass

if ((psiFile1 instanceof PsiJavaFile) && ((PsiJavaFile) psiFile1).getClasses().length > 0) {                psiClass = ((PsiJavaFile) psiFile1).getClasses()[0];            }复制代码

手动设置Action的名字和图标

Presentation presentation = getTemplatePresentation();presentation.setText(fileType);presentation.setIcon(IconLoader.getIcon("/icons/icon_tf.png"));复制代码

其中icons要放到Resource目录下:

注意图片的命名规则

在ActionGroup中手动添加Acton

public class AddMVPFile extends DefaultActionGroup implements DumbAware {    public AddMVPFile() {        setPopup(true);        Presentation presentation = getTemplatePresentation();        presentation.setText("MVPFile");        presentation.setIcon(IconLoader.getIcon("/icons/icon_tf.png"));        List
fileTypes = new ArrayList<>(); fileTypes.add("Contract"); fileTypes.add("PresenterImpl"); fileTypes.add("ModelImpl"); for (String fileType:fileTypes){ add(new AddFile(fileType)); } }}复制代码

其中AddFile是Acton,要实现如下所示的效果,需要加入 setPopup(true);否则Action是平铺开来的,没办法放到MVPFile下

通过复写Action 的 update 来控制Action是否可见

@Override    public void update(AnActionEvent e) {        super.update(e);        IdeView ideView = e.getRequiredData(LangDataKeys.IDE_VIEW);        PsiDirectory directory = ideView.getOrChooseDirectory();        if (directory.getName().equals("contract"))            e.getPresentation().setEnabledAndVisible(true);        else            e.getPresentation().setEnabledAndVisible(false);    }复制代码

e.getPresentation().setEnabled(true);用来设置该Action是否可用,

e.getPresentation().setEnabledAndVisible(true);用来设置该Action可用并且可见,可以灵活选用

显示错误信息

Messages.showErrorDialog("Generation failed, " +                            "your class name MUST END WITH 'Contract' or 'Presenter'.",                    "Class Name Error");复制代码

Dialog 设置

//设置Dialog的标题setTitle("New Mvp File");//设置Dialog的最小大小setMinimumSize(new Dimension(260, 120));//设置Dialog在屏幕中间,public void setLocationRelativeTo(Component c)设置窗口相对于指定组件的位置。 //如果组件当前未显示,或者 c 为 null,则此窗口将置于屏幕的中央。setLocationRelativeTo(null);复制代码

setLocationRelativeTo(null)可以使其屏幕居中,但如果IDE不全屏,显示的效果就不好看了,想使Dialog在IDE窗口居中显示,可以这样设置:

setLocationRelativeTo(WindowManager.getInstance().getFrame(actionEvent.getProject())

注意setMinimumSize和setLocationRelativeTo的先后位置,如果setLocationRelativeTo在前,则创建出来的窗口的左上角居中,因为这时窗口还没有大小。

导入需要的类

要想使用如下的方法导入import,前提条件是需要导入的类必须包含包名,例如Log.e需要写成android.util.Log.e(TAG,field.toString());

JavaCodeStyleManager styleManager = JavaCodeStyleManager.getInstance(project);styleManager.optimizeImports(file);styleManager.shortenClassReferences(targetClass);复制代码

获取PsiElment下所有的PsiStatement

for (PsiStatement psiStatement : psiMethod.getBody().getStatements()) {    EventLogger.log(psiStatement.getText());   // 查找setContentView    if (psiStatement.getFirstChild() instanceof PsiMethodCallExpression) {        PsiReferenceExpression methodExpression = ((PsiMethodCallExpression) psiStatement.getFirstChild()).getMethodExpression();        if (methodExpression.getText().equals("setContentView")) {           setContentViewStatement = psiStatement;        } else if (methodExpression.getText().equals("initView")) {           hasInitViewStatement = true;                       }                }}复制代码

c

转载地址:http://auvjo.baihongyu.com/

你可能感兴趣的文章
iOS开发-Protocol协议及委托代理(Delegate)传值
查看>>
【BZOJ】1105: [POI2007]石头花园SKA
查看>>
MapReduce原理与设计思想
查看>>
Theano学习笔记(三)——图结构
查看>>
UVa - 11400 - Lighting System Design
查看>>
Oracle 11g 客户端使用
查看>>
luvit 被忽视的lua 高性能框架(仿nodejs)
查看>>
也许每个农村出来的码农都有个田园梦
查看>>
J2EE的13种核心技术
查看>>
Express.js 中的 Sessions 如何工作?(译)
查看>>
Web自动化之Headless Chrome概览
查看>>
【133天】尚学堂高淇Java300集视频精华笔记(71-72)
查看>>
剖析 Laravel 计划任务--事件属性
查看>>
Micronaut教程:如何使用基于JVM的框架构建微服务
查看>>
检查IP是否可用的方法
查看>>
互联网架构师必备技术 Docker仓库与Java应用服务动态发布那些事
查看>>
Intellij IDEA 2018.2 搭建Spring Boot 应用
查看>>
作为数据科学家,我都有哪些弱点
查看>>
(转)线程安全的CopyOnWriteArrayList介绍
查看>>
对LinqtoExcel的扩展 【数据有限性,逻辑有效性】
查看>>