Idea 插件开发经常使用的方法

建立文件时用到的方法

获取经常使用工具类

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

获取鼠标选中的目录

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

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

建立Java类

经过DirectoryService建立Java类android

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目录下:bash

注意图片的命名规则markdown

在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<String> 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下ide

经过复写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窗口居中显示,能够这样设置:ui

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

注意setMinimumSize和setLocationRelativeTo的前后位置,若是setLocationRelativeTo在前,则建立出来的窗口的左上角居中,由于这时窗口尚未大小。code

导入须要的类

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

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

相关文章
相关标签/搜索