summaryrefslogtreecommitdiff
path: root/src/plugins/android.codeutils/src/com/motorola/studio/android/model/java/ActivityClass.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/android.codeutils/src/com/motorola/studio/android/model/java/ActivityClass.java')
-rw-r--r--src/plugins/android.codeutils/src/com/motorola/studio/android/model/java/ActivityClass.java223
1 files changed, 223 insertions, 0 deletions
diff --git a/src/plugins/android.codeutils/src/com/motorola/studio/android/model/java/ActivityClass.java b/src/plugins/android.codeutils/src/com/motorola/studio/android/model/java/ActivityClass.java
new file mode 100644
index 0000000..fd7a5ed
--- /dev/null
+++ b/src/plugins/android.codeutils/src/com/motorola/studio/android/model/java/ActivityClass.java
@@ -0,0 +1,223 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.motorola.studio.android.model.java;
+
+import org.eclipse.jdt.core.dom.AST;
+import org.eclipse.jdt.core.dom.ASTNode;
+import org.eclipse.jdt.core.dom.ASTParser;
+import org.eclipse.jdt.core.dom.Block;
+import org.eclipse.jdt.core.dom.CompilationUnit;
+import org.eclipse.jdt.core.dom.ImportDeclaration;
+import org.eclipse.jdt.core.dom.MethodDeclaration;
+import org.eclipse.jdt.core.dom.Modifier.ModifierKeyword;
+import org.eclipse.jdt.core.dom.PrimitiveType;
+import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
+import org.eclipse.jdt.core.dom.SuperMethodInvocation;
+import org.eclipse.jdt.core.dom.Type;
+import org.eclipse.jdt.core.dom.TypeDeclaration;
+import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.text.edits.MalformedTreeException;
+import org.eclipse.text.edits.TextEdit;
+
+import com.motorola.studio.android.codeutils.i18n.CodeUtilsNLS;
+import com.motorola.studio.android.common.exception.AndroidException;
+import com.motorola.studio.android.common.log.StudioLogger;
+
+/**
+ * Class used to create an Android Activity building block class
+ */
+public class ActivityClass extends JavaClass
+{
+ public static final String ACTIVITY_SUPERCLASS = "android.app.Activity";
+
+ private static final String[] BUNDLE_CLASS = getFQNAsArray("android.os.Bundle");
+
+ protected static final String ONCREATE_METHOD_NAME = "onCreate";
+
+ protected static final String ONSTART_METHOD_NAME = "onStart";
+
+ private ASTRewrite rewrite = null;
+
+ /**
+ * The constructor
+ *
+ * @param className The simple class name
+ * @param packageName The full-qualified class package name
+ * @param addOnStart If true, adds the OnStart method to the activity class
+ */
+ public ActivityClass(String className, String packageName, boolean addOnStart)
+ {
+ super(className, packageName, ACTIVITY_SUPERCLASS);
+ addBasicActivityInfo();
+
+ if (addOnStart)
+ {
+ addOnStartMethod();
+ }
+ }
+
+ /**
+ * Adds basic information to the activity class
+ */
+ private void addBasicActivityInfo()
+ {
+ addOnCreateMethod();
+
+ // Adds JavaDoc to elements
+ addComment(classDecl, CodeUtilsNLS.MODEL_ActivityClass_ActivityDescription);
+ }
+
+ /**
+ * Adds the onCreate method to the activity class
+ */
+ @SuppressWarnings("unchecked")
+ private void addOnCreateMethod()
+ {
+ // Adds import for Bundle
+ ImportDeclaration intentImport = ast.newImportDeclaration();
+ intentImport.setName(ast.newName(BUNDLE_CLASS));
+ compUnit.imports().add(intentImport);
+
+ MethodDeclaration onCreateMethod = ast.newMethodDeclaration();
+ onCreateMethod.modifiers().add(ast.newModifier(ModifierKeyword.PROTECTED_KEYWORD));
+ onCreateMethod.setReturnType2(ast.newPrimitiveType(PrimitiveType.VOID));
+ onCreateMethod.setName(ast.newSimpleName(ONCREATE_METHOD_NAME));
+ addMethodParameter(onCreateMethod, "savedInstanceState",
+ ast.newSimpleType(ast.newSimpleName(getName(BUNDLE_CLASS))));
+ addEmptyBlock(onCreateMethod);
+ addSuperInvocation(onCreateMethod);
+ classDecl.bodyDeclarations().add(onCreateMethod);
+
+ // Adds JavaDoc to the method
+ addComment(onCreateMethod, CodeUtilsNLS.MODEL_ActivityClass_OnCreateMethodDescription);
+ addMethodReference(onCreateMethod, ACTIVITY_SUPERCLASS, ONCREATE_METHOD_NAME, new Type[]
+ {
+ ast.newSimpleType(ast.newSimpleName(getName(BUNDLE_CLASS)))
+ });
+ }
+
+ /**
+ * Adds the onStart method to the activity class
+ */
+ @SuppressWarnings("unchecked")
+ private void addOnStartMethod()
+ {
+ MethodDeclaration onStartMethod = ast.newMethodDeclaration();
+ onStartMethod.modifiers().add(ast.newModifier(ModifierKeyword.PROTECTED_KEYWORD));
+ onStartMethod.setReturnType2(ast.newPrimitiveType(PrimitiveType.VOID));
+ onStartMethod.setName(ast.newSimpleName(ONSTART_METHOD_NAME));
+ addEmptyBlock(onStartMethod);
+ addSuperInvocation(onStartMethod);
+ classDecl.bodyDeclarations().add(onStartMethod);
+
+ // Adds JavaDoc to the method
+ addComment(onStartMethod, CodeUtilsNLS.MODEL_ActivityClass_OnStartMethodDescription);
+ addMethodReference(onStartMethod, ACTIVITY_SUPERCLASS, ONSTART_METHOD_NAME, null);
+ }
+
+ /**
+ * Adds a "super.method(arguments...)" statement inside the given method body
+ *
+ * @param method The method declaration
+ */
+ @SuppressWarnings("unchecked")
+ private void addSuperInvocation(MethodDeclaration method)
+ {
+ SuperMethodInvocation superInv = ast.newSuperMethodInvocation();
+ superInv.setName(ast.newSimpleName(method.getName().toString()));
+ for (Object param : method.parameters())
+ {
+ if (param instanceof SingleVariableDeclaration)
+ {
+ SingleVariableDeclaration vd = (SingleVariableDeclaration) param;
+ String varName = vd.getName().toString();
+ superInv.arguments().add(ast.newSimpleName(varName));
+ }
+ }
+ method.getBody().statements().add(ast.newExpressionStatement(superInv));
+ }
+
+ /* (non-Javadoc)
+ * @see com.motorola.studio.android.model.java.JavaClass#addComments()
+ */
+ @Override
+ protected void addComments() throws AndroidException
+ {
+ ASTNode todoComment;
+
+ ASTParser parser = ASTParser.newParser(AST.JLS3);
+ parser.setSource(document.get().toCharArray());
+
+ compUnit = (CompilationUnit) parser.createAST(null);
+ ast = compUnit.getAST();
+ rewrite = ASTRewrite.create(ast);
+
+ todoComment =
+ rewrite.createStringPlaceholder(CodeUtilsNLS.MODEL_Common_ToDoPutYourCodeHere,
+ ASTNode.EMPTY_STATEMENT);
+
+ TypeDeclaration activityClass = (TypeDeclaration) compUnit.types().get(0);
+ MethodDeclaration method;
+ Block block;
+
+ // Adds the Override annotation and ToDo comment to all overridden methods
+ for (int i = 0; i < activityClass.bodyDeclarations().size(); i++)
+ {
+ method = (MethodDeclaration) activityClass.bodyDeclarations().get(i);
+
+ // Adds the Override annotation
+ rewrite.getListRewrite(method, method.getModifiersProperty()).insertFirst(
+ OVERRIDE_ANNOTATION, null);
+
+ // Adds the ToDo comment
+ block = method.getBody();
+ rewrite.getListRewrite(block, Block.STATEMENTS_PROPERTY).insertLast(todoComment, null);
+ }
+
+ try
+ {
+ // Writes the modifications
+ TextEdit modifications = rewrite.rewriteAST(document, null);
+ modifications.apply(document);
+ }
+ catch (IllegalArgumentException e)
+ {
+ String errMsg =
+ NLS.bind(CodeUtilsNLS.EXC_JavaClass_ErrorApplyingCommentsToCode, className);
+
+ StudioLogger.error(ActivityClass.class, errMsg, e);
+ throw new AndroidException(errMsg);
+ }
+ catch (MalformedTreeException e)
+ {
+ String errMsg =
+ NLS.bind(CodeUtilsNLS.EXC_JavaClass_ErrorApplyingCommentsToCode, className);
+
+ StudioLogger.error(ActivityClass.class, errMsg, e);
+ throw new AndroidException(errMsg);
+ }
+ catch (BadLocationException e)
+ {
+ String errMsg =
+ NLS.bind(CodeUtilsNLS.EXC_JavaClass_ErrorApplyingCommentsToCode, className);
+
+ StudioLogger.error(ActivityClass.class, errMsg, e);
+ throw new AndroidException(errMsg);
+ }
+ }
+}