/**
 *                                                                            
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *                                                                            
 * All rights reserved. This program and the accompanying materials           
 * are made available under the terms of the Eclipse Public License 2.0        
 * which accompanies this distribution, and is available at                  
 * https://www.eclipse.org/legal/epl-2.0/                                 
 *                                 
 * SPDX-License-Identifier: EPL-2.0                                 
 *                                                                            
 * Contributors:   
 * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
 */
package org.eclipse.osbp.preferences.ui.page;

import java.util.HashSet;
import java.util.Locale;

import org.eclipse.osbp.preferences.LocaleUtils;
import org.eclipse.osbp.preferences.Preference;
import org.eclipse.osbp.preferences.ProductConfiguration;
import org.eclipse.osbp.preferences.ui.component.APreferencePage;
import org.eclipse.osbp.preferences.ui.component.AddRemoveListFieldEditor;
import org.eclipse.osbp.preferences.ui.component.Item;
import org.eclipse.osbp.preferences.ui.component.Type;
import org.eclipse.osbp.preferences.ui.data.ProductConfigurationStore;

public class PreferencePageLocalization extends APreferencePage {

	public PreferencePageLocalization() {
		super(
			"localization",
			"localization"
		);
	}
	
	protected String[][] getAvailableLanguages() {
		Locale[] locales;
		if	(store.isWorkspaceSelected()) {
			locales = Locale.getAvailableLocales();
		}
		else {
			HashSet<Locale> helper = new HashSet<>(); 
			for	(Locale locale : ProductConfiguration.getLanguages().values()) {
				if	(locale != null) {
					helper.add(locale);
				}
			}
			locales = helper.toArray(new Locale[0]);
		}
		String[][] retcode = new String[locales.length][2];
		LocaleUtils.sortLocalesOnDisplayName(locales);
		int idx = 0;
		for (Locale locale : locales) {
			String loc = locale.toString();
			if	(!loc.isEmpty()) {
				retcode[idx][0] = loc;
				retcode[idx][1] = store.getLanguageDisplayName(locale);
			}
			idx++;
		}
		return retcode;
	}

	@Override
	public void initialize() {
		super.initialize();
		AddRemoveListFieldEditor languages = (AddRemoveListFieldEditor)getEditor(Preference.LOCALIZATION_SUPPORTED_LANGUAGES);
		if	(languages != null) {
			languages.setAvailableNamesAndValues(getAvailableLanguages());
		}
	}

	@Override
	protected Item[] initializeItems() {
		return new Item[] {
			new Item(Type.TEXT, Preference.SHOW_PRODUCT_CONFIGURATION, "Product Configuration", false),
			new Item(""),
			new Item(Type.BOOLEAN, Preference.LOCALIZATION_AUTOCREATE, "Extract I18N Properties"),
			new Item(Type.BOOLEAN, Preference.LOCALIZATION_SHOW_SELECT_IN_RESPECTIVE_LOCALE, "Display locale selection in respective locale"),
			new Item(""),
			new Item(Type.LIST_ADD_REMOVE, Preference.LOCALIZATION_SUPPORTED_LANGUAGES, "Supported Languages", getAvailableLanguages(), ProductConfigurationStore.CONFIGURATION_ITEM_SEPARATOR)
		};
	}
}
