/*
 * Copyright (C) 2011 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.assetstudio;

import com.android.ide.eclipse.adt.internal.project.ProjectChooserHelper;
import com.android.ide.eclipse.adt.internal.project.ProjectChooserHelper.ProjectCombo;
import com.android.ide.eclipse.adt.internal.resources.ResourceNameValidator;
import com.android.resources.ResourceFolderType;

import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
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.Label;
import org.eclipse.swt.widgets.Text;

/** Page for choosing the type of asset to create, as well as the target project */
public class ChooseAssetTypePage extends WizardPage implements SelectionListener, ModifyListener {
    private final CreateAssetSetWizardState mValues;
    private ProjectCombo mProjectButton;
    private Button mClipboardButton;
    private Text mNameText;
    private boolean mNameModified;
    private Label mResourceName;

    /**
     * Create the wizard.
     */
    public ChooseAssetTypePage(CreateAssetSetWizardState values) {
        super("chooseAssetTypePage");
        mValues = values;
        setTitle("Choose Icon Set Type");
        setDescription("Select the type of icon set to create:");
    }

    /**
     * Create contents of the wizard.
     *
     * @param parent the parent composite
     */
    @Override
    public void createControl(Composite parent) {
        Composite container = new Composite(parent, SWT.NULL);

        setControl(container);
        container.setLayout(new GridLayout(3, false));

        for (AssetType type : AssetType.values()) {
            Button button = new Button(container, SWT.RADIO);
            button.setData(type);
            button.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1));
            button.setSelection(type == mValues.type);
            button.setText(type.getDisplayName());
            button.addSelectionListener(this);
        }

        Label separator = new Label(container, SWT.SEPARATOR | SWT.HORIZONTAL);
        GridData gdSeparator = new GridData(SWT.FILL, SWT.CENTER, false, false, 3, 1);
        gdSeparator.heightHint = 20;
        separator.setLayoutData(gdSeparator);

        Label projectLabel = new Label(container, SWT.NONE);
        projectLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
        projectLabel.setText("Project:");

        ProjectChooserHelper helper =
                new ProjectChooserHelper(getShell(), null /* filter */);
        mProjectButton = new ProjectCombo(helper, container, mValues.project);
        mProjectButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
        mProjectButton.addSelectionListener(this);

        Label assetLabel = new Label(container, SWT.NONE);
        assetLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
        assetLabel.setText("Icon Name:");

        mNameText = new Text(container, SWT.BORDER);
        mNameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
        mNameText.addModifyListener(this);

        Label resourceLabel = new Label(container, SWT.NONE);
        resourceLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
        resourceLabel.setText("Resource:");

        mResourceName = new Label(container, SWT.NONE);
        mResourceName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));

        mClipboardButton = new Button(container, SWT.FLAT);
        mClipboardButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
        mClipboardButton.setText("Copy Name to Clipboard");

        mClipboardButton.addSelectionListener(this);

        updateAssetType();
        validatePage();
        parent.getDisplay().asyncExec(new Runnable() {
            @Override
            public void run() {
                mNameText.setFocus();
            }
        });
    }

    private void updateAssetType() {
        if (!mNameModified) {
            // Default name suggestion, possibly as a suffix, e.g. "ic_menu_<name>"
            String replace = "name";
            String suggestedName = String.format(mValues.type.getDefaultNameFormat(), replace);
            mNameText.setText(suggestedName);
            mValues.outputName = suggestedName;

            updateResourceLabel();
            mNameModified = false;
            int start = suggestedName.indexOf(replace);
            if (start != -1) {
                mNameText.setSelection(start, start + replace.length());
            } else {
                mNameText.selectAll();
            }
        } else {
            mNameText.selectAll();
        }
    }

    private void updateResourceLabel() {
        mResourceName.setText("@drawable/" + getOutputName()); //$NON-NLS-1$
    }

    @Override
    public boolean canFlipToNextPage() {
        return mValues.project != null;
    }

    @Override
    public void widgetSelected(SelectionEvent e) {
        Object source = e.getSource();
        if (source == mProjectButton) {
            mValues.project = mProjectButton.getSelectedProject();
            validatePage();
        } else if (source == mClipboardButton) {
            Clipboard clipboard = new Clipboard(getShell().getDisplay());
            TextTransfer textTransfer = TextTransfer.getInstance();
            clipboard.setContents(
                    new Object[] { mResourceName.getText() },
                    new Transfer[] { textTransfer });
            clipboard.dispose();
        } else if (source instanceof Button) {
            // User selected a different asset type to be created
            Object data = ((Button) source).getData();
            if (data instanceof AssetType) {
                mValues.type = (AssetType) data;
                CreateAssetSetWizardState.sLastType = mValues.type;
                updateAssetType();
            }
        }
    }

    @Override
    public void widgetDefaultSelected(SelectionEvent e) {
    }

    @Override
    public void modifyText(ModifyEvent e) {
        Object source = e.getSource();
        if (source == mNameText) {
            mNameModified = true;
            mValues.outputName = mNameText.getText().trim();
            updateResourceLabel();
        }

        validatePage();
    }

    private String getOutputName() {
        return mNameText.getText().trim();
    }

    private void validatePage() {
        String error = null;

        if (mValues.project == null) {
            error = "Please select an Android project.";
        } else {
            String outputName = getOutputName();
            if (outputName == null || outputName.length() == 0) {
                error = "Please enter a name";
            } else {
                ResourceNameValidator validator =
                        ResourceNameValidator.create(true, ResourceFolderType.DRAWABLE);
                error = validator.isValid(outputName);
            }
        }

        setPageComplete(error == null);
        if (error != null) {
            setMessage(error, IMessageProvider.ERROR);
        } else {
            setErrorMessage(null);
            setMessage(null);
        }
    }
}
