/*******************************************************************************
* Copyright (c) 2013, 2015 Dirk Fauth and others.
* 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:
* Dirk Fauth <dirk.fauth@googlemail.com> - initial API and implementation
* Fabian Miehe - Bug 440435
*******************************************************************************/
package org.eclipse.e4.ui.internal;
import java.util.List;
import java.util.Locale;
import javax.inject.Inject;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.di.annotations.Optional;
import org.eclipse.e4.core.internal.services.ResourceBundleHelper;
import org.eclipse.e4.core.services.events.IEventBroker;
import org.eclipse.e4.core.services.nls.ILocaleChangeService;
import org.eclipse.e4.core.services.translation.TranslationService;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.model.application.ui.MElementContainer;
import org.eclipse.e4.ui.model.application.ui.MLocalizable;
import org.eclipse.e4.ui.model.application.ui.MUIElement;
import org.eclipse.e4.ui.model.application.ui.advanced.MPerspective;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.e4.ui.model.application.ui.basic.MTrimBar;
import org.eclipse.e4.ui.model.application.ui.basic.MTrimmedWindow;
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
import org.eclipse.e4.ui.model.application.ui.menu.MToolBar;
import org.osgi.service.log.LogService;
/**
* Default implementation of {@link ILocaleChangeService} that changes the {@link Locale} in the
* specified {@link IEclipseContext} and additionally fires an event on the event bus.
*
* @author Dirk Fauth
*
*/
@SuppressWarnings("restriction")
public class LocaleChangeServiceImpl implements ILocaleChangeService {
MApplication application;
@Inject
IEventBroker broker;
@Inject
@Optional
LogService logService;
/**
* Create a new {@link LocaleChangeServiceImpl} for the given {@link IEclipseContext}.
*
* @param application
* The application to retrieve the context from.
*/
@Inject
public LocaleChangeServiceImpl(MApplication application) {
this.application = application;
}
@Override
public void changeApplicationLocale(Locale locale) {
// the TranslationService.LOCALE context parameter is specified as String
// so we put the String representation of the given Locale to the context
this.application.getContext().set(TranslationService.LOCALE, locale);
// update model
updateLocalization(this.application.getChildren());
// fire event
broker.post(LOCALE_CHANGE, locale);
}
@Override
public void changeApplicationLocale(String localeString) {
try {
Locale locale = ResourceBundleHelper.toLocale(localeString);
// set the locale to the application context
// use the resolved locale instead of the given locale string to avoid invalid locales
// in context
this.application.getContext().set(TranslationService.LOCALE, locale);
// update model
updateLocalization(this.application.getChildren());
// fire event
broker.post(LOCALE_CHANGE, locale);
} catch (Exception e) {
// performing a locale update failed
// there is no locale change performed
if (logService != null)
logService.log(LogService.LOG_ERROR, e.getMessage()
+ " - No Locale change will be performed."); //$NON-NLS-1$
}
}
/**
* Will iterate over the given list of {@link MUIElement}s and inform them about the Locale
* change if necessary.
*
* @param children
* The list of {@link MUIElement}s that should be checked for Locale updates.
*/
@SuppressWarnings({ "rawtypes" })
protected void updateLocalization(List<? extends MUIElement> children) {
for (MUIElement element : children) {
if (element instanceof MElementContainer) {
updateLocalization(((MElementContainer) element).getChildren());
}
if (element instanceof MWindow) {
MWindow window = (MWindow) element;
MMenu mainMenu = window.getMainMenu();
if (mainMenu != null) {
mainMenu.updateLocalization();
updateLocalization(mainMenu.getChildren());
}
updateLocalization(window.getSharedElements());
updateLocalization(window.getWindows());
}
if (element instanceof MTrimmedWindow) {
for (MTrimBar trimBar : ((MTrimmedWindow) element).getTrimBars()) {
trimBar.updateLocalization();
updateLocalization(trimBar.getChildren());
}
}
if (element instanceof MPerspective) {
updateLocalization(((MPerspective) element).getWindows());
}
if (element instanceof MPart) {
MPart mPart = (MPart) element;
MToolBar toolbar = mPart.getToolbar();
if (toolbar != null && toolbar.getChildren() != null) {
toolbar.updateLocalization();
updateLocalization(toolbar.getChildren());
}
}
((MLocalizable) element).updateLocalization();
}
}
}