创建文件时用到的方法
获取常用工具类
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")); ListfileTypes = 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