/* * Copyright 2012 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.drools.workbench.screens.guided.rule.client.editor; import java.util.List; import com.google.gwt.core.client.Scheduler; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.logical.shared.HasValueChangeHandlers; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Widget; import org.drools.workbench.models.commons.backend.rule.SharedConstants; import org.drools.workbench.models.datamodel.rule.HasCEPWindow; import org.drools.workbench.screens.guided.rule.client.resources.GuidedRuleEditorResources; import org.gwtbootstrap3.client.ui.ListBox; import org.kie.workbench.common.widgets.client.datamodel.CEPOracle; import org.kie.workbench.common.widgets.client.resources.HumanReadable; import org.kie.workbench.common.widgets.client.resources.i18n.HumanReadableConstants; import org.uberfire.ext.widgets.common.client.common.AbstractRestrictedEntryTextBox; /** * Drop-down Widget for Operators including supplementary controls for CEP * operator parameters */ public class CEPWindowOperatorsDropdown extends Composite implements HasValueChangeHandlers<OperatorSelection> { private List<String> operators = CEPOracle.getCEPWindowOperators(); private ListBox box; private HorizontalPanel parametersContainer = new HorizontalPanel(); private HorizontalPanel windowContainer = new HorizontalPanel(); private boolean isReadOnly = false; protected HasCEPWindow hcw; //Parameter value defining the server-side class used to generate DRL for CEP operator parameters private static final String CEP_OPERATOR_PARAMETER_GENERATOR = "org.drools.workbench.models.commons.backend.rule.CEPWindowOperatorParameterDRLBuilder"; public CEPWindowOperatorsDropdown() { windowContainer.setStylePrimaryName( GuidedRuleEditorResources.INSTANCE.css().container() ); initWidget( windowContainer ); } public CEPWindowOperatorsDropdown( HasCEPWindow hcw, boolean isReadOnly ) { this(); this.isReadOnly = isReadOnly; setCEPWindow( hcw ); } public void setCEPWindow( HasCEPWindow hcw ) { this.hcw = hcw; windowContainer.clear(); windowContainer.add( getDropDown() ); windowContainer.add( getOperatorExtension() ); } /** * Gets the index of the currently-selected item. * @return */ public int getSelectedIndex() { return box.getSelectedIndex(); } /** * Gets the value associated with the item at a given index. * @param index * @return */ public String getValue( int index ) { return box.getValue( index ); } //Additional widget for CEP Window operator parameter private Widget getOperatorExtension() { parametersContainer.setStylePrimaryName( GuidedRuleEditorResources.INSTANCE.css().container() ); return parametersContainer; } //Hide\display the additional CEP widget is appropriate private void operatorChanged( OperatorSelection selection ) { parametersContainer.clear(); String operator = selection.getValue(); if ( CEPOracle.isCEPWindowOperatorTime( operator ) ) { AbstractRestrictedEntryTextBox txt = new CEPTimeParameterTextBox( hcw.getWindow(), 1 ); initialiseTextBox( txt ); } else if ( CEPOracle.isCEPWindowOperatorLength( operator ) ) { AbstractRestrictedEntryTextBox txt = new CEPLengthParameterTextBox( hcw.getWindow(), 1 ); initialiseTextBox( txt ); } else { parametersContainer.setVisible( false ); hcw.getWindow().clearParameters(); } } private void initialiseTextBox( AbstractRestrictedEntryTextBox txt ) { String key = String.valueOf( 1 ); String value = hcw.getWindow().getParameter( key ); if ( value == null ) { value = ""; hcw.getWindow().setParameter( key, value ); } if ( !txt.isValidValue( value, false ) ) { value = ""; hcw.getWindow().setParameter( key, value ); } txt.setText( value ); txt.setEnabled( !isReadOnly ); parametersContainer.add( txt ); parametersContainer.setVisible( true ); hcw.getWindow().setParameter( SharedConstants.OPERATOR_PARAMETER_GENERATOR, CEP_OPERATOR_PARAMETER_GENERATOR ); } //Actual drop-down private Widget getDropDown() { String selected = ""; String selectedText = ""; box = new ListBox(); box.setEnabled( !isReadOnly ); box.addItem( HumanReadableConstants.INSTANCE.noCEPWindow(), "" ); for ( int i = 0; i < operators.size(); i++ ) { String op = operators.get( i ); box.addItem( HumanReadable.getOperatorDisplayName( op ), op ); if ( op.equals( hcw.getWindow().getOperator() ) ) { selected = op; selectedText = HumanReadable.getOperatorDisplayName( op ); box.setSelectedIndex( i + 1 ); } } selectItem( hcw.getWindow().getOperator() ); //Fire event to ensure parent Widgets correct their state depending on selection final HasValueChangeHandlers<OperatorSelection> source = this; final OperatorSelection selection = new OperatorSelection( selected, selectedText ); Scheduler.get().scheduleFinally( new Command() { public void execute() { operatorChanged( selection ); ValueChangeEvent.fire( source, selection ); } } ); //Signal parent Widget whenever a change happens box.addChangeHandler( new ChangeHandler() { public void onChange( ChangeEvent event ) { String selected = box.getValue( box.getSelectedIndex() ); String selectedText = box.getItemText( box.getSelectedIndex() ); OperatorSelection selection = new OperatorSelection( selected, selectedText ); operatorChanged( selection ); ValueChangeEvent.fire( source, selection ); } } ); return box; } /** * Allow parent Widgets to register for events when the operator changes */ public HandlerRegistration addValueChangeHandler( ValueChangeHandler<OperatorSelection> handler ) { return addHandler( handler, ValueChangeEvent.getType() ); } /** * Select a given item in the drop-down * @param operator The DRL operator, not the HumanReadable form */ public void selectItem( String operator ) { String currentOperator = box.getValue( box.getSelectedIndex() ); if ( currentOperator.equals( operator ) ) { return; } for ( int i = 0; i < box.getItemCount(); i++ ) { String op = box.getValue( i ); if ( op.equals( operator ) ) { box.setSelectedIndex( i ); break; } } String selected = box.getValue( box.getSelectedIndex() ); String selectedText = box.getItemText( box.getSelectedIndex() ); OperatorSelection selection = new OperatorSelection( selected, selectedText ); operatorChanged( selection ); } }