001: package org.drools.eclipse.rulebuilder.ui;
002:
003: import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
004: import org.drools.brms.client.modeldriven.brl.CompositeFactPattern;
005: import org.drools.brms.client.modeldriven.brl.DSLSentence;
006: import org.drools.brms.client.modeldriven.brl.FactPattern;
007: import org.drools.brms.client.modeldriven.brl.IPattern;
008: import org.eclipse.swt.SWT;
009: import org.eclipse.swt.widgets.Combo;
010: import org.eclipse.swt.widgets.Composite;
011: import org.eclipse.swt.widgets.Control;
012: import org.eclipse.swt.widgets.Event;
013: import org.eclipse.swt.widgets.Listener;
014: import org.eclipse.swt.widgets.Shell;
015:
016: /**
017: * This provides a popup for new LHS condition selection. (add new if-condition)
018: *
019: * @author Anton Arhipov
020: * @author Ahti Kitsik
021: */
022: public class AddNewConditionDialog extends RuleDialog {
023:
024: private IPattern pattern;
025:
026: private RuleModeller modeller;
027:
028: public AddNewConditionDialog(Shell parent, RuleModeller modeller) {
029:
030: super (parent, "Add new condition to the rule",
031: "Pick the values from combos and confirm the selection.");
032:
033: this .modeller = modeller;
034: }
035:
036: protected Control createDialogArea(final Composite parent) {
037: Control dialog = super .createDialogArea(parent);
038:
039: Composite composite = (Composite) dialog;
040:
041: addFacts(composite);
042:
043: addConditionType(composite);
044:
045: addDSLSentences(composite);
046:
047: return composite;
048: }
049:
050: private void addFacts(Composite composite) {
051: createLabel(composite, "Fact");
052:
053: String[] factTypes = getCompletion().getFactTypes();
054: final Combo factsCombo = new Combo(composite, SWT.READ_ONLY);
055: factsCombo.add("Choose fact type...");
056: for (int i = 0; i < factTypes.length; i++) {
057: factsCombo.add(factTypes[i]);
058: }
059: factsCombo.select(0);
060:
061: factsCombo.addListener(SWT.Selection, new Listener() {
062: public void handleEvent(Event event) {
063: if (factsCombo.getSelectionIndex() == 0) {
064: return;
065: }
066: modeller.getModel().addLhsItem(
067: new FactPattern(factsCombo.getText()));
068: modeller.reloadLhs();
069: modeller.setDirty(true);
070: close();
071: }
072: });
073: }
074:
075: private void addConditionType(Composite composite) {
076: createLabel(composite, "Condition type");
077:
078: final Combo conditionalsCombo = new Combo(composite,
079: SWT.READ_ONLY);
080: String[] conditionalElements = getCompletion()
081: .getConditionalElements();
082: conditionalsCombo.add("Choose condition type...");
083: for (int i = 0; i < conditionalElements.length; i++) {
084: conditionalsCombo.add(conditionalElements[i]);
085: }
086: conditionalsCombo.select(0);
087:
088: conditionalsCombo.addListener(SWT.Selection, new Listener() {
089: public void handleEvent(Event event) {
090: if (conditionalsCombo.getSelectionIndex() == 0) {
091: return;
092: }
093:
094: modeller.getModel().addLhsItem(
095: new CompositeFactPattern(conditionalsCombo
096: .getText()));
097: modeller.reloadLhs();
098: modeller.setDirty(true);
099: close();
100: }
101: });
102: }
103:
104: //
105: // The list of DSL sentences
106: //
107: private void addDSLSentences(Composite composite) {
108: if (getCompletion().getDSLConditions().length > 0) {
109: createLabel(composite, "Condition sentences");
110:
111: final Combo dslCombo = new Combo(composite, SWT.READ_ONLY);
112: dslCombo.add("Choose...");
113:
114: for (int i = 0; i < getCompletion().getDSLConditions().length; i++) {
115: DSLSentence sen = getCompletion().getDSLConditions()[i];
116: dslCombo.add(sen.toString());
117: }
118:
119: dslCombo.select(0);
120:
121: dslCombo.addListener(SWT.Selection, new Listener() {
122: public void handleEvent(Event event) {
123: if (dslCombo.getSelectionIndex() == 0) {
124: return;
125: }
126:
127: DSLSentence sentence = getCompletion()
128: .getDSLConditions()[dslCombo
129: .getSelectionIndex() - 1];
130: //TODO Handle this kind of situations with care - add* can throw runtime exceptions
131: modeller.getModel().addLhsItem(sentence.copy());
132:
133: modeller.reloadLhs();
134: modeller.setDirty(true);
135: close();
136: }
137: });
138:
139: }
140: }
141:
142: public IPattern getPattern() {
143: return pattern;
144: }
145:
146: private SuggestionCompletionEngine getCompletion() {
147: return modeller.getSuggestionCompletionEngine();
148: }
149:
150: }
|