/* * Copyright 2015 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.screens.datamodeller.client.widgets.advanceddomain.valuepaireditor.enums; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.ui.Widget; import org.kie.workbench.common.screens.datamodeller.client.widgets.advanceddomain.valuepaireditor.ValuePairEditor; import org.kie.workbench.common.screens.datamodeller.client.widgets.advanceddomain.valuepaireditor.ValuePairEditorHandler; import org.kie.workbench.common.screens.datamodeller.client.widgets.advanceddomain.valuepaireditor.util.ValuePairEditorUtil; import org.kie.workbench.common.services.datamodeller.core.AnnotationValuePairDefinition; import org.uberfire.commons.data.Pair; public class MultipleEnumValuePairEditor implements MultipleEnumValuePairEditorView.Presenter, ValuePairEditor<List<String>> { private MultipleEnumValuePairEditorView view; private AnnotationValuePairDefinition valuePairDefinition; private ValuePairEditorHandler editorHandler; private Map<String, EnumValuePairOptionEditor> valueToEditor = new HashMap<String, EnumValuePairOptionEditor>(); private static final String EMPTY_ARRAY = "_EMPTY_ARRAY_"; private List<String> currentValues = null; public MultipleEnumValuePairEditor() { this( ( MultipleEnumValuePairEditorView ) GWT.create( MultipleEnumValuePairEditorViewImpl.class ) ); } public MultipleEnumValuePairEditor( MultipleEnumValuePairEditorView view ) { this.view = view; view.init( this ); } @Override public Widget asWidget() { return view.asWidget(); } @Override public void init( AnnotationValuePairDefinition valuePairDefinition ) { this.valuePairDefinition = valuePairDefinition; view.setValuePairLabel( ValuePairEditorUtil.buildValuePairLabel( valuePairDefinition ) ); view.showValuePairRequiredIndicator( !valuePairDefinition.hasDefaultValue() ); initOptionEditors( createOptions( valuePairDefinition.enumValues() ) ); } @Override public void clear() { setSelectedValues( new ArrayList<String>() ); } @Override public void addEditorHandler( ValuePairEditorHandler editorHandler ) { this.editorHandler = editorHandler; } @Override public void setValue( List<String> value ) { this.currentValues = value; setSelectedValues( value ); } public List<String> getValue( ) { return currentValues; } @Override public boolean isValid() { return true; } @Override public AnnotationValuePairDefinition getValuePairDefinition() { return valuePairDefinition; } @Override public void setErrorMessage( String errorMessage ) { view.setErrorMessage( errorMessage ); } @Override public void clearErrorMessage() { view.clearErrorMessage(); } @Override public void showValidateButton( boolean show ) { //This editor doesn't need the validate button. } @Override public void showValuePairName( boolean show ) { //this editor doesn't need to hide the label } @Override public void refresh() { //This editor doesn't need the refresh implementation. } private List<Pair<String, String>> createOptions( String[] enumValues ) { List<Pair<String, String>> items = new ArrayList<Pair<String, String>>( ); for ( int i = 0; i < enumValues.length; i++ ) { items.add( new Pair( enumValues[i], enumValues[i] ) ); } return items; } private void initOptionEditors( List<Pair<String, String>> options ) { view.clear(); if ( options != null ) { for ( final Pair<String, String> option : options ) { final EnumValuePairOptionEditor optionEditor = createOptionEditor( option.getK2() ); valueToEditor.put( option.getK2(), optionEditor ); optionEditor.addEnumValuePairOptionEditorHandler( new EnumValuePairOptionEditorView.EnumValuePairOptionEditorHandler() { @Override public void onValueChange() { doOnValueChange( option.getK2(), optionEditor.getValue() ); if ( !EMPTY_ARRAY.equals( option.getK2() ) && optionEditor.getValue() ) { valueToEditor.get( EMPTY_ARRAY ).setValue( false ); } } } ); view.addOptionEditor( optionEditor ); } } final EnumValuePairOptionEditor emptyArrayEditor = createOptionEditor( "{}" ); view.addOptionEditor( emptyArrayEditor ); valueToEditor.put( EMPTY_ARRAY, emptyArrayEditor ); emptyArrayEditor.addEnumValuePairOptionEditorHandler( new EnumValuePairOptionEditorView.EnumValuePairOptionEditorHandler() { @Override public void onValueChange() { doOnValueChange( EMPTY_ARRAY, emptyArrayEditor.getValue() ); if ( emptyArrayEditor.getValue() ) { uncheckOthers( EMPTY_ARRAY ); } } } ); } //protected for testing purposes protected EnumValuePairOptionEditor createOptionEditor( String option ) { return new EnumValuePairOptionEditor( option ); } private void doOnValueChange( String valueName, boolean isChecked ) { if ( EMPTY_ARRAY.equals( valueName ) ) { currentValues = isChecked ? new ArrayList<String>( ) : null; } else if ( !isChecked ) { safeRemoveValue( valueName ); } else { safeAddValue( valueName ); } if ( editorHandler != null ) { editorHandler.onValueChange(); } } private void setSelectedValues( List<String> values ) { for ( EnumValuePairOptionEditor optionEditor : valueToEditor.values() ) { optionEditor.setValue( false ); } if ( values != null ) { if ( values.size() == 0 ) { valueToEditor.get( EMPTY_ARRAY ).setValue( true ); } else { for ( String value : values ) { EnumValuePairOptionEditor optionEditor = valueToEditor.get( value ); if ( optionEditor != null ) { optionEditor.setValue( true ); } } } } } private void safeRemoveValue( String value ) { if ( currentValues != null ) { currentValues.remove( value ); if ( currentValues.size() == 0 ) { currentValues = null; } } } private void safeAddValue( String value ) { if ( currentValues == null ) { currentValues = new ArrayList<String>( ); } if ( !currentValues.contains( value )) { currentValues.add( value ); } } private void uncheckOthers( String value ) { for ( String key : valueToEditor.keySet() ) { if ( !key.equals( value ) ) { valueToEditor.get( key ).setValue( false ); } } } }