From 5a56af922a4e0f5743073f4636ab64c6dc0bd4b9 Mon Sep 17 00:00:00 2001
From: Runt <qingingrunt2010@qq.com>
Date: Tue, 08 Jun 2021 02:59:40 +0000
Subject: [PATCH] json 数据bean类

---
 src/template/NormalClass                              |   13 
 src/com/runt/android/actions/CreateNormalResult.java  |  181 +++++++++++
 libs/json-20180813.jar                                |    0 
 src/com/runt/android/dialogs/DoubleInputDialog.form   |  110 ++++++
 src/com/runt/android/dialogs/DoubleInputDialog.java   |  100 ++++++
 src/com/runt/android/utils/Util.java                  |   93 +++++
 src/template/NormalResult                             |   21 +
 resources/META-INF/plugin.xml                         |   15 
 src/com/runt/android/actions/BaseAction.java          |  269 ++++++++++++++++
 src/com/runt/android/actions/BaseCreateApiResult.java |  113 +++++++
 10 files changed, 915 insertions(+), 0 deletions(-)

diff --git a/libs/json-20180813.jar b/libs/json-20180813.jar
new file mode 100644
index 0000000..592f08c
--- /dev/null
+++ b/libs/json-20180813.jar
Binary files differ
diff --git a/resources/META-INF/plugin.xml b/resources/META-INF/plugin.xml
index b9c9934..918dd71 100644
--- a/resources/META-INF/plugin.xml
+++ b/resources/META-INF/plugin.xml
@@ -27,6 +27,21 @@
 
   <actions>
     <!-- Add your actions here -->
+
+    <!-- Add your actions here -->
+    <group id="runtMethod"  text="Runt项目" description="Runt的android项目开发插件" popup="true">
+      <add-to-group group-id="NewGroup" anchor="first"/>
+
+      <!-- Add your actions here -->
+      <group id="BeanMethod"  text="数据bean类" description="数据bean类" popup="true">
+        <add-to-group group-id="runtMethod" anchor="first"/>
+        <action id="CreateNormalResult" class="com.runt.android.actions.CreateNormalResult" text="创建普通数据类"
+            description="创建普通数据类">
+          <keyboard-shortcut keymap="$default" first-keystroke="alt shift v"/>
+        </action>
+      </group>
+    </group>
+
   </actions>
 
 </idea-plugin>
\ No newline at end of file
diff --git a/src/com/runt/android/actions/BaseAction.java b/src/com/runt/android/actions/BaseAction.java
new file mode 100644
index 0000000..826e96a
--- /dev/null
+++ b/src/com/runt/android/actions/BaseAction.java
@@ -0,0 +1,269 @@
+package com.runt.android.actions;
+
+import com.intellij.openapi.actionSystem.AnAction;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+import java.io.BufferedWriter;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * My father is Object, ites purpose of
+ *
+ * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-10-27.
+ */
+
+public abstract  class BaseAction extends AnAction {
+
+    protected  final SimpleDateFormat dateFormat = new SimpleDateFormat   ("yyyy-MM-dd");
+
+    /**
+     * 生成参数变量代码
+     * @param args
+     * @return
+     */
+    public String getFields(String[] args, String keyWord){
+        StringBuilder fieldStr = new StringBuilder();
+        for(String field : args){
+            fieldStr.append(keyWord+" String "+humpName(field)+";\n");//创建参数变量,默认string
+        }
+        return fieldStr.toString();
+    }
+    /**
+     * 生成参数变量代码
+     * @param jsonStr json格式对象
+     * @return
+     */
+    public String getFields(String jsonStr  ){
+        return getFields(new JSONObject(jsonStr),"public");
+
+    }
+
+    /**
+     * 生成参数变量代码
+     * @param jsonStr json格式对象
+     * @param keyWord 关键字 public,private,protect等
+     * @return
+     */
+    public String getFields(String jsonStr , String keyWord){
+        return getFields(new JSONObject(jsonStr),keyWord);
+
+    }
+
+    public String getFields(JSONObject jsonObject ) {
+        return  getFields(jsonObject,"public");
+    }
+    public String getFields(JSONObject jsonObject , String keyWord){
+        StringBuilder fieldStr = new StringBuilder();
+        Map<String , Object> fieldMap =  getFieldNormalMap(jsonObject);
+        for(String clssName : fieldMap.keySet()){
+            if(fieldMap.get(clssName) instanceof List){
+                //创建参数变量,
+                fieldStr.append(keyWord+" " + (clssName.toLowerCase().equals("null") ? "String":clssName) + " "  );
+                List<String> fields= (List<String>) fieldMap.get(clssName);
+                for(String field : fields){
+                    if(fields.indexOf(field) == fields.size() -1 ){
+                        fieldStr.append( field + ";\n");
+                    }else{
+                        fieldStr.append( field + ",");
+                    }
+                }
+            }else {
+                //创建参数变量,
+                fieldStr.append(keyWord+" " + (clssName.toLowerCase().equals("null") ? "String":clssName) + " " + fieldMap.get(clssName) + " ;\n");
+            }
+        }
+        return fieldStr.toString();
+
+    }
+    /**
+     * 获取json中解析的普通变量集合
+     * @param jsonStr
+     * @return
+     */
+    protected Map<String,Object> getFieldNormalMap(String jsonStr){
+        return getFieldNormalMap(new JSONObject(jsonStr));
+    }
+
+    /**
+     * 获取json中解析的普通变量集合
+     * @param jsonObject
+     * @return
+     */
+    protected Map<String,Object> getFieldNormalMap(JSONObject jsonObject){
+        Map<String , Object> fieldMap = new HashMap<>();
+        for(String key: jsonObject.keySet()){
+            Object obj = jsonObject.get(key);
+            key = humpName(key);
+            String clssName = obj.getClass().getSimpleName();//声明变量的数据类型
+            if(obj instanceof  JSONArray){
+                clssName = "List";
+            }else if(obj instanceof JSONObject){
+                clssName = "Map";
+            }
+            //将key作为声明的变量名
+            if(fieldMap.get(clssName) == null){//没有同数据类型的变量
+                fieldMap.put(clssName,key);
+            }else if(fieldMap.get(clssName) instanceof List){//已有同数据类型的变量
+                List vlus = (List) fieldMap.get(clssName);
+                vlus.add(key);//追加
+            }else {//已有同数据类型的变量,转变为集合
+                List vlus = new ArrayList();
+                String field =  fieldMap.get(clssName).toString();
+                vlus.add(field);
+                vlus.add(key);//追加
+                fieldMap.replace(clssName,vlus);//替换为集合
+            }
+        }
+        return fieldMap;
+    }
+
+
+    /**
+     * 创建api返回类文件
+     */
+    protected void createApiFile(String filePath,String name, String fieldsStr,String packageName,String fileName,String[] fields ){
+        createApiFile(filePath,name,fieldsStr,packageName,fileName,fields,"");
+    }
+
+    /**
+     *
+     * 创建api返回类文件
+     * @param filePath      文件路径
+     * @param name          文件名称
+     * @param fieldsStr     声明变量字符串
+     * @param packageName   包名
+     * @param fileName      模版文件
+     * @param fields        变量名集合
+     * @param classStr      内部类代码字符
+     */
+    protected void createApiFile(String filePath,String name, String fieldsStr,String packageName,String fileName,String[] fields,String classStr){
+         createFile(filePath,name,fieldsStr,packageName,fileName,fields,classStr,"Result");
+    }
+
+    /**
+     * 创建数据类文件
+     * @param suffix    文件名后缀
+     */
+    protected void createFile(String filePath,String name, String fieldsStr,String packageName,String fileName,String[] fields,String classStr,String suffix){
+        try {
+            String desc = name;
+            if(name.indexOf(",")>-1){
+                desc = name.split(",")[1];
+                name = name.split(",")[0];
+            }
+            name = toUperFirst(name);
+            Properties prop = System.getProperties();
+            String template = getTemplateString(fileName)
+                    .replace("{desc}", desc)
+                    .replace("{date}", dateFormat.format(new Date()))
+                    .replace("{author}", prop.getProperty( "user.name" )+" "+prop.getProperty("os.name"))
+                    .replace("{fields}", fieldsStr)
+                    .replace("{name}", name)
+                    .replace("{class}",classStr)
+                    .replace("{package}",packageName)
+                    .replace("{toString}",getToString(name,fields));
+            File viewFile = new File(filePath, name+suffix+".java");
+            if (!viewFile.exists()) {
+                viewFile.createNewFile();
+            }
+            FileWriter fw = new FileWriter(viewFile.getAbsoluteFile());
+            BufferedWriter bw = new BufferedWriter(fw);
+            bw.write(template);
+            bw.close();
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+
+    }
+
+
+
+    /**
+     * 重写 toString
+     * @param name
+     * @param fields
+     * @return
+     */
+    protected String getToString(String name,String[] fields){
+        StringBuilder sb = new StringBuilder();
+        sb.append("@Override\n");
+        sb.append("public String toString() {\n");
+        sb.append("return  \""+name+"{\" + \n");
+        for(String field : fields){
+            sb.append(" \""+humpName(field)+"=\" + "+humpName(field)+(field.equals(fields[fields.length-1])?"+":"+\",\"+")+"\n");
+        }
+        sb.append("'}';\n");
+        sb.append("}\n");
+        return sb.toString();
+    }
+
+    /**
+     * 驼峰命名
+     * @param name
+     * @return
+     */
+    public String humpName(String name){
+        String[] strings = name.split("_");
+        StringBuilder sb = new StringBuilder();
+        sb.append(strings[0]);
+        for(int i = 1 ; i < strings.length ; i ++){
+            sb.append(toUperFirst(strings[i]));
+        }
+        return sb.toString();
+    }
+
+
+    /**
+     * 首字母大写
+     * @param name
+     * @return
+     */
+    public String toUperFirst(String name){
+        return name.substring(0,1).toUpperCase()+name.substring(1);
+    }
+
+
+    /**
+     * 获取模板字符串
+     */
+    public String getTemplateString(String fileName) {
+        InputStream in = null;
+        in = this.getClass().getResourceAsStream("/template/" + fileName);
+        String content = "";
+        try {
+            content = new String(readStream(in));
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return content;
+    }
+    private byte[] readStream(InputStream inputStream) throws IOException {
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        byte[] buffer = new byte[1024];
+        int len;
+        try {
+            while ((len = inputStream.read(buffer)) != -1){
+                outputStream.write(buffer, 0, len);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }finally {
+            outputStream.close();
+            inputStream.close();
+        }
+        return outputStream.toByteArray();
+    }
+}
diff --git a/src/com/runt/android/actions/BaseCreateApiResult.java b/src/com/runt/android/actions/BaseCreateApiResult.java
new file mode 100644
index 0000000..f895c34
--- /dev/null
+++ b/src/com/runt/android/actions/BaseCreateApiResult.java
@@ -0,0 +1,113 @@
+package com.runt.android.actions;
+
+import com.intellij.ide.IdeView;
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.actionSystem.LangDataKeys;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.wm.WindowManager;
+import com.intellij.psi.PsiDirectory;
+import com.runt.android.dialogs.DoubleInputDialog;
+import com.runt.android.utils.Util;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * My father is Object, ites purpose of
+ *
+ * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-10-28.
+ */
+
+public abstract class BaseCreateApiResult extends BaseAction {
+
+    @Override
+    public void actionPerformed(AnActionEvent actionEvent) {
+        Project project = actionEvent.getProject();
+        //选择的路径
+        IdeView ideView = actionEvent.getRequiredData(LangDataKeys.IDE_VIEW);
+        PsiDirectory directory = ideView.getOrChooseDirectory();
+        String packageName = Util.getPackageDir(project,directory.toString());
+        String filePath = directory.toString().split("PsiDirectory:")[1];//选择的路径
+        //根据包名截取末尾路径
+        String path = filePath.substring(filePath.indexOf(packageName.replace(".","\\"))+packageName.replace(".","\\").length());
+        //转换并合并成包名
+        final String packageN = packageName+ path.replace("\\",".");
+        // TODO: insert action logic here
+        DoubleInputDialog dialog = createDoubleDialog(filePath,packageN,actionEvent);
+        dialog.pack();
+        //设置对话框跟随当前windows窗口
+        dialog.setLocationRelativeTo(WindowManager.getInstance().getFrame(project));
+        dialog.setVisible(true);
+    }
+
+    /**
+     * 创建弹框
+     * @param filePath
+     * @param packageN
+     * @param actionEvent
+     * @return
+     */
+    protected DoubleInputDialog createDoubleDialog(String filePath,String packageN,AnActionEvent actionEvent){
+       return new DoubleInputDialog(new DoubleInputDialog.DialogListener() {
+            @Override
+            public void Ok(String[] object) {
+
+                //弹框确认
+                /*Messages.showMessageDialog(project,packageN+" "+object[1],
+                        "文件为空",
+                        Messages.getInformationIcon());*/
+                //去除换行
+                object[1] =  object[1].replace("\"\n","\"")
+                        .replace(",\n",",")
+                        .replace("\n,",",")
+                        .replace("\n}","}")
+                        .replace("}\n","}")
+                        .replace("{\n","{");
+                if(object[1].indexOf("{")==0){//是否为json字符串
+                    createResultFile(filePath, packageN,object);
+                }else{
+                    createResultFile(filePath,object[0],getFields(object[1].split(","),"public"),packageN,object[1].split(","));
+                }
+                actionEvent.getProject().getBaseDir().refresh(false, true);//刷新项目
+            }
+
+            @Override
+            public void cancel(Object object) {
+
+            }
+        });
+    }
+
+
+
+
+    /**
+     *  创建文件
+     * @param filePath      文件路径
+     */
+    public void createResultFile(String filePath,  String packageName, String[] object){
+
+        Map<String, Object> fieldMap = getFieldNormalMap(object[1]);
+        List<String> list = new ArrayList<>();
+        for(String key: fieldMap.keySet()){
+            if(fieldMap.get(key) instanceof List){
+                list.addAll((List)fieldMap.get(key));
+            }else{
+                list.add(fieldMap.get(key).toString());
+            }
+        }
+        createResultFile(filePath,object[0],getFields(object[1],"public"),packageName,list.toArray(new String[0]));
+    }
+
+    /**
+     *  创建文件
+     * @param filePath      文件路径
+     * @param name          文件名称
+     * @param fieldsStr     声明变量代码
+     * @param packageName   包名
+     * @param fields        变量名称集合
+     */
+    public abstract void createResultFile(String filePath, String name, String fieldsStr, String packageName, String[] fields );
+
+}
\ No newline at end of file
diff --git a/src/com/runt/android/actions/CreateNormalResult.java b/src/com/runt/android/actions/CreateNormalResult.java
new file mode 100644
index 0000000..6bcde35
--- /dev/null
+++ b/src/com/runt/android/actions/CreateNormalResult.java
@@ -0,0 +1,181 @@
+package com.runt.android.actions;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * My father is Object, ites purpose of
+ *
+ * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-11-10.
+ */
+
+public class CreateNormalResult extends BaseCreateApiResult {
+
+
+    /**
+     * 获取json中解析的变量集合
+     * @param jsonStr
+     * @return
+     */
+    @Override
+    protected Map<String,Object> getFieldNormalMap(String jsonStr){
+        return getFieldNormalMap(new JSONObject(jsonStr));
+    }
+
+
+    /**
+     * 获取json中解析的变量集合
+     * @param jsonObject
+     * @return
+     */
+    @Override
+    protected Map<String,Object> getFieldNormalMap(JSONObject jsonObject){
+        Map<String , Object> fieldMap = new HashMap<>();
+        for(String key: jsonObject.keySet()){
+            Object obj = jsonObject.get(key);
+            key = humpName(key);//驼峰命名
+            String clssName = obj.getClass().getSimpleName();//声明变量的数据类型
+            if(obj instanceof JSONArray){
+                Object val = ((JSONArray)obj).get(0);
+                if(val instanceof JSONObject){
+                    //将声明的变量定义为变量数据类型
+                    String name = replaseS(key);//去复数
+                    clssName ="java.util.List<"+toUperFirst(name)+">";
+                }else {
+                    clssName ="java.util.List<"+val.getClass().getSimpleName()+">";
+                }
+            }else if(obj instanceof JSONObject){
+                //将声明的变量定义为变量数据类型
+                clssName = toUperFirst(key);
+            }
+            //将key作为声明的变量名
+            if(fieldMap.get(clssName) == null){//没有同数据类型的变量
+                fieldMap.put(clssName,key);
+            }else if(fieldMap.get(clssName) instanceof List){//已有同数据类型的变量
+                List vlus = (List) fieldMap.get(clssName);
+                vlus.add(key);//追加
+            }else {//已有同数据类型的变量,转变为集合
+                List vlus = new ArrayList();
+                String field =  fieldMap.get(clssName).toString();
+                vlus.add(field);
+                vlus.add(key);//追加
+                fieldMap.replace(clssName,vlus);//替换为集合
+            }
+        }
+        return fieldMap;
+    }
+
+
+    protected String getClassStr (String json){
+        return getClassStr(new JSONObject(json));
+
+    }
+
+    /**
+     * 遍历json 创建内部类代码
+     * @param jsonObject
+     * @return
+     */
+    protected String getClassStr ( JSONObject jsonObject){
+        StringBuilder sb = new StringBuilder();
+        for(String key: jsonObject.keySet()){//遍历
+            Object obj = jsonObject.get(key);
+            if(obj instanceof JSONArray){
+                Object val = ((JSONArray)obj).get(0);
+                if(val instanceof JSONObject){//判断值是否为object
+                    String name = replaseS(key);//去复数
+                    sb.append(getClassStr(name,(JSONObject)val));//创建类代码
+                }
+            }else if(obj instanceof JSONObject){//判断值是否为object
+                String name = replaseS(key);//去复数
+                sb.append(getClassStr(name,(JSONObject)obj));//创建类代码
+            }
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 生成内部类
+     * @param name
+     * @param jsonObject
+     * @return
+     */
+    private String getClassStr(String name,JSONObject jsonObject){
+
+        Map<String, Object> fieldMap = getFieldNormalMap(jsonObject);
+        List<String> list = new ArrayList<>();
+        for(String key: fieldMap.keySet()){
+            if(fieldMap.get(key) instanceof List){
+                list.addAll((List)fieldMap.get(key));
+            }else{
+                list.add(fieldMap.get(key).toString());
+            }
+        }
+        String classStr = getClassStr(jsonObject);//是否含有内部类
+
+        name = toUperFirst(name);
+        String template = getTemplateString("NormalClass")
+                .replace("{fields}", getFields(jsonObject))//替换写入声明变量
+                .replace("{name}", name)//类名
+                .replace("{class}",classStr)//内部类
+                .replace("{toString}",getToString(name,list.toArray(new String[0])));
+        return  template;
+    }
+
+    @Override
+    public void createResultFile(String filePath, String packageName, String[] object) {
+
+        Map<String, Object> fieldMap = getFieldNormalMap(object[1]);
+        List<String> list = new ArrayList<>();
+        for(String key: fieldMap.keySet()){
+            if(fieldMap.get(key) instanceof List){
+                list.addAll((List)fieldMap.get(key));
+            }else{
+                list.add(fieldMap.get(key).toString());
+            }
+        }
+        createFile(filePath,object[0],getFields(object[1]),packageName,"NormalResult",list.toArray(new String[0]),getClassStr(object[1]),"");
+
+    }
+
+    @Override
+    public void createResultFile(String filePath, String name, String fieldsStr, String packageName, String[] fields) {
+        createFile(filePath,name,fieldsStr,packageName,"NormalResult",fields,"","");
+    }
+
+
+    /**
+     * 去掉复数形式
+     * @param str
+     * @return
+     */
+    public static String replaseS(String str){
+        if( replaseS(str,"ves")){
+            return  str.replace("ves","f");
+
+        }else  if( replaseS(str,"ies")){
+            return  str.replace("ies","y");
+
+        }else  if( replaseS(str,"es")){
+            return  str.replace("es","");
+
+        }else  if( replaseS(str,"s" )  ){
+            return  str.replace("s","");
+
+        }else  if( replaseS(str,"men")){
+            return  str.replace("men","man");
+        }
+        return  str;
+    }
+    public static boolean replaseS(String str,String Sstr ){
+        if(str.lastIndexOf(Sstr) == str.length()-Sstr.length()){
+            return true;
+        }
+        return false;
+    }
+}
diff --git a/src/com/runt/android/dialogs/DoubleInputDialog.form b/src/com/runt/android/dialogs/DoubleInputDialog.form
new file mode 100644
index 0000000..d699fe3
--- /dev/null
+++ b/src/com/runt/android/dialogs/DoubleInputDialog.form
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.zhenfei.plugin.dialogs.DoubleInputDialog">
+  <grid id="cbd77" binding="contentPane" layout-manager="GridLayoutManager" row-count="2" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+    <margin top="10" left="10" bottom="10" right="10"/>
+    <constraints>
+      <xy x="48" y="54" width="436" height="297"/>
+    </constraints>
+    <properties/>
+    <border type="none"/>
+    <children>
+      <grid id="94766" layout-manager="GridLayoutManager" row-count="1" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+        <margin top="0" left="0" bottom="0" right="0"/>
+        <constraints>
+          <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="1" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
+        </constraints>
+        <properties/>
+        <border type="none"/>
+        <children>
+          <hspacer id="98af6">
+            <constraints>
+              <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
+            </constraints>
+          </hspacer>
+          <grid id="9538f" layout-manager="GridLayoutManager" row-count="1" column-count="2" same-size-horizontally="true" same-size-vertically="false" hgap="-1" vgap="-1">
+            <margin top="0" left="0" bottom="0" right="0"/>
+            <constraints>
+              <grid row="0" column="1" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
+            </constraints>
+            <properties/>
+            <border type="none"/>
+            <children>
+              <component id="e7465" class="javax.swing.JButton" binding="buttonOK">
+                <constraints>
+                  <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
+                </constraints>
+                <properties>
+                  <text value="OK"/>
+                </properties>
+              </component>
+              <component id="5723f" class="javax.swing.JButton" binding="buttonCancel">
+                <constraints>
+                  <grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
+                </constraints>
+                <properties>
+                  <text value="Cancel"/>
+                </properties>
+              </component>
+            </children>
+          </grid>
+        </children>
+      </grid>
+      <grid id="e3588" layout-manager="GridLayoutManager" row-count="5" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+        <margin top="0" left="0" bottom="0" right="0"/>
+        <constraints>
+          <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
+        </constraints>
+        <properties/>
+        <border type="none"/>
+        <children>
+          <vspacer id="8d275">
+            <constraints>
+              <grid row="0" column="0" row-span="5" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
+            </constraints>
+          </vspacer>
+          <component id="d4082" class="javax.swing.JTextField" binding="textField1" default-binding="true">
+            <constraints>
+              <grid row="1" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
+                <preferred-size width="150" height="-1"/>
+              </grid>
+            </constraints>
+            <properties>
+              <text value=""/>
+            </properties>
+          </component>
+          <component id="f7553" class="javax.swing.JLabel">
+            <constraints>
+              <grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+            </constraints>
+            <properties>
+              <text value="声明类名称"/>
+            </properties>
+          </component>
+          <component id="6beb2" class="javax.swing.JLabel">
+            <constraints>
+              <grid row="2" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+            </constraints>
+            <properties>
+              <text value="参数声明(json数据或英文“,”分隔)"/>
+            </properties>
+          </component>
+          <scrollpane id="5cadd">
+            <constraints>
+              <grid row="3" column="1" row-span="2" col-span="1" vsize-policy="7" hsize-policy="7" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
+            </constraints>
+            <properties/>
+            <border type="none"/>
+            <children>
+              <component id="9f376" class="javax.swing.JTextArea" binding="textArea1" default-binding="true">
+                <constraints/>
+                <properties>
+                  <text value=""/>
+                </properties>
+              </component>
+            </children>
+          </scrollpane>
+        </children>
+      </grid>
+    </children>
+  </grid>
+</form>
diff --git a/src/com/runt/android/dialogs/DoubleInputDialog.java b/src/com/runt/android/dialogs/DoubleInputDialog.java
new file mode 100644
index 0000000..b7b4eba
--- /dev/null
+++ b/src/com/runt/android/dialogs/DoubleInputDialog.java
@@ -0,0 +1,100 @@
+package com.runt.android.dialogs;
+
+import java.awt.Color;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JDialog;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import javax.swing.JTextField;
+import javax.swing.KeyStroke;
+
+/**
+ * 输入弹框
+ */
+public class DoubleInputDialog extends JDialog {
+    private JPanel contentPane;
+    private JButton buttonOK;
+    private JButton buttonCancel;
+    private JTextField textField1;
+    private JTextArea textArea1;
+    DialogListener listener;
+
+    public DoubleInputDialog(DialogListener listener){
+        this();
+        this.listener = listener;
+    }
+
+    public DoubleInputDialog() {
+        setContentPane(contentPane);
+        setModal(true);
+        getRootPane().setDefaultButton(buttonOK);
+        buttonOK.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                onOK();
+            }
+        });
+
+        buttonCancel.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                onCancel();
+            }
+        });
+
+        // call onCancel() when cross is clicked
+        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
+        addWindowListener(new WindowAdapter() {
+            public void windowClosing(WindowEvent e) {
+                onCancel();
+            }
+        });
+        textArea1.setSize(300,400);
+        textArea1.setRows(10);
+        textArea1.setColumns(11);
+        textArea1.setTabSize(4);
+        textArea1.setSelectedTextColor(Color.RED);
+        textArea1.setSelectionColor(Color.BLACK);
+        textArea1.setLineWrap(true);        //激活自动换行功能
+        //textAreaOutput.setEnabled(false);
+        textArea1.setWrapStyleWord(true);
+
+        contentPane.registerKeyboardAction(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                onCancel();
+            }
+        }, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
+    }
+
+    private void onOK() {
+        // add your code here
+        dispose();
+        if(listener != null){
+            listener.Ok(new String[]{textField1.getText(),textArea1.getText()});
+        }
+    }
+
+    private void onCancel() {
+        // add your code here if necessary
+        dispose();
+    }
+
+    public interface  DialogListener{
+
+        public void Ok(String[] object);
+
+        public void cancel(Object object);
+
+    }
+    public static void main(String[] args) {
+        DoubleInputDialog dialog = new DoubleInputDialog();
+        dialog.pack();
+        dialog.setVisible(true);
+        System.exit(0);
+    }
+}
diff --git a/src/com/runt/android/utils/Util.java b/src/com/runt/android/utils/Util.java
new file mode 100644
index 0000000..d88ff71
--- /dev/null
+++ b/src/com/runt/android/utils/Util.java
@@ -0,0 +1,93 @@
+package com.runt.android.utils;
+
+import com.intellij.openapi.project.Project;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+/**
+ * Created by 赵振良 on 2020/8/6
+ */
+public class Util {
+    private static Pattern humpPattern = Pattern.compile("[A-Z]");
+
+    /**
+     * 获取路径名
+     */
+    public static String getPackageDir(Project project, String dir) {
+        String packageName = "";
+        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+        try {
+            DocumentBuilder db = dbf.newDocumentBuilder();
+            Document doc = db.parse(project.getBasePath() + "/app/src/main/AndroidManifest.xml");
+            NodeList nodeList = doc.getElementsByTagName("manifest");
+            for (int i = 0; i < nodeList.getLength(); i++) {
+                Node node = nodeList.item(i);
+                Element element = (Element) node;
+                packageName = element.getAttribute("package");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        String split = packageName.replace(".","/");
+        String dirs[] = dir.split(split);
+        if(dirs.length < 2){
+            return packageName;
+        }else{
+            String resultPackage = packageName+(dirs[1].replace("/","."));
+            return resultPackage;
+        }
+    }
+
+    /**
+     * 获取包名
+     * @param project
+     * @return
+     */
+    public static String getPackageId(Project project){
+        String packageName = "";
+        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+        try {
+            DocumentBuilder db = dbf.newDocumentBuilder();
+            Document doc = db.parse(project.getBasePath() + "/app/src/main/AndroidManifest.xml");
+            NodeList nodeList = doc.getElementsByTagName("manifest");
+            for (int i = 0; i < nodeList.getLength(); i++) {
+                Node node = nodeList.item(i);
+                Element element = (Element) node;
+                packageName = element.getAttribute("package");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return packageName;
+    }
+
+    /**
+     * 驼峰命名转下划线命名
+     * @param str
+     * @return
+     */
+    public static String humpToLine(String str) {
+        Matcher matcher = humpPattern.matcher(str);
+        StringBuffer sb = new StringBuffer();
+        while (matcher.find()) {
+            matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
+        }
+        matcher.appendTail(sb);
+        String result = sb.toString();
+        int length = result.length();
+        if(result.startsWith("_")){
+            result = result.substring(1,length);
+        }
+        return result;
+    }
+}
\ No newline at end of file
diff --git a/src/template/NormalClass b/src/template/NormalClass
new file mode 100644
index 0000000..1f1aa8c
--- /dev/null
+++ b/src/template/NormalClass
@@ -0,0 +1,13 @@
+public class {name} {
+
+    //以下为声明的参数
+    {fields}
+
+
+    {toString}
+
+
+    {class}
+
+
+}
diff --git a/src/template/NormalResult b/src/template/NormalResult
new file mode 100644
index 0000000..fd6cd1a
--- /dev/null
+++ b/src/template/NormalResult
@@ -0,0 +1,21 @@
+package {package};
+
+
+
+
+/**
+ * {desc} 说明
+ * Created by {author} on {date}
+ */
+public class {name}  {
+
+    //以下为声明的参数
+    {fields}
+
+
+    {toString}
+
+
+    {class}
+
+}

--
Gitblit v1.9.1