/* * Copyright 2017 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.dtable.client.wizard.table.pages; import java.util.List; import java.util.Set; import javax.annotation.PostConstruct; import javax.enterprise.context.Dependent; import javax.inject.Inject; import com.google.gwt.cell.client.TextCell; import com.google.gwt.core.client.GWT; 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.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.view.client.MultiSelectionModel; import com.google.gwt.view.client.SelectionChangeEvent; import org.drools.workbench.models.guided.dtable.shared.model.Pattern52; import org.drools.workbench.screens.guided.dtable.client.resources.i18n.GuidedDecisionTableConstants; import org.drools.workbench.screens.guided.dtable.client.widget.Validator; import org.drools.workbench.screens.guided.dtable.client.wizard.table.pages.cells.DefaultPatternCell; import org.drools.workbench.screens.guided.rule.client.editor.BindingTextBox; import org.drools.workbench.screens.guided.rule.client.editor.CEPWindowOperatorsDropdown; import org.drools.workbench.screens.guided.rule.client.editor.OperatorSelection; import org.gwtbootstrap3.client.ui.Button; import org.gwtbootstrap3.client.ui.FormGroup; import org.gwtbootstrap3.client.ui.HelpBlock; import org.gwtbootstrap3.client.ui.Label; import org.gwtbootstrap3.client.ui.TextBox; import org.gwtbootstrap3.client.ui.constants.IconType; import org.gwtbootstrap3.client.ui.constants.ValidationState; import org.uberfire.client.callbacks.Callback; import org.uberfire.ext.widgets.core.client.resources.WizardCellListResources; /** * An implementation of the Fact Patterns page */ @Dependent public class FactPatternsPageViewImpl extends Composite implements FactPatternsPageView { private Presenter presenter; private Validator validator; private Set<String> availableTypesSelections; private MinimumWidthCellList<String> availableTypesWidget; private List<Pattern52> chosenPatterns; private Pattern52 chosenPatternSelection; private Set<Pattern52> chosenPatternSelections; private MinimumWidthCellList<Pattern52> chosenPatternWidget; @UiField ScrollPanel availableTypesContainer; @UiField ScrollPanel chosenPatternsContainer; @UiField Button btnAdd; @UiField Button btnRemove; @UiField VerticalPanel patternDefinition; @UiField BindingTextBox txtBinding; @UiField HelpBlock txtBindingHelp; @UiField FormGroup bindingContainer; @UiField TextBox txtEntryPoint; @UiField CEPWindowOperatorsDropdown ddCEPWindow; @UiField FormGroup cepWindowContainer; @UiField(provided = true) Button btnMoveUp = new Button() {{ setIcon( IconType.ANGLE_UP ); }}; @UiField(provided = true) Button btnMoveDown = new Button() {{ setIcon( IconType.ANGLE_DOWN ); }}; @Inject private DefaultPatternCell patternCell; interface FactPatternsPageWidgetBinder extends UiBinder<Widget, FactPatternsPageViewImpl> { } private static FactPatternsPageWidgetBinder uiBinder = GWT.create( FactPatternsPageWidgetBinder.class ); public FactPatternsPageViewImpl() { initWidget( uiBinder.createAndBindUi( this ) ); } @PostConstruct public void setup() { this.availableTypesWidget = new MinimumWidthCellList<String>( new TextCell(), WizardCellListResources.INSTANCE ); this.chosenPatternWidget = new MinimumWidthCellList<Pattern52>( patternCell, WizardCellListResources.INSTANCE ); initialiseAvailableTypes(); initialiseChosenPatterns(); initialiseBinding(); initialiseEntryPoint(); initialiseCEPWindow(); initialiseShufflers(); } @Override public void setValidator( final Validator validator ) { this.validator = validator; this.patternCell.setValidator( validator ); } private void initialiseAvailableTypes() { availableTypesContainer.add( availableTypesWidget ); availableTypesWidget.setKeyboardSelectionPolicy( KeyboardSelectionPolicy.ENABLED ); availableTypesWidget.setMinimumWidth( 270 ); final Label lstEmpty = new Label( GuidedDecisionTableConstants.INSTANCE.DecisionTableWizardNoAvailablePatterns() ); lstEmpty.setStyleName( WizardCellListResources.INSTANCE.cellListStyle().cellListEmptyItem() ); availableTypesWidget.setEmptyListWidget( lstEmpty ); final MultiSelectionModel<String> selectionModel = new MultiSelectionModel<String>(); availableTypesWidget.setSelectionModel( selectionModel ); selectionModel.addSelectionChangeHandler( new SelectionChangeEvent.Handler() { @Override public void onSelectionChange( final SelectionChangeEvent event ) { availableTypesSelections = selectionModel.getSelectedSet(); btnAdd.setEnabled( availableTypesSelections.size() > 0 ); } } ); } private void initialiseChosenPatterns() { chosenPatternsContainer.add( chosenPatternWidget ); chosenPatternWidget.setKeyboardSelectionPolicy( KeyboardSelectionPolicy.ENABLED ); chosenPatternWidget.setMinimumWidth( 270 ); final Label lstEmpty = new Label( GuidedDecisionTableConstants.INSTANCE.DecisionTableWizardNoChosenPatterns() ); lstEmpty.setStyleName( WizardCellListResources.INSTANCE.cellListStyle().cellListEmptyItem() ); chosenPatternWidget.setEmptyListWidget( lstEmpty ); final MultiSelectionModel<Pattern52> selectionModel = new MultiSelectionModel<Pattern52>(System::identityHashCode); chosenPatternWidget.setSelectionModel( selectionModel ); selectionModel.addSelectionChangeHandler( new SelectionChangeEvent.Handler() { @Override public void onSelectionChange( final SelectionChangeEvent event ) { chosenPatternSelections = selectionModel.getSelectedSet(); chosenTypesSelected( chosenPatternSelections ); } private void chosenTypesSelected( final Set<Pattern52> ps ) { btnRemove.setEnabled( true ); if ( ps.size() == 1 ) { chosenPatternSelection = ps.iterator().next(); patternDefinition.setVisible( true ); validateBinding(); txtBinding.setEnabled( true ); txtBinding.setText( chosenPatternSelection.getBoundName() ); txtEntryPoint.setEnabled( true ); txtEntryPoint.setText( chosenPatternSelection.getEntryPointName() ); enableMoveUpButton(); enableMoveDownButton(); presenter.isPatternEvent( chosenPatternSelection, new Callback<Boolean>() { @Override public void callback( final Boolean result ) { if ( Boolean.TRUE.equals( result ) ) { ddCEPWindow.setCEPWindow( chosenPatternSelection ); cepWindowContainer.setVisible( true ); } else { cepWindowContainer.setVisible( false ); } } } ); } else { chosenPatternSelection = null; patternDefinition.setVisible( false ); txtBinding.setEnabled( false ); txtBinding.setText( "" ); txtEntryPoint.setEnabled( false ); txtEntryPoint.setText( "" ); btnMoveUp.setEnabled( false ); btnMoveDown.setEnabled( false ); cepWindowContainer.setVisible( false ); } } } ); } private void validateBinding() { if ( validator.isPatternBindingUnique( chosenPatternSelection ) ) { txtBindingHelp.setVisible( false ); bindingContainer.removeStyleName( ValidationState.ERROR.getCssName() ); } else { txtBindingHelp.setVisible( true ); bindingContainer.addStyleName( ValidationState.ERROR.getCssName() ); } } private void enableMoveUpButton() { if ( chosenPatterns == null || chosenPatternSelection == null ) { btnMoveUp.setEnabled( false ); return; } int index = chosenPatterns.indexOf( chosenPatternSelection ); btnMoveUp.setEnabled( index > 0 ); } private void enableMoveDownButton() { if ( chosenPatterns == null || chosenPatternSelection == null ) { btnMoveDown.setEnabled( false ); return; } int index = chosenPatterns.indexOf( chosenPatternSelection ); btnMoveDown.setEnabled( index < chosenPatterns.size() - 1 ); } private void initialiseBinding() { txtBinding.addValueChangeHandler( new ValueChangeHandler<String>() { @Override public void onValueChange( final ValueChangeEvent<String> event ) { String binding = txtBinding.getText(); chosenPatternSelection.setBoundName( binding ); presenter.stateChanged(); validateBinding(); } } ); } private void initialiseEntryPoint() { txtEntryPoint.addValueChangeHandler( new ValueChangeHandler<String>() { @Override public void onValueChange( final ValueChangeEvent<String> event ) { if ( chosenPatternSelection == null ) { return; } chosenPatternSelection.setEntryPointName( event.getValue() ); } } ); } private void initialiseCEPWindow() { ddCEPWindow.addValueChangeHandler( new ValueChangeHandler<OperatorSelection>() { @Override public void onValueChange( final ValueChangeEvent<OperatorSelection> event ) { if ( chosenPatternSelection == null ) { return; } OperatorSelection selection = event.getValue(); String selected = selection.getValue(); chosenPatternSelection.getWindow().setOperator( selected ); } } ); } private void initialiseShufflers() { btnMoveUp.addClickHandler( new ClickHandler() { @Override public void onClick( final ClickEvent event ) { int index = chosenPatterns.indexOf( chosenPatternSelection ); final Pattern52 p = chosenPatterns.remove( index ); chosenPatterns.add( index - 1, p ); setChosenPatterns( chosenPatterns ); presenter.setConditionPatterns( chosenPatterns ); } } ); btnMoveDown.addClickHandler( new ClickHandler() { @Override public void onClick( final ClickEvent event ) { int index = chosenPatterns.indexOf( chosenPatternSelection ); final Pattern52 p = chosenPatterns.remove( index ); chosenPatterns.add( index + 1, p ); setChosenPatterns( chosenPatterns ); presenter.setConditionPatterns( chosenPatterns ); } } ); } @Override public void setAvailableFactTypes( final List<String> types ) { availableTypesWidget.setRowCount( types.size(), true ); availableTypesWidget.setRowData( types ); } @Override public void setChosenPatterns( final List<Pattern52> types ) { chosenPatterns = types; chosenPatternWidget.setRowCount( types.size(), true ); chosenPatternWidget.setRowData( types ); enableMoveUpButton(); enableMoveDownButton(); presenter.stateChanged(); } @Override public void init( final FactPatternsPageView.Presenter presenter ) { this.presenter = presenter; } @Override public void setArePatternBindingsUnique( final boolean arePatternBindingsUnique ) { chosenPatternWidget.redraw(); } @UiHandler(value = "btnAdd") public void btnAddClick( final ClickEvent event ) { for ( String type : availableTypesSelections ) { final Pattern52 pattern = new Pattern52(); pattern.setFactType( type ); chosenPatterns.add( pattern ); } setChosenPatterns( chosenPatterns ); presenter.setConditionPatterns( chosenPatterns ); presenter.stateChanged(); } @UiHandler(value = "btnRemove") public void btnRemoveClick( final ClickEvent event ) { boolean allPatternsRemoved = true; for ( Pattern52 pattern : chosenPatternSelections ) { if ( !validator.canPatternBeRemoved( pattern ) ) { allPatternsRemoved = false; } else { chosenPatterns.remove( pattern ); chosenPatternSelections.remove( pattern ); //Raise an Event so ActionSetFieldPage can synchronise Patterns presenter.signalRemovalOfPattern( pattern ); } } if ( !allPatternsRemoved ) { Window.alert( GuidedDecisionTableConstants.INSTANCE.UnableToDeletePatterns() ); } setChosenPatterns( chosenPatterns ); presenter.setConditionPatterns( chosenPatterns ); presenter.stateChanged(); txtBinding.setText( "" ); txtBinding.setEnabled( false ); txtEntryPoint.setText( "" ); txtEntryPoint.setEnabled( false ); btnRemove.setEnabled( isAPatternSelected() ); patternDefinition.setVisible( false ); } private boolean isAPatternSelected() { for ( Pattern52 pattern : chosenPatterns ) { if ( chosenPatternWidget.getSelectionModel().isSelected( pattern ) ) { return true; } } return false; } }