diff --git a/LayoutCreator.jar b/LayoutCreator.jar new file mode 100644 index 0000000..0a1a714 Binary files /dev/null and b/LayoutCreator.jar differ diff --git a/src/utils/LayoutCreator.java b/src/utils/LayoutCreator.java index 7016e35..f500211 100644 --- a/src/utils/LayoutCreator.java +++ b/src/utils/LayoutCreator.java @@ -5,7 +5,6 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; -import com.intellij.psi.impl.source.tree.PsiWhiteSpaceImpl; import com.intellij.psi.search.EverythingGlobalScope; import entity.Element; import org.apache.http.util.TextUtils; @@ -25,6 +24,7 @@ public class LayoutCreator extends WriteCommandAction.Simple { protected String mLayoutFileName; protected String mFieldNamePrefix; protected boolean mCreateHolder; + public static final String ANDROID_RECYCLER_VIEW_VIEWHOLDER_CLASS = "android.support.v7.widget.RecyclerView.ViewHolder"; public LayoutCreator(PsiFile file, PsiClass clazz, String command, ArrayList elements, String layoutFileName, String fieldNamePrefix, boolean createHolder) { super(clazz.getProject(), command); @@ -59,17 +59,29 @@ public void run() throws Throwable { * Create ViewHolder for adapters with injections */ protected void generateAdapter() { + //remove old viewHolder method added by ZhangYiGe at 2017年1月9日17:41:13 + PsiClass[] psiClasses = mClass.getInnerClasses(); + for (PsiClass psiClass : psiClasses) { + if(psiClass.getName().contains("ViewHolder")){ + psiClass.delete(); + } + } + //end + // view holder class String holderClassName = Utils.getViewHolderClassName(); StringBuilder holderBuilder = new StringBuilder(); // generator of view holder class StringBuilder generator = new StringBuilder(); + generator.append("public " + holderClassName + "(android.view.View rootView) {\n"); // rootView String rootViewName = "rootView"; holderBuilder.append("public " + "android.view.View " + rootViewName + ";\n"); + //call parent method added by zhangyige at 2016-12-22 + generator.append("super(rootView);\n"); generator.append("this." + rootViewName + " = " + rootViewName + ";\n"); for (Element element : mElements) { @@ -90,9 +102,22 @@ protected void generateAdapter() { PsiClass viewHolder = mFactory.createClassFromText(holderBuilder.toString(), mClass); viewHolder.setName(holderClassName); + //添加父类 added by ZhangYiGe at 2017年1月9日17:40:53 + PsiClass rvHolderClass = findClass(mProject, ANDROID_RECYCLER_VIEW_VIEWHOLDER_CLASS); + viewHolder.getExtendsList().add(mFactory.createClassReferenceElement(rvHolderClass)); + //end mClass.add(viewHolder); mClass.addBefore(mFactory.createKeyword("public", mClass), mClass.findInnerClassByName(holderClassName, true)); mClass.addBefore(mFactory.createKeyword("static", mClass), mClass.findInnerClassByName(holderClassName, true)); + + } + public PsiClass findClass(Project project, String className) { + JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); + PsiClass viewClass = psiFacade.findClass(className, new EverythingGlobalScope(project)); + if (viewClass == null) { + Utils.showErrorNotification(project, "Class not found: " + className); + } + return viewClass; } /** @@ -167,7 +192,7 @@ protected void generateFindViewById() { } } - if(!hasInitViewStatement && setContentViewStatement != null) { + if (!hasInitViewStatement && setContentViewStatement != null) { // Insert initView() after setContentView() onCreate.getBody().addAfter(mFactory.createStatementFromText("initView();", mClass), setContentViewStatement); } @@ -193,7 +218,7 @@ protected void generateFindViewById() { if (statement instanceof PsiReturnStatement) { returnStatement = (PsiReturnStatement) statement; returnValue = returnStatement.getReturnValue().getText(); - } else if(statement.getFirstChild() instanceof PsiMethodCallExpression) { + } else if (statement.getFirstChild() instanceof PsiMethodCallExpression) { PsiReferenceExpression methodExpression = ((PsiMethodCallExpression) statement.getFirstChild()).getMethodExpression(); if (methodExpression.getText().equals("initView")) { hasInitViewStatement = true; @@ -201,7 +226,7 @@ protected void generateFindViewById() { } } - if(!hasInitViewStatement && returnStatement != null && returnValue != null) { + if (!hasInitViewStatement && returnStatement != null && returnValue != null) { // Insert initView() before return statement onCreateView.getBody().addBefore(mFactory.createStatementFromText("initView(" + returnValue + ");", mClass), returnStatement); } @@ -251,7 +276,7 @@ private void generatorLayoutCode(String contextName, String findPre) { String idName = element.id; int index = idName.lastIndexOf("_"); String name = index == -1 ? idName : idName.substring(index + 1); - if(name.equals(idName)) { + if (name.equals(idName)) { name += "String"; } @@ -348,11 +373,11 @@ private void generatorLayoutCode(String contextName, String findPre) { // append non-repeated field PsiCodeBlock onClickMethodBody = onClickMethods[0].getBody(); - for(PsiElement element : onClickMethodBody.getChildren()) { - if(element instanceof PsiSwitchStatement) { + for (PsiElement element : onClickMethodBody.getChildren()) { + if (element instanceof PsiSwitchStatement) { PsiSwitchStatement switchStatement = (PsiSwitchStatement) element; PsiCodeBlock body = switchStatement.getBody(); - if(body != null) { + if (body != null) { for (Element clickableElement : clickableElements) { String caseStr = "case " + clickableElement.getFullID() + " :"; body.add(mFactory.createStatementFromText(caseStr, body));