blob: f48ebf2aae28999ffa7cde7e2979c9500322ef2f [file] [log] [blame]
/*
* 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);
}
}
}