Localis(z)ation support
[lgpl/argeo-commons.git] / org.argeo.util / src / org / argeo / util / LocaleChoice.java
index aaf719db4c437b84bf53501fde2ead0e3021b1e5..4b4db0eca257ac6e1c78f84a775f7e26d98462e6 100644 (file)
 package org.argeo.util;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Locale;
 
 import javax.security.auth.callback.LanguageCallback;
 
+import org.argeo.ArgeoException;
+
 /** Choose in a list of locales. TODO: replace with {@link LanguageCallback} */
 public class LocaleChoice {
-       private List<Locale> availableLocales = new ArrayList<Locale>();
+       private final List<Locale> locales;
 
        private Integer selectedIndex = null;
-       private Integer defaultIndex = null;
+       private final Integer defaultIndex;
+
+       public LocaleChoice(List<Locale> locales, Locale defaultLocale) {
+               Integer defaultIndex = null;
+               this.locales = Collections.unmodifiableList(locales);
+               for (int i = 0; i < locales.size(); i++)
+                       if (locales.get(i).equals(defaultLocale))
+                               defaultIndex = i;
 
-       // public LocaleCallback(Integer defaultIndex, List<Locale>
-       // availableLocales) {
-       // this.availableLocales = Collections
-       // .unmodifiableList(new ArrayList<Locale>(availableLocales));
-       // this.defaultIndex = defaultIndex;
-       // this.selectedIndex = defaultIndex;
-       // }
+               // based on language only
+               if (defaultIndex == null)
+                       for (int i = 0; i < locales.size(); i++)
+                               if (locales.get(i).getLanguage()
+                                               .equals(defaultLocale.getLanguage()))
+                                       defaultIndex = i;
+
+               if (defaultIndex == null)
+                       throw new ArgeoException("Default locale " + defaultLocale
+                                       + " is not in available locales " + locales);
+               this.defaultIndex = defaultIndex;
+
+               this.selectedIndex = defaultIndex;
+       }
 
        /**
         * Convenience constructor based on a comma separated list of iso codes (en,
         * en_US, fr_CA, etc.). Default selection is default locale.
         */
        public LocaleChoice(String locales, Locale defaultLocale) {
-               if (locales == null || locales.trim().equals(""))
-                       return;
-               String[] codes = locales.split(",");
-               for (int i = 0; i < codes.length; i++) {
-                       String code = codes[i];
-                       // variant not supported
-                       int indexUnd = code.indexOf("_");
-                       Locale locale;
-                       if (indexUnd > 0) {
-                               String language = code.substring(0, indexUnd);
-                               String country = code.substring(indexUnd + 1);
-                               locale = new Locale(language, country);
-                       } else {
-                               locale = new Locale(code);
-                       }
-                       availableLocales.add(locale);
-                       if (locale.equals(defaultLocale))
-                               defaultIndex = i;
-               }
-
-               if (defaultIndex == null)
-                       defaultIndex = 0;
-
-               this.selectedIndex = defaultIndex;
+               this(asLocaleList(locales), defaultLocale);
        }
 
        public String[] getSupportedLocalesLabels() {
-               String[] labels = new String[availableLocales.size()];
-               for (int i = 0; i < availableLocales.size(); i++) {
-                       Locale locale = availableLocales.get(i);
+               String[] labels = new String[locales.size()];
+               for (int i = 0; i < locales.size(); i++) {
+                       Locale locale = locales.get(i);
                        if (locale.getCountry().equals(""))
                                labels[i] = locale.getDisplayLanguage(locale) + " ["
                                                + locale.getLanguage() + "]";
@@ -87,7 +81,7 @@ public class LocaleChoice {
        public Locale getSelectedLocale() {
                if (selectedIndex == null)
                        return null;
-               return availableLocales.get(selectedIndex);
+               return locales.get(selectedIndex);
        }
 
        public void setSelectedIndex(Integer selectedIndex) {
@@ -98,12 +92,35 @@ public class LocaleChoice {
                return defaultIndex;
        }
 
-       public List<Locale> getAvailableLocales() {
-               return availableLocales;
+       public List<Locale> getLocales() {
+               return locales;
        }
 
        public Locale getDefaultLocale() {
-               return availableLocales.get(getDefaultIndex());
+               return locales.get(getDefaultIndex());
+       }
+
+       /** Returns null if argument is null. */
+       public static List<Locale> asLocaleList(String locales) {
+               if (locales == null)
+                       return null;
+               ArrayList<Locale> availableLocales = new ArrayList<Locale>();
+               String[] codes = locales.split(",");
+               for (int i = 0; i < codes.length; i++) {
+                       String code = codes[i];
+                       // variant not supported
+                       int indexUnd = code.indexOf("_");
+                       Locale locale;
+                       if (indexUnd > 0) {
+                               String language = code.substring(0, indexUnd);
+                               String country = code.substring(indexUnd + 1);
+                               locale = new Locale(language, country);
+                       } else {
+                               locale = new Locale(code);
+                       }
+                       availableLocales.add(locale);
+               }
+               return availableLocales;
        }
 
        public static void main(String[] args) {