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

import java.io.File;

import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.DirectoryDialog;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;

import com.motorola.studio.android.common.log.StudioLogger;
import com.motorola.studio.android.i18n.AndroidNLS;
import com.motorola.studio.android.model.AndroidProject;
import com.motorola.studio.android.model.AndroidProject.SourceTypes;
import com.motorola.studio.android.model.IWizardModel;
import com.motorola.studio.android.wizards.project.NewAndroidProjectMainPage;

/**
 * Class that implements the Location group to be used on the New Project Wizard
 */
public class LocationGroup extends Composite
{
    final private AndroidProject project;

    final private NewAndroidProjectMainPage page;

    private String lastSourcePathValue = null;

    /**
     * Constructor
     * 
     * @param parent
     * @param project
     * @param page
     */
    public LocationGroup(Composite parent, AndroidProject project, NewAndroidProjectMainPage page)
    {
        super(parent, SWT.SHADOW_ETCHED_IN);
        this.project = project;
        this.page = page;
        setLayout(new GridLayout());
        setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        createControl(this);
    }

    /**
     * Create Controls
     * 
     * @param parent
     */
    private void createControl(Composite parent)
    {
        final Button createNewProjectRadio = new Button(this, SWT.RADIO);
        createNewProjectRadio.setText(AndroidNLS.UI_LocationGroup_NewProjectRadioLabel);
        createNewProjectRadio.setSelection(true);

        final Button createSampleRadio = new Button(this, SWT.RADIO);
        createSampleRadio.setText(AndroidNLS.UI_LocationGroup_NewFromSampleRadioLabel);
        createSampleRadio.setSelection(false);

        final Button existing_project_radio = new Button(this, SWT.RADIO);
        existing_project_radio
                .setText(AndroidNLS.UI_LocationGroup_NewFromExistentProjectRadioLabel);
        existing_project_radio.setSelection(false);

        final Button useDefaultLocation = new Button(this, SWT.CHECK);
        useDefaultLocation.setText(AndroidNLS.UI_LocationGroup_UseDefaultLocationCheckLabel);
        useDefaultLocation.setSelection(true);

        Composite location_group = new Composite(this, SWT.NONE);
        location_group.setLayout(new GridLayout(4, false));
        location_group.setLayoutData(new GridData(GridData.FILL_BOTH));
        location_group.setFont(parent.getFont());

        Label locationLabel = new Label(location_group, SWT.NONE);
        locationLabel.setText(AndroidNLS.UI_LocationGroup_LocationLabel);

        final Text projectPath = new Text(location_group, SWT.BORDER);
        GridData data = new GridData(GridData.FILL, GridData.BEGINNING, true, false, 2, 1);
        projectPath.setLayoutData(data);
        projectPath.setFont(parent.getFont());
        projectPath.setText(ResourcesPlugin.getWorkspace().getRoot().getLocation().toOSString());
        projectPath.setEnabled(false);
        projectPath.addListener(SWT.Modify, new Listener()
        {
            public void handleEvent(Event event)
            {
                if (projectPath.isEnabled())
                {
                    project.setLocation(projectPath.getText());
                    notifyListeners(IWizardModel.MODIFIED, new Event());
                }
            }
        });

        final Button browseButton = new Button(location_group, SWT.PUSH);
        browseButton.setText(AndroidNLS.UI_General_BrowseButtonLabel);
        browseButton.setEnabled(false);
        page.setButtonLayoutData(browseButton);
        browseButton.addSelectionListener(new SelectionAdapter()
        {
            @Override
            public void widgetSelected(SelectionEvent e)
            {

                String existing_dir = project.getLocation();

                // Disable the path if it doesn't exist
                if (existing_dir != null
                        && (existing_dir.length() == 0 || !new File(existing_dir).exists()))
                {
                    existing_dir = null;
                }

                DirectoryDialog dd = new DirectoryDialog(projectPath.getShell());
                dd.setMessage(AndroidNLS.UI_LocationGroup_BrowseDialogMessage);
                dd.setFilterPath(existing_dir);
                String customLocation = dd.open();
                if (customLocation != null)
                {
                    projectPath.setText(customLocation);
                    if (existing_project_radio.getSelection() && customLocation.length() > 0)
                    {
                        setLastSourcePath(customLocation);
                    }
                }
            }
        });

        SelectionListener location_listener = new SelectionAdapter()
        {
            @Override
            public void widgetSelected(SelectionEvent e)
            {
                boolean isNewProject = createNewProjectRadio.getSelection();
                boolean existentProject = existing_project_radio.getSelection();
                boolean fromSample = createSampleRadio.getSelection();

                if (isNewProject ^ existentProject ^ fromSample)
                {
                    // After this point We know that only one option is true
                    boolean useDefault = useDefaultLocation.getSelection();
                    useDefaultLocation.setEnabled(!existentProject);

                    String path;
                    if (existentProject)
                    {
                        path = getLastSourcePath();
                        useDefaultLocation.setSelection(false);
                        useDefault = false;
                    }
                    else if (useDefault)
                    {
                        path = project.getDefaultLocation();
                    }
                    else
                    {
                        path = project.getLocation();
                    }
                    boolean enablePath = !((isNewProject || fromSample) && useDefault);
                    projectPath.setEnabled(enablePath);
                    browseButton.setEnabled(enablePath);

                    project.setSourceType(isNewProject ? SourceTypes.NEW : existentProject
                            ? SourceTypes.EXISTING : SourceTypes.SAMPLE);

                    project.setUseDefaultLocation(useDefault);
                    if (enablePath && (path == null || path.length() == 0))
                    {
                        projectPath.setText(""); //$NON-NLS-1$
                        projectPath.setFocus();
                    }
                    else
                    {
                        projectPath.setText(path);
                    }

                    notifyListeners(IWizardModel.MODIFIED, new Event());
                }
                else
                {
                    StudioLogger.error(LocationGroup.class,
                            "Ilegal State with New Project radio buttons."); //$NON-NLS-1$
                }
            }
        };

        createNewProjectRadio.addSelectionListener(location_listener);
        existing_project_radio.addSelectionListener(location_listener);
        useDefaultLocation.addSelectionListener(location_listener);
    }

    /**
     * Get last path value defined by the user for the
     * "Create from existing source" case
     * 
     * @return The last path value defined by the user.
     */
    public String getLastSourcePath()
    {
        return this.lastSourcePathValue;
    }

    /**
     * Set the last path value defined by the user for the
     * "Create from existing source" case
     * 
     * @param path
     *            - The last path defined by the user
     */
    public void setLastSourcePath(String path)
    {
        this.lastSourcePathValue = path;
    }
}
