/*
 * $Id: LocaleManager.java,v 1.3 2003/12/24 10:12:03 bigmac Exp $
 *
 * Copyright (c) Siemens AG 2008 
 *           (c) Universität Paderborn 2008 
 * Licensed under EUPL 1.1. 
 *
 * $Log: LocaleManager.java,v $
 * Revision 1.3  2003/12/24 10:12:03  bigmac
 * Projektweite Import-Optimierung
 *
 * Revision 1.2  2003/06/06 10:58:03  lawern
 * Anpassungen an Retriever
 *
 * Revision 1.1  2002/10/21 14:35:57  bigmac
 * *** empty log message ***
 *
 * Revision 1.1  2002/05/14 13:48:55  moelle
 * *** empty log message ***
 *
 * Revision 1.2  2002/02/26 09:39:02  bigmac
 * warning von javadoc behoben
 *
 * Revision 1.1  2001/10/09 13:36:18  bigmac
 * Initial version
 *
 */
package vkc.misc;

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


/**
 * Klasse zur Verwaltung und Benachrichtigung von  applikationsweiten
 * Spracheinstellungen
 * 
 * <p></p>
 *
 * @author bigmac
 */
public class LocaleManager implements LocaleChangeListener {
    private static Locale locale = Locale.getDefault();
    private static LocaleManager localeManager = null;
    HashSet localeChangeListeners = new HashSet();

    protected LocaleManager() {
    }

    /**
     * Gibt die einzige Instanz innherhalb einer Applikation des LocaleManagers
     * zurück.
     * 
     * <p></p>
     */
    public static LocaleManager getLocaleManager() {
        if (localeManager == null) {
            localeManager = new LocaleManager();
        }

        return localeManager;
    }

    /**
     * Setzt die Locale des LocaleManagers
     * 
     * <p></p>
     */
    public static void setLocale(Locale l) {
        locale = l;
        Locale.setDefault(l);

        LocaleChangeEvent e = new LocaleChangeEvent(getLocaleManager(), l);
        getLocaleManager().localeChanged(e);
    }

    /**
     * Gibt z.Zt. gesetzte Locale des LocaleManagers zurück
     * 
     * <p></p>
     */
    public static Locale getLocale() {
        return locale;
    }

    /**
     * Registriert einen LocaleChangeListener für die Benachrichtigung bei
     * Änderungen an der Locale
     * 
     * <p></p>
     */
    public synchronized void addLocaleChangeListener(
        LocaleChangeListener listener) {
        localeChangeListeners.add(listener);
    }

    /**
     * Enfernt einen LocaleChangeListener aus der Benachrichtigungsliste
     * 
     * <p></p>
     */
    public synchronized void removeLocaleChangeListener(
        LocaleChangeListener listener) {
        localeChangeListeners.remove(listener);
    }

    /**
     * Benachrichtigt alle registrierten Listener bei Bedarf
     * 
     * <p></p>
     */
    public void localeChanged(LocaleChangeEvent e) {
        HashSet listeners;

        locale = e.getLocale();

        synchronized (this) {
            listeners = (HashSet) localeChangeListeners.clone();
        }

        Iterator it = listeners.iterator();
        LocaleChangeListener listener = null;

        while (it.hasNext()) {
            listener = (LocaleChangeListener) it.next();

            try {
                listener.localeChanged(e);
            } catch (Exception ex) {
                localeChangeListeners.remove(listener);

                continue;
            }
        }
    }
}
