/* * Copyright 2011 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.widget; import java.util.Collection; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.shared.EventBus; 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.client.Command; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.Widget; import org.drools.workbench.models.datamodel.rule.RuleModel; import org.drools.workbench.models.guided.dtable.shared.model.BRLColumn; import org.drools.workbench.models.guided.dtable.shared.model.BaseColumn; import org.drools.workbench.models.guided.dtable.shared.model.GuidedDecisionTable52; import org.drools.workbench.screens.guided.dtable.client.resources.i18n.GuidedDecisionTableConstants; import org.drools.workbench.screens.guided.dtable.client.widget.table.GuidedDecisionTableView; import org.drools.workbench.screens.guided.rule.client.editor.ModellerWidgetFactory; import org.drools.workbench.screens.guided.rule.client.editor.RuleModelEditor; import org.drools.workbench.screens.guided.rule.client.editor.RuleModeller; import org.drools.workbench.screens.guided.rule.client.editor.RuleModellerConfiguration; import org.drools.workbench.screens.guided.rule.client.editor.RuleModellerWidgetFactory; import org.gwtbootstrap3.client.ui.CheckBox; import org.gwtbootstrap3.client.ui.TextBox; import org.kie.workbench.common.widgets.client.datamodel.AsyncPackageDataModelOracle; import org.uberfire.ext.widgets.common.client.common.popups.BaseModal; import org.uberfire.ext.widgets.common.client.common.popups.footers.ModalFooterOKCancelButtons; import org.uberfire.mvp.ParameterizedCommand; /** * An editor for Limited Entry BRL Column definitions */ public abstract class AbstractLimitedEntryBRLColumnViewImpl<T, C extends BaseColumn> extends BaseModal implements RuleModelEditor { protected int MIN_WIDTH = 500; @UiField(provided = true) RuleModeller ruleModeller; @UiField TextBox txtColumnHeader; @UiField CheckBox chkHideColumn; @UiField ScrollPanel brlEditorContainer; @SuppressWarnings("rawtypes") interface AbstractLimitedEntryBRLColumnEditorBinder extends UiBinder<Widget, AbstractLimitedEntryBRLColumnViewImpl> { } private static AbstractLimitedEntryBRLColumnEditorBinder uiBinder = GWT.create( AbstractLimitedEntryBRLColumnEditorBinder.class ); //TODO {manstis} Popups need to MVP'ed protected final GuidedDecisionTable52 model; protected GuidedDecisionTableView.Presenter presenter; private final Command cmdOK = new Command() { @Override public void execute() { applyChanges(); } }; private final Command cmdCancel = new Command() { @Override public void execute() { hide(); } }; private final ModalFooterOKCancelButtons footer = new ModalFooterOKCancelButtons( cmdOK, cmdCancel ); protected final BRLColumn<T, C> editingCol; protected final BRLColumn<T, C> originalCol; protected final RuleModel ruleModel; protected final EventBus eventBus; protected final boolean isNew; public AbstractLimitedEntryBRLColumnViewImpl( final GuidedDecisionTable52 model, final AsyncPackageDataModelOracle oracle, final GuidedDecisionTableView.Presenter presenter, final EventBus eventBus, final BRLColumn<T, C> column, final boolean isNew, final boolean isReadOnly ) { this.model = model; this.presenter = presenter; this.eventBus = eventBus; this.originalCol = column; this.isNew = isNew; this.editingCol = cloneBRLColumn( column ); this.ruleModel = getRuleModel( editingCol ); //Limited Entry decision tables do not permit field values to be defined with Template Keys final ModellerWidgetFactory widgetFactory = new RuleModellerWidgetFactory(); this.ruleModeller = new RuleModeller( ruleModel, oracle, widgetFactory, getRuleModellerConfiguration(), eventBus, isReadOnly ); setWidth( getPopupWidth() + "px" ); setBody( uiBinder.createAndBindUi( this ) ); add( footer ); presenter.getPackageParentRuleNames( new ParameterizedCommand<Collection<String>>() { @Override public void execute( final Collection<String> ruleNames ) { ruleModeller.setRuleNamesForPackage( ruleNames ); } } ); this.brlEditorContainer.setHeight( "100%" ); this.brlEditorContainer.setWidth( "100%" ); this.txtColumnHeader.setText( editingCol.getHeader() ); this.chkHideColumn.setValue( editingCol.isHideColumn() ); this.footer.enableOkButton( !isReadOnly ); } protected abstract boolean isHeaderUnique( String header ); protected abstract RuleModel getRuleModel( BRLColumn<T, C> column ); protected abstract RuleModellerConfiguration getRuleModellerConfiguration(); protected abstract void doInsertColumn(); protected abstract void doUpdateColumn(); protected abstract BRLColumn<T, C> cloneBRLColumn( BRLColumn<T, C> col ); protected abstract boolean isDefined(); public RuleModeller getRuleModeller() { return this.ruleModeller; } /** * Width of pop-up, 50% of the client width or MIN_WIDTH * @return */ private int getPopupWidth() { int w = (int) ( Window.getClientWidth() * 0.5 ); if ( w < MIN_WIDTH ) { w = MIN_WIDTH; } return w; } @UiHandler("txtColumnHeader") void columnHanderChangeHandler( ChangeEvent event ) { editingCol.setHeader( txtColumnHeader.getText() ); } @UiHandler("chkHideColumn") void hideColumnClickHandler( ClickEvent event ) { editingCol.setHideColumn( chkHideColumn.getValue() ); } private void applyChanges() { //Validation if ( null == editingCol.getHeader() || "".equals( editingCol.getHeader() ) ) { Window.alert( GuidedDecisionTableConstants.INSTANCE.YouMustEnterAColumnHeaderValueDescription() ); return; } if ( isNew ) { if ( !isHeaderUnique( editingCol.getHeader() ) ) { Window.alert( GuidedDecisionTableConstants.INSTANCE.ThatColumnNameIsAlreadyInUsePleasePickAnother() ); return; } if ( isDefined() ) { doInsertColumn(); } else { Window.alert( GuidedDecisionTableConstants.INSTANCE.DecisionTableBRLFragmentNothingDefined() ); return; } } else { if ( !originalCol.getHeader().equals( editingCol.getHeader() ) ) { if ( !isHeaderUnique( editingCol.getHeader() ) ) { Window.alert( GuidedDecisionTableConstants.INSTANCE.ThatColumnNameIsAlreadyInUsePleasePickAnother() ); return; } } if ( isDefined() ) { doUpdateColumn(); } else { Window.alert( GuidedDecisionTableConstants.INSTANCE.DecisionTableBRLFragmentNothingDefined() ); return; } } hide(); } }