[jboss-svn-commits] JBL Code SVN: r33460 - in labs/jbossrules/trunk: drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven and 8 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Jun 11 18:07:10 EDT 2010


Author: baunax
Date: 2010-06-11 18:07:09 -0400 (Fri, 11 Jun 2010)
New Revision: 33460

Added:
   labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/ExpressionPartHelper.java
   labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/ExpressionUnboundFact.java
   labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/SingleFieldConstraintEBLeftSide.java
Modified:
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/ClickableLabel.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/InfoPopup.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/HumanReadable.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ConstraintValueEditor.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/FactPatternWidget.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleModellerWidget.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/factPattern/Connectives.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/factPattern/PopupCreator.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/packages/PackageEditor.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/ListUtil.java
   labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/files/PackageDeploymentServletTest.java
   labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/SuggestionCompletionEngine.java
   labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/CopyExpressionVisitor.java
   labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/ExpressionFieldVariable.java
   labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/ExpressionFormLine.java
   labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/ExpressionVisitor.java
   labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/ISingleFieldConstraint.java
   labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/RuleModel.java
   labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/SingleFieldConstraint.java
   labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/server/util/BRDRLPersistence.java
Log:
GUVNOR-559 Allow to use the Expression Builder on the left side of a constraints
	- changes to support the ExpressionBuilder be displayed on the left side of constraints 

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/ClickableLabel.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/ClickableLabel.java	2010-06-11 21:54:53 UTC (rev 33459)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/ClickableLabel.java	2010-06-11 22:07:09 UTC (rev 33460)
@@ -1,15 +1,22 @@
 package org.drools.guvnor.client.common;
 
+import com.google.gwt.event.dom.client.ClickHandler;
 import com.google.gwt.user.client.ui.ClickListener;
 import com.google.gwt.user.client.ui.HTML;
 
 public class ClickableLabel extends HTML {
 
+	@Deprecated
 	public ClickableLabel(String text, ClickListener event, boolean enabled) {
 		super(doText(text, enabled));
 		if (enabled) this.addClickListener(event);
 	}
 
+	public ClickableLabel(String text, ClickHandler event, boolean enabled) {
+		super(doText(text, enabled));
+		if (enabled) this.addClickHandler(event);
+	}
+	
     private static String doText(String text, boolean enabled) {
         if (enabled)
             return "<div class='x-form-field'><span class='selectable-label'>" + text + "</span></div>";

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/InfoPopup.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/InfoPopup.java	2010-06-11 21:54:53 UTC (rev 33459)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/InfoPopup.java	2010-06-11 22:07:09 UTC (rev 33460)
@@ -15,14 +15,11 @@
  * limitations under the License.
  */
 
-
-
-import com.google.gwt.user.client.ui.ClickListener;
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
 import com.google.gwt.user.client.ui.Composite;
 import com.google.gwt.user.client.ui.Image;
-import com.google.gwt.user.client.ui.Widget;
 
-
 /**
  * This is handy for in-place context help.
  *
@@ -33,14 +30,14 @@
     public InfoPopup(final String title, final String message) {
         Image info = new Image("images/information.gif");
         info.setTitle( message );
-        info.addClickListener( new ClickListener() {
-            public void onClick(Widget w) {
-                final FormStylePopup pop = new FormStylePopup("images/information.gif", title);
-                pop.addRow( new SmallLabel(message) );
+		info.addClickHandler(new ClickHandler() {
 
-                pop.show();
-            }
-        } );
+			public void onClick(ClickEvent event) {
+				final FormStylePopup pop = new FormStylePopup("images/information.gif", title);
+				pop.addRow(new SmallLabel(message));
+				pop.show();
+			}
+		});
         initWidget( info );
     }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/HumanReadable.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/HumanReadable.java	2010-06-11 21:54:53 UTC (rev 33459)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/HumanReadable.java	2010-06-11 22:07:09 UTC (rev 33460)
@@ -14,18 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-
-
-import org.drools.guvnor.client.messages.Constants;
-
 import java.util.HashMap;
 import java.util.Map;
 
+import org.drools.guvnor.client.messages.Constants;
+
 import com.google.gwt.core.client.GWT;
 
-import org.drools.ide.common.client.modeldriven.brl.FromCompositeFactPattern;
-
 /**
  * This contains some simple mappings between operators, conditional elements and the human readable
  * equivalent.
@@ -37,9 +32,9 @@
  */
 public class HumanReadable {
 
-    public static Map operatorDisplayMap = new HashMap();
-    public static Map ceDisplayMap = new HashMap();
-    public static Map actionDisplayMap = new HashMap();
+    public static Map<String, String> operatorDisplayMap = new HashMap<String, String>();
+    public static Map<String, String> ceDisplayMap = new HashMap<String, String>();
+    public static Map<String, String> actionDisplayMap = new HashMap<String, String>();
     public static final String[] CONDITIONAL_ELEMENTS = new String[] {"not", "exists", "or"};
     public static final String[] FROM_CONDITIONAL_ELEMENTS = new String[] {"from","from accumulate","from collect"};
 
@@ -95,9 +90,6 @@
 
     }
 
-
-
-
     public static String getOperatorDisplayName(String op) {
         return lookup(op, operatorDisplayMap);
     }
@@ -106,16 +98,12 @@
         return lookup( ce, ceDisplayMap );
     }
 
-    private static String lookup(String ce, Map map) {
-        if (map.containsKey(ce)) {
-            return (String) map.get(ce);
-        } else {
-            return ce;
-        }
+    private static String lookup(String ce, Map<String, String> map) {
+    	String ret = map.get(ce);
+    	return ret == null ? ce : ret;
     }
 
     public static String getActionDisplayName(String action) {
         return lookup(action, actionDisplayMap);
     }
-
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ConstraintValueEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ConstraintValueEditor.java	2010-06-11 21:54:53 UTC (rev 33459)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ConstraintValueEditor.java	2010-06-11 22:07:09 UTC (rev 33460)
@@ -15,7 +15,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-import com.google.gwt.event.dom.client.ChangeEvent;
 import java.util.List;
 
 import org.drools.guvnor.client.common.DirtyableComposite;
@@ -32,11 +31,12 @@
 import org.drools.ide.common.client.modeldriven.brl.SingleFieldConstraint;
 
 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.Command;
 import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.ChangeListener;
-import com.google.gwt.user.client.ui.ClickListener;
 import com.google.gwt.user.client.ui.HTML;
 import com.google.gwt.user.client.ui.HasVerticalAlignment;
 import com.google.gwt.user.client.ui.HorizontalPanel;
@@ -85,23 +85,17 @@
 
         valueType = sce.getFieldType(pattern.factType, fieldName);
         this.fieldType = valueType;
-        if (SuggestionCompletionEngine.TYPE_NUMERIC.equals(valueType)) {
-            this.numericValue = true;
-        } else {
-            this.numericValue = false;
-        }
+        this.numericValue = SuggestionCompletionEngine.TYPE_NUMERIC.equals(valueType);
         
         this.readOnly = readOnly;
         if (SuggestionCompletionEngine.TYPE_BOOLEAN.equals(valueType)) {
             this.dropDownData = DropDownData.create(new String[]{"true", "false"}); //NON-NLS
         } else {
-            this.dropDownData = sce.getEnums(pattern,
-                    fieldName);
+            this.dropDownData = sce.getEnums(pattern, fieldName);
         }
 
         refreshEditor();
         initWidget(panel);
-
     }
 
 	private void refreshEditor() {
@@ -109,11 +103,10 @@
         Widget constraintWidget = null;
         if (constraint.constraintValueType == SingleFieldConstraint.TYPE_UNDEFINED) {
             Image clickme = new Image("images/edit.gif"); //NON-NLS
-            clickme.addClickListener(new ClickListener() {
-
-                public void onClick(Widget w) {
-                    showTypeChoice(w,
-                            constraint);
+            clickme.addClickHandler(new ClickHandler() {
+				
+				public void onClick(ClickEvent event) {
+					showTypeChoice((Widget) event.getSource(), constraint);
                 }
             });
             constraintWidget = clickme;
@@ -169,7 +162,7 @@
                 case SingleFieldConstraint.TYPE_RET_VALUE:
                 	constraintWidget = returnValueEditor();
                     break;
-                case SingleFieldConstraint.TYPE_EXPR_BUILDER:
+                case SingleFieldConstraint.TYPE_EXPR_BUILDER_VALUE:
                 	constraintWidget = expressionEditor();
                     break;
                 case SingleFieldConstraint.TYPE_VARIABLE:
@@ -191,7 +184,7 @@
             return new SmallLabel(this.constraint.value);
         }
 
-        List vars = this.model.getBoundVariablesInScope(this.constraint);
+        List<String> vars = this.model.getBoundVariablesInScope(this.constraint);
 
         final ListBox box = new ListBox();
 
@@ -200,8 +193,7 @@
         }
 
         int j = 0;
-        for (int i = 0; i < vars.size(); i++) {
-            String var = (String) vars.get(i);
+        for (String var : vars) {
             FactPattern f = model.getBoundFact(var);
             String fv = model.getFieldConstraint(var);
             if ((f != null && f.factType.equals(this.fieldType)) || (fv != null && fv.equals(this.fieldType))) {
@@ -224,10 +216,10 @@
             }
         }
 
-        box.addChangeListener(new ChangeListener() {
-
-            public void onChange(Widget w) {
-                executeOnValueChangeCommand();
+        box.addChangeHandler(new ChangeHandler() {
+			
+			public void onChange(ChangeEvent event) {
+				executeOnValueChangeCommand();
                 constraint.value = box.getItemText(box.getSelectedIndex());
             }
         });
@@ -259,19 +251,25 @@
         if (!(this.constraint instanceof SingleFieldConstraint)) {
             throw new IllegalArgumentException("Expected SingleFieldConstraint, but " + constraint.getClass().getName() + " found.");
         }
-        ExpressionBuilder builder = new ExpressionBuilder(this.modeller, ((SingleFieldConstraint) this.constraint).getExpression());
+        ExpressionBuilder builder = new ExpressionBuilder(this.modeller, ((SingleFieldConstraint) this.constraint).getExpressionValue());
+        builder.addExpressionTypeChangeHandler(new ExpressionTypeChangeHandler() {
+			
+			public void onExpressionTypeChanged(ExpressionTypeChangeEvent event) {
+				System.out.println("type changed: " + event.getOldType() + " -> " + event.getNewType());
+			}
+		});
         builder.addOnModifiedCommand(new Command() {
 
             public void execute() {
                 executeOnValueChangeCommand();
             }
         });
-        String msg = constants.ExpressionEditor();
+//        String msg = constants.ExpressionEditor();
         Widget ed = widgets(new HTML("&nbsp;"),
                 builder);
         return ed;
     }
-
+    
     /**
      * Show a list of possibilities for the value type.
      */
@@ -281,10 +279,9 @@
                 constants.FieldValue());
 
         Button lit = new Button(constants.LiteralValue());
-        lit.addClickListener(new ClickListener() {
-
-            public void onClick(Widget w) {
-                con.constraintValueType = SingleFieldConstraint.TYPE_LITERAL;
+        lit.addClickHandler(new ClickHandler() {
+			public void onClick(ClickEvent event) {
+				con.constraintValueType = SingleFieldConstraint.TYPE_LITERAL;
                 doTypeChosen(form);
             }
         });
@@ -296,8 +293,8 @@
 		if (modeller.isTemplate()) {
 	        String templateKeyLabel = constants.TemplateKey();
 	        Button templateKeyButton = new Button(templateKeyLabel);
-	        templateKeyButton.addClickListener(new ClickListener() {
-	            public void onClick(Widget arg0) {
+	        templateKeyButton.addClickHandler(new ClickHandler() {
+				public void onClick(ClickEvent event) {
 	                con.constraintValueType = ISingleFieldConstraint.TYPE_TEMPLATE;
 	                doTypeChosen(form);
 	            }
@@ -314,14 +311,15 @@
 
         //only want to show variables if we have some !
         if (this.model.getBoundVariablesInScope(this.constraint).size() > 0 || SuggestionCompletionEngine.TYPE_COLLECTION.equals(this.fieldType)) {
-            List vars = this.model.getBoundFacts();
+            List<String> vars = this.model.getBoundFacts();
             boolean foundABouncVariableThatMatches = false;
-            for (int i = 0; i < vars.size(); i++) {
-                String var = (String) vars.get(i);
+            for (String var : vars) {
                 FactPattern f = model.getBoundFact(var);
                 String fieldConstraint = model.getFieldConstraint(var);
 
-                if ((f != null && f.factType.equals(this.fieldType)) || this.fieldType.equals(fieldConstraint)) {
+                if ((f != null && f.factType != null && this.fieldType != null) 
+                		&& (f.factType.equals(this.fieldType) 
+                			|| this.fieldType.equals(fieldConstraint))) {
                     foundABouncVariableThatMatches = true;
                     break;
                 } else {
@@ -334,11 +332,10 @@
                     }
                 }
             }
-            if (foundABouncVariableThatMatches == true) {
+            if (foundABouncVariableThatMatches) {
                 Button variable = new Button(constants.BoundVariable());
-                variable.addClickListener(new ClickListener() {
-
-                    public void onClick(Widget w) {
+                variable.addClickHandler(new ClickHandler() {
+        			public void onClick(ClickEvent event) {
                         con.constraintValueType = SingleFieldConstraint.TYPE_VARIABLE;
                         doTypeChosen(form);
                     }
@@ -351,9 +348,8 @@
         }
 
         Button formula = new Button(constants.NewFormula());
-        formula.addClickListener(new ClickListener() {
-
-            public void onClick(Widget w) {
+        formula.addClickHandler(new ClickHandler() {
+			public void onClick(ClickEvent event) {
                 con.constraintValueType = SingleFieldConstraint.TYPE_RET_VALUE;
                 doTypeChosen(form);
             }
@@ -365,10 +361,9 @@
                 constants.FormulaExpressionTip())));
 
         Button expression = new Button(constants.ExpressionEditor());
-        expression.addClickListener(new ClickListener() {
-
-            public void onClick(Widget w) {
-                con.constraintValueType = SingleFieldConstraint.TYPE_EXPR_BUILDER;
+        expression.addClickHandler(new ClickHandler() {
+			public void onClick(ClickEvent event) {
+                con.constraintValueType = SingleFieldConstraint.TYPE_EXPR_BUILDER_VALUE;
                 doTypeChosen(form);
             }
         });
@@ -378,7 +373,6 @@
                 new InfoPopup(constants.ExpressionEditor(),
                 constants.ExpressionEditor())));
 
-
         form.show();
     }
 

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/FactPatternWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/FactPatternWidget.java	2010-06-11 21:54:53 UTC (rev 33459)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/FactPatternWidget.java	2010-06-11 22:07:09 UTC (rev 33460)
@@ -26,18 +26,30 @@
 import org.drools.guvnor.client.modeldriven.HumanReadable;
 import org.drools.guvnor.client.modeldriven.ui.factPattern.Connectives;
 import org.drools.guvnor.client.modeldriven.ui.factPattern.PopupCreator;
-import org.drools.ide.common.client.modeldriven.SuggestionCompletionEngine;
 import org.drools.ide.common.client.modeldriven.brl.CompositeFieldConstraint;
 import org.drools.ide.common.client.modeldriven.brl.FactPattern;
 import org.drools.ide.common.client.modeldriven.brl.FieldConstraint;
 import org.drools.ide.common.client.modeldriven.brl.IPattern;
 import org.drools.ide.common.client.modeldriven.brl.SingleFieldConstraint;
+import org.drools.ide.common.client.modeldriven.brl.SingleFieldConstraintEBLeftSide;
 
 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.Command;
 import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.ui.*;
+import com.google.gwt.user.client.ui.FlexTable;
+import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.HasHorizontalAlignment;
+import com.google.gwt.user.client.ui.HasVerticalAlignment;
+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.TextBox;
+import com.google.gwt.user.client.ui.Widget;
 import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
 import com.gwtext.client.util.Format;
 
@@ -49,7 +61,6 @@
 public class FactPatternWidget extends RuleModellerWidget {
 
     private FactPattern pattern;
-    private SuggestionCompletionEngine completions;
     private DirtyableFlexTable layout = new DirtyableFlexTable();
     private Connectives connectives;
     private PopupCreator popupCreator;
@@ -87,17 +98,16 @@
             String customLabel, boolean canBind, Boolean readOnly) {
         super(mod);
         this.pattern = (FactPattern) p;
-        this.completions = mod.getSuggestionCompletions();
         this.bindable = canBind;
 
         this.connectives = new Connectives();
-        this.connectives.setCompletions(completions);
+        this.connectives.setCompletions(mod.getSuggestionCompletions());
         this.connectives.setModeller(mod);
         this.connectives.setPattern(pattern);
 
         this.popupCreator = new PopupCreator();
         this.popupCreator.setBindable(bindable);
-        this.popupCreator.setCompletions(completions);
+        this.popupCreator.setCompletions(mod.getSuggestionCompletions());
         this.popupCreator.setModeller(mod);
         this.popupCreator.setPattern(pattern);
 
@@ -105,7 +115,7 @@
 
         //if readOnly == null, the RO attribute is calculated.
         if (readOnly == null){
-            this.readOnly = !completions.containsFactType(this.pattern.factType);
+            this.readOnly = !connectives.getCompletions().containsFactType(this.pattern.factType);
         }else{
             this.readOnly = readOnly;
         }
@@ -175,17 +185,17 @@
             final int currentRow = i;
             Image clear = new ImageButton("images/delete_faded.gif");//NON-NLS
             clear.setTitle(constants.RemoveThisWholeRestriction());
-            clear.addClickListener(new ClickListener() {
-
-                public void onClick(Widget w) {
-                    if (Window.confirm(constants.RemoveThisItem())) {
+            clear.addClickHandler(new ClickHandler() {
+				
+				public void onClick(ClickEvent event) {
+					if (Window.confirm(constants.RemoveThisItem())) {
                         setModified(true);
                         pattern.removeConstraint(currentRow);
                         getModeller().refreshWidget();
                     }
-                }
-            });
-
+				}
+			});
+           
             if (!this.readOnly) {
                 table.setWidget(currentRow, 5, clear);
             }
@@ -254,11 +264,10 @@
         FlexTable t = new FlexTable();
         String desc = null;
 
-
-        ClickListener click = new ClickListener() {
-
-            public void onClick(Widget w) {
-                popupCreator.showPatternPopupForComposite(w, constraint);
+    	ClickHandler click = new ClickHandler() {
+			
+			public void onClick(ClickEvent event) {
+                popupCreator.showPatternPopupForComposite((Widget) event.getSource(), constraint);
             }
         };
 
@@ -282,17 +291,16 @@
                 final int currentRow = i;
                 Image clear = new ImageButton("images/delete_faded.gif"); //NON-NLS
                 clear.setTitle(constants.RemoveThisNestedRestriction());
-
-                clear.addClickListener(new ClickListener() {
-
-                    public void onClick(Widget w) {
-                        if (Window.confirm(constants.RemoveThisItemFromNestedConstraint())) {
+                clear.addClickHandler(new ClickHandler() {
+					
+					public void onClick(ClickEvent event) {
+						if (Window.confirm(constants.RemoveThisItemFromNestedConstraint())) {
                             setModified(true);
                             constraint.removeConstraint(currentRow);
                             getModeller().refreshWidget();
                         }
-                    }
-                });
+					}
+				});
                 if (!this.readOnly) {
                     inner.setWidget(i, 5, clear);
                 }
@@ -308,26 +316,50 @@
      * Applies a single field constraint to the given table, and start row.
      */
     private void renderSingleFieldConstraint(final RuleModeller modeller,
-            final DirtyableFlexTable inner, int row, final SingleFieldConstraint constraint,
-            boolean showBinding, int tabs) {
+            final DirtyableFlexTable inner, final int row, final SingleFieldConstraint constraint,
+            boolean showBinding, final int tabs) {
 
-        int col = 1; //for offsetting, just a slight indent
+        final int col = 1; //for offsetting, just a slight indent
 
-
         inner.setWidget(row, 0, new HTML("&nbsp;&nbsp;&nbsp;&nbsp;"));
         //inner.getFlexCellFormatter().setWidth(row, 0, "15%");
         //DOCNHERON
         if (constraint.constraintValueType != SingleFieldConstraint.TYPE_PREDICATE) {
 
-            inner.setWidget(row, 0 + col, fieldLabel(constraint, showBinding, tabs * 20));
+        	HorizontalPanel ebContainer = null;
+        	if (constraint instanceof SingleFieldConstraintEBLeftSide) {
+        		ebContainer = expressionBuilderLS(
+        				(SingleFieldConstraintEBLeftSide) constraint, showBinding, tabs * 20);
+				inner.setWidget(row, 0 + col, ebContainer);
+        	} else {
+        		inner.setWidget(row, 0 + col, fieldLabel(constraint, showBinding, tabs * 20));
+        	}
             inner.setWidget(row, 1 + col, operatorDropDown(constraint));
             inner.setWidget(row, 2 + col, valueEditor(constraint, constraint.fieldType));
             inner.setWidget(row, 3 + col, connectives.connectives(constraint, constraint.fieldType));
+            
+            if (ebContainer != null && ebContainer.getWidgetCount() > 0) {
+            	if (ebContainer.getWidget(0) instanceof ExpressionBuilder) {
+					ExpressionBuilder eb = (ExpressionBuilder) ebContainer.getWidget(0);
+					eb.addExpressionTypeChangeHandler(new ExpressionTypeChangeHandler() {
+						
+						public void onExpressionTypeChanged(ExpressionTypeChangeEvent event) {
+							try {
+								constraint.fieldType = event.getNewType();
+								inner.setWidget(row, 1 + col, operatorDropDown(constraint, constraint.fieldType));
+							} catch (Exception e) {
+								e.printStackTrace();
+							}
+						}
+					});
+				}
+            }
+            
             Image addConnective = new ImageButton("images/add_connective.gif"); //NON-NLS
             addConnective.setTitle(constants.AddMoreOptionsToThisFieldsValues());
-            addConnective.addClickListener(new ClickListener() {
-
-                public void onClick(Widget w) {
+            addConnective.addClickHandler(new ClickHandler() {
+				
+				public void onClick(ClickEvent event) {
                     setModified(true);
                     constraint.addNewConnective();
                     modeller.refreshWidget();
@@ -342,7 +374,7 @@
             inner.getFlexCellFormatter().setColSpan(row, 1, 5);
         }
     }
-
+    
     /**
      * This provides an inline formula editor, not unlike a spreadsheet does.
      */
@@ -362,10 +394,10 @@
         box.setText(c.value);
 
         if (!this.readOnly) {
-            box.addChangeListener(new ChangeListener() {
-
-                public void onChange(Widget w) {
-                    setModified(true);
+            box.addChangeHandler(new ChangeHandler() {
+				
+				public void onChange(ChangeEvent event) {
+					setModified(true);
                     c.value = box.getText();
                     getModeller().makeDirty();
                 }
@@ -383,11 +415,11 @@
      * This returns the pattern label.
      */
     private Widget getPatternLabel() {
-        ClickListener click = new ClickListener() {
-
-            public void onClick(Widget w) {
+    	ClickHandler click = new ClickHandler() {
+			
+			public void onClick(ClickEvent event) {
                 String factTypeShortName = (pattern.factType.contains(".")?pattern.factType.substring(pattern.factType.lastIndexOf(".")+1):pattern.factType);
-                popupCreator.showPatternPopup(w, factTypeShortName, null);
+                popupCreator.showPatternPopup((Widget) event.getSource(), factTypeShortName, null);
             }
         };
 
@@ -433,9 +465,16 @@
         return constraintValueEditor;
     }
 
+    
+    
     private Widget operatorDropDown(final SingleFieldConstraint c) {
+    	return operatorDropDown(c, connectives.getCompletions()
+    			.getFieldType(pattern.factType, c.fieldName));
+    }
+    
+    private Widget operatorDropDown(final SingleFieldConstraint c, String type) {
         if (!this.readOnly) {
-            String[] ops = completions.getOperatorCompletions(pattern.factType, c.fieldName);
+            String[] ops = connectives.getCompletions().getOperatorCompletions(type);
             final ListBox box = new ListBox();
             box.addItem(constants.pleaseChoose(), "");
             for (int i = 0; i < ops.length; i++) {
@@ -447,9 +486,9 @@
 
             }
 
-            box.addChangeListener(new ChangeListener() {
-
-                public void onChange(Widget w) {
+            box.addChangeHandler(new ChangeHandler() {
+				
+				public void onChange(ChangeEvent event) {
                     setModified(true);
                     c.operator = box.getValue(box.getSelectedIndex());
                     if (c.operator.equals("")) {
@@ -467,29 +506,46 @@
 
     }
 
+    private HorizontalPanel expressionBuilderLS(final SingleFieldConstraintEBLeftSide con, boolean showBinding, int padding) {
+    	HorizontalPanel ab = new HorizontalPanel();
+        ab.setStyleName("modeller-field-Label");
+
+        if (!con.isBound()) {
+            if (bindable && showBinding && !this.readOnly) {
+				ExpressionBuilder eb = new ExpressionBuilder(getModeller(), con.getExpressionLeftSide());
+            	ab.add(eb);
+            } else {
+                ab.add(new SmallLabel(con.getExpressionLeftSide().getText()));
+            }
+        } else {
+            ab.add(new SmallLabel(con.fieldName));
+            ab.add(new SmallLabel(" <b>[" + con.fieldBinding + "]</b>"));       //NON-NLS
+        }
+        return ab;
+    }
+    
     /**
      * get the field widget. This may be a simple label, or it may
      * be bound (and show the var name) or a icon to create a binding.
      * It will only show the binding option of showBinding is true.
      */
-    private Widget fieldLabel(final SingleFieldConstraint con, boolean showBinding, int padding) {//, final Command onChange) {
+	private Widget fieldLabel(final SingleFieldConstraint con, boolean showBinding, int padding) {//, final Command onChange) {
         HorizontalPanel ab = new HorizontalPanel();
         ab.setStyleName("modeller-field-Label");
 
         if (!con.isBound()) {
             if (bindable && showBinding && !this.readOnly) {
-
-                ClickListener click = new ClickListener() {
-
-                    public void onClick(Widget w) {
-                        String[] fields = completions.getFieldCompletions(con.fieldType);
-                        popupCreator.showBindFieldPopup(w, con, fields, popupCreator);
+            	ClickHandler click = new ClickHandler() {
+					
+					public void onClick(ClickEvent event) {
+                        String[] fields = connectives.getCompletions().getFieldCompletions(con.fieldType);
+                        popupCreator.showBindFieldPopup((Widget) event.getSource(), con, fields, popupCreator);
                     }
                 };
 
                 Image bind = new ImageButton("images/edit_tiny.gif", constants.GiveFieldVarName()); //NON-NLS
 
-                bind.addClickListener(click);
+                bind.addClickHandler(click);
                 ClickableLabel cl = new ClickableLabel(con.fieldName, click, !this.readOnly);
                 DOM.setStyleAttribute(cl.getElement(), "marginLeft", "" + padding + "pt"); //NON-NLS
                 ab.add(cl);
@@ -503,7 +559,6 @@
             ab.add(new SmallLabel(" <b>[" + con.fieldBinding + "]</b>"));       //NON-NLS
         }
 
-
         return ab;
     }
 

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleModellerWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleModellerWidget.java	2010-06-11 21:54:53 UTC (rev 33459)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleModellerWidget.java	2010-06-11 22:07:09 UTC (rev 33460)
@@ -40,6 +40,10 @@
         }
         this.modified = modified;
     }
+    
+    protected boolean isModified() {
+        return modified;
+    }
 
     public void addOnModifiedCommand(Command command){
         this.onModifiedCommands.add(command);

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/factPattern/Connectives.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/factPattern/Connectives.java	2010-06-11 21:54:53 UTC (rev 33459)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/factPattern/Connectives.java	2010-06-11 22:07:09 UTC (rev 33460)
@@ -1,20 +1,21 @@
 package org.drools.guvnor.client.modeldriven.ui.factPattern;
 
 import org.drools.guvnor.client.common.DirtyableHorizontalPane;
+import org.drools.guvnor.client.messages.Constants;
 import org.drools.guvnor.client.modeldriven.HumanReadable;
 import org.drools.guvnor.client.modeldriven.ui.ConstraintValueEditor;
 import org.drools.guvnor.client.modeldriven.ui.RuleModeller;
-import org.drools.guvnor.client.messages.Constants;
 import org.drools.ide.common.client.modeldriven.SuggestionCompletionEngine;
 import org.drools.ide.common.client.modeldriven.brl.ConnectiveConstraint;
 import org.drools.ide.common.client.modeldriven.brl.FactPattern;
 import org.drools.ide.common.client.modeldriven.brl.ISingleFieldConstraint;
 import org.drools.ide.common.client.modeldriven.brl.SingleFieldConstraint;
 
-import com.google.gwt.user.client.ui.ChangeListener;
+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.user.client.ui.ListBox;
 import com.google.gwt.user.client.ui.Widget;
-import com.google.gwt.core.client.GWT;
 
 public class Connectives {
     private FactPattern                pattern;
@@ -96,15 +97,15 @@
             if ( op.equals( con.operator ) ) {
                 box.setSelectedIndex( i + 1 );
             }
-
         }
 
-        box.addChangeListener( new ChangeListener() {
-            public void onChange(Widget w) {
-                con.operator = box.getValue( box.getSelectedIndex() );
-            }
-        } );
+		box.addChangeHandler(new ChangeHandler() {
 
+			public void onChange(ChangeEvent event) {
+				con.operator = box.getValue(box.getSelectedIndex());
+			}
+		});
+
         return box;
     }
 }

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/factPattern/PopupCreator.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/factPattern/PopupCreator.java	2010-06-11 21:54:53 UTC (rev 33459)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/factPattern/PopupCreator.java	2010-06-11 22:07:09 UTC (rev 33460)
@@ -3,24 +3,27 @@
 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.modeldriven.ui.RuleModeller;
-import org.drools.guvnor.client.messages.Constants;
 import org.drools.ide.common.client.modeldriven.FieldAccessorsAndMutators;
 import org.drools.ide.common.client.modeldriven.SuggestionCompletionEngine;
 import org.drools.ide.common.client.modeldriven.brl.CompositeFieldConstraint;
+import org.drools.ide.common.client.modeldriven.brl.ExpressionFormLine;
+import org.drools.ide.common.client.modeldriven.brl.ExpressionUnboundFact;
 import org.drools.ide.common.client.modeldriven.brl.FactPattern;
 import org.drools.ide.common.client.modeldriven.brl.FieldConstraint;
 import org.drools.ide.common.client.modeldriven.brl.SingleFieldConstraint;
+import org.drools.ide.common.client.modeldriven.brl.SingleFieldConstraintEBLeftSide;
 
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
 import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.ChangeListener;
-import com.google.gwt.user.client.ui.ClickListener;
 import com.google.gwt.user.client.ui.HorizontalPanel;
 import com.google.gwt.user.client.ui.ListBox;
 import com.google.gwt.user.client.ui.TextBox;
 import com.google.gwt.user.client.ui.Widget;
-import com.google.gwt.core.client.GWT;
 import com.gwtext.client.util.Format;
 
 public class PopupCreator {
@@ -101,9 +104,8 @@
         vn.add(varName);
         vn.add(ok);
 
-        ok.addClickListener(new ClickListener() {
-
-            public void onClick(Widget w) {
+        ok.addClickHandler(new ClickHandler() {
+			public void onClick(ClickEvent event) {
                 String var = varName.getText();
                 if (modeller.isVariableNameUsed(var)) {
                     Window.alert(Format.format(constants.TheVariableName0IsAlreadyTaken(), var));
@@ -118,9 +120,8 @@
         if (fields != null) {
             Button sub = new Button(constants.ShowSubFields());
             popup.addAttribute(Format.format(constants.ApplyAConstraintToASubFieldOf0(), con.fieldName), sub);
-            sub.addClickListener(new ClickListener() {
-
-                public void onClick(Widget sender) {
+            sub.addClickHandler(new ClickHandler() {
+    			public void onClick(ClickEvent event) {
                     popup.hide();
                     popupCreator.showPatternPopup(w, con.fieldType, con);
                 }
@@ -146,9 +147,8 @@
 
         box.setSelectedIndex(0);
 
-        box.addChangeListener(new ChangeListener() {
-
-            public void onChange(Widget w) {
+        box.addClickHandler(new ClickHandler() {
+			public void onClick(ClickEvent event) {
                 composite.addConstraint(new SingleFieldConstraint(box.getItemText(box.getSelectedIndex())));
                 modeller.refreshWidget();
                 popup.hide();
@@ -163,9 +163,8 @@
         composites.addItem(constants.AnyOfOr(), CompositeFieldConstraint.COMPOSITE_TYPE_OR);
         composites.setSelectedIndex(0);
 
-        composites.addChangeListener(new ChangeListener() {
-
-            public void onChange(Widget w) {
+        composites.addClickHandler(new ClickHandler() {
+			public void onClick(ClickEvent event) {
                 CompositeFieldConstraint comp = new CompositeFieldConstraint();
                 comp.compositeJunctionType = composites.getValue(composites.getSelectedIndex());
                 composite.addConstraint(comp);
@@ -204,12 +203,11 @@
 
         box.setSelectedIndex(0);
 
-        box.addChangeListener(new ChangeListener() {
-
-            public void onChange(Widget w) {
+        box.addClickHandler(new ClickHandler() {
+			public void onClick(ClickEvent event) {
                 String fieldName = box.getItemText(box.getSelectedIndex());
                 String qualifiedName = factType + "." + fieldName;
-                String fieldType = (String) completions.getFieldType(qualifiedName);
+                String fieldType = completions.getFieldType(qualifiedName);
                 pattern.addConstraint(new SingleFieldConstraint(fieldName, fieldType, con));
                 modeller.refreshWidget();
                 popup.hide();
@@ -217,16 +215,14 @@
         });
         popup.addAttribute(constants.AddARestrictionOnAField(), box);
 
-
         final ListBox composites = new ListBox();
         composites.addItem("...");
         composites.addItem(constants.AllOfAnd(), CompositeFieldConstraint.COMPOSITE_TYPE_AND);
         composites.addItem(constants.AnyOfOr(), CompositeFieldConstraint.COMPOSITE_TYPE_OR);
         composites.setSelectedIndex(0);
 
-        composites.addChangeListener(new ChangeListener() {
-
-            public void onChange(Widget w) {
+        composites.addClickHandler(new ClickHandler() {
+			public void onClick(ClickEvent event) {
                 CompositeFieldConstraint comp = new CompositeFieldConstraint();
                 comp.compositeJunctionType = composites.getValue(composites.getSelectedIndex());
                 pattern.addConstraint(comp);
@@ -245,14 +241,11 @@
             popup.addAttribute(constants.MultipleFieldConstraint(), horiz);
         }
 
-
-        //popup.addRow( new HTML("<hr/>") );
         if (con == null) {
             popup.addRow(new SmallLabel("<i>" + constants.AdvancedOptionsColon() + "</i>")); //NON-NLS
-            final Button predicate = new Button(constants.NewFormula());
-            predicate.addClickListener(new ClickListener() {
-
-                public void onClick(Widget w) {
+            Button predicate = new Button(constants.NewFormula());
+            predicate.addClickHandler(new ClickHandler() {
+    			public void onClick(ClickEvent event) {
                     SingleFieldConstraint con = new SingleFieldConstraint();
                     con.constraintValueType = SingleFieldConstraint.TYPE_PREDICATE;
                     pattern.addConstraint(con);
@@ -261,7 +254,21 @@
                 }
             });
             popup.addAttribute(constants.AddANewFormulaStyleExpression(), predicate);
-
+            
+            Button ebBtn = new Button(constants.ExpressionEditor());
+            
+            ebBtn.addClickHandler(new ClickHandler() {
+    			public void onClick(ClickEvent event) {
+                    SingleFieldConstraintEBLeftSide con = new SingleFieldConstraintEBLeftSide();
+                    con.constraintValueType = SingleFieldConstraint.TYPE_UNDEFINED;
+                    pattern.addConstraint(con);
+                    con.setExpressionLeftSide(new ExpressionFormLine(new ExpressionUnboundFact(pattern)));
+                    modeller.refreshWidget();
+                    popup.hide();
+                }
+            });
+            popup.addAttribute(constants.ExpressionEditor(), ebBtn);
+                        
             doBindingEditor(popup);
         }
 
@@ -288,9 +295,8 @@
             varName.add(varTxt);
 
             Button bindVar = new Button(constants.Set());
-            bindVar.addClickListener(new ClickListener() {
-
-                public void onClick(Widget w) {
+            bindVar.addClickHandler(new ClickHandler() {
+    			public void onClick(ClickEvent event) {
                     String var = varTxt.getText();
                     if (modeller.isVariableNameUsed(var)) {
                         Window.alert(Format.format(constants.TheVariableName0IsAlreadyTaken(), var));

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/packages/PackageEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/packages/PackageEditor.java	2010-06-11 21:54:53 UTC (rev 33459)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/packages/PackageEditor.java	2010-06-11 22:07:09 UTC (rev 33460)
@@ -39,6 +39,8 @@
 import org.drools.guvnor.client.messages.Constants;
 
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.ui.Button;
@@ -301,16 +303,17 @@
 
         addbutton.setTitle( constants.CreateCategoryRule() );
 
-        addbutton.addClickListener( new ClickListener() {
-            public void onClick(Widget w) {
-                if ( exw.getSelectedPath().length() > 0 && ruleName.getText().trim().length() > 0 ) {
+        addbutton.addClickHandler(new ClickHandler() {
+			
+			public void onClick(ClickEvent event) {
+				if ( exw.getSelectedPath().length() > 0 && ruleName.getText().trim().length() > 0 ) {
                     addToCatRules( exw.getSelectedPath(),
                                    ruleName.getText() );
                 }
                 refreshWidgets();
                 pop.hide();
-            }
-        } );
+			}
+		});
 
         pop.addAttribute( constants.AllTheRulesInFollowingCategory(),
                           exw );

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/ListUtil.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/ListUtil.java	2010-06-11 21:54:53 UTC (rev 33459)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/ListUtil.java	2010-06-11 22:07:09 UTC (rev 33460)
@@ -24,10 +24,10 @@
 
 public class ListUtil {
 
-    public static List filter(DSLSentence[] source,
+    public static List<DSLSentence> filter(DSLSentence[] source,
                              String filterVal) {
 
-        ArrayList filteredList = new ArrayList();
+        List<DSLSentence> filteredList = new ArrayList<DSLSentence>();
         for ( int i = 0; i < source.length; i++ ) {
             DSLSentence item = source[i];
             if (filterVal.equals( "" ) || item.sentence.startsWith( filterVal )) {

Modified: labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/files/PackageDeploymentServletTest.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/files/PackageDeploymentServletTest.java	2010-06-11 21:54:53 UTC (rev 33459)
+++ labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/files/PackageDeploymentServletTest.java	2010-06-11 22:07:09 UTC (rev 33460)
@@ -28,12 +28,11 @@
 import org.drools.repository.AssetItem;
 import org.drools.repository.PackageItem;
 import org.drools.repository.RulesRepository;
+import org.drools.util.codec.Base64;
 import org.mortbay.jetty.Server;
 import org.mortbay.jetty.servlet.Context;
 import org.mortbay.jetty.servlet.ServletHolder;
 
-import sun.misc.BASE64Encoder;
-
 public class PackageDeploymentServletTest extends TestCase {
 
 	public void FIXMEtestLoadingRules() throws Exception {
@@ -271,12 +270,12 @@
 		ServiceImplementation impl = new ServiceImplementation();
 		impl.repository = repo;
 
-		PackageItem pkg = repo.createPackage("testScenariosURL", "");
+		repo.createPackage("testScenariosURL", "");
 		impl.createPackageSnapshot("testScenariosURL", "SNAP1", false, "");
 
-        BASE64Encoder enc = new sun.misc.BASE64Encoder();
+		Base64 enc = new Base64();
         String userpassword = "test" + ":" + "password";
-        final String encodedAuthorization = enc.encode( userpassword.getBytes() );      
+        final String encodedAuthorization = enc.encodeToString( userpassword.getBytes() );      
 
         Map<String, String> headers = new HashMap<String, String>() {
             {

Modified: labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/SuggestionCompletionEngine.java
===================================================================
--- labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/SuggestionCompletionEngine.java	2010-06-11 21:54:53 UTC (rev 33459)
+++ labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/SuggestionCompletionEngine.java	2010-06-11 22:07:09 UTC (rev 33460)
@@ -204,21 +204,23 @@
     
     public String[] getOperatorCompletions(final String factType,
                                            final String fieldName) {
-        final String type = this.getFieldType( factType, fieldName );
-        if ( type == null ) {
-            return STANDARD_OPERATORS;
-        } else if ( type.equals( TYPE_STRING ) ) {
-            return STRING_OPERATORS;
-        } else if ( type.equals( TYPE_COMPARABLE ) || type.equals( TYPE_DATE ) || type.equals( TYPE_NUMERIC ) ) {
-            return COMPARABLE_OPERATORS;
-        } else if ( type.equals( TYPE_COLLECTION ) ) {
-            return COLLECTION_OPERATORS;
-        } else {
-            return STANDARD_OPERATORS;
-        }
-
+        return getOperatorCompletions(getFieldType( factType, fieldName ));
     }
 
+	public String[] getOperatorCompletions(final String type) {
+		if (type == null) {
+			return STANDARD_OPERATORS;
+		} else if (type.equals(TYPE_STRING)) {
+			return STRING_OPERATORS;
+		} else if (type.equals(TYPE_COMPARABLE) || type.equals(TYPE_DATE) || type.equals(TYPE_NUMERIC)) {
+			return COMPARABLE_OPERATORS;
+		} else if (type.equals(TYPE_COLLECTION)) {
+			return COLLECTION_OPERATORS;
+		} else {
+			return STANDARD_OPERATORS;
+		}
+	}
+    
     public String[] getFieldCompletionsForGlobalVariable(final String varName) {
         final String type = this.getGlobalVariable( varName );
         return this.getModelFields(type);
@@ -248,6 +250,9 @@
     public DropDownData getEnums(FactPattern pat,
                                  String field) {
 
+    	if (field == null) {
+    		return null;
+    	}
         Map<String, Object> dataEnumLookupFields = loadDataEnumLookupFields();
 
         if ( pat.constraintList != null && pat.constraintList.constraints != null ) {

Modified: labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/CopyExpressionVisitor.java
===================================================================
--- labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/CopyExpressionVisitor.java	2010-06-11 21:54:53 UTC (rev 33459)
+++ labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/CopyExpressionVisitor.java	2010-06-11 22:07:09 UTC (rev 33460)
@@ -36,6 +36,11 @@
 		moveNext(part);
 	}
 
+	public void visit(ExpressionUnboundFact part) {
+		add(new ExpressionUnboundFact(part.getFact()));
+		moveNext(part);
+	}
+	
 	public void visit(ExpressionCollection part) {
 		add(new ExpressionCollection(part.getName(), part.getClassType(), part.getGenericType(), part.getParametricType()));
 		moveNext(part);

Modified: labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/ExpressionFieldVariable.java
===================================================================
--- labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/ExpressionFieldVariable.java	2010-06-11 21:54:53 UTC (rev 33459)
+++ labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/ExpressionFieldVariable.java	2010-06-11 22:07:09 UTC (rev 33460)
@@ -9,9 +9,6 @@
  */
 public class ExpressionFieldVariable extends ExpressionText {
 	
-	@SuppressWarnings("unused")
-	private ExpressionFieldVariable() {}
-
 	public ExpressionFieldVariable(String name) {
 		super(name, "java.lang.String", SuggestionCompletionEngine.TYPE_FINAL_OBJECT);
 	}

Modified: labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/ExpressionFormLine.java
===================================================================
--- labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/ExpressionFormLine.java	2010-06-11 21:54:53 UTC (rev 33459)
+++ labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/ExpressionFormLine.java	2010-06-11 22:07:09 UTC (rev 33460)
@@ -5,7 +5,8 @@
 
 public class ExpressionFormLine implements IAction, IPattern, Cloneable {
 	
-    private LinkedList<ExpressionPart> parts = new LinkedList<ExpressionPart>() ;
+    private String bindVariable = null;
+	private LinkedList<ExpressionPart> parts = new LinkedList<ExpressionPart>() ;
     
     public ExpressionFormLine() {}
 
@@ -22,7 +23,7 @@
 	}
 
 	public String getText() {
-		return new ToStringVisitor().buildString(getRootExpression());
+		return new ToStringVisitor().buildString(getBindVariable(), getRootExpression());
 	}
 	
 	public void appendPart(ExpressionPart part) {
@@ -46,7 +47,7 @@
 		return parts.getLast();
 	}
 	
-	public String getPreviousType() {
+	public String getPreviousClassType() {
 		ExpressionPart last = getPreviousPart();
 		return last.getPrevious() == null ? null : last.getPrevious().getClassType(); 
 	}
@@ -56,8 +57,13 @@
 	}
 	
 	public String getGenericType() {
-		return parts.getLast().getGenericType();
+		return parts.isEmpty() ? null : parts.getLast().getGenericType();
 	}
+	
+	public String getPreviousGenericType() {
+		ExpressionPart prev = getPreviousPart().getPrevious();
+		return prev == null ? null : prev.getGenericType();
+	}
 
 	public String getParametricType() {
 		return parts.getLast().getParametricType();
@@ -79,15 +85,29 @@
 	public ExpressionPart getRootExpression() {
 		return parts.isEmpty() ? null : parts.getFirst();
 	}
+
+	public boolean isBound() {
+		return bindVariable != null;
+	}
 	
+	public String getBindVariable() {
+		return bindVariable;
+	}
+
+	public void setBindVariable(String bindVariable) {
+		this.bindVariable = bindVariable;
+	}
+
 	private static class ToStringVisitor implements ExpressionVisitor {
 		private StringBuilder str;
+		private boolean first;
 		
-		public String buildString(ExpressionPart exp) {
+		public String buildString(String bindVariable, ExpressionPart exp) {
 			if (exp == null) {
 				return "";
 			}
-			str = new StringBuilder();
+			str = new StringBuilder(bindVariable == null ? "" : bindVariable );
+			first = true;
 			exp.accept(this);
 			return str.toString();
 		}
@@ -97,12 +117,18 @@
 		}
 
 		public void visit(ExpressionField part) {
-			str.append('.').append(part.getName());
+			if (!first) {
+				str.append('.');
+			}
+			str.append(part.getName());
 			moveNext(part);
 		}
 
 		public void visit(ExpressionMethod part) {
-			str.append('.').append(part.getName())
+			if (!first) {
+				str.append('.');
+			}
+			str.append(part.getName())
 				.append('(')
 				.append(paramsToString(part.getParams()))
 				.append(')');
@@ -114,13 +140,21 @@
 			moveNext(part);			
 		}
 
+		public void visit(ExpressionUnboundFact part) {
+			moveNext(part, false);
+		}
+
+		
 		public void visit(ExpressionGlobalVariable part) {
 			str.append(part.getName());
 			moveNext(part);
 		}
 
 		public void visit(ExpressionCollection part) {
-			str.append('.').append(part.getName());
+			if (!first) {
+				str.append('.');
+			}
+			str.append(part.getName());
 			moveNext(part);
 		}
 
@@ -141,13 +175,20 @@
 			ToStringVisitor stringVisitor = new ToStringVisitor();
 			StringBuilder strParams = new StringBuilder();
 			for (ExpressionFormLine param : params.values()) {
-				strParams.append(", ").append(stringVisitor.buildString(param.getRootExpression()));
+				strParams.append(", ").append(stringVisitor.buildString(param.getBindVariable(), param.getRootExpression()));
 			}
 			return strParams.substring(2);
 		}
 		
 		private void moveNext(ExpressionPart exp) {
+			moveNext(exp, true);
+		}
+		
+		private void moveNext(ExpressionPart exp, boolean resetFirst) {
 			if (exp.getNext() != null) {
+				if (resetFirst) {
+					first = false;
+				}
 				exp.getNext().accept(this);
 			}
 		}

Added: labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/ExpressionPartHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/ExpressionPartHelper.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/ExpressionPartHelper.java	2010-06-11 22:07:09 UTC (rev 33460)
@@ -0,0 +1,31 @@
+package org.drools.ide.common.client.modeldriven.brl;
+
+import org.drools.ide.common.client.modeldriven.MethodInfo;
+import org.drools.ide.common.client.modeldriven.SuggestionCompletionEngine;
+
+public class ExpressionPartHelper {
+	public static ExpressionPart getExpressionPartForMethod(SuggestionCompletionEngine sce, String factName, String methodName) {
+		MethodInfo mi = sce.getMethodinfo(factName, methodName);
+		if (SuggestionCompletionEngine.TYPE_COLLECTION.equals(mi.getGenericType())) {
+			return new ExpressionCollection(methodName, mi.getReturnClassType(),
+					mi.getGenericType(), mi.getParametricReturnType());
+		} 
+		return new ExpressionMethod(mi.getName(), mi.getReturnClassType(), mi.getGenericType());
+	}
+	
+	public static ExpressionPart getExpressionPartForField(SuggestionCompletionEngine sce, String factName, String fieldName) {
+		String fieldClassName = sce.getFieldClassName(factName, fieldName);
+		String fieldGenericType = sce.getFieldType(factName, fieldName);
+		if (SuggestionCompletionEngine.TYPE_COLLECTION.equals(fieldGenericType)) {
+			String fieldParametricType = sce.getParametricFieldType(factName, fieldName);
+			return new ExpressionCollection(fieldName, fieldClassName, fieldGenericType,
+					fieldParametricType);
+		} 
+		return new ExpressionField(fieldName, fieldClassName, fieldGenericType);
+	}
+	
+	public static ExpressionPart getExpressionPartForGlobalVariable(SuggestionCompletionEngine sce, String varName) {
+		String globalVarType = sce.getGlobalVariable(varName);
+		return new ExpressionGlobalVariable(varName, globalVarType, globalVarType);
+	}
+}


Property changes on: labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/ExpressionPartHelper.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/ExpressionUnboundFact.java
===================================================================
--- labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/ExpressionUnboundFact.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/ExpressionUnboundFact.java	2010-06-11 22:07:09 UTC (rev 33460)
@@ -0,0 +1,23 @@
+package org.drools.ide.common.client.modeldriven.brl;
+
+
+public class ExpressionUnboundFact extends ExpressionPart {
+	private FactPattern fact;
+	
+	@SuppressWarnings("unused")
+	private ExpressionUnboundFact() {}
+
+	public ExpressionUnboundFact(FactPattern fact) {
+		super(fact.factType, fact.factType, fact.factType);
+		this.fact = fact;
+	}
+
+	public FactPattern getFact() {
+		return fact;
+	}
+	
+	@Override
+	public void accept(ExpressionVisitor visitor) {
+		visitor.visit(this);
+	}
+}


Property changes on: labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/ExpressionUnboundFact.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/ExpressionVisitor.java
===================================================================
--- labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/ExpressionVisitor.java	2010-06-11 21:54:53 UTC (rev 33459)
+++ labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/ExpressionVisitor.java	2010-06-11 22:07:09 UTC (rev 33460)
@@ -9,4 +9,5 @@
 	void visit(ExpressionCollection part);
 	void visit(ExpressionCollectionIndex part);
 	void visit(ExpressionText part);
+	void visit(ExpressionUnboundFact part);
 }

Modified: labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/ISingleFieldConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/ISingleFieldConstraint.java	2010-06-11 21:54:53 UTC (rev 33459)
+++ labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/ISingleFieldConstraint.java	2010-06-11 22:07:09 UTC (rev 33460)
@@ -31,11 +31,6 @@
     public static final int TYPE_RET_VALUE = 3;
 
     /**
-     * This is for a "expression builder" that calculates a value.
-     */
-    public static final int TYPE_EXPR_BUILDER = 6;
-
-    /**
      * This is not used yet. ENUMs are not suitable for business rules
      * until we can get data driven non code enums.
      */
@@ -45,11 +40,21 @@
      * The fieldName and fieldBinding is not used in the case of a predicate.
      */
     public static final int TYPE_PREDICATE = 5;
+
+    /**
+     * This is for a "expression builder" that calculates a value.
+     */
+    public static final int TYPE_EXPR_BUILDER_VALUE = 6;
     
     /**
      * This is for a field to be a placeholder for a template
      */
     public static final int TYPE_TEMPLATE = 7;
+    
+    /**
+     * This is for a "expression builder" in the left side of a constraint.
+     */
+//    public static final int TYPE_EXPR_BUILDER_LEFT_SIDE = 8;
 
     public String           value;
     public int              constraintValueType;

Modified: labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/RuleModel.java
===================================================================
--- labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/RuleModel.java	2010-06-11 21:54:53 UTC (rev 33459)
+++ labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/RuleModel.java	2010-06-11 22:07:09 UTC (rev 33460)
@@ -127,27 +127,27 @@
 
         for (int j = 0; j < fact.getFieldConstraints().length; j++) {
             FieldConstraint fc = fact.getFieldConstraints()[j];
-            List<String> s = giveFieldBinding(fc);
+            List<String> s = getFieldBinding(fc);
             result.addAll(s);
         }
         return result;
     }
 
-    private List<String> giveFieldBinding(FieldConstraint f) {
+    private List<String> getFieldBinding(FieldConstraint f) {
         List<String> result = new ArrayList<String>();
         if (f instanceof SingleFieldConstraint) {
-            SingleFieldConstraint s = (SingleFieldConstraint) f;
-            if (s.isBound() == true) {
-                result.add(s.fieldBinding);
+            SingleFieldConstraint sfc = (SingleFieldConstraint) f;
+            if (sfc.isBound()) {
+                result.add(sfc.fieldBinding);
             }
         }
         if (f instanceof CompositeFieldConstraint) {
-            CompositeFieldConstraint s = (CompositeFieldConstraint) f;
+            CompositeFieldConstraint cfc = (CompositeFieldConstraint) f;
 
             //If the user didn't add any constraint yet, s.constraints is null
-            if (s.constraints != null){
-                for (FieldConstraint ss : s.constraints) {
-                    List<String> t = giveFieldBinding(ss);
+            if (cfc.constraints != null){
+                for (FieldConstraint ss : cfc.constraints) {
+                    List<String> t = getFieldBinding(ss);
                     result.addAll(t);
                 }
             }

Modified: labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/SingleFieldConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/SingleFieldConstraint.java	2010-06-11 21:54:53 UTC (rev 33459)
+++ labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/SingleFieldConstraint.java	2010-06-11 22:07:09 UTC (rev 33460)
@@ -62,14 +62,14 @@
      * Returns true of there is a field binding.
      */
     public boolean isBound() {
-        return this.fieldBinding != null && this.fieldBinding.length() > 0 ;
+        return this.fieldBinding != null && this.fieldBinding.length() > 0; 
     }
 
-    public ExpressionFormLine getExpression() {
+    public ExpressionFormLine getExpressionValue() {
         return expression;
     }
 
-    public void setExpression(ExpressionFormLine expression) {
+    public void setExpressionValue(ExpressionFormLine expression) {
         this.expression = expression;
     }
 }

Added: labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/SingleFieldConstraintEBLeftSide.java
===================================================================
--- labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/SingleFieldConstraintEBLeftSide.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/SingleFieldConstraintEBLeftSide.java	2010-06-11 22:07:09 UTC (rev 33460)
@@ -0,0 +1,38 @@
+package org.drools.ide.common.client.modeldriven.brl;
+
+
+/**
+ * @author baunax at gmail.com
+ */
+public class SingleFieldConstraintEBLeftSide extends SingleFieldConstraint {
+
+    public SingleFieldConstraintEBLeftSide() {
+		super();
+	}
+
+	public SingleFieldConstraintEBLeftSide(String field, String fieldType, FieldConstraint parent) {
+		super(field, fieldType, parent);
+	}
+
+	public SingleFieldConstraintEBLeftSide(String field) {
+		super(field);
+	}
+
+	private ExpressionFormLine expLeftSide = new ExpressionFormLine();
+
+    /**
+     * Returns true of there is a field binding.
+     */
+    public boolean isBound() {
+        return super.isBound() 
+        	|| (expLeftSide != null && expLeftSide.isBound()) ;
+    }
+    
+    public ExpressionFormLine getExpressionLeftSide() {
+        return expLeftSide;
+    }
+
+    public void setExpressionLeftSide(ExpressionFormLine expression) {
+        this.expLeftSide = expression;
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/brl/SingleFieldConstraintEBLeftSide.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/server/util/BRDRLPersistence.java
===================================================================
--- labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/server/util/BRDRLPersistence.java	2010-06-11 21:54:53 UTC (rev 33459)
+++ labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/server/util/BRDRLPersistence.java	2010-06-11 22:07:09 UTC (rev 33460)
@@ -399,7 +399,9 @@
                     buf.append(" : ");
                 }
                 if ((constr.operator != null && constr.value != null)
-                        || constr.fieldBinding != null || constr.constraintValueType == ISingleFieldConstraint.TYPE_EXPR_BUILDER) {
+                        || constr.fieldBinding != null 
+                        || constr.constraintValueType == ISingleFieldConstraint.TYPE_EXPR_BUILDER_VALUE
+                        || constr instanceof SingleFieldConstraintEBLeftSide) {
                     SingleFieldConstraint parent = (SingleFieldConstraint) constr.parent;
                     StringBuilder parentBuf = new StringBuilder();
                     while (parent != null) {
@@ -407,13 +409,17 @@
                         parent = (SingleFieldConstraint) parent.parent;
                     }
                     buf.append(parentBuf);
-                    buf.append(constr.fieldName);
+                    if (constr instanceof SingleFieldConstraintEBLeftSide) {
+                    	buf.append(((SingleFieldConstraintEBLeftSide) constr).getExpressionLeftSide().getText());
+                    } else {
+                    	buf.append(constr.fieldName);
+                    }
                 }
-
-                addFieldRestriction(buf, constr.constraintValueType,
-                        constr.operator, constr.value,constr.getExpression());
-
-                // and now do the connectives.
+                
+                addFieldRestriction(buf, constr.constraintValueType, constr.operator, constr.value, constr
+                		.getExpressionValue());
+                
+				// and now do the connectives.
                 if (constr.connectives != null) {
                     for (int j = 0; j < constr.connectives.length; j++) {
                         final ConnectiveConstraint conn = constr.connectives[j];
@@ -449,7 +455,7 @@
                         buf.append('"');
                     }
                     break;
-                case ISingleFieldConstraint.TYPE_EXPR_BUILDER:
+                case ISingleFieldConstraint.TYPE_EXPR_BUILDER_VALUE:
                     if (expression!=null){
                         buf.append(expression.getText());
                     }



More information about the jboss-svn-commits mailing list