/* * Copyright 2010 JBoss Inc * * 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.guvnor.client.ruleeditor; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.drools.factconstraints.client.ConstraintConfiguration; import org.drools.factconstraints.client.helper.ConstraintsContainer; import org.drools.guvnor.client.common.FormStylePopup; import org.drools.guvnor.client.common.ImageButton; import org.drools.guvnor.client.common.SmallLabel; import org.drools.guvnor.client.messages.Constants; import org.drools.guvnor.client.packages.SuggestionCompletionCache; import org.drools.guvnor.client.resources.Images; import org.drools.guvnor.client.rpc.RuleAsset; import org.drools.guvnor.client.rpc.WorkingSetConfigData; import org.drools.ide.common.client.modeldriven.SuggestionCompletionEngine; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.VerticalPanel; /** * * @author esteban */ public class FactsConstraintsEditorPanel extends Composite { private Constants constants = GWT.create( Constants.class ); private static Images images = GWT.create( Images.class ); private static int idGenerator = 0; private ListBox factsCombo = new ListBox( false ); private ListBox fieldsCombo = new ListBox( false ); private ListBox constraintsCombo = new ListBox( false ); private VerticalPanel vpConstraintConf = new VerticalPanel(); private boolean validFactsChanged = true; private Map<String, ConstraintConfiguration> contraintsMap = new HashMap<String, ConstraintConfiguration>(); private final RuleAsset workingSet; private final WorkingSetEditor workingSetEditor; public FactsConstraintsEditorPanel(WorkingSetEditor workingSetEditor) { this.workingSetEditor = workingSetEditor; this.workingSet = workingSetEditor.getWorkingSet(); factsCombo.setVisibleItemCount( 1 ); fieldsCombo.setVisibleItemCount( 1 ); constraintsCombo.setVisibleItemCount( 5 ); factsCombo.addChangeHandler( new ChangeHandler() { public void onChange(ChangeEvent event) { fillSelectedFactFields(); } } ); fieldsCombo.addChangeHandler( new ChangeHandler() { public void onChange(ChangeEvent event) { fillFieldConstrains(); } } ); Image addNewConstraint = new ImageButton( images.newItem() ); addNewConstraint.setTitle( constants.AddNewConstraint() ); addNewConstraint.addClickHandler( new ClickHandler() { public void onClick(ClickEvent event) { showNewConstrainPop(); } } ); Image removeConstraint = new Image( images.trash() ); removeConstraint.setTitle( constants.removeConstraint() ); removeConstraint.addClickHandler( new ClickHandler() { public void onClick(ClickEvent event) { removeConstraint(); } } ); final FlexTable table = new FlexTable(); VerticalPanel vp = new VerticalPanel(); vp.add( new SmallLabel( constants.FactTypes() ) ); vp.add( factsCombo ); table.setWidget( 0, 0, vp ); vp = new VerticalPanel(); vp.add( new SmallLabel( constants.Field() ) ); vp.add( fieldsCombo ); table.setWidget( 1, 0, vp ); vp = new VerticalPanel(); HorizontalPanel hp = new HorizontalPanel(); vp.add( new SmallLabel( constants.Constraints() ) ); hp.add( constraintsCombo ); VerticalPanel btnPanel = new VerticalPanel(); btnPanel.add( addNewConstraint ); btnPanel.add( removeConstraint ); hp.add( btnPanel ); vp.add( hp ); table.setWidget( 2, 0, vp ); table.getFlexCellFormatter().setRowSpan( 2, 0, 3 ); constraintsCombo.addChangeHandler( new ChangeHandler() { public void onChange(ChangeEvent event) { showConstraintConfig(); } } ); vpConstraintConf.add( new SmallLabel( constants.ConstraintsParameters() ) ); vpConstraintConf.add( new SmallLabel( "" ) ); table.setWidget( 0, 1, vpConstraintConf ); table.getFlexCellFormatter().setRowSpan( 0, 1, 5 ); fillSelectedFacts(); fillSelectedFactFields(); fillFieldConstrains(); showConstraintConfig(); this.initWidget( table ); } protected final void fillSelectedFacts() { if ( validFactsChanged ) { String s = factsCombo.getSelectedIndex() != -1 ? factsCombo.getItemText( factsCombo.getSelectedIndex() ) : ""; factsCombo.clear(); validFactsChanged = false; for ( int i = 0; i < workingSetEditor.getValidFactsListBox().getItemCount(); i++ ) { String itemText = workingSetEditor.getValidFactsListBox().getItemText( i ); factsCombo.addItem( itemText ); if ( s.equals( itemText ) ) { factsCombo.setSelectedIndex( i ); } } if ( factsCombo.getSelectedIndex() == -1 && factsCombo.getItemCount() > 0 ) { factsCombo.setSelectedIndex( 0 ); } fillSelectedFactFields(); } } private void fillSelectedFactFields() { if ( factsCombo.getSelectedIndex() != -1 ) { String fact = factsCombo.getItemText( factsCombo.getSelectedIndex() ); fieldsCombo.clear(); for ( String field : getCompletionEngine().getFieldCompletions( fact ) ) { fieldsCombo.addItem( field ); } } if ( fieldsCombo.getSelectedIndex() == -1 && fieldsCombo.getItemCount() > 0 ) { fieldsCombo.setSelectedIndex( 0 ); } fillFieldConstrains(); } private void fillFieldConstrains() { if ( fieldsCombo.getSelectedIndex() != -1 ) { String fieldName = fieldsCombo.getItemText( fieldsCombo.getSelectedIndex() ); String factField = factsCombo.getItemText( factsCombo.getSelectedIndex() ); constraintsCombo.clear(); contraintsMap.clear(); for ( ConstraintConfiguration c : this.workingSetEditor.getConstraintsConstrainer().getConstraints( factField, fieldName ) ) { constraintsCombo.addItem( c.getConstraintName(), addContrainsMap( c ) ); } vpConstraintConf.remove( vpConstraintConf.getWidgetCount() - 1 ); vpConstraintConf.add( new SmallLabel() ); } showConstraintConfig(); } synchronized private String addContrainsMap(ConstraintConfiguration c) { String constraintId = String.valueOf( idGenerator++ ); contraintsMap.put( constraintId, c ); return constraintId; } protected void removeConstraint() { if ( constraintsCombo.getSelectedIndex() != -1 ) { ConstraintConfiguration c = contraintsMap.get( constraintsCombo.getValue( constraintsCombo.getSelectedIndex() ) ); ((WorkingSetConfigData) workingSet.content).constraints = this.workingSetEditor.getConstraintsConstrainer().removeConstraint( c ); } fillFieldConstrains(); } private void showConstraintConfig() { if ( constraintsCombo.getItemCount() == 0 ) { vpConstraintConf.remove( vpConstraintConf.getWidgetCount() - 1 ); vpConstraintConf.add( new SmallLabel() ); return; } if ( constraintsCombo.getSelectedIndex() != -1 ) { ConstraintConfiguration c = contraintsMap.get( constraintsCombo.getValue( constraintsCombo.getSelectedIndex() ) ); ConstraintEditor editor = new ConstraintEditor( c ); vpConstraintConf.remove( vpConstraintConf.getWidgetCount() - 1 ); vpConstraintConf.add( editor ); } } private void showNewConstrainPop() { final FormStylePopup pop = new FormStylePopup( images.config(), constants.AddNewConstraint() ); final Button addbutton = new Button( constants.OK() ); final ListBox consDefsCombo = new ListBox( false ); consDefsCombo.setVisibleItemCount( 5 ); addbutton.setTitle( constants.AddNewConstraint() ); List<String> names = new ArrayList<String>( ConstraintsContainer.getAllConfigurations().keySet() ); Collections.sort( names ); for ( String name : names ) { consDefsCombo.addItem( name ); } addbutton.addClickHandler( new ClickHandler() { public void onClick(ClickEvent event) { String name = consDefsCombo.getItemText( consDefsCombo.getSelectedIndex() ); ConstraintConfiguration config = ConstraintsContainer.getEmptyConfiguration( name ); if ( config != null ) { String factName = factsCombo.getItemText( factsCombo.getSelectedIndex() ); String fieldName = fieldsCombo.getItemText( fieldsCombo.getSelectedIndex() ); config.setFactType( factName ); config.setFieldName( fieldName ); if ( ((WorkingSetConfigData) workingSet.content).constraints == null ) { ((WorkingSetConfigData) workingSet.content).constraints = new ArrayList<ConstraintConfiguration>(); } ((WorkingSetConfigData) workingSet.content).constraints.add( config ); constraintsCombo.addItem( config.getConstraintName(), addContrainsMap( config ) ); workingSetEditor.getConstraintsConstrainer().addConstraint( config ); } pop.hide(); } } ); pop.addAttribute( constants.WillExtendTheFollowingRuleCalled(), consDefsCombo ); pop.addAttribute( "", addbutton ); pop.show(); } private SuggestionCompletionEngine getCompletionEngine() { return SuggestionCompletionCache.getInstance().getEngineFromCache( workingSet.metaData.packageName ); } public void notifyValidFactsChanged() { this.validFactsChanged = true; } }