/*******************************************************************************
* Copyright (c) 2013, 2016 EclipseSource 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:
* EclipseSource - initial API and implementation
******************************************************************************/
package org.eclipse.rap.examples.pages;
import static org.eclipse.rap.examples.pages.internal.ImageUtil.getImage;
import java.text.DateFormat;
import java.text.NumberFormat;
import java.util.Calendar;
import java.util.Currency;
import java.util.Locale;
import org.eclipse.rap.examples.ExampleUtil;
import org.eclipse.rap.examples.IExamplePage;
import org.eclipse.rap.examples.pages.internal.ExamplesMessages;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.rap.rwt.client.service.ClientInfo;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Device;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
public class InternationalizationExamplePage implements IExamplePage {
private Language[] languages;
private Composite parentContainer;
private Composite contentContainer;
private final float EQUATOR = 40075.017F;
@Override
public void createControl( Composite parent ) {
initLanguages( parent.getDisplay() );
parentContainer = parent;
parentContainer.addListener( SWT.Dispose, new LocaleResetListener() );
parentContainer.setLayout( ExampleUtil.createMainLayout( 1 ) );
createLocaleSwitcherArea();
createContentArea();
}
private void initLanguages( Device device ) {
languages = new Language[] {
new Language( null, getImage( device, "no-flag.png" ) ),
new Language( Locale.US, getImage( device, "en-flag.png" ) ),
new Language( Locale.GERMANY, getImage( device, "de-flag.png" ) ),
new Language( Locale.FRANCE, getImage( device, "fr-flag.png" ) ),
new Language( new Locale( "bg", "BG", "" ), getImage( device, "bg-flag.png" ) ),
new Language( Locale.CHINA, getImage( device, "zh-flag.png" ) )
};
}
private void createLocaleSwitcherArea() {
Composite container = new Composite( parentContainer, SWT.NONE );
container.setLayout( ExampleUtil.createGridLayout( 3, false, true, true ) );
container.setLayoutData( ExampleUtil.createHorzFillData() );
Label clientLanguage = new Label( container, SWT.NONE );
clientLanguage.setLayoutData( createClientLanguageGridData() );
ClientInfo clientInfo = RWT.getClient().getService( ClientInfo.class );
clientLanguage.setText( "Browser default language: "
+ clientInfo.getLocale().getDisplayLanguage() );
new Label( container, SWT.NONE ).setText( "Select language: " );
ToolBar toolBar = new ToolBar( container, SWT.RIGHT | SWT.FLAT );
toolBar.setLayoutData( createToolBarGridData() );
ToolItem dropDown = new ToolItem( toolBar, SWT.DROP_DOWN );
dropDown.setText( languages[ 0 ].name );
dropDown.setImage( languages[ 0 ].flag );
Menu dropDownMenu = createDropDownMenu( dropDown );
dropDown.addListener( SWT.Selection, new DropDownSelectionListener( dropDownMenu ) );
}
private Menu createDropDownMenu( ToolItem dropDown ) {
Menu menu = new Menu( dropDown.getParent().getShell(), SWT.POP_UP );
for( int i = 0; i < languages.length; i++ ) {
MenuItem item = new MenuItem( menu, SWT.PUSH );
item.setText( languages[ i ].name );
item.setImage( languages[ i ].flag );
item.setData( languages[ i ] );
item.addListener( SWT.Selection, new MenuItemSelectionListener( dropDown ) );
}
return menu;
}
private void createContentArea() {
if( contentContainer != null ) {
contentContainer.dispose();
}
contentContainer = new Composite( parentContainer, SWT.NONE );
contentContainer.setLayoutData( ExampleUtil.createFillData() );
contentContainer.setLayout( ExampleUtil.createGridLayout( 2, false, true, true ) );
createTextArea();
createCurrentDataArea();
parentContainer.layout();
}
private void createTextArea() {
Group area = new Group( contentContainer, SWT.NONE );
area.setLayoutData( new GridData( SWT.TOP, SWT.FILL, true, false ) );
area.setText( "Text" );
area.setLayout( ExampleUtil.createGridLayout( 1, false, true, true ) );
Label title = new Label( area, SWT.CENTER );
title.setLayoutData( ExampleUtil.createHorzFillData() );
title.setData( RWT.CUSTOM_VARIANT, "heading" );
title.setText( ExamplesMessages.get().WhatIsUnicode_Title );
Label text = new Label( area, SWT.WRAP );
text.setLayoutData( ExampleUtil.createFillData() );
text.setText( ExamplesMessages.get().WhatIsUnicode_Descritption );
}
private void createCurrentDataArea() {
Group area = new Group( contentContainer, SWT.NONE );
area.setLayoutData( new GridData( SWT.TOP, SWT.FILL, false, false ) );
area.setText( "Data" );
area.setLayout( ExampleUtil.createGridLayout( 2, false, true, true ) );
Locale locale = RWT.getLocale();
Calendar calendar = Calendar.getInstance( locale );
DateFormat dateFormatter = DateFormat.getDateInstance( DateFormat.FULL, locale );
addDataEntry( area, "Date:", dateFormatter.format( calendar.getTime() ) );
DateFormat timeFormatter = DateFormat.getTimeInstance( DateFormat.SHORT, locale );
addDataEntry( area, "Time:", timeFormatter.format( calendar.getTime() ) );
NumberFormat numberFormatter = NumberFormat.getNumberInstance( locale );
addDataEntry( area, "Equator:", numberFormatter.format( EQUATOR ) + " km" );
try {
Currency currentCurrency = Currency.getInstance( locale );
addDataEntry( area, "Currency:", currentCurrency.getCurrencyCode() );
} catch( IllegalArgumentException ex ) {
// Currency.getInstance not supported for all locale?
}
}
private void addDataEntry( Group area, String heading, String data ) {
Label title = new Label( area, SWT.RIGHT );
title.setText( heading );
title.setData( RWT.CUSTOM_VARIANT, "heading" );
Label today = new Label( area, SWT.RIGHT );
today.setText( data );
}
private GridData createClientLanguageGridData() {
return new GridData( SWT.FILL, SWT.CENTER, true, false );
}
private GridData createToolBarGridData() {
return new GridData( 180, SWT.DEFAULT );
}
private final class Language {
public final String name;
public final Locale locale;
public final Image flag;
public Language( Locale locale, Image flag ) {
if( locale == null ) {
this.name = "Default";
} else {
this.name = locale.getDisplayLanguage();
}
this.locale = locale;
this.flag = flag;
}
}
private final class MenuItemSelectionListener implements Listener {
private final ToolItem dropDown;
public MenuItemSelectionListener( ToolItem dropDown ) {
this.dropDown = dropDown;
}
@Override
public void handleEvent( Event event ) {
MenuItem item = ( MenuItem )event.widget;
Language language = ( Language )item.getData();
dropDown.setText( language.name );
dropDown.setImage( language.flag );
RWT.setLocale( language.locale );
createContentArea();
}
}
private final class DropDownSelectionListener implements Listener {
private final Menu menu;
public DropDownSelectionListener( Menu menu ) {
this.menu = menu;
}
@Override
public void handleEvent( Event event ) {
ToolItem dropDown = ( ToolItem )event.widget;
if( event.detail == SWT.ARROW ) {
Point point = dropDown.getParent().toDisplay( event.x, event.y );
menu.setLocation( point );
menu.setVisible( true );
}
}
}
private final class LocaleResetListener implements Listener {
@Override
public void handleEvent( Event event ) {
RWT.setLocale( null );
}
}
}