[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