All Downloads are FREE. Search and download functionalities are using the official Maven repository.

gwt.material.design.incubator.client.language.LanguageSelector Maven / Gradle / Ivy

There is a newer version: 2.8.3
Show newest version
/*
 * #%L
 * GwtMaterial
 * %%
 * Copyright (C) 2015 - 2017 GwtMaterialDesign
 * %%
 * 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.
 * #L%
 */
package gwt.material.design.incubator.client.language;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Document;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.HasValue;
import gwt.material.design.client.MaterialDesignBase;
import gwt.material.design.client.base.HasActivates;
import gwt.material.design.client.base.HasType;
import gwt.material.design.client.base.MaterialWidget;
import gwt.material.design.client.base.mixin.CssTypeMixin;
import gwt.material.design.client.constants.IconPosition;
import gwt.material.design.client.ui.MaterialDropDown;
import gwt.material.design.client.ui.MaterialImage;
import gwt.material.design.client.ui.MaterialLink;
import gwt.material.design.incubator.client.AddinsIncubator;
import gwt.material.design.incubator.client.base.IncubatorWidget;
import gwt.material.design.incubator.client.base.constants.IncubatorCssName;

import java.util.ArrayList;
import java.util.List;

/**
 * A widget that provides a selection of {@link LanguageSelectorItem} for the site Internationalization (i18n)
 * 

*

* Note: This component is under the incubation process and subject to change. *

* * @author kevzlou7979 */ public class LanguageSelector extends MaterialWidget implements HasValue, HasType { static { IncubatorWidget.showWarning(LanguageSelector.class); if (AddinsIncubator.isDebug()) { MaterialDesignBase.injectCss(LanguageSelectorDebugClientBundle.INSTANCE.languageSelectorDebugCss()); } else { MaterialDesignBase.injectCss(LanguageSelectorClientBundle.INSTANCE.languageSelectorCss()); } } private MaterialImage imageActivator = new MaterialImage(); private MaterialLink textActivator = new MaterialLink(); private MaterialDropDown dropdown = new MaterialDropDown(); private List languages = new ArrayList<>(); private Language language; private boolean lazyLoaded; private CssTypeMixin typeMixin; public LanguageSelector() { super(Document.get().createDivElement(), IncubatorCssName.LANGUAGE_SELECTOR); setType(LanguageSelectorType.TEXT); } @Override protected void onLoad() { super.onLoad(); dropdown.clear(); dropdown.setConstrainWidth(false); add(dropdown); if (lazyLoaded) { languages.forEach(language -> addLanguageItem(language)); } // Register Value Change Handler registerHandler(addValueChangeHandler(event -> { Language language = event.getValue(); if (this.language != language) { // Navigate to selected language value / locale and reload the browser String param = Window.Location.createUrlBuilder().setParameter("locale", language.getValue()).buildString(); Window.Location.replace(param); } })); // Get the current locale inside the browser url String currentLocale = Window.Location.getParameter("locale"); if (languages.size() != 0) { Language currentLanguage = languages.stream().filter(language -> language.getValue().equals(currentLocale)).findFirst().orElse(languages.get(0)); setValue(currentLanguage, true); if (languages.size() == 1) { addStyleName(IncubatorCssName.SINGLE_LANGUAGE); } else { removeStyleName(IncubatorCssName.SINGLE_LANGUAGE); } } else { GWT.log("Please add at least one language for this selector."); } } /** * Ability to add language item {@link Language} * contains name, value and imageActivator url */ public void addLanguage(Language language) { languages.add(language); if (dropdown.isAttached()) { addLanguageItem(language); } else { lazyLoaded = true; } } public void addLanguageItem(Language language) { LanguageSelectorItem item = new LanguageSelectorItem(language); item.addClickHandler(event -> ValueChangeEvent.fire(LanguageSelector.this, language)); dropdown.add(item); } public void setLanguages(List languages) { for (Language language : languages) { addLanguage(language); } } /** * Get the lists of registered languages of this selector component */ public List getLanguages() { return languages; } @Override public Language getValue() { return language; } @Override public void setValue(Language language) { setValue(language, false); } @Override public void setValue(Language language, boolean fireEvents) { this.language = language; if (getType() == LanguageSelectorType.TEXT) { textActivator.setText(language.getName()); } else { imageActivator.setUrl(language.getImage()); } if (fireEvents) { ValueChangeEvent.fire(this, language); } } public MaterialDropDown getDropdown() { return dropdown; } @Override public void setType(LanguageSelectorType type) { getTypeMixin().setType(type); if (isAttached()) { applyType(type); } else { registerHandler(addAttachHandler(attachEvent -> applyType(type))); } } @Override public LanguageSelectorType getType() { return getTypeMixin().getType(); } protected void applyType(LanguageSelectorType type) { if (type == LanguageSelectorType.TEXT) { textActivator.setIconPosition(IconPosition.RIGHT); setActivator(textActivator); } else { setActivator(imageActivator); } } protected void setActivator(T widget) { String activator = DOM.createUniqueId(); widget.setActivates(activator); widget.addStyleName(IncubatorCssName.LANGUAGE_ACTIVATOR); add(widget); dropdown.setActivator(activator); dropdown.reload(); } @Override public HandlerRegistration addValueChangeHandler(ValueChangeHandler valueChangeHandler) { return addHandler(valueChangeHandler, ValueChangeEvent.getType()); } public CssTypeMixin getTypeMixin() { if (typeMixin == null) { typeMixin = new CssTypeMixin<>(this); } return typeMixin; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy