/*
 * 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.wizards.buildingblocks;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.wizard.IWizardContainer;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Link;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.wizards.IWizardDescriptor;

import com.motorola.studio.android.codeutils.CodeUtilsActivator;
import com.motorola.studio.android.codeutils.i18n.CodeUtilsNLS;
import com.motorola.studio.android.common.exception.AndroidException;
import com.motorola.studio.android.common.log.StudioLogger;
import com.motorola.studio.android.common.utilities.AndroidUtils;
import com.motorola.studio.android.model.Activity;

/**
 * Class that implements the Activity Wizard Main Page
 */
public class NewActivityMainPage extends NewLauncherWizardPage
{
    @Override
    public boolean canFlipToNextPage()
    {

        return false;
    }

    private static final String NEW_ACTIVITY_HELP = CodeUtilsActivator.PLUGIN_ID + ".newactivity";

    /**
     * Default constructor
     * 
     * @param activity The activity model
     */
    public NewActivityMainPage(Activity activity)
    {
        super(activity, CodeUtilsNLS.UI_NewActivityMainPage_PageTitle);
    }

    /*
     * (non-Javadoc)
     * @see com.motorola.studio.android.wizards.buildingblocks.NewBuildingBlocksWizard#getBuildBlock()
     */
    @Override
    public Activity getBuildBlock()
    {
        return (Activity) super.getBuildBlock();
    }

    /* (non-Javadoc)
     * @see com.motorola.studio.android.wizards.buildingblocks.NewBuildingBlocksWizardPage#getMethods()
     */
    @Override
    protected Method[] getMethods()
    {
        Method onCreateMethod = new Method(getBuildBlock().getOnStartMessage())
        {
            @Override
            public void handle(boolean selection)
            {
                getBuildBlock().setOnStart(selection);
            }
        };
        return new Method[]
        {
            onCreateMethod
        };
    }

    /* (non-Javadoc)
     * @see com.motorola.studio.android.wizards.buildingblocks.NewBuildingBlocksWizardPage#createIntermediateControls(org.eclipse.swt.widgets.Composite)
     */
    @Override
    protected void createIntermediateControls(Composite parent)
    {
        createIntentFilterControls(parent);
        createMainActivityControl(parent, 4);
        createSeparator(parent, 4);
    }

    /**
     * add samples control.
     * 
     * @param composite
     *            The wizard page composite
     */
    @Override
    protected void createSampleControls(Composite composite, int nColumns)
    {
        GridData data = null;

        Composite linkCompositecomposite = new Composite(composite, SWT.FILL);
        linkCompositecomposite.setFont(composite.getFont());
        GridLayout layout = new GridLayout(nColumns, false);
        linkCompositecomposite.setLayout(layout);
        data = new GridData(SWT.FILL, SWT.FILL, true, true, nColumns, 2);
        linkCompositecomposite.setLayoutData(data);

        Image image = null;
        try
        {
            ImageDescriptor imageDesc =
                    ImageDescriptor.createFromURL(CodeUtilsActivator.getDefault().getBundle()
                            .getEntry("icons/obj16/new_activity_template_wiz.png")); //$NON-NLS-1$
            image = imageDesc.createImage();
        }
        catch (Exception ex)
        {
            // do nothing;
        }

        CLabel imgLabelLeft = new CLabel(linkCompositecomposite, SWT.CENTER);
        data = new GridData(SWT.LEFT, SWT.CENTER, false, false);
        imgLabelLeft.setLayoutData(data);
        imgLabelLeft.setImage(image);

        final Link templateLink = new Link(linkCompositecomposite, SWT.NONE);
        data = new GridData(SWT.LEFT, SWT.CENTER, true, true);
        templateLink.setLayoutData(data);
        templateLink.setText("<a>" + CodeUtilsNLS.UI_CreateNewActivityBasedOnTemplateLink //$NON-NLS-1$
                + "</a>"); //$NON-NLS-1$

        templateLink.addSelectionListener(new SelectionAdapter()
        {
            /* (non-Javadoc)
             * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
             */
            @Override
            public void widgetSelected(SelectionEvent event)
            {

                NewActivityWizard newActivityWizard = (NewActivityWizard) getWizard();
                IWizardContainer container = newActivityWizard.getContainer();

                container.getShell().setVisible(false);

                if (container instanceof WizardDialog)
                {

                    IWizardDescriptor descriptor =
                            PlatformUI
                                    .getWorkbench()
                                    .getNewWizardRegistry()
                                    .findWizard(
                                            "com.motorola.studio.android.wizards.newActivityBasedOnTemplateWizard");
                    if (descriptor != null)
                    {
                        NewActivityBasedOnTemplateWizard wizard = null;
                        try
                        {
                            wizard = (NewActivityBasedOnTemplateWizard) descriptor.createWizard();
                            NewActivityWizard activityWizard = (NewActivityWizard) getWizard();

                            wizard.init(PlatformUI.getWorkbench(), activityWizard.getSelection());
                            WizardDialog nextWd = new WizardDialog(getShell(), wizard);
                            nextWd.setTitle(wizard.getWindowTitle());
                            nextWd.open();
                        }
                        catch (CoreException e)
                        {
                            StudioLogger
                                    .error(NewActivityMainPage.class,
                                            "could not open new activity based on template wizard from inside new activity wizard");
                        }
                    }

                    WizardDialog nextWd = (WizardDialog) container;
                    nextWd.close();
                }

            }

        });

        templateLink.setEnabled(true);

    }

    private void createMainActivityControl(Composite parent, int nColumns)
    {
        // Create a checkbox to allow the user to set the created activity as the MAIN activity
        Button checkButtonMainActivity = new Button(parent, SWT.CHECK | SWT.LEFT);
        GridData gridData = new GridData(SWT.FILL, SWT.CENTER, true, false, nColumns, 1);
        checkButtonMainActivity.setLayoutData(gridData);
        checkButtonMainActivity.setText(CodeUtilsNLS.UI_NewActivityMainPage_CheckMainButton);
        checkButtonMainActivity.addSelectionListener(new SelectionAdapter()
        {

            @Override
            public void widgetSelected(SelectionEvent e)
            {
                if (e.widget instanceof Button)
                {
                    // Set Activity flag accordingly
                    getBuildBlock().setMainActivity(((Button) e.widget).getSelection());

                }
            }

        });
    }

    /* (non-Javadoc)
     * @see com.motorola.studio.android.wizards.buildingblocks.NewBuildingBlocksWizardPage#getDefaultMessage()
     */
    @Override
    public String getDefaultMessage()
    {
        return CodeUtilsNLS.UI_NewActivityMainPage_DescriptionCreateActivity;
    }

    /* (non-Javadoc)
     * @see com.motorola.studio.android.wizards.buildingblocks.NewBuildingBlocksWizardPage#getWizardTitle()
     */
    @Override
    public String getWizardTitle()
    {
        return CodeUtilsNLS.UI_NewActivityMainPage_TitleActivity;
    }

    /* (non-Javadoc)
     * @see com.motorola.studio.android.wizards.buildingblocks.NewLauncherWizardPage#getIntentFiltersActions()
     */
    @Override
    protected String[] getIntentFiltersActions()
    {
        String[] intentFiltersActions = new String[0];
        try
        {
            intentFiltersActions = AndroidUtils.getActivityActions(getBuildBlock().getProject());
        }
        catch (AndroidException e)
        {
            setErrorMessage(e.getMessage());
        }
        return intentFiltersActions;
    }

    /**
     * Gets the help ID to be used for attaching
     * context sensitive help. 
     * 
     * Classes that extends this class and want to set
     * their on help should override this method
     */
    @Override
    protected String getHelpId()
    {
        return NEW_ACTIVITY_HELP;
    }
}