/*
* Copyright (c) 2015, Inversoft Inc., All Rights Reserved
*
* 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 org.primeframework.mvc.control.form;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.apache.commons.lang3.LocaleUtils;
import org.primeframework.mvc.control.annotation.ControlAttribute;
import org.primeframework.mvc.control.annotation.ControlAttributes;
import com.google.inject.Inject;
/**
* This class is the control for a Locale select box.
*
* @author Brian Pontarelli
*/
@ControlAttributes(
required = {
@ControlAttribute(name = "name")
},
optional = {
@ControlAttribute(name = "disabled", types = {boolean.class, Boolean.class}),
@ControlAttribute(name = "includeCountries", types = {boolean.class, Boolean.class}),
@ControlAttribute(name = "multiple", types = {boolean.class, Boolean.class}),
@ControlAttribute(name = "preferredLocales", types = {String.class}),
@ControlAttribute(name = "readonly", types = {boolean.class, Boolean.class}),
@ControlAttribute(name = "required", types = {boolean.class, Boolean.class}),
@ControlAttribute(name = "size", types = {int.class, Number.class}),
@ControlAttribute(name = "tabindex", types = {int.class, Number.class})
}
)
public class LocaleSelect extends Select {
private final Locale locale;
@Inject
public LocaleSelect(Locale locale) {
this.locale = locale;
}
/**
* Adds the countries Map and then calls super.
*/
@Override
protected Map<String, Object> makeParameters() {
LinkedHashMap<String, String> locales = new LinkedHashMap<>();
String preferred = (String) attributes.get("preferredLocales");
if (preferred != null) {
String[] parts = preferred.split(",");
for (String part : parts) {
Locale locale = LocaleUtils.toLocale(part);
locales.put(locale.toString(), locale.getDisplayName(locale));
}
}
boolean includeCountries = attributes.containsKey("includeCountries") ? (Boolean) attributes.get("includeCountries") : true;
List<Locale> allLocales = new ArrayList<>();
Collections.addAll(allLocales, Locale.getAvailableLocales());
allLocales.removeIf((locale) -> locale.getLanguage().isEmpty() || locale.hasExtensions() || !locale.getScript().isEmpty() ||
!locale.getVariant().isEmpty() || (!includeCountries && !locale.getCountry().isEmpty()));
allLocales.sort((one, two) -> one.getDisplayName(locale).compareTo(two.getDisplayName(locale)));
for (Locale locale : allLocales) {
if (!locales.containsKey(locale.getCountry())) {
locales.put(locale.toString(), locale.getDisplayName(this.locale));
}
}
attributes.put("items", locales);
return super.makeParameters();
}
}