/* | |
* 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.generateviewbylayout.codegenerators; | |
import org.eclipse.core.resources.IFile; | |
import org.eclipse.core.runtime.IProgressMonitor; | |
import org.eclipse.core.runtime.IStatus; | |
import org.eclipse.core.runtime.SubMonitor; | |
import org.eclipse.jdt.core.JavaModelException; | |
import org.eclipse.jdt.core.dom.MethodDeclaration; | |
import org.eclipse.jdt.core.dom.MethodInvocation; | |
import org.eclipse.jdt.core.dom.SimpleName; | |
import org.eclipse.jdt.core.dom.TypeDeclaration; | |
import com.motorola.studio.android.codeutils.i18n.CodeUtilsNLS; | |
import com.motorola.studio.android.common.IAndroidConstants; | |
import com.motorola.studio.android.common.utilities.AndroidUtils; | |
import com.motorola.studio.android.generatecode.JDTUtils; | |
import com.motorola.studio.android.generateviewbylayout.JavaViewBasedOnLayoutModifierConstants; | |
import com.motorola.studio.android.generateviewbylayout.model.CodeGeneratorDataBasedOnLayout; | |
import com.motorola.studio.android.generateviewbylayout.model.LayoutNode; | |
/** | |
* Responsible to create findViewById statements | |
*/ | |
public class FindViewByIdCodeGenerator extends AbstractLayoutCodeGenerator | |
{ | |
protected IFile javaFile; | |
/** | |
* @param codeGeneratorData | |
* @param onCreateDeclaration | |
* @param typeDeclaration | |
* @param javaFile file used to get API version number (it is necessary to differentiate between Activity or Fragment in the findViewById method invocation) | |
*/ | |
public FindViewByIdCodeGenerator(CodeGeneratorDataBasedOnLayout codeGeneratorData, | |
MethodDeclaration onCreateDeclaration, TypeDeclaration typeDeclaration, IFile javaFile) | |
{ | |
super(codeGeneratorData, onCreateDeclaration, typeDeclaration); | |
this.javaFile = javaFile; | |
} | |
@Override | |
public void generateCode(IProgressMonitor monitor) throws JavaModelException | |
{ | |
addFindByIdStatement(monitor); | |
} | |
/** | |
* Field Assigment to find item inside layout xml | |
* | |
* <br> | |
* GENERATED_CODE_FORMAT: | |
* <br> | |
* $GUI_ID = $GUI_TYPE findViewById(R.id.$GUI_ID); | |
*/ | |
private void addFindByIdStatement(IProgressMonitor monitor) throws JavaModelException | |
{ | |
SubMonitor subMonitor = SubMonitor.convert(monitor); | |
subMonitor.beginTask(CodeUtilsNLS.JavaViewBasedOnLayoutModifier_AddingFindingViewById, | |
codeGeneratorData.getGuiItems().size()); | |
/* AST To be written | |
* ExpressionStatement | |
Assignment | |
leftHand SimpleName(button1) | |
Assignment.Operator = | |
rightHand CastExpression | |
expression MethodInvocation | |
arguments = QualifiedName(R.id.button1) | |
SimpleName = findViewById | |
type | |
SimpleType (Button) | |
*/ | |
for (LayoutNode node : codeGeneratorData.getGuiItems()) | |
{ | |
if ((node.getNodeId() != null) && node.shouldInsertCode()) | |
{ | |
boolean containsFindViewByIdDeclaration = checkIfFindViewByIdAlreadyDeclared(node); | |
if (!containsFindViewByIdDeclaration) | |
{ | |
//avoid to call method twice | |
if (!node.isFragmentPlaceholder()) | |
{ | |
//not fragment | |
addAssignmentStatement(node, null, | |
JavaViewBasedOnLayoutModifierConstants.FIND_VIEW_BY_ID); | |
} | |
else | |
{ | |
//is fragment placeholder | |
MethodInvocation optionalInvocation = | |
onCreateDeclaration.getAST().newMethodInvocation(); | |
String methodName = null; | |
try | |
{ | |
if ((AndroidUtils.getApiVersionNumberForProject(javaFile.getProject()) < 11) | |
&& JDTUtils.isCompatibilityFragmentActivitySubclass(javaFile)) | |
{ | |
//if compatibility package (before 3.0) | |
methodName = | |
JavaViewBasedOnLayoutModifierConstants.GET_SUPPORT_FRAGMENT_MANAGER; | |
} | |
else if ((AndroidUtils.getApiVersionNumberForProject(javaFile | |
.getProject()) < IAndroidConstants.API_LEVEL_FOR_PLATFORM_VERSION_3_0_0) | |
&& !JDTUtils.isCompatibilityFragmentActivitySubclass(javaFile)) | |
{ | |
//if compatibility package (before 3.0) | |
//but user is trying to use compatibility package with Activity (instead of FragmentActivity) | |
throw new JavaModelException( | |
new IllegalArgumentException( | |
CodeUtilsNLS.FindViewByIdCodeGenerator_CompatibilityModeClassNeedToExtendFragmentActivityError), | |
IStatus.ERROR); | |
} | |
else if ((AndroidUtils.getApiVersionNumberForProject(javaFile | |
.getProject()) >= IAndroidConstants.API_LEVEL_FOR_PLATFORM_VERSION_3_0_0)) | |
{ | |
//if after 3.0 (API level >=11) | |
methodName = | |
JavaViewBasedOnLayoutModifierConstants.GET_FRAGMENT_MANAGER; | |
} | |
if (methodName != null) | |
{ | |
SimpleName managerMethod = | |
onCreateDeclaration.getAST().newSimpleName(methodName); | |
optionalInvocation.setName(managerMethod); | |
addAssignmentStatement(node, optionalInvocation, | |
JavaViewBasedOnLayoutModifierConstants.FIND_FRAGMENT_BY_ID); | |
} | |
} | |
catch (Exception e) | |
{ | |
throw new JavaModelException(e, IStatus.ERROR); | |
} | |
} | |
} | |
} | |
subMonitor.worked(1); | |
} | |
} | |
} |