/* * 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.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.SubMonitor; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.dom.FieldDeclaration; import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.jdt.core.dom.Modifier; import org.eclipse.jdt.core.dom.Modifier.ModifierKeyword; import org.eclipse.jdt.core.dom.SimpleName; import org.eclipse.jdt.core.dom.SimpleType; import org.eclipse.jdt.core.dom.TypeDeclaration; import org.eclipse.jdt.core.dom.VariableDeclarationFragment; import com.motorola.studio.android.codeutils.i18n.CodeUtilsNLS; import com.motorola.studio.android.generateviewbylayout.model.CodeGeneratorDataBasedOnLayout; import com.motorola.studio.android.generateviewbylayout.model.LayoutNode; /** * Responsible to generate class attributes based on layout type */ public class ClassAttributesCodeGenerator extends AbstractLayoutCodeGenerator { /** * @param codeGeneratorData * @param onCreateDeclaration * @param typeDeclaration */ public ClassAttributesCodeGenerator(CodeGeneratorDataBasedOnLayout codeGeneratorData, MethodDeclaration onCreateDeclaration, TypeDeclaration typeDeclaration) { super(codeGeneratorData, onCreateDeclaration, typeDeclaration); } @Override public void generateCode(IProgressMonitor monitor) throws JavaModelException { addAttributes(monitor); } /** * Add attributes based on the GUI items declared on layout XML * <br> * GENERATED_CODE_FORMAT: * <br> * private $GUI_TYPE $GUI_ID; * @throws JavaModelException */ @SuppressWarnings("unchecked") private void addAttributes(IProgressMonitor monitor) throws JavaModelException { SubMonitor subMonitor = SubMonitor.convert(monitor); subMonitor.beginTask(CodeUtilsNLS.JavaViewBasedOnLayoutModifier_AddingAttributes, codeGeneratorData.getGuiItems().size()); /* * AST to be written * FieldDeclaration: * [Javadoc] { ExtendedModifier } Type VariableDeclarationFragment * { , VariableDeclarationFragment } ; */ for (LayoutNode node : codeGeneratorData.getGuiItems()) { if ((node.getNodeId() != null) && node.shouldInsertCode()) { boolean containFieldDeclared = getCodeGeneratorData().getJavaLayoutData().getVisitor() .checkIfAttributeAlreadyDeclared(node, false); if (!containFieldDeclared) { //avoid to declare attribute twice Modifier privateMod = typeDeclaration.getAST().newModifier(ModifierKeyword.PRIVATE_KEYWORD); SimpleName guiName; try { guiName = getNodeVariableTypeBasedOnLayoutNode(node); } catch (CoreException e) { throw new JavaModelException(e); } SimpleType guiType = typeDeclaration.getAST().newSimpleType(guiName); VariableDeclarationFragment variableFragment = typeDeclaration.getAST().newVariableDeclarationFragment(); SimpleName varName = variableFragment.getAST().newSimpleName(node.getNodeId()); variableFragment.setName(varName); FieldDeclaration declaration = typeDeclaration.getAST().newFieldDeclaration(variableFragment); declaration.modifiers().add(privateMod); declaration.setType(guiType); typeDeclaration.bodyDeclarations().add(0, declaration); //add as the first item } } subMonitor.worked(1); } } }