[jboss-svn-commits] JBL Code SVN: r18955 - in labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client: common and 1 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Mar 14 02:21:21 EDT 2008


Author: michael.neale at jboss.com
Date: 2008-03-14 02:21:21 -0400 (Fri, 14 Mar 2008)
New Revision: 18955

Added:
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/decisiontable/GuidedDTColumnConfig.java
Modified:
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/admin/CategoryManager.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/common/FormStylePopup.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/decisiontable/GuidedDecisionTableWidget.java
Log:
JBRULES-1494 Decision table column configuration

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/admin/CategoryManager.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/admin/CategoryManager.java	2008-03-14 06:19:13 UTC (rev 18954)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/admin/CategoryManager.java	2008-03-14 06:21:21 UTC (rev 18955)
@@ -29,8 +29,12 @@
 import org.drools.brms.client.modeldriven.dt.AttributeCol;
 import org.drools.brms.client.modeldriven.dt.ConditionCol;
 import org.drools.brms.client.modeldriven.dt.GuidedDecisionTable;
+import org.drools.brms.client.packages.SuggestionCompletionCache;
+import org.drools.brms.client.rpc.MetaData;
 import org.drools.brms.client.rpc.RepositoryServiceFactory;
+import org.drools.brms.client.rpc.RuleAsset;
 
+import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.ui.ClickListener;
 import com.google.gwt.user.client.ui.Composite;
@@ -108,6 +112,7 @@
         };
         ConditionCol c1 = new ConditionCol();
         c1.header = "Driver 1 age";
+
         dt.conditionCols.add(c1);
         ConditionCol c2 = new ConditionCol();
         c2.header = "Driver 2 age";
@@ -121,8 +126,17 @@
         a1.header = "Do something !";
         dt.actionCols.add(a1);
 
+        SuggestionCompletionCache.getInstance().doAction("com.billasurf.manufacturing.plant", new Command() {
+			public void execute() {
+				System.err.println("loaded SCE");
+			}
+        });
         //initWidget( form );
-        initWidget( new GuidedDecisionTableWidget(dt) );
+        RuleAsset asset_ = new RuleAsset();
+        asset_.metaData = new MetaData();
+        asset_.metaData.packageName = "com.billasurf.manufacturing.plant";
+        asset_.content = dt;
+        initWidget( new GuidedDecisionTableWidget(asset_) );
     }
 
 

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/common/FormStylePopup.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/common/FormStylePopup.java	2008-03-14 06:19:13 UTC (rev 18954)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/common/FormStylePopup.java	2008-03-14 06:21:21 UTC (rev 18955)
@@ -38,6 +38,9 @@
 	private Boolean shadow;
 	private Integer width;
 	private Integer height;
+	private boolean modal = true;
+	private int popLeft = -1;
+	private int popTop;
 
     public FormStylePopup(String image,
                           final String title) {
@@ -72,19 +75,27 @@
     	this.dialog.destroy();
     }
 
+    public void setPopupPosition(int left, int top) {
+    	this.popLeft = left;
+    	this.popTop = top;
+    }
 
 
+
 	public void show() {
 
 		dialog = new Window();
 		dialog.setAutoScroll(true);
-		dialog.setModal(true);
+		dialog.setModal(modal );
 		dialog.setWidth((width == null)? 500 : width.intValue());
 		//dialog.setHeight((height == null)? form.getNumAttributes() * 40 + 100 : height.intValue());
 		dialog.setShadow((shadow == null)? true : shadow.booleanValue());
 		dialog.setResizable(true);
 		dialog.setClosable(true);
 		dialog.setTitle(title);
+		if (popLeft > -1) {
+			dialog.setPosition(popLeft, popTop);
+		}
 
 
 
@@ -96,5 +107,17 @@
 		this.dialog.show();
 	}
 
+	public void setModal(boolean m) {
+		this.modal = m;
+	}
 
+	public void setTitle(String t) {
+		this.title = t;
+	}
+
+	public void setWidth(int i) {
+		this.width = new Integer(i);
+	}
+
+
 }
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/decisiontable/GuidedDTColumnConfig.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/decisiontable/GuidedDTColumnConfig.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/decisiontable/GuidedDTColumnConfig.java	2008-03-14 06:21:21 UTC (rev 18955)
@@ -0,0 +1,331 @@
+package org.drools.brms.client.decisiontable;
+
+import org.drools.brms.client.common.FormStylePopup;
+import org.drools.brms.client.common.ImageButton;
+import org.drools.brms.client.common.SmallLabel;
+import org.drools.brms.client.modeldriven.HumanReadable;
+import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
+import org.drools.brms.client.modeldriven.brl.ISingleFieldConstraint;
+import org.drools.brms.client.modeldriven.dt.ConditionCol;
+import org.drools.brms.client.modeldriven.dt.GuidedDecisionTable;
+
+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.HorizontalPanel;
+import com.google.gwt.user.client.ui.Image;
+import com.google.gwt.user.client.ui.ListBox;
+import com.google.gwt.user.client.ui.RadioButton;
+import com.google.gwt.user.client.ui.TextBox;
+import com.google.gwt.user.client.ui.Widget;
+
+/**
+ * This is a configuration editor for a column in a the guided decision table.
+ * @author Michael Neale
+ *
+ */
+public class GuidedDTColumnConfig extends FormStylePopup {
+
+	private GuidedDecisionTable dt;
+	private SuggestionCompletionEngine sce;
+	private ConditionCol editingCol;
+	private SmallLabel patternLabel = new SmallLabel();
+	private SmallLabel fieldLabel = new SmallLabel();
+	private SmallLabel operatorLabel = new SmallLabel();
+
+	/**
+	 * Pass in a null col and it will create a new one.
+	 */
+	public GuidedDTColumnConfig(SuggestionCompletionEngine sce, final GuidedDecisionTable dt, final Command refreshGrid, final ConditionCol col, final boolean isNew) {
+		super();
+		this.setModal(false);
+		this.dt = dt;
+		this.sce = sce;
+		this.editingCol = new ConditionCol();
+		editingCol.boundName = col.boundName;
+		editingCol.constraintValueType = col.constraintValueType;
+		editingCol.factField = col.factField;
+		editingCol.factType = col.factType;
+		editingCol.header = col.header;
+		editingCol.operator = col.operator;
+
+
+		setTitle("Condition column configuration");
+
+		final TextBox header = new TextBox();
+		header.setText(col.header);
+		header.addChangeListener(new ChangeListener() {
+			public void onChange(Widget w) {
+				editingCol.header = header.getText();
+			} });
+		addAttribute("Column header (description):", header);
+
+
+		HorizontalPanel pattern = new HorizontalPanel();
+		pattern.add(patternLabel);
+		doPatternLabel();
+
+		Image changePattern = new ImageButton("images/edit.gif", "Choose an existing pattern that this column adds to", new ClickListener() {
+			public void onClick(Widget w) {
+				showChangePattern(w);
+			}
+		});
+		pattern.add(changePattern);
+
+
+		Image newPattern = new ImageButton("images/new_item.gif", "Create a new pattern for this column", new ClickListener() {
+			public void onClick(Widget w) {
+				showNewPatternDialog();
+			}
+		});
+
+		pattern.add(newPattern);
+		addAttribute("Pattern:", pattern);
+
+		//now a radio button with the type
+		RadioButton literal = new RadioButton("constraintValueType", "Literal value");
+		RadioButton formula = new RadioButton("constraintValueType", "Formula");
+		RadioButton predicate = new RadioButton("constraintValueType", "Predicate");
+
+
+		HorizontalPanel valueTypes = new HorizontalPanel();
+		valueTypes.add(literal);
+		valueTypes.add(formula);
+		valueTypes.add(predicate);
+		addAttribute("Calculation type:", valueTypes);
+
+		switch (editingCol.constraintValueType) {
+			case ISingleFieldConstraint.TYPE_LITERAL:
+				literal.setChecked(true);
+				break;
+			case ISingleFieldConstraint.TYPE_RET_VALUE :
+				formula.setChecked(true);
+				break;
+			case ISingleFieldConstraint.TYPE_PREDICATE :
+				predicate.setChecked(true);
+		}
+
+		literal.addClickListener(new ClickListener() {
+			public void onClick(Widget w) {
+				applyConsTypeChange(ISingleFieldConstraint.TYPE_LITERAL);
+			}
+		});
+
+
+		formula.addClickListener(new ClickListener() {
+			public void onClick(Widget w) {
+				applyConsTypeChange(ISingleFieldConstraint.TYPE_RET_VALUE);
+			}
+		});
+		predicate.addClickListener(new ClickListener() {
+			public void onClick(Widget w) {
+				applyConsTypeChange(ISingleFieldConstraint.TYPE_PREDICATE);
+			}
+		});
+
+
+		HorizontalPanel field = new HorizontalPanel();
+		field.add(fieldLabel);
+		Image editField = new ImageButton("images/edit.gif", "Edit the field that this column operates on", new ClickListener() {
+			public void onClick(Widget w) {
+				showFieldChange();
+			}
+		});
+		field.add(editField);
+		addAttribute("Field:", field);
+		doFieldLabel();
+
+
+		HorizontalPanel operator = new HorizontalPanel();
+		operator.add(operatorLabel);
+		Image editOp = new ImageButton("images/edit.gif", "Edit the operator that is used to compare data with this field", new ClickListener() {
+			public void onClick(Widget w) {
+				showOperatorChange();
+			}
+		});
+		operator.add(editOp);
+		addAttribute("Operator:", operator);
+		doOperatorLabel();
+
+
+		Button apply = new Button("Apply changes");
+		apply.addClickListener(new ClickListener() {
+			public void onClick(Widget w) {
+				if (isNew) {
+					dt.conditionCols.add(editingCol);
+
+				} else {
+					col.boundName = editingCol.boundName;
+					col.constraintValueType = editingCol.constraintValueType;
+					col.factField = editingCol.factField;
+					col.factType = editingCol.factType;
+					col.header = editingCol.header;
+					col.operator = editingCol.operator;
+
+				}
+				refreshGrid.execute();
+				hide();
+
+			}
+		});
+		addRow(apply);
+
+
+
+
+
+	}
+
+	private void applyConsTypeChange(int newType) {
+		editingCol.constraintValueType = newType;
+		doFieldLabel();
+		doOperatorLabel();
+	}
+
+
+	private void doOperatorLabel() {
+		if (editingCol.constraintValueType == ISingleFieldConstraint.TYPE_PREDICATE) {
+			operatorLabel.setText("(not needed for predicate)");
+		} else if (nil(editingCol.factType)) {
+			operatorLabel.setText("(please select a pattern first)");
+		} else if (nil(editingCol.factField)) {
+			operatorLabel.setText("(please choose a field first)");
+		} else if (nil(editingCol.operator)) {
+			operatorLabel.setText("(please select a field)");
+		} else {
+			operatorLabel.setText(HumanReadable.getOperatorDisplayName(editingCol.operator));
+		}
+	}
+
+	private void showOperatorChange() {
+		final FormStylePopup pop = new FormStylePopup();
+		pop.setModal(false);
+		String[] ops = this.sce.getOperatorCompletions(editingCol.factType, editingCol.factField);
+		final ListBox box = new ListBox();
+		for (int i = 0; i < ops.length; i++) {
+			box.addItem(HumanReadable.getOperatorDisplayName(ops[i]), ops[i]);
+		}
+		pop.addAttribute("Operator:", box);
+		Button b = new Button("OK");
+		pop.addRow(b);
+		b.addClickListener(new ClickListener() {
+			public void onClick(Widget w) {
+				editingCol.operator = box.getValue(box.getSelectedIndex());
+				doOperatorLabel();
+				pop.hide();
+			}
+		});
+		pop.show();
+
+	}
+
+	private void doFieldLabel() {
+		if (editingCol.constraintValueType == ISingleFieldConstraint.TYPE_PREDICATE) {
+			fieldLabel.setText("(not needed for predicate)");
+		} else if (nil(editingCol.factType)) {
+			fieldLabel.setText("(please select a pattern first)");
+		}
+		else if (nil(editingCol.factField)) {
+			fieldLabel.setText("(please select a field)");
+		} else {
+			fieldLabel.setText(this.editingCol.factField);
+		}
+	}
+
+	private boolean nil(String s) {
+		return s == null || s.equals("");
+	}
+
+	protected void showFieldChange() {
+		final FormStylePopup pop = new FormStylePopup();
+		pop.setModal(false);
+		String[] fields = this.sce.getFieldCompletions(this.editingCol.factType);
+		final ListBox box = new ListBox();
+		for (int i = 0; i < fields.length; i++) {
+			box.addItem(fields[i]);
+		}
+		pop.addAttribute("Field:", box);
+		Button b = new Button("OK");
+		pop.addRow(b);
+		b.addClickListener(new ClickListener() {
+			public void onClick(Widget w) {
+				editingCol.factField = box.getItemText(box.getSelectedIndex());
+				doFieldLabel();
+				doOperatorLabel();
+				pop.hide();
+			}
+		});
+		pop.show();
+	}
+
+	private void doPatternLabel() {
+		if (this.editingCol.factType != null) {
+			this.patternLabel.setText(this.editingCol.factType + " [" + editingCol.boundName + "]");
+		}
+		doFieldLabel();
+		doOperatorLabel();
+
+	}
+
+	protected void showChangePattern(Widget w) {
+		final FormStylePopup pop = new FormStylePopup();
+
+		final ListBox pats = this.loadPatterns();
+		pop.addAttribute("Choose existing pattern to add column to:", pats);
+		Button ok = new Button("OK");
+		pop.addRow(ok);
+
+		ok.addClickListener(new ClickListener() {
+			public void onClick(Widget w) {
+				String[] val = pats.getValue(pats.getSelectedIndex()).split("\\s");
+				editingCol.factType = val[0];
+				editingCol.boundName = val[1];
+				doPatternLabel();
+				pop.hide();
+			}
+		});
+
+		pop.show();
+	}
+
+	protected void showNewPatternDialog() {
+		final FormStylePopup pop = new FormStylePopup();
+		pop.setTitle("Create a new fact pattern");
+		final ListBox types = new ListBox();
+		for (int i = 0; i < sce.factTypes.length; i++) {
+			types.addItem(sce.factTypes[i]);
+		}
+		pop.addAttribute("Fact type:", types);
+		final TextBox binding = new TextBox();
+		pop.addAttribute("name:", binding);
+
+		Button ok = new Button("OK");
+		ok.addClickListener(new ClickListener() {
+			public void onClick(Widget w) {
+				editingCol.boundName = binding.getText();
+				editingCol.factType = types.getItemText(types.getSelectedIndex());
+				doPatternLabel();
+				pop.hide();
+			}
+		});
+		pop.addRow(ok);
+
+		pop.show();
+
+	}
+
+	private ListBox loadPatterns() {
+		ListBox patterns = new ListBox();
+		for (int i = 0; i < dt.conditionCols.size(); i++) {
+			ConditionCol c = (ConditionCol) dt.conditionCols.get(i);
+			patterns.addItem(c.factType + " [" + c.boundName + "]", c.factType + " " + c.boundName);
+		}
+
+		return patterns;
+
+	}
+
+
+
+}


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/decisiontable/GuidedDTColumnConfig.java
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/decisiontable/GuidedDecisionTableWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/decisiontable/GuidedDecisionTableWidget.java	2008-03-14 06:19:13 UTC (rev 18954)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/decisiontable/GuidedDecisionTableWidget.java	2008-03-14 06:21:21 UTC (rev 18955)
@@ -6,11 +6,16 @@
 import org.drools.brms.client.common.FormStylePopup;
 import org.drools.brms.client.common.ImageButton;
 import org.drools.brms.client.common.SmallLabel;
+import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
+import org.drools.brms.client.modeldriven.brl.ISingleFieldConstraint;
 import org.drools.brms.client.modeldriven.dt.ActionCol;
 import org.drools.brms.client.modeldriven.dt.AttributeCol;
 import org.drools.brms.client.modeldriven.dt.ConditionCol;
 import org.drools.brms.client.modeldriven.dt.GuidedDecisionTable;
+import org.drools.brms.client.packages.SuggestionCompletionCache;
+import org.drools.brms.client.rpc.RuleAsset;
 
+import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.ui.Button;
 import com.google.gwt.user.client.ui.ClickListener;
 import com.google.gwt.user.client.ui.Composite;
@@ -63,28 +68,41 @@
 	private GridPanel grid;
 	private FieldDef[] fds;
 	private VerticalPanel attributeConfigWidget;
+	private VerticalPanel conditionsConfigWidget;
+	private String packageName;
 
 
-	public GuidedDecisionTableWidget(GuidedDecisionTable dt) {
+	public GuidedDecisionTableWidget(RuleAsset asset) {
 
-    	this.dt = dt;
+    	this.dt = (GuidedDecisionTable) asset.content;
+    	this.packageName = asset.metaData.packageName;
 
 
         layout = new VerticalPanel();
 
         FormPanel config = new FormPanel();
-        config.setTitle("Table configuration");
- //         config.setFrame(true);
+        config.setTitle("Decision table");
+
         config.setBodyBorder(false);
+        config.setCollapsed(true);
+        config.setCollapsible(true);
 
+
         FieldSet attributes = new FieldSet("Attributes");
         attributes.setCollapsible(true);
+
         attributes.setFrame(true);
         attributes.add(getAttributes());
         config.add(attributes);
 
 
+        FieldSet conditions = new FieldSet("Conditions");
+        conditions.setCollapsible(true);
+        conditions.add(getConditions());
 
+
+        config.add(conditions);
+
         layout.add(config);
 
         refreshGrid();
@@ -93,6 +111,81 @@
         initWidget(layout);
     }
 
+	private Widget getConditions() {
+		conditionsConfigWidget = new VerticalPanel();
+		refreshConditionsWidget();
+		return conditionsConfigWidget;
+	}
+
+	private void refreshConditionsWidget() {
+		this.conditionsConfigWidget.clear();
+		for (int i = 0; i < dt.conditionCols.size(); i++) {
+			ConditionCol c = (ConditionCol) dt.conditionCols.get(i);
+			HorizontalPanel hp = new HorizontalPanel();
+			hp.add(removeCondition(c));
+			hp.add(editCondition(c));
+			hp.add(new SmallLabel(c.header));
+			conditionsConfigWidget.add(hp);
+		}
+		conditionsConfigWidget.add(newCondition());
+
+
+
+	}
+
+	private Widget newCondition() {
+		final ConditionCol newCol = new ConditionCol();
+		newCol.constraintValueType = ISingleFieldConstraint.TYPE_LITERAL;
+		return new ImageButton("images/new_item.gif", "Add a new condition column", new ClickListener() {
+			public void onClick(Widget w) {
+				GuidedDTColumnConfig dialog = new GuidedDTColumnConfig(getSCE(), dt, new Command() {
+					public void execute() {
+						//want to add in a blank row into the data
+						scrapeData(dt.attributeCols.size() + dt.conditionCols.size() + 1);
+						refreshGrid();
+						refreshConditionsWidget();
+					}
+				}, newCol, true);
+				dialog.show();
+			}
+		});
+	}
+
+	private Widget editCondition(final ConditionCol c) {
+		return new ImageButton("images/edit.gif", "Edit this columns configuration", new ClickListener() {
+			public void onClick(Widget w) {
+				GuidedDTColumnConfig dialog = new GuidedDTColumnConfig(getSCE(), dt, new Command() {
+					public void execute() {
+						scrapeData(-1);
+						refreshGrid();
+						refreshConditionsWidget();
+					}
+				}, c, false);
+				dialog.show();
+			}
+		});
+	}
+
+	protected SuggestionCompletionEngine getSCE() {
+		return SuggestionCompletionCache.getInstance().getEngineFromCache(this.packageName);
+	}
+
+	private Widget removeCondition(final ConditionCol c) {
+		Image del = new ImageButton("images/delete_item_small.gif", "Remove this condition column", new ClickListener() {
+			public void onClick(Widget w) {
+				if (com.google.gwt.user.client.Window.confirm("Are you sure you want to delete the column for " + c.header + " - all data in that column will be removed?")) {
+					dt.conditionCols.remove(c);
+					removeField(c.header);
+					scrapeData(-1);
+					refreshGrid();
+					refreshConditionsWidget();
+				}
+			}
+		});
+
+		return del;
+	}
+
 	private Widget getAttributes() {
 		attributeConfigWidget = new VerticalPanel();
 		refreshAttributeWidget();
@@ -212,7 +305,7 @@
 				for (int j = 0; j < fds.length; j++) {
 					if (j < insertCol) {
 						row[j] = r.getAsString(fds[j].getName());
-					} else if (j > insertCol) {
+					} else if (j >= insertCol) {
 						row[j + 1] = r.getAsString(fds[j].getName());
 					}
 				}
@@ -377,8 +470,8 @@
 
 
         grid.setStore(store);
-        grid.setWidth(500);
-        grid.setHeight(300);
+        grid.setWidth(700);
+        grid.setHeight(500);
 
 
         grid.addGridCellListener(new GridCellListenerAdapter() {




More information about the jboss-svn-commits mailing list