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

import com.android.ide.eclipse.adt.internal.editors.IconFactory;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.browser.IWebBrowser;

import java.net.URL;

/**
 * Dialog shown by the {@link ConvertSwitchQuickFixProcessor}. This is a custom
 * dialog rather than a plain {@link MessageDialog} such that we can show a link
 * and point to a web page for more info.
 */
class ConvertSwitchDialog extends TitleAreaDialog implements SelectionListener {
    /** URL containing more info */
    private static final String URL = "http://tools.android.com/tips/non-constant-fields"; //$NON-NLS-1$

    private final String mField;

    private Link mLink;

    /**
     * Create the dialog.
     * @param parentShell the parent shell
     * @param field the field name we're warning about
     */
    public ConvertSwitchDialog(Shell parentShell, String field) {
        super(parentShell);
        mField = field;
        Image image = IconFactory.getInstance().getIcon("android-64"); //$NON-NLS-1$
        setTitleImage(image);
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        String text = String.format(
            "As of ADT 14, the resource fields (such as %1$s) are no longer constants " +
            "when defined in library projects. This is necessary to make library " +
            "projects reusable without recompiling them.\n" +
            "\n" +
            "One consequence of this is that you can no longer use the fields directly " +
            "in switch statements. You must use an if-else chain instead.\n" +
            "\n" +
            "Eclipse can automatically convert from a switch statement to an if-else " +
            "statement. Just place the caret on the switch keyword and invoke " +
            "Quick Fix (Ctrl-1 on Windows and Linux, Cmd-1 on Mac), then select " +
            "\"Convert 'switch' to 'if-else'\".\n" +
            "\n" +
            "For more information, see <a href=\"" + URL + "\">" + URL + "</a>",
            mField);

        Composite area = (Composite) super.createDialogArea(parent);
        Composite container = new Composite(area, SWT.NONE);
        container.setLayout(new GridLayout(1, false));
        container.setLayoutData(new GridData(GridData.FILL_BOTH));

        mLink = new Link(container, SWT.NONE);
        mLink.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, true, 1, 1));
        mLink.setText(text);
        mLink.addSelectionListener(this);

        setMessage("Non-Constant Expressions: Migration Necessary", IMessageProvider.INFORMATION);

        return area;
    }

    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
        createButton(parent, IDialogConstants.HELP_ID, IDialogConstants.HELP_LABEL, false);
    }

    @Override
    protected Point getInitialSize() {
        return new Point(500, 400);
    }

    private void showWebPage() {
        try {
            IWorkbench workbench = PlatformUI.getWorkbench();
            IWebBrowser browser = workbench.getBrowserSupport().getExternalBrowser();
            browser.openURL(new URL(URL));
        } catch (Exception e) {
            String message = String.format("Could not open browser. Vist\n%1$s\ninstead.",
                    URL);
            MessageDialog.openError(getShell(), "Browser Error", message);
        }

    }

    @Override
    protected void buttonPressed(int buttonId) {
        if (buttonId == IDialogConstants.HELP_ID) {
            showWebPage();
        } else {
            super.buttonPressed(buttonId);
        }
    }

    // ---- Implements SelectionListener ----

    @Override
    public void widgetSelected(SelectionEvent e) {
        if (e.getSource() == mLink) {
            showWebPage();
        }
    }

    @Override
    public void widgetDefaultSelected(SelectionEvent e) {
    }
}
