/* * 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.column.pages; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.function.Consumer; import javax.enterprise.context.Dependent; import javax.enterprise.event.Event; import javax.inject.Inject; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.Widget; import org.drools.workbench.models.datamodel.rule.BaseSingleFieldConstraint; import org.drools.workbench.models.guided.dtable.shared.model.ConditionCol52; import org.drools.workbench.screens.guided.dtable.client.resources.i18n.GuidedDecisionTableErraiConstants; import org.drools.workbench.screens.guided.dtable.client.wizard.column.pages.common.BaseDecisionTableColumnPage; import org.drools.workbench.screens.guided.dtable.client.wizard.column.plugins.ConditionColumnPlugin; import org.drools.workbench.screens.guided.rule.client.editor.CEPOperatorsDropdown; import org.gwtbootstrap3.client.ui.ListBox; import org.jboss.errai.ui.client.local.spi.TranslationService; import org.kie.workbench.common.widgets.client.datamodel.AsyncPackageDataModelOracle; import org.uberfire.client.callbacks.Callback; import org.uberfire.client.mvp.UberElement; import org.uberfire.client.mvp.UberView; import org.uberfire.ext.widgets.core.client.wizards.WizardPageStatusChangeEvent; import static org.drools.workbench.screens.guided.dtable.client.wizard.column.pages.common.DecisionTableColumnViewUtils.nil; @Dependent public class OperatorPage extends BaseDecisionTableColumnPage<ConditionColumnPlugin> { private View view; private Event<WizardPageStatusChangeEvent> changeEvent; @Inject public OperatorPage(final View view, final Event<WizardPageStatusChangeEvent> changeEvent, final TranslationService translationService) { super(translationService); this.view = view; this.changeEvent = changeEvent; } @Override protected UberElement<?> getView() { return view; } @Override public String getTitle() { return translate(GuidedDecisionTableErraiConstants.OperatorPage_Operator); } @Override public void prepareView() { view.init(this); setupWarningMessages(); setupOperator(); } private void setupOperator() { operatorDropdown(dropdown -> view.setupOperator(dropdown)); } private void setupWarningMessages() { if (isConstraintValuePredicate()) { view.showPredicateWarning(); } else { view.showFactFieldWarningWhenItIsNotDefined(hasFactField()); } } @Override public void isComplete(final Callback<Boolean> callback) { boolean hasOperator = !nil(plugin().getFactField()) && !nil(editingCol().getOperator()); callback.callback(hasOperator || isConstraintValuePredicate()); } public String getOperator() { return editingCol().getOperator(); } void setOperator(final String operator) { plugin().setOperator(operator); } void operatorDropdown(final Consumer<IsWidget> widgetSupplier) { if (hasFactField()) { cepOperatorsDropdown(widgetSupplier); } else { emptyOperatorsDropdown(widgetSupplier); } } boolean isConstraintValuePredicate() { return plugin().constraintValue() == BaseSingleFieldConstraint.TYPE_PREDICATE; } boolean hasFactField() { return !nil(plugin().getFactField()); } void getOperatorCompletions(final Callback<String[]> callback) { final AsyncPackageDataModelOracle oracle = presenter.getDataModelOracle(); oracle.getOperatorCompletions(plugin().getFactType(), plugin().getFactField(), callback); } private void emptyOperatorsDropdown(final Consumer<IsWidget> widgetSupplier) { final ListBox listBox = newListBox(); listBox.addItem(translate(GuidedDecisionTableErraiConstants.OperatorPage_PleaseChoose)); listBox.getElement().setAttribute("disabled", "disabled"); widgetSupplier.accept(listBox); } ListBox newListBox() { return new ListBox(); } private void cepOperatorsDropdown(final Consumer<IsWidget> widgetSupplier) { getOperatorCompletions(options -> { final String[] operatorsArray = filterOptionsForConstraintTypeLiteral(options); final CEPOperatorsDropdown dropdown = newCepOperatorsDropdown(operatorsArray); dropdown.insertItem(translate(GuidedDecisionTableErraiConstants.OperatorPage_NoOperator), "", 1); dropdown.addValueChangeHandler(valueChangeEvent -> { setOperator(valueChangeEvent.getValue().getValue()); }); widgetSupplier.accept(dropdown); }); } CEPOperatorsDropdown newCepOperatorsDropdown(final String[] operatorsArray) { return new CEPOperatorsDropdown(operatorsArray, editingCol()); } String[] filterOptionsForConstraintTypeLiteral(final String[] options) { final List<String> operatorOptions = new ArrayList<>(); Collections.addAll(operatorOptions, options); if (getConstraintValueType() != BaseSingleFieldConstraint.TYPE_LITERAL) { operatorOptions.remove("in"); operatorOptions.remove("not in"); } return operatorOptions.toArray(new String[operatorOptions.size()]); } private ConditionCol52 editingCol() { return plugin().editingCol(); } private int getConstraintValueType() { return plugin().constraintValue(); } public interface View extends UberElement<OperatorPage> { void showFactFieldWarningWhenItIsNotDefined(boolean hasOperator); void showPredicateWarning(); void setupOperator(IsWidget dropdown); } }