/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
 *
 * 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.android.ide.eclipse.adt.internal.editors.manifest.descriptors;

import com.android.SdkConstants;
import com.android.ide.eclipse.adt.internal.editors.manifest.model.UiClassAttributeNode.IPostTypeCreationAction;

import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;

/**
 * Action to be executed after an Activity class is created.
 */
class PostActivityCreationAction implements IPostTypeCreationAction {

    private final static PostActivityCreationAction sAction = new PostActivityCreationAction();

    private PostActivityCreationAction() {
        // private constructor to enforce singleton.
    }


    /**
     * Returns the action.
     */
    public static IPostTypeCreationAction getAction() {
        return sAction;
    }

    /**
     * Processes a newly created Activity.
     *
     */
    @Override
    public void processNewType(IType newType) {
        try {
            String methodContent =
                "    /** Called when the activity is first created. */\n" +
                "    @Override\n" +
                "    public void onCreate(Bundle savedInstanceState) {\n" +
                "        super.onCreate(savedInstanceState);\n" +
                "\n" +
                "        // TODO Auto-generated method stub\n" +
                "    }";
            newType.createMethod(methodContent, null /* sibling*/, false /* force */,
                    new NullProgressMonitor());

            // we need to add the import for Bundle, so we need the compilation unit.
            // Since the type could be enclosed in other types, we loop till we find it.
            ICompilationUnit compilationUnit = null;
            IJavaElement element = newType;
            do {
                IJavaElement parentElement = element.getParent();
                if (parentElement !=  null) {
                    if (parentElement.getElementType() == IJavaElement.COMPILATION_UNIT) {
                        compilationUnit = (ICompilationUnit)parentElement;
                    }

                    element = parentElement;
                } else {
                    break;
                }
            } while (compilationUnit == null);

            if (compilationUnit != null) {
                compilationUnit.createImport(SdkConstants.CLASS_BUNDLE,
                        null /* sibling */, new NullProgressMonitor());
            }
        } catch (JavaModelException e) {
        }
    }
}
