001: package org.drools.eclipse.rulebuilder.ui;
002:
003: import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
004: import org.drools.brms.client.modeldriven.brl.CompositeFieldConstraint;
005: import org.drools.brms.client.modeldriven.brl.FactPattern;
006: import org.drools.brms.client.modeldriven.brl.ISingleFieldConstraint;
007: import org.drools.brms.client.modeldriven.brl.SingleFieldConstraint;
008: import org.eclipse.swt.SWT;
009: import org.eclipse.swt.layout.GridData;
010: import org.eclipse.swt.layout.GridLayout;
011: import org.eclipse.swt.widgets.Button;
012: import org.eclipse.swt.widgets.Combo;
013: import org.eclipse.swt.widgets.Composite;
014: import org.eclipse.swt.widgets.Control;
015: import org.eclipse.swt.widgets.Event;
016: import org.eclipse.swt.widgets.Listener;
017: import org.eclipse.swt.widgets.Shell;
018: import org.eclipse.swt.widgets.Text;
019: import org.eclipse.ui.forms.widgets.FormToolkit;
020:
021: /**
022: * Adding a new constraint for a field of a FactPattern
023: *
024: * @author Anton Arhipov
025: * @author Ahti Kitsik
026: *
027: */
028: public class AddNewFieldConstraintDialog extends RuleDialog {
029:
030: private final FormToolkit toolkit;
031:
032: private RuleModeller modeller;
033:
034: private FactPattern pattern;
035:
036: private boolean isNested;
037:
038: public AddNewFieldConstraintDialog(Shell parent,
039: FormToolkit toolkit, RuleModeller modeller,
040: FactPattern pattern, boolean isNested) {
041: super (parent, "Update constraints",
042: "Pick the values from combos and confirm the selection.");
043: this .toolkit = toolkit;
044: this .modeller = modeller;
045: this .pattern = pattern;
046: this .isNested = isNested;
047: }
048:
049: protected Control createDialogArea(final Composite parent) {
050: Composite composite = (Composite) super
051: .createDialogArea(parent);
052:
053: GridLayout l = new GridLayout();
054: l.numColumns = 3;
055: l.marginBottom = 0;
056: l.marginHeight = 0;
057: l.marginLeft = 0;
058: l.marginRight = 0;
059: l.marginTop = 0;
060: l.marginWidth = 0;
061: composite.setLayout(l);
062:
063: GridData gd = new GridData(GridData.FILL_HORIZONTAL);
064: gd.horizontalSpan = 2;
065:
066: createFieldRestrictionCombo(composite, gd);
067: createMultipleRestrictionCombo(composite, gd);
068: createFormulaRow(composite, gd);
069: if (!isNested) {
070: createVariableBindingRow(composite);
071: }
072:
073: toolkit.paintBordersFor(composite);
074: return composite;
075: }
076:
077: private void createMultipleRestrictionCombo(Composite composite,
078: GridData gd) {
079: createLabel(composite, "Multiple field constriant");
080: final Combo composites = new Combo(composite, SWT.READ_ONLY);
081:
082: composites.setLayoutData(gd);
083:
084: composites.add("...");
085: composites.add("All of (And)");
086: composites.add("Any of (Or)");
087: composites.setData("All of (And)",
088: CompositeFieldConstraint.COMPOSITE_TYPE_AND);
089: composites.setData("Any of (Or)",
090: CompositeFieldConstraint.COMPOSITE_TYPE_OR);
091: composites.select(0);
092:
093: composites.addListener(SWT.Selection, new Listener() {
094: public void handleEvent(Event event) {
095: if (composites.getSelectionIndex() == 0) {
096: return;
097: }
098:
099: CompositeFieldConstraint comp = new CompositeFieldConstraint();
100: comp.compositeJunctionType = (String) composites
101: .getData(composites.getText());
102:
103: pattern.addConstraint(comp);
104: modeller.reloadLhs(); //TODO:review, perhaps should be another order of these calls
105: modeller.setDirty(true);
106: close();
107: }
108: });
109: }
110:
111: private void createFieldRestrictionCombo(Composite composite,
112: GridData gd) {
113: createLabel(composite, "Add a restriction on a field");
114:
115: String[] fieldCompletitions = getCompletion()
116: .getFieldCompletions(pattern.factType);
117: final Combo fieldsCombo = new Combo(composite, SWT.READ_ONLY);
118: fieldsCombo.setLayoutData(gd);
119: fieldsCombo.add("...");
120: for (int i = 0; i < fieldCompletitions.length; i++) {
121: fieldsCombo.add(fieldCompletitions[i]);
122: }
123: fieldsCombo.select(0);
124:
125: fieldsCombo.addListener(SWT.Selection, new Listener() {
126: public void handleEvent(Event event) {
127: if (fieldsCombo.getSelectionIndex() == 0) {
128: return;
129: }
130:
131: SingleFieldConstraint constraint = new SingleFieldConstraint();
132: constraint.fieldName = fieldsCombo.getText();
133: pattern.addConstraint(constraint);
134: modeller.setDirty(true);
135: modeller.reloadLhs();
136: close();
137: }
138: });
139: }
140:
141: private void createFormulaRow(Composite composite, GridData gd) {
142: createLabel(composite, "Add a new formula style expression");
143: Button formulaButton = toolkit.createButton(composite,
144: "New formula", SWT.PUSH);
145:
146: formulaButton.addListener(SWT.Selection, new Listener() {
147: public void handleEvent(Event event) {
148: SingleFieldConstraint con = new SingleFieldConstraint();
149: con.constraintValueType = ISingleFieldConstraint.TYPE_PREDICATE;
150: pattern.addConstraint(con);
151: modeller.setDirty(true);
152: modeller.reloadLhs();
153: close();
154: }
155: });
156:
157: formulaButton.setLayoutData(gd);
158: }
159:
160: private void createVariableBindingRow(Composite composite) {
161: createLabel(composite, "Variable name");
162: final Text variableText = createText(composite, "");
163:
164: if (pattern.boundName != null) {
165: variableText.setText(pattern.boundName);
166: }
167:
168: Button varButton = toolkit.createButton(composite, "Set",
169: SWT.PUSH);
170: varButton.addListener(SWT.Selection, new Listener() {
171: public void handleEvent(Event event) {
172: pattern.boundName = variableText.getText();
173: modeller.reloadLhs();
174: modeller.setDirty(true);
175: close();
176: }
177: });
178: }
179:
180: private SuggestionCompletionEngine getCompletion() {
181: return modeller.getSuggestionCompletionEngine();
182: }
183:
184: }
|