/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* 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.
*/
package org.kie.workbench.common.workbench.client.configuration.popups;
import java.util.HashMap;
import java.util.Map;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Widget;
import org.jboss.errai.common.client.api.Caller;
import org.jboss.errai.common.client.api.RemoteCallback;
import org.jboss.errai.ioc.client.api.AfterInitialization;
import org.kie.workbench.common.widgets.client.resources.i18n.CommonConstants;
import org.kie.workbench.common.workbench.client.configuration.ContextualView;
import org.uberfire.client.mvp.PerspectiveActivity;
import org.uberfire.client.mvp.PerspectiveManager;
import org.uberfire.client.mvp.PlaceManager;
import org.uberfire.commons.data.Pair;
import org.uberfire.ext.properties.editor.client.widgets.PropertyEditorComboBox;
import org.uberfire.ext.properties.editor.client.widgets.PropertyEditorItemLabel;
import org.uberfire.ext.services.shared.preferences.UserPreferencesService;
import org.uberfire.ext.services.shared.preferences.UserWorkbenchPreferences;
import org.uberfire.ext.widgets.common.client.common.popups.BaseModal;
import org.uberfire.ext.widgets.common.client.common.popups.errors.ErrorPopup;
import org.uberfire.ext.widgets.common.client.common.popups.footers.ModalFooterOKCancelButtons;
import org.uberfire.mvp.PlaceRequest;
import org.uberfire.mvp.impl.ForcedPlaceRequest;
import static org.kie.workbench.common.workbench.client.configuration.ContextualView.*;
@Dependent
public class WorkbenchConfigurationPopup extends BaseModal {
interface WorkbenchConfigurationPopupImplBinder extends UiBinder<Widget, WorkbenchConfigurationPopup> {
}
private static WorkbenchConfigurationPopupImplBinder uiBinder = GWT.create( WorkbenchConfigurationPopupImplBinder.class );
@UiField
PropertyEditorComboBox languageListItems;
@UiField
PropertyEditorComboBox multipleModeItems;
@UiField
PropertyEditorItemLabel languageListItemsLabel;
@UiField
PropertyEditorItemLabel multipleModeItemsLabel;
private PlaceManager placeManager;
private PerspectiveManager perspectiveManager;
private ContextualView contextualView;
private Caller<UserPreferencesService> preferencesService;
private CommonConstants constants = GWT.create( CommonConstants.class );
private Map<String, String> languageMap = new HashMap<String, String>();
private Map<String, String> viewModeMap = new HashMap<String, String>();
@Inject
public WorkbenchConfigurationPopup( final PlaceManager placeManager,
final PerspectiveManager perspectiveManager,
final ContextualView contextualView,
final Caller<UserPreferencesService> preferencesService ) {
this.placeManager = placeManager;
this.perspectiveManager = perspectiveManager;
this.contextualView = contextualView;
this.preferencesService = preferencesService;
setTitle( constants.Workbench_Settings() );
setBody( uiBinder.createAndBindUi( WorkbenchConfigurationPopup.this ) );
final Command okCommand = new Command() {
@Override
public void execute() {
onOk();
hide();
}
};
final Command cancelCommand = new Command() {
@Override
public void execute() {
hide();
}
};
add( new ModalFooterOKCancelButtons( okCommand,
cancelCommand ) );
languageMap.put( "default",
constants.English() );
languageMap.put( "zh_CN",
constants.ChineseSimplified() );
languageMap.put( "de",
constants.German() );
languageMap.put( "es",
constants.Spanish() );
languageMap.put( "fr",
constants.French() );
languageMap.put( "ja",
constants.Japanese() );
languageMap.put( "pt_BR",
constants.Portuguese() );
viewModeMap.put( ADVANCED_MODE,
constants.Advanced() );
viewModeMap.put( BASIC_MODE,
constants.Basic() );
}
@AfterInitialization
public void setup() {
languageListItemsLabel.setText( constants.Language() );
multipleModeItemsLabel.setText( constants.View_Mode() );
setLanguageListItems();
setMultipleModeItems( multipleModeItems );
preferencesService.call( new RemoteCallback<UserWorkbenchPreferences>() {
@Override
public void callback( final UserWorkbenchPreferences response ) {
if ( response != null ) {
languageListItems.setSelectItemByText( languageMap.get( response.getLanguage() ) );
multipleModeItems.setSelectItemByText( viewModeMap.get( response.getViewMode( ALL_PERSPECTIVES ) ) );
for ( Map.Entry<String, String> entry : response.getPerspectiveViewMode().entrySet() ) {
contextualView.setViewMode( entry.getKey(),
entry.getValue() );
}
refresh( response.getLanguage(),
response.getViewMode( ALL_PERSPECTIVES ),
response );
}
}
} ).loadUserPreferences( new UserWorkbenchPreferences( "default" ) );
}
public void onOk() {
final Pair<String, String> selectedLanguage = languageListItems.getSelectedPair( languageListItems.getSelectedIndex() );
final Pair<String, String> selectedViewMode = multipleModeItems.getSelectedPair( multipleModeItems.getSelectedIndex() );
refresh( selectedLanguage.getK2(),
selectedViewMode.getK2(),
null );
saveUserWorkbenchPreferences( selectedLanguage.getK2(),
selectedViewMode.getK2() );
}
private void saveUserWorkbenchPreferences( final String language,
final String viewMode ) {
UserWorkbenchPreferences preferences = new UserWorkbenchPreferences( language );
preferences.setViewMode( ALL_PERSPECTIVES,
viewMode );
preferencesService.call( new RemoteCallback<Void>() {
@Override
public void callback( Void response ) {
}
} ).saveUserPreferences( preferences );
}
private void refresh( final String selectedLanguageItem,
final String selectedMultipleMode,
final UserWorkbenchPreferences response ) {
boolean refreshPerspectiveFlag = true;
boolean refreshWorkbenchFlag = true;
if ( selectedLanguageItem.equals( getCurrentLocaleName() ) ) {
refreshWorkbenchFlag = false;
}
if ( selectedMultipleMode.equals( contextualView.getViewMode( ALL_PERSPECTIVES ) ) ) {
refreshPerspectiveFlag = false;
}
switchMode( refreshPerspectiveFlag,
refreshWorkbenchFlag );
refreshWorkbench( selectedLanguageItem,
refreshWorkbenchFlag,
response );
}
private void setLanguageListItems() {
languageListItems.clear();
final String[] languages = getAvailableLocaleNames();
for ( String language : languages ) {
languageListItems.addItem( Pair.newPair( languageMap.get( language ),
language ) );
}
}
private void setCurrentLanguage( final String languageName,
final UserWorkbenchPreferences response ) {
String isRefresh = Window.Location.getParameter( "isRefresh" );
if ( response != null && ( isRefresh == null || isRefresh.equals( "" ) ) ) {
Window.Location.assign( Window.Location.createUrlBuilder()
.removeParameter( getLocaleQueryParam() )
.setParameter( getCurrentLocaleQueryParam(),
languageName )
.setParameter( "isRefresh",
"false" )
.buildString() );
} else if ( response == null ) {
Window.Location.assign( Window.Location.createUrlBuilder()
.removeParameter( getLocaleQueryParam() )
.setParameter( getCurrentLocaleQueryParam(),
languageName )
.buildString() );
}
}
private void refreshWorkbench( final String selectedLanguageItem,
final boolean refreshWorkbenchFlag,
final UserWorkbenchPreferences response ) {
if ( refreshWorkbenchFlag == false ) {
return;
}
if ( selectedLanguageItem == null || selectedLanguageItem.equals( "" ) ) {
showFieldEmptyWarning();
} else {
setCurrentLanguage( selectedLanguageItem,
response );
}
}
private void setMultipleModeItems( final PropertyEditorComboBox multipleModeItems ) {
multipleModeItems.clear();
multipleModeItems.addItem( Pair.newPair( viewModeMap.get( BASIC_MODE ),
BASIC_MODE ) );
multipleModeItems.addItem( Pair.newPair( viewModeMap.get( ADVANCED_MODE ),
ADVANCED_MODE ) );
}
private void switchMode( final boolean refreshPerspectiveFlag,
final boolean refreshWorkbenchFlag ) {
String isRefresh = Window.Location.getParameter( "isRefresh" );
if ( refreshPerspectiveFlag && ( !refreshWorkbenchFlag || ( refreshWorkbenchFlag && isRefresh.equals( "false" ) ) ) ) {
String modeName = contextualView.getViewMode( ALL_PERSPECTIVES );
if ( modeName.equals( BASIC_MODE ) ) {
contextualView.setViewMode( ALL_PERSPECTIVES,
ADVANCED_MODE );
} else {
contextualView.setViewMode( ALL_PERSPECTIVES,
BASIC_MODE );
}
refreshPerspective();
}
}
private void refreshPerspective() {
final PerspectiveActivity currentPerspective = perspectiveManager.getCurrentPerspective();
perspectiveManager.removePerspectiveStates( new org.uberfire.mvp.Command() {
@Override
public void execute() {
if ( currentPerspective != null ) {
final PlaceRequest pr = new ForcedPlaceRequest( currentPerspective.getIdentifier(),
currentPerspective.getPlace().getParameters() );
placeManager.goTo( pr );
}
}
} );
}
private void showFieldEmptyWarning() {
ErrorPopup.showMessage( constants.PleaseSetAName() );
}
//Support overriding for Unit Tests
protected String[] getAvailableLocaleNames() {
return LocaleInfo.getAvailableLocaleNames();
}
//Support overriding for Unit Tests
protected String getLocaleQueryParam() {
return LocaleInfo.getLocaleQueryParam();
}
//Support overriding for Unit Tests
protected String getCurrentLocaleName() {
return LocaleInfo.getCurrentLocale().getLocaleName();
}
//Support overriding for Unit Tests
protected String getCurrentLocaleQueryParam() {
return LocaleInfo.getCurrentLocale().getLocaleQueryParam();
}
}