myFactory = JavaPsiFacade.getElementFactory(mProject);复制代码
经过AnActionEvent获取到Ideview,而后调用getOrChooseDiretory()
获取鼠标右击选中的目录java
IdeView ideView = anActionEvent.getRequiredData(LangDataKeys.IDE_VIEW);
PsiDirectory directory = ideView.getOrChooseDirectory();复制代码
经过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 view = myFactory.createInterface("View"); psiClass.add(view);复制代码
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; }复制代码
if ((psiFile1 instanceof PsiJavaFile) && ((PsiJavaFile) psiFile1).getClasses().length > 0) { psiClass = ((PsiJavaFile) psiFile1).getClasses()[0]; }复制代码
Presentation presentation = getTemplatePresentation(); presentation.setText(fileType); presentation.setIcon(IconLoader.getIcon("/icons/icon_tf.png"));复制代码
其中icons要放到Resource目录下:bash
注意图片的命名规则markdown
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
@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的标题 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);复制代码
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