/* * 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. * * 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.drools.workbench.screens.guided.dtree.client.widget.popups; import java.util.Date; import java.util.Map; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.user.client.ui.Widget; import org.drools.workbench.models.datamodel.oracle.DataType; import org.drools.workbench.models.datamodel.oracle.DropDownData; import org.drools.workbench.models.guided.dtree.shared.model.nodes.HasValue; import org.drools.workbench.models.guided.dtree.shared.model.values.Value; import org.drools.workbench.screens.guided.dtree.client.resources.i18n.GuidedDecisionTreeConstants; import org.drools.workbench.screens.guided.dtree.client.widget.utils.ValueUtilities; import org.gwtbootstrap3.client.ui.ListBox; import org.gwtbootstrap3.client.ui.TextBox; import org.kie.workbench.common.services.shared.preferences.ApplicationPreferences; import org.kie.workbench.common.widgets.client.datamodel.AsyncPackageDataModelOracle; import org.kie.workbench.common.widgets.client.widget.EnumDropDownUtilities; import org.kie.workbench.common.widgets.client.widget.TextBoxFactory; import org.uberfire.ext.widgets.common.client.common.DatePicker; import org.uberfire.ext.widgets.common.client.common.popups.errors.ErrorPopup; public abstract class ValueEditorFactory { private static final String DATE_FORMAT = ApplicationPreferences.getDroolsDateFormat(); public Widget getValueEditor( final String className, final String fieldName, final HasValue hasValue, final AsyncPackageDataModelOracle oracle, final boolean isMultipleSelect ) { String dataType = oracle.getFieldType( className, fieldName ); //Operators "contained in" and "not contained in" fallback to Strings if ( isMultipleSelect ) { dataType = DataType.TYPE_STRING; } //Fields with enumerations fallback to Strings DropDownData dd = null; if ( oracle.hasEnums( className, fieldName ) ) { final Map<String, String> currentValueMap = getCurrentValueMap(); dd = oracle.getEnums( className, fieldName, currentValueMap ); } //Ensure Node has a value if needed if ( hasValue.getValue() == null ) { final Value value = ValueUtilities.makeEmptyValue( dataType ); if ( value == null ) { ErrorPopup.showMessage( GuidedDecisionTreeConstants.INSTANCE.dataTypeNotSupported0( dataType ) ); return null; } else { hasValue.setValue( value ); } } //Setup the correct widget corresponding to the data type if ( dataType.equals( DataType.TYPE_DATE ) ) { final DatePicker valueEditor = new DatePicker( false ); // Wire-up update handler valueEditor.addValueChangeHandler( new ValueChangeHandler<Date>() { @Override public void onValueChange( final ValueChangeEvent<Date> event ) { hasValue.getValue().setValue( valueEditor.getValue() ); } } ); //Set Widget's value valueEditor.setFormat( DATE_FORMAT ); valueEditor.setValue( (Date) hasValue.getValue().getValue() ); return valueEditor; } else if ( dataType.equals( DataType.TYPE_BOOLEAN ) ) { final ListBox valueEditor = new ListBox(); valueEditor.addItem( "true" ); valueEditor.addItem( "false" ); // Wire-up update handler valueEditor.addClickHandler( new ClickHandler() { public void onClick( final ClickEvent event ) { final String txtValue = valueEditor.getValue( valueEditor.getSelectedIndex() ); final Boolean value = Boolean.valueOf( txtValue ); hasValue.getValue().setValue( value ); } } ); //Set Widget's value valueEditor.setSelectedIndex( hasValue.getValue().getValue().equals( Boolean.TRUE ) ? 0 : 1 ); return valueEditor; } else { //If we have enumeration data show a ListBox if ( dd != null ) { final ListBox valueEditor = makeListBox( dd, hasValue, oracle, isMultipleSelect ); return valueEditor; } //Otherwise show a TextBox final TextBox valueEditor = TextBoxFactory.getTextBox( dataType ); //Wire-up Handlers before setting value, as invalid values cause the ValueChangeHandler to be invoked valueEditor.addValueChangeHandler( new ValueChangeHandler<String>() { @Override public void onValueChange( final ValueChangeEvent<String> event ) { hasValue.getValue().setValue( event.getValue() ); } } ); //Set Widget's value valueEditor.setText( ValueUtilities.convertNodeValue( hasValue.getValue() ) ); return valueEditor; } } //Get a Map<String(FieldName), String(FieldValue)> of all Constraints proceeding the one being edited //Dependent enumerations span a single Pattern so only walk the tree up to the first non-ConstraintNode //as this represents the boundary between Patterns. protected abstract Map<String, String> getCurrentValueMap(); private ListBox makeListBox( final DropDownData dd, final HasValue hasValue, final AsyncPackageDataModelOracle oracle, final boolean isMultipleSelect ) { final ListBox lb = new ListBox( isMultipleSelect ); final EnumDropDownUtilities utilities = new EnumDropDownUtilities() { @Override protected int addItems( final ListBox listBox ) { return 0; } @Override protected void selectItem( final ListBox listBox ) { final int itemCount = listBox.getItemCount(); listBox.setEnabled( itemCount > 0 ); if ( itemCount > 0 ) { listBox.setSelectedIndex( 0 ); hasValue.getValue().setValue( listBox.getValue( 0 ) ); } else { hasValue.getValue().setValue( "" ); } } }; final String value = hasValue.getValue().getValue().toString(); utilities.setDropDownData( value, dd, isMultipleSelect, oracle.getResourcePath(), lb ); // Wire up update handler lb.addClickHandler( new ClickHandler() { public void onClick( ClickEvent event ) { String value = null; if ( lb.isMultipleSelect() ) { for ( int i = 0; i < lb.getItemCount(); i++ ) { if ( lb.isItemSelected( i ) ) { if ( value == null ) { value = lb.getValue( i ); } else { value = value + "," + lb.getValue( i ); } } } } else { int index = lb.getSelectedIndex(); if ( index > -1 ) { value = lb.getValue( index ); } } hasValue.getValue().setValue( value ); } } ); return lb; } }