Home | History | Annotate | Download | only in configuration
      1 /*
      2  * Copyright (C) 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Eclipse Public License, Version 1.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.eclipse.org/org/documents/epl-v10.php
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.ide.eclipse.adt.internal.editors.layout.configuration;
     18 
     19 import static com.android.ide.common.resources.configuration.LocaleQualifier.FAKE_VALUE;
     20 
     21 import com.android.annotations.NonNull;
     22 import com.android.annotations.Nullable;
     23 import com.android.ide.common.resources.configuration.FolderConfiguration;
     24 import com.android.ide.common.resources.configuration.LocaleQualifier;
     25 
     26 import org.eclipse.swt.graphics.Image;
     27 
     28 /**
     29  * A language,region pair
     30  */
     31 public class Locale {
     32     /**
     33      * A special marker region qualifier representing any region
     34      */
     35     public static final LocaleQualifier ANY_QUALIFIER = new LocaleQualifier(FAKE_VALUE);
     36 
     37     /**
     38      * A locale which matches any language and region
     39      */
     40     public static final Locale ANY = new Locale(ANY_QUALIFIER);
     41 
     42     /**
     43      * The locale qualifier, or {@link #ANY_QUALIFIER} if this locale matches
     44      * any locale
     45      */
     46     @NonNull
     47     public final LocaleQualifier qualifier;
     48 
     49     /**
     50      * Constructs a new {@linkplain Locale} matching a given language in a given
     51      * locale.
     52      *
     53      * @param locale the locale
     54      */
     55     private Locale(@NonNull
     56     LocaleQualifier locale) {
     57         qualifier = locale;
     58     }
     59 
     60     /**
     61      * Constructs a new {@linkplain Locale} matching a given language in a given
     62      * specific locale.
     63      *
     64      * @param locale the locale
     65      * @return a locale with the given locale
     66      */
     67     @NonNull
     68     public static Locale create(@NonNull
     69     LocaleQualifier locale) {
     70         return new Locale(locale);
     71     }
     72 
     73     /**
     74      * Constructs a new {@linkplain Locale} for the given folder configuration
     75      *
     76      * @param folder the folder configuration
     77      * @return a locale with the given language and region
     78      */
     79     public static Locale create(FolderConfiguration folder) {
     80         LocaleQualifier locale = folder.getLocaleQualifier();
     81         if (locale == null) {
     82             return ANY;
     83         } else {
     84             return new Locale(locale);
     85         }
     86     }
     87 
     88     /**
     89      * Constructs a new {@linkplain Locale} for the given locale string, e.g.
     90      * "zh", "en-rUS", or "b+eng+US".
     91      *
     92      * @param localeString the locale description
     93      * @return the corresponding locale
     94      */
     95     @NonNull
     96     public static Locale create(@NonNull
     97     String localeString) {
     98         // Load locale. Note that this can get overwritten by the
     99         // project-wide settings read below.
    100 
    101         LocaleQualifier qualifier = LocaleQualifier.getQualifier(localeString);
    102         if (qualifier != null) {
    103             return new Locale(qualifier);
    104         } else {
    105             return ANY;
    106         }
    107     }
    108 
    109     /**
    110      * Returns a flag image to use for this locale
    111      *
    112      * @return a flag image, or a default globe icon
    113      */
    114     @NonNull
    115     public Image getFlagImage() {
    116         String languageCode = qualifier.hasLanguage() ? qualifier.getLanguage() : null;
    117         if (languageCode == null) {
    118             return FlagManager.getGlobeIcon();
    119         }
    120         String regionCode = hasRegion() ? qualifier.getRegion() : null;
    121         FlagManager icons = FlagManager.get();
    122         Image image = icons.getFlag(languageCode, regionCode);
    123         if (image != null) {
    124             return image;
    125         } else {
    126             return FlagManager.getGlobeIcon();
    127         }
    128     }
    129 
    130     /**
    131      * Returns true if this locale specifies a specific language. This is true
    132      * for all locales except {@link #ANY}.
    133      *
    134      * @return true if this locale specifies a specific language
    135      */
    136     public boolean hasLanguage() {
    137         return !qualifier.hasFakeValue();
    138     }
    139 
    140     /**
    141      * Returns true if this locale specifies a specific region
    142      *
    143      * @return true if this locale specifies a region
    144      */
    145     public boolean hasRegion() {
    146         return qualifier.getRegion() != null && !FAKE_VALUE.equals(qualifier.getRegion());
    147     }
    148 
    149     /**
    150      * Returns the locale formatted as language-region. If region is not set,
    151      * language is returned. If language is not set, empty string is returned.
    152      */
    153     public String toLocaleId() {
    154         return qualifier == ANY_QUALIFIER ? "" : qualifier.getTag();
    155     }
    156 
    157     @Override
    158     public int hashCode() {
    159         final int prime = 31;
    160         int result = 1;
    161         result = prime * result + qualifier.hashCode();
    162         return result;
    163     }
    164 
    165     @Override
    166     public boolean equals(@Nullable
    167     Object obj) {
    168         if (this == obj)
    169             return true;
    170         if (obj == null)
    171             return false;
    172         if (getClass() != obj.getClass())
    173             return false;
    174         Locale other = (Locale) obj;
    175         if (!qualifier.equals(other.qualifier))
    176             return false;
    177         return true;
    178     }
    179 
    180     @Override
    181     public String toString() {
    182         return qualifier.getTag();
    183     }
    184 }
    185