生成Dialog,通过输入的内容生成模板代码

一、代码

  1. package action;
  2. import com.intellij.openapi.actionSystem.AnAction;
  3. import com.intellij.openapi.actionSystem.AnActionEvent;
  4. import com.intellij.openapi.actionSystem.PlatformDataKeys;
  5. import com.intellij.openapi.diagnostic.Logger;
  6. import com.intellij.openapi.project.Project;
  7. import org.codehaus.groovy.macro.transform.MacroTransformation;
  8. import org.jetbrains.annotations.NotNull;
  9. import util.AppUtils;
  10. import util.FileUtil;
  11. import util.StringUtil;
  12. import view.MvpDialog;
  13. import java.util.Map;
  14. public class SdgjMvpActivityPluginAction extends AnAction {
  15. private Project project;
  16. private String basePath; //选中的路径,如项目/login/src/main
  17. private String packageName = ""; //包名
  18. private String mIntro = "";
  19. private String mAuthor = "";//作者
  20. private String dirPackagename = ""; //点击目录,如 com.sdjg.mvp.page.login.pwd_login
  21. private String mModuleName; //模块名称,如 pwd_login
  22. private String mModuleDirName = ""; //模块目录名,如Login
  23. private int mType; //0activity 1fragment
  24. private static final Logger logger= Logger.getInstance(SdgjMvpActivityPluginAction.class);
  25. private enum CodeType {
  26. Activity,Fragment,Layout,AndroidManifest
  27. }
  28. @Override
  29. public void actionPerformed(AnActionEvent e) {
  30. project=e.getData(PlatformDataKeys.PROJECT);
  31. init();
  32. }
  33. private void init() {
  34. MvpDialog mvpDialog = new MvpDialog(new MvpDialog.DialogCallback() {
  35. @Override
  36. public void ok(String moduleName, String author, String intro, int type) {
  37. mModuleName = moduleName;
  38. mAuthor = author;
  39. mIntro = intro;
  40. mType=type;
  41. createClassFile();
  42. }
  43. });
  44. mvpDialog.setVisible(true);
  45. }
  46. /**
  47. * 生成类文件
  48. */
  49. private void createClassFile() {
  50. if(mType==0){
  51. createClassFile(CodeType.Activity);
  52. createClassFile(CodeType.AndroidManifest);
  53. }
  54. else{
  55. createClassFile(CodeType.Fragment);
  56. }
  57. createClassFile(CodeType.Layout);
  58. createClassFile(CodeType.ViewModel);
  59. }
  60. private void createClassFile(CodeType codeType) {
  61. String content="";
  62. switch (codeType) {
  63. case Activity:
  64. case Fragment:
  65. String type="";
  66. if(mType==0){
  67. type="Activity";
  68. }
  69. else{
  70. type="Fragment";
  71. }
  72. content= readTemplateFile("Template"+type+".txt");
  73. content = dealActivityTemplateContent(content);
  74. FileUtil.writeToFile(content, basePath + "/" + mModuleName, StringUtil.pathToMethodName(mModuleName) + type+ ".kt");
  75. break;
  76. case Layout:
  77. content= readTemplateFile("TemplateLayout.txt");
  78. String layoutPath=StringUtil.pathExtractDirPath(basePath,"main");
  79. if(!layoutPath.isEmpty()){
  80. layoutPath+="res/layout";
  81. }
  82. String layoutContent="";
  83. if(mType==0) {
  84. layoutContent= readTemplateFile("TemplateLayoutTitle.txt");
  85. content=content.replace("$content$",layoutContent);
  86. FileUtil.writeToFile(content, layoutPath, "activity_" + mModuleName + ".xml");
  87. }
  88. else{
  89. content=content.replace("$content$","");
  90. FileUtil.writeToFile(content, layoutPath, "fragment_" + mModuleName + ".xml");
  91. }
  92. break;
  93. case AndroidManifest:
  94. content= readTemplateFile("TemplateAndroidManifest.txt");
  95. content=dealAndroidMainifestTemplateContent(content);
  96. writeManifest(content,"AndroidManifest.xml");
  97. break;
  98. }
  99. }
  100. /**
  101. * 往androidManifest中写入新增的Android
  102. */
  103. private void writeManifest(String content,String path){
  104. String mainPath=StringUtil.pathExtractDirPath(basePath,"main");
  105. if(!mainPath.isEmpty()){
  106. mainPath+=path;
  107. }
  108. if(FileUtil.isFileExists(mainPath)) {
  109. String mainifestContent = FileUtil.readProjectFile(mainPath);
  110. mainifestContent = mainifestContent.replace("</application>", content + "\n </application>");
  111. FileUtil.writeToFile(mainifestContent, mainPath, "");
  112. }
  113. }
  114. /**
  115. * 读取文件
  116. * @param fileName
  117. * @return
  118. */
  119. private String readTemplateFile(String fileName){
  120. String content = FileUtil.readTemplateFile(this, "/Template/mvp/" + fileName);
  121. return content;
  122. }
  123. private String readFunctionTemplateFile(String fileName){
  124. String content = FileUtil.readTemplateFile(this, "/Template/mvp/functionTemplate/" + fileName);
  125. return content;
  126. }
  127. //替换Activity模板中字符
  128. private String dealActivityTemplateContent(String content){
  129. content = content.replace("$basePackageName$", packageName);
  130. content = content.replace("$name$", mModuleName);
  131. String[] packageNameList = packageName.split("\\.");
  132. String arouterName = packageNameList[packageNameList.length - 1];
  133. content = content.replace("$Arouter$", arouterName.toUpperCase());
  134. content=dealTemplateContent(content);
  135. return content;
  136. }
  137. //替换AndroidManifest模板中字符
  138. private String dealAndroidMainifestTemplateContent(String content){
  139. content = content.replace("$fileName$", StringUtil.pathToMethodName(mModuleName));
  140. String manPath=StringUtil.pathExtractDirPathLater(basePath,"page");
  141. manPath="."+ manPath.replace("/",".");
  142. content=content.replace("$package$",manPath);
  143. return content;
  144. }
  145. //默认替换模板中字符
  146. private String dealTemplateContent(String content) {
  147. content = content.replace("$packagename$", dirPackagename);
  148. content = content.replace("$intro$", mIntro);
  149. content = content.replace("$Author$", mAuthor);
  150. content = content.replace("$fileName$", StringUtil.pathToMethodName(mModuleName));
  151. return content;
  152. }
  153. /**
  154. * update用于判断该插件是否能使用
  155. * 在actionPerformed前执行,这里判断必须是main路径才能使用
  156. *
  157. * @param e
  158. */
  159. @Override
  160. public void update(@NotNull AnActionEvent e) {
  161. basePath = AppUtils.getSelectPath(e);
  162. String moduleStr = AppUtils.getModulePath(basePath);
  163. if (moduleStr.isEmpty()) {
  164. e.getPresentation().setEnabled(false);
  165. } else if (!AppUtils.isDirExist(basePath,"page")) {
  166. e.getPresentation().setEnabled(false);
  167. } else {
  168. packageName = AppUtils.getPackageName(moduleStr);
  169. dirPackagename = AppUtils.packageSuffix(basePath, packageName);
  170. String[] packs = packageName.split("\\.");
  171. mModuleDirName = packs[packs.length - 1];
  172. mModuleDirName = StringUtil.firstToUpperCase(mModuleDirName);
  173. }
  174. super.update(e);
  175. }
  176. }

其实就是获取路径,通过文件读写的方式写进去,如果已经存在,则使用$标记$的方式来把它替换掉,即可实现自动生成代码的方式。
这里只是简单的代码生成,还可以自动生成Retrofit+okhtt的接口代码,然后界面生成ViewModel并自动引入,自动调用的方式减少代码工作量。

二、配套的工具类

FileUtil.java
StringUtil.java
SystemUtil.java
AppUtils.java