/*
* 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;
import java.io.File;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import com.motorola.studio.android.generatecode.AbstractCodeGenerator;
import com.motorola.studio.android.generatecode.AbstractCodeGeneratorData;
import com.motorola.studio.android.generatecode.JavaCodeModifier;
import com.motorola.studio.android.generateviewbylayout.codegenerators.ClassAttributesCodeGenerator;
import com.motorola.studio.android.generateviewbylayout.codegenerators.EditTextCodeGenerator;
import com.motorola.studio.android.generateviewbylayout.codegenerators.FindViewByIdCodeGenerator;
import com.motorola.studio.android.generateviewbylayout.codegenerators.GalleryCodeGenerator;
import com.motorola.studio.android.generateviewbylayout.codegenerators.OnClickGUIsCodeGenerator;
import com.motorola.studio.android.generateviewbylayout.codegenerators.RadioButtonCodeGenerator;
import com.motorola.studio.android.generateviewbylayout.codegenerators.RatingBarCodeGenerator;
import com.motorola.studio.android.generateviewbylayout.codegenerators.SaveStateCodeGenerator;
import com.motorola.studio.android.generateviewbylayout.codegenerators.SeekBarCodeGenerator;
import com.motorola.studio.android.generateviewbylayout.codegenerators.SpinnerCodeGenerator;
import com.motorola.studio.android.generateviewbylayout.model.CodeGeneratorDataBasedOnLayout;
/**
* Manager responsible to modify activity / fragment based on layout xml
*/
public class JavaModifierBasedOnLayout extends JavaCodeModifier
{
private boolean generateDefaultListeners = false;
private MethodDeclaration onCreateDeclaration;
static
{
IMPORT_LIST.add(JavaViewBasedOnLayoutModifierConstants.IMPORT_ANDROID_APP);
IMPORT_LIST.add(JavaViewBasedOnLayoutModifierConstants.IMPORT_ANDROID_WIDGET);
IMPORT_LIST.add(JavaViewBasedOnLayoutModifierConstants.IMPORT_ANDROID_VIEW_VIEW);
}
@Override
protected void initVariables()
{
CodeGeneratorDataBasedOnLayout codeGeneratorDataBasedOnLayout =
(CodeGeneratorDataBasedOnLayout) getCodeGeneratorData();
onCreateDeclaration =
codeGeneratorDataBasedOnLayout.getJavaLayoutData().getVisitor()
.getOnCreateDeclaration();
//get typeDeclaration
super.initVariables();
}
@Override
protected void callCodeGenerators(final SubMonitor theMonitor, IFile java)
throws JavaModelException
{
CodeGeneratorDataBasedOnLayout codeGeneratorDataBasedOnLayout =
(CodeGeneratorDataBasedOnLayout) getCodeGeneratorData();
new ClassAttributesCodeGenerator(codeGeneratorDataBasedOnLayout, onCreateDeclaration,
typeDeclaration).generateCode(theMonitor);
FindViewByIdCodeGenerator f =
new FindViewByIdCodeGenerator(codeGeneratorDataBasedOnLayout, onCreateDeclaration,
typeDeclaration, java);
f.generateCode(theMonitor);
if (shouldGenerateDefaultListeners())
{
//call the generators declared into the codeGenerators list
super.callCodeGenerators(theMonitor, java);
}
//generate save state code
new SaveStateCodeGenerator(codeGeneratorDataBasedOnLayout, onCreateDeclaration,
typeDeclaration).generateCode(theMonitor);
}
/**
* Factory method to include all the code generators for the given java modifier
* @param codeGeneratorDataBasedOnLayout
* @return list of code generators
*/
@Override
public List<AbstractCodeGenerator> populateListOfCodeGenerators(
AbstractCodeGeneratorData abstractCodeGeneratorData)
{
CodeGeneratorDataBasedOnLayout codeGeneratorDataBasedOnLayout =
(CodeGeneratorDataBasedOnLayout) abstractCodeGeneratorData;
codeGenerators.add(new OnClickGUIsCodeGenerator(codeGeneratorDataBasedOnLayout,
onCreateDeclaration, typeDeclaration));
codeGenerators.add(new RadioButtonCodeGenerator(codeGeneratorDataBasedOnLayout,
onCreateDeclaration, typeDeclaration));
codeGenerators.add(new EditTextCodeGenerator(codeGeneratorDataBasedOnLayout,
onCreateDeclaration, typeDeclaration));
codeGenerators.add(new SpinnerCodeGenerator(codeGeneratorDataBasedOnLayout,
onCreateDeclaration, typeDeclaration));
codeGenerators.add(new GalleryCodeGenerator(codeGeneratorDataBasedOnLayout,
onCreateDeclaration, typeDeclaration));
codeGenerators.add(new RatingBarCodeGenerator(codeGeneratorDataBasedOnLayout,
onCreateDeclaration, typeDeclaration));
codeGenerators.add(new SeekBarCodeGenerator(codeGeneratorDataBasedOnLayout,
onCreateDeclaration, typeDeclaration));
return codeGenerators;
}
/**
* @return true if need to generate code for listeners (buttons, edit fields), false if do not need
*/
public boolean shouldGenerateDefaultListeners()
{
return generateDefaultListeners;
}
/**
* Defines if the class have to generate listeners (e.g.: onclick for buttons, onKey for edittext, and so on)
* @param generateDefaultListeners the generateDefaultListeners to set
*/
public void setGenerateDefaultListeners(boolean generateDefaultListeners)
{
this.generateDefaultListeners = generateDefaultListeners;
}
@Override
protected File getDataResource()
{
return ((CodeGeneratorDataBasedOnLayout) codeGeneratorData).getLayoutFile().getFile();
}
}