/*
 * Copyright (C) 2012 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.layout.configuration;

import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
import com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewMode;
import com.android.ide.eclipse.adt.internal.wizards.newxmlfile.AddTranslationDialog;

import org.eclipse.core.resources.IProject;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolItem;

import java.util.List;

/**
 * The {@linkplain LocaleMenuListener} class is responsible for generating the locale
 * menu in the {@link ConfigurationChooser}.
 */
class LocaleMenuListener extends SelectionAdapter {
    private static final int ACTION_SET_LOCALE = 1;
    private static final int ACTION_ADD_TRANSLATION = 2;

    private final ConfigurationChooser mConfigChooser;
    private final int mAction;
    private final Locale mLocale;

    LocaleMenuListener(
            @NonNull ConfigurationChooser configChooser,
            int action,
            @Nullable Locale locale) {
        mConfigChooser = configChooser;
        mAction = action;
        mLocale = locale;
    }

    @Override
    public void widgetSelected(SelectionEvent e) {
        switch (mAction) {
            case ACTION_SET_LOCALE: {
                mConfigChooser.selectLocale(mLocale);
                mConfigChooser.onLocaleChange();
                break;
            }
            case ACTION_ADD_TRANSLATION: {
                IProject project = mConfigChooser.getProject();
                Shell shell = mConfigChooser.getShell();
                AddTranslationDialog dialog = new AddTranslationDialog(shell, project);
                dialog.open();
                break;
            }
            default: assert false : mAction;
        }
    }

    static void show(final ConfigurationChooser chooser, ToolItem combo) {
        Menu menu = new Menu(chooser.getShell(), SWT.POP_UP);
        Configuration configuration = chooser.getConfiguration();
        List<Locale> locales = chooser.getLocaleList();
        Locale current = configuration.getLocale();

        for (Locale locale : locales) {
            String title = ConfigurationChooser.getLocaleLabel(chooser, locale, false);
            MenuItem item = new MenuItem(menu, SWT.CHECK);
            item.setText(title);
            Image image = locale.getFlagImage();
            item.setImage(image);

            boolean selected = current == locale;
            if (selected) {
                item.setSelection(true);
            }

            LocaleMenuListener listener = new LocaleMenuListener(chooser, ACTION_SET_LOCALE,
                    locale);
            item.addSelectionListener(listener);
        }

        if (locales.size() > 1) {
            @SuppressWarnings("unused")
            MenuItem separator = new MenuItem(menu, SWT.SEPARATOR);

            ConfigurationMenuListener.addTogglePreviewModeAction(menu,
                    "Preview All Locales", chooser, RenderPreviewMode.LOCALES);
        }

        @SuppressWarnings("unused")
        MenuItem separator = new MenuItem(menu, SWT.SEPARATOR);

        MenuItem item = new MenuItem(menu, SWT.PUSH);
        item.setText("Add New Translation...");
        LocaleMenuListener listener = new LocaleMenuListener(chooser,
                ACTION_ADD_TRANSLATION, null);
        item.addSelectionListener(listener);

        Rectangle bounds = combo.getBounds();
        Point location = new Point(bounds.x, bounds.y + bounds.height);
        location = combo.getParent().toDisplay(location);
        menu.setLocation(location.x, location.y);
        menu.setVisible(true);
    }
}
