一、代码
package action;import com.intellij.openapi.actionSystem.AnAction;import com.intellij.openapi.actionSystem.AnActionEvent;import com.intellij.openapi.actionSystem.PlatformDataKeys;import com.intellij.openapi.diagnostic.Logger;import com.intellij.openapi.project.Project;import org.codehaus.groovy.macro.transform.MacroTransformation;import org.jetbrains.annotations.NotNull;import util.AppUtils;import util.FileUtil;import util.StringUtil;import view.MvpDialog;import java.util.Map;public class SdgjMvpActivityPluginAction extends AnAction {private Project project;private String basePath; //选中的路径,如项目/login/src/mainprivate String packageName = ""; //包名private String mIntro = "";private String mAuthor = "";//作者private String dirPackagename = ""; //点击目录,如 com.sdjg.mvp.page.login.pwd_loginprivate String mModuleName; //模块名称,如 pwd_loginprivate String mModuleDirName = ""; //模块目录名,如Loginprivate int mType; //0activity 1fragmentprivate static final Logger logger= Logger.getInstance(SdgjMvpActivityPluginAction.class);private enum CodeType {Activity,Fragment,Layout,AndroidManifest}@Overridepublic void actionPerformed(AnActionEvent e) {project=e.getData(PlatformDataKeys.PROJECT);init();}private void init() {MvpDialog mvpDialog = new MvpDialog(new MvpDialog.DialogCallback() {@Overridepublic void ok(String moduleName, String author, String intro, int type) {mModuleName = moduleName;mAuthor = author;mIntro = intro;mType=type;createClassFile();}});mvpDialog.setVisible(true);}/*** 生成类文件*/private void createClassFile() {if(mType==0){createClassFile(CodeType.Activity);createClassFile(CodeType.AndroidManifest);}else{createClassFile(CodeType.Fragment);}createClassFile(CodeType.Layout);createClassFile(CodeType.ViewModel);}private void createClassFile(CodeType codeType) {String content="";switch (codeType) {case Activity:case Fragment:String type="";if(mType==0){type="Activity";}else{type="Fragment";}content= readTemplateFile("Template"+type+".txt");content = dealActivityTemplateContent(content);FileUtil.writeToFile(content, basePath + "/" + mModuleName, StringUtil.pathToMethodName(mModuleName) + type+ ".kt");break;case Layout:content= readTemplateFile("TemplateLayout.txt");String layoutPath=StringUtil.pathExtractDirPath(basePath,"main");if(!layoutPath.isEmpty()){layoutPath+="res/layout";}String layoutContent="";if(mType==0) {layoutContent= readTemplateFile("TemplateLayoutTitle.txt");content=content.replace("$content$",layoutContent);FileUtil.writeToFile(content, layoutPath, "activity_" + mModuleName + ".xml");}else{content=content.replace("$content$","");FileUtil.writeToFile(content, layoutPath, "fragment_" + mModuleName + ".xml");}break;case AndroidManifest:content= readTemplateFile("TemplateAndroidManifest.txt");content=dealAndroidMainifestTemplateContent(content);writeManifest(content,"AndroidManifest.xml");break;}}/*** 往androidManifest中写入新增的Android*/private void writeManifest(String content,String path){String mainPath=StringUtil.pathExtractDirPath(basePath,"main");if(!mainPath.isEmpty()){mainPath+=path;}if(FileUtil.isFileExists(mainPath)) {String mainifestContent = FileUtil.readProjectFile(mainPath);mainifestContent = mainifestContent.replace("</application>", content + "\n </application>");FileUtil.writeToFile(mainifestContent, mainPath, "");}}/*** 读取文件* @param fileName* @return*/private String readTemplateFile(String fileName){String content = FileUtil.readTemplateFile(this, "/Template/mvp/" + fileName);return content;}private String readFunctionTemplateFile(String fileName){String content = FileUtil.readTemplateFile(this, "/Template/mvp/functionTemplate/" + fileName);return content;}//替换Activity模板中字符private String dealActivityTemplateContent(String content){content = content.replace("$basePackageName$", packageName);content = content.replace("$name$", mModuleName);String[] packageNameList = packageName.split("\\.");String arouterName = packageNameList[packageNameList.length - 1];content = content.replace("$Arouter$", arouterName.toUpperCase());content=dealTemplateContent(content);return content;}//替换AndroidManifest模板中字符private String dealAndroidMainifestTemplateContent(String content){content = content.replace("$fileName$", StringUtil.pathToMethodName(mModuleName));String manPath=StringUtil.pathExtractDirPathLater(basePath,"page");manPath="."+ manPath.replace("/",".");content=content.replace("$package$",manPath);return content;}//默认替换模板中字符private String dealTemplateContent(String content) {content = content.replace("$packagename$", dirPackagename);content = content.replace("$intro$", mIntro);content = content.replace("$Author$", mAuthor);content = content.replace("$fileName$", StringUtil.pathToMethodName(mModuleName));return content;}/*** update用于判断该插件是否能使用* 在actionPerformed前执行,这里判断必须是main路径才能使用** @param e*/@Overridepublic void update(@NotNull AnActionEvent e) {basePath = AppUtils.getSelectPath(e);String moduleStr = AppUtils.getModulePath(basePath);if (moduleStr.isEmpty()) {e.getPresentation().setEnabled(false);} else if (!AppUtils.isDirExist(basePath,"page")) {e.getPresentation().setEnabled(false);} else {packageName = AppUtils.getPackageName(moduleStr);dirPackagename = AppUtils.packageSuffix(basePath, packageName);String[] packs = packageName.split("\\.");mModuleDirName = packs[packs.length - 1];mModuleDirName = StringUtil.firstToUpperCase(mModuleDirName);}super.update(e);}}
其实就是获取路径,通过文件读写的方式写进去,如果已经存在,则使用$标记$的方式来把它替换掉,即可实现自动生成代码的方式。
这里只是简单的代码生成,还可以自动生成Retrofit+okhtt的接口代码,然后界面生成ViewModel并自动引入,自动调用的方式减少代码工作量。
