/* * 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.modeldriven.ui; import java.util.List; import org.drools.guvnor.client.common.DirtyableComposite; import org.drools.guvnor.client.common.DropDownValueChanged; import org.drools.guvnor.client.common.FormStylePopup; import org.drools.guvnor.client.common.InfoPopup; import org.drools.guvnor.client.common.SmallLabel; import org.drools.guvnor.client.messages.Constants; import org.drools.guvnor.client.resources.Images; import org.drools.guvnor.client.util.NumbericFilterKeyPressHandler; import org.drools.ide.common.client.modeldriven.DropDownData; import org.drools.ide.common.client.modeldriven.FieldNature; import org.drools.ide.common.client.modeldriven.SuggestionCompletionEngine; import org.drools.ide.common.client.modeldriven.brl.ActionFieldFunction; import org.drools.ide.common.client.modeldriven.brl.ActionFieldValue; import org.drools.ide.common.client.modeldriven.brl.ActionInsertFact; import org.drools.ide.common.client.modeldriven.brl.FactPattern; 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.event.dom.client.KeyUpEvent; import com.google.gwt.event.dom.client.KeyUpHandler; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.HTML; 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.SimplePanel; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; /** * This provides for editing of fields in the RHS of a rule. * * @author Nicolas Heron * */ public class MethodParameterValueEditor extends DirtyableComposite { private Constants constants = GWT.create( Constants.class ); private static Images images = GWT.create( Images.class ); private ActionFieldFunction methodParameter; private DropDownData enums; private SimplePanel root; private RuleModeller model = null; private String parameterType = null; private Command onValueChangeCommand = null; public MethodParameterValueEditor(final ActionFieldFunction val, final DropDownData enums, RuleModeller model, String parameterType, Command onValueChangeCommand) { if ( val.type.equals( SuggestionCompletionEngine.TYPE_BOOLEAN ) ) { this.enums = DropDownData.create( new String[]{"true", "false"} ); } else { this.enums = enums; } this.root = new SimplePanel(); this.methodParameter = val; this.model = model; this.parameterType = parameterType; this.onValueChangeCommand = onValueChangeCommand; refresh(); initWidget( root ); } private void refresh() { root.clear(); if ( enums != null && (enums.fixedList != null || enums.queryExpression != null) ) { root.add( new EnumDropDown( methodParameter.value, new DropDownValueChanged() { public void valueChanged(String newText, String newValue) { methodParameter.value = newValue; if ( onValueChangeCommand != null ) { onValueChangeCommand.execute(); } makeDirty(); } }, enums ) ); } else { if ( methodParameter.nature == FieldNature.TYPE_UNDEFINED ) { // we have a blank slate.. // have to give them a choice root.add( choice() ); } else { if ( methodParameter.nature == FieldNature.TYPE_VARIABLE ) { ListBox list = boundVariable( methodParameter ); root.add( list ); } else { TextBox box = boundTextBox( this.methodParameter ); root.add( box ); } } } } private ListBox boundVariable(final FieldNature c) { /* * If there is a bound variable that is the same type of the current * variable type, then propose a list */ ListBox listVariable = new ListBox(); List<String> vars = model.getModel().getBoundFacts(); for ( String v : vars ) { FactPattern factPattern = model.getModel().getBoundFact( v ); if ( factPattern.factType.equals( this.methodParameter.type ) ) { // First selection is empty if ( listVariable.getItemCount() == 0 ) { listVariable.addItem( "..." ); } listVariable.addItem( v ); } } /* * add the bound variable of the rhs */ List<String> vars2 = model.getModel().getRhsBoundFacts(); for ( String v : vars2 ) { ActionInsertFact factPattern = model.getModel().getRhsBoundFact( v ); if ( factPattern.factType.equals( this.methodParameter.type ) ) { // First selection is empty if ( listVariable.getItemCount() == 0 ) { listVariable.addItem( "..." ); } listVariable.addItem( v ); } } if ( methodParameter.value.equals( "=" ) ) { listVariable.setSelectedIndex( 0 ); } else { for ( int i = 0; i < listVariable.getItemCount(); i++ ) { if ( listVariable.getItemText( i ).equals( methodParameter.value ) ) { listVariable.setSelectedIndex( i ); } } } if ( listVariable.getItemCount() > 0 ) { listVariable.addChangeHandler( new ChangeHandler() { public void onChange(ChangeEvent event) { ListBox w = (ListBox) event.getSource(); methodParameter.value = w.getValue( w.getSelectedIndex() ); if ( onValueChangeCommand != null ) { onValueChangeCommand.execute(); } makeDirty(); refresh(); } } ); } return listVariable; } private TextBox boundTextBox(final ActionFieldValue c) { final TextBox box = new TextBox(); box.setStyleName( "constraint-value-Editor" ); if ( c.value == null ) { box.setText( "" ); } else { if ( c.value.trim().equals( "" ) ) { c.value = ""; } box.setText( c.value ); } if ( c.value == null || c.value.length() < 5 ) { box.setVisibleLength( 6 ); } else { box.setVisibleLength( c.value.length() - 1 ); } box.addChangeHandler( new ChangeHandler() { public void onChange(ChangeEvent event) { c.value = box.getText(); if ( onValueChangeCommand != null ) { onValueChangeCommand.execute(); } makeDirty(); } } ); box.addKeyUpHandler( new KeyUpHandler() { public void onKeyUp(KeyUpEvent event) { box.setVisibleLength( box.getText().length() ); } } ); if ( methodParameter.type.equals( SuggestionCompletionEngine.TYPE_NUMERIC ) ) { box.addKeyPressHandler( new NumbericFilterKeyPressHandler( box ) ); } return box; } private Widget choice() { Image clickme = new Image( images.edit() ); clickme.addClickHandler( new ClickHandler() { public void onClick(ClickEvent event) { showTypeChoice( (Widget) event.getSource() ); } } ); return clickme; } protected void showTypeChoice(Widget w) { final FormStylePopup form = new FormStylePopup( images.newexWiz(), constants.FieldValue() ); Button lit = new Button( constants.LiteralValue() ); lit.addClickHandler( new ClickHandler() { public void onClick(ClickEvent event) { methodParameter.nature = FieldNature.TYPE_LITERAL; methodParameter.value = " "; makeDirty(); refresh(); form.hide(); } } ); form.addAttribute( constants.LiteralValue() + ":", widgets( lit, new InfoPopup( constants.Literal(), constants.LiteralValTip() ) ) ); form.addRow( new HTML( "<hr/>" ) ); form.addRow( new SmallLabel( constants.AdvancedSection() ) ); /* * If there is a bound variable that is the same type of the current * variable type, then show abutton */ List<String> vars = model.getModel().getBoundFacts(); List<String> vars2 = model.getModel().getRhsBoundFacts(); for ( String i : vars2 ) { vars.add( i ); } for ( String v : vars ) { boolean createButton = false; Button variable = new Button( constants.BoundVariable() ); if ( vars2.contains( v ) == false ) { FactPattern factPattern = model.getModel().getBoundFact( v ); if ( factPattern.factType.equals( this.parameterType ) ) { createButton = true; } } else { ActionInsertFact factPattern = model.getModel().getRhsBoundFact( v ); if ( factPattern.factType.equals( this.parameterType ) ) { createButton = true; } } if ( createButton == true ) { form.addAttribute( constants.BoundVariable() + ":", variable ); variable.addClickHandler( new ClickHandler() { public void onClick(ClickEvent event) { methodParameter.nature = FieldNature.TYPE_VARIABLE; methodParameter.value = "="; makeDirty(); refresh(); form.hide(); } } ); break; } } form.show(); } private Widget widgets(Button lit, InfoPopup popup) { HorizontalPanel h = new HorizontalPanel(); h.add( lit ); h.add( popup ); return h; } }