summaryrefslogtreecommitdiff
path: root/src/plugins/android.codeutils/src/com/motorola/studio/android/generateviewbylayout/codegenerators/ClassAttributesCodeGenerator.java
blob: 9765308fc7455770006ac80c4f485b6d698c1515 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/*
 * 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);
        }
    }

}