/*
* 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 javax.enterprise.context.Dependent;
import javax.inject.Inject;
import com.google.gwt.user.client.ui.IsWidget;
import org.drools.workbench.models.datamodel.rule.BaseSingleFieldConstraint;
import org.drools.workbench.models.datamodel.rule.CEPWindow;
import org.drools.workbench.models.guided.dtable.shared.model.GuidedDecisionTable52;
import org.drools.workbench.models.guided.dtable.shared.model.Pattern52;
import org.drools.workbench.screens.guided.dtable.client.resources.i18n.GuidedDecisionTableErraiConstants;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.commons.HasValueOptionsPage;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.pages.common.BaseDecisionTableColumnPage;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.plugins.commons.DecisionTableColumnPlugin;
import org.drools.workbench.screens.guided.rule.client.editor.BindingTextBox;
import org.drools.workbench.screens.guided.rule.client.editor.CEPWindowOperatorsDropdown;
import org.gwtbootstrap3.client.ui.TextBox;
import org.jboss.errai.ui.client.local.spi.TranslationService;
import org.uberfire.client.callbacks.Callback;
import org.uberfire.client.mvp.UberElement;
import static org.drools.workbench.screens.guided.dtable.client.wizard.column.pages.common.DecisionTableColumnViewUtils.nil;
@Dependent
public class ValueOptionsPage<T extends HasValueOptionsPage & DecisionTableColumnPlugin> extends BaseDecisionTableColumnPage<T> {
private View view;
private boolean valueListEnabled = false;
private boolean cepOperatorsEnabled = false;
private boolean defaultValueEnabled = false;
private boolean limitedValueEnabled = false;
private boolean bindingEnabled = false;
@Inject
public ValueOptionsPage(final View view,
final TranslationService translationService) {
super(translationService);
this.view = view;
}
@Override
protected UberElement<?> getView() {
return view;
}
@Override
public String getTitle() {
return translate(GuidedDecisionTableErraiConstants.ValueOptionsPage_ValueOptions);
}
@Override
public void isComplete(final Callback<Boolean> callback) {
callback.callback(plugin().isValueOptionsPageCompleted());
}
@Override
public void prepareView() {
view.init(this);
markAsViewed();
setupValueList();
setupCepOperators();
setupDefaultValue();
setupLimitedValue();
setupBinding();
}
private void setupValueList() {
if (!isValueListEnabled()) {
view.hideValueList();
return;
}
if (!canSetupValueList()) {
view.disableValueList();
} else {
view.enableValueList();
}
view.setValueListText(getValueList());
}
private void setupCepOperators() {
if (!isCepOperatorsEnabled()) {
view.hideCepOperators();
return;
}
isFactTypeAnEvent((isEvent) -> {
if (canSetupCepOperators() && isEvent) {
view.setupCepOperators(newCEPWindowOperatorsDropdown());
} else {
view.setupCepOperators(disabledTextBox());
}
});
}
private void setupDefaultValue() {
if (!isDefaultValueEnabled()) {
view.hideDefaultValue();
return;
}
if (canSetupDefaultValue()) {
view.setupDefaultValue(newDefaultValueWidget());
} else {
view.setupDefaultValue(disabledTextBox());
}
}
private void setupLimitedValue() {
if (!isLimitedValueEnabled()) {
view.hideLimitedValue();
return;
}
if (canSetupLimitedValue()) {
view.setupLimitedValue(newLimitedValueWidget());
} else {
view.setupLimitedValue(disabledTextBox());
}
}
private void setupBinding() {
if (!isBindingEnabled()) {
view.hideBinding();
return;
}
if (canSetupBinding()) {
view.setupBinding(newBindingTextBox());
} else {
view.setupBinding(disabledTextBox());
}
}
private TextBox disabledTextBox() {
return new TextBox() {{
getElement().setAttribute("disabled",
"disabled");
}};
}
private boolean isValueListEnabled() {
return valueListEnabled;
}
private boolean isCepOperatorsEnabled() {
return cepOperatorsEnabled;
}
private boolean isDefaultValueEnabled() {
return defaultValueEnabled;
}
private boolean isLimitedValueEnabled() {
return limitedValueEnabled;
}
private boolean isBindingEnabled() {
return bindingEnabled;
}
public void enableValueList() {
valueListEnabled = true;
}
public void enableCepOperators() {
cepOperatorsEnabled = true;
}
public void enableDefaultValue() {
defaultValueEnabled = true;
}
public void enableLimitedValue() {
limitedValueEnabled = true;
}
public void enableBinding() {
bindingEnabled = true;
}
IsWidget newDefaultValueWidget() {
return plugin().defaultValueWidget();
}
IsWidget newLimitedValueWidget() {
return plugin().limitedValueWidget();
}
private CEPWindowOperatorsDropdown newCEPWindowOperatorsDropdown() {
final Pattern52 editingPattern = editingPattern();
return new CEPWindowOperatorsDropdown(editingPattern,
false) {{
addValueChangeHandler(event -> {
final CEPWindow cepWindow = editingPattern.getWindow();
final String operator = event.getValue().getValue();
cepWindow.setOperator(operator);
});
}};
}
private TextBox newBindingTextBox() {
final BindingTextBox bindingTextBox = new BindingTextBox();
bindingTextBox.setText(plugin().getBinding());
bindingTextBox.addChangeHandler(event -> {
plugin().setBinding(bindingTextBox.getText());
});
return bindingTextBox;
}
boolean canSetupCepOperators() {
return isCepOperatorsEnabled() && editingPattern() != null;
}
boolean canSetupDefaultValue() {
if (!isDefaultValueEnabled()) {
return false;
}
if (tableFormat() != GuidedDecisionTable52.TableFormat.EXTENDED_ENTRY) {
return false;
}
if (doesNotHaveFactTypeOrFactField()) {
return false;
}
if (!plugin().doesOperatorNeedValue()) {
return false;
}
return true;
}
boolean canSetupLimitedValue() {
if (!isLimitedValueEnabled()) {
return false;
}
if (tableFormat() != GuidedDecisionTable52.TableFormat.LIMITED_ENTRY) {
return false;
}
if (doesNotHaveFactTypeOrFactField()) {
return false;
}
if (!plugin().doesOperatorNeedValue()) {
return false;
}
return true;
}
boolean canSetupBinding() {
return isBindingEnabled() && plugin().constraintValue() == BaseSingleFieldConstraint.TYPE_LITERAL;
}
private boolean canSetupValueList() {
if (!isValueListEnabled()) {
return false;
}
if (tableFormat() != GuidedDecisionTable52.TableFormat.EXTENDED_ENTRY) {
return false;
}
if (doesNotHaveFactTypeOrFactField()) {
return false;
}
if (!doesOperatorAcceptValueList()) {
return false;
}
if (presenter.getDataModelOracle().hasEnums(factType(),
plugin().getFactField())) {
return false;
}
return true;
}
private boolean doesOperatorAcceptValueList() {
return plugin().doesOperatorAcceptValueList();
}
private boolean doesNotHaveFactTypeOrFactField() {
return nil(plugin().getFactType()) || nil(plugin().getFactField());
}
void isFactTypeAnEvent(final Callback<Boolean> callback) {
if (canSetupCepOperators()) {
presenter.getDataModelOracle().isFactTypeAnEvent(factType(),
callback);
} else {
callback.callback(false);
}
}
private GuidedDecisionTable52.TableFormat tableFormat() {
return presenter.getModel().getTableFormat();
}
private Pattern52 editingPattern() {
return plugin().editingPattern();
}
private String factType() {
if (editingPattern() != null) {
return editingPattern().getFactType();
}
return "";
}
public String getValueList() {
return plugin().getValueList();
}
public void setValueList(final String valueList) {
plugin().setValueList(valueList);
setupDefaultValue();
}
private void markAsViewed() {
plugin().setValueOptionsPageAsCompleted();
}
public interface View extends UberElement<ValueOptionsPage> {
void setValueListText(String valueListText);
void enableValueList();
void disableValueList();
void hideValueList();
void setupDefaultValue(IsWidget widget);
void hideDefaultValue();
void setupLimitedValue(IsWidget widget);
void hideLimitedValue();
void setupBinding(IsWidget widget);
void hideBinding();
void hideCepOperators();
void setupCepOperators(IsWidget widget);
}
}