org.ripla.web.util.LanguageSelect.java Source code

Java tutorial

Introduction

Here is the source code for org.ripla.web.util.LanguageSelect.java

Source

/*******************************************************************************
 * Copyright (c) 2012-2013 RelationWare, Benno Luthiger
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 * RelationWare, Benno Luthiger
 ******************************************************************************/

package org.ripla.web.util;

import java.util.HashMap;
import java.util.Locale;

import org.osgi.service.useradmin.User;
import org.ripla.interfaces.IRiplaEventDispatcher;
import org.ripla.util.PreferencesHelper;
import org.ripla.web.Activator;
import org.ripla.web.Constants;
import org.ripla.web.interfaces.IToolbarAction;
import org.ripla.web.interfaces.IToolbarActionListener;
import org.ripla.web.internal.services.ConfigManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.vaadin.data.Property;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.server.VaadinSession;
import com.vaadin.shared.ui.label.ContentMode;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;

/**
 * Language selection component.
 * 
 * @author Luthiger
 */
@SuppressWarnings("serial")
public final class LanguageSelect extends CustomComponent {
    private static final Logger LOG = LoggerFactory.getLogger(LanguageSelect.class);

    private final HorizontalLayout layout;
    private IToolbarActionListener listener;

    private final ComboBox select;

    /**
     * LanguageSelect constructor.
     * 
     * @param inPreferences
     *            {@link PreferencesHelper}
     * @param inConfigManager
     *            {@link ConfigManager}
     * @param inUser
     *            {@link User}
     */
    public LanguageSelect(final PreferencesHelper inPreferences, final ConfigManager inConfigManager,
            final User inUser) {
        super();
        // initialize language form prefs (1) or config admin (2)
        // final String lActiveLanguage = inPreferences.getLocale(inUser,
        // new Locale(inConfigManager.getLanguage())).getLanguage();

        setStyleName("ripla-language-select"); //$NON-NLS-1$
        setSizeUndefined();

        layout = new HorizontalLayout();
        setCompositionRoot(layout);
        layout.setHeight(22, Unit.PIXELS);
        layout.setSpacing(true);

        final Label lLabel = new Label(Activator.getMessages().getMessage("toolbar.label.language"), //$NON-NLS-1$
                ContentMode.HTML);
        lLabel.setStyleName("ripla-toolbar-label"); //$NON-NLS-1$
        lLabel.setSizeUndefined();
        layout.addComponent(lLabel);
        layout.setComponentAlignment(lLabel, Alignment.MIDDLE_LEFT);
        layout.setExpandRatio(lLabel, 1);

        select = createSelect();
        select.addValueChangeListener(new Property.ValueChangeListener() {
            @Override
            public void valueChange(final ValueChangeEvent inEvent) {
                final Locale lNew = ((LocaleAdapter) select.getValue()).getLocale();
                Locale lOld = null;
                try {
                    VaadinSession.getCurrent().getLockInstance().lock();
                    lOld = VaadinSession.getCurrent().getLocale();
                } finally {
                    VaadinSession.getCurrent().getLockInstance().unlock();
                }
                if (lOld != null && !lOld.equals(lNew)) {
                    try {
                        VaadinSession.getCurrent().getLockInstance().lock();
                        VaadinSession.getCurrent().setLocale(lNew);
                    } finally {
                        VaadinSession.getCurrent().getLockInstance().unlock();
                    }
                    if (listener != null) {
                        listener.processAction(new IToolbarAction() {
                            @Override
                            public void run() {
                                LOG.trace("Setting language preference to {}.", lNew.getLanguage());
                                VaadinSession.getCurrent().getAttribute(IRiplaEventDispatcher.class).dispatch(
                                        org.ripla.interfaces.IRiplaEventDispatcher.Event.REFRESH,
                                        new HashMap<String, Object>());
                            }
                        });
                    }
                }
            }
        });
        layout.addComponent(select);
    }

    /**
     * @param inHeight
     *            int the component's height in pixels
     */
    public void setHeight(final int inHeight) {
        layout.setHeight(inHeight, Unit.PIXELS);
    }

    /**
     * @param inListeners
     *            IToolbarActionListener the listener to actions on the toolbar
     *            item
     */
    public void setListener(final IToolbarActionListener inListener) {
        listener = inListener;
    }

    private ComboBox createSelect() {
        final ComboBox outSelect = new ComboBox(null);
        outSelect.setStyleName("ripla-select"); //$NON-NLS-1$
        outSelect.setWidth(55, Unit.PIXELS);
        outSelect.setNullSelectionAllowed(false);
        outSelect.setImmediate(true);
        return outSelect;
    }

    @Override
    public void attach() {
        super.attach();

        final LanguagesContainer lLanguages = LanguagesContainer.getLanguages(Constants.LANGUAGES,
                getSession().getLocale().getLanguage());
        select.setContainerDataSource(lLanguages);
        select.select(lLanguages.getActiveLanguage());
    }

    // ---

    private static class LanguagesContainer extends BeanItemContainer<LocaleAdapter> {
        private LocaleAdapter activeLanguage;

        private LanguagesContainer() {
            super(LocaleAdapter.class);
        }

        protected static LanguagesContainer getLanguages(final Locale[] inLanguages,
                final String inActiveLanguage) {
            final LanguagesContainer out = new LanguagesContainer();
            for (final Locale lLocale : inLanguages) {
                final LocaleAdapter lWrapped = new LocaleAdapter(lLocale); // NOPMD
                out.addItem(lWrapped);
                if (inActiveLanguage.equals(lLocale.getLanguage())) {
                    out.setActiveLanguage(lWrapped);
                }
            }
            return out;
        }

        private void setActiveLanguage(final LocaleAdapter inActiveLanguage) {
            activeLanguage = inActiveLanguage;
        }

        protected LocaleAdapter getActiveLanguage() {
            return activeLanguage;
        }
    }

    private static class LocaleAdapter {
        private final Locale locale;

        LocaleAdapter(final Locale inLocale) {
            locale = inLocale;
        }

        protected Locale getLocale() {
            return locale;
        }

        @Override
        public String toString() {
            return locale.getLanguage();
        }
    }

}