001: package org.drools.eclipse.rulebuilder.ui;
002:
003: import java.util.Arrays;
004: import java.util.List;
005:
006: import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
007: import org.drools.brms.client.modeldriven.brl.ActionInsertFact;
008: import org.drools.brms.client.modeldriven.brl.ActionInsertLogicalFact;
009: import org.drools.brms.client.modeldriven.brl.ActionRetractFact;
010: import org.drools.brms.client.modeldriven.brl.ActionSetField;
011: import org.drools.brms.client.modeldriven.brl.ActionUpdateField;
012: import org.drools.brms.client.modeldriven.brl.DSLSentence;
013: import org.eclipse.swt.SWT;
014: import org.eclipse.swt.widgets.Combo;
015: import org.eclipse.swt.widgets.Composite;
016: import org.eclipse.swt.widgets.Control;
017: import org.eclipse.swt.widgets.Event;
018: import org.eclipse.swt.widgets.Listener;
019: import org.eclipse.swt.widgets.Shell;
020:
021: /**
022: * This provides a popup for new RHS action selection.
023: *
024: * @author Anton Arhipov
025: * @author Ahti Kitsik
026: */
027: public class AddNewActionDialog extends RuleDialog {
028:
029: private RuleModeller modeller;
030:
031: public AddNewActionDialog(Shell parent, RuleModeller modeller) {
032: super (parent, "Add a new action",
033: "Pick the values from combos and confirm the selection.");
034: this .modeller = modeller;
035: }
036:
037: protected Control createDialogArea(final Composite parent) {
038: Composite composite = (Composite) super
039: .createDialogArea(parent);
040: String heading = "Choose...";
041:
042: createValuesOfFieldPart(composite, heading);
043:
044: createModifyFieldPart(composite, heading);
045:
046: createRetractFieldPart(composite, heading);
047:
048: String[] facts = getCompletion().getFactTypes();
049:
050: createFactAssertionPart(composite, heading, facts);
051:
052: createFactLogicalAssertionPart(composite, heading, facts);
053:
054: createDslSentences(composite, heading);
055:
056: return composite;
057: }
058:
059: private void createRetractFieldPart(Composite composite,
060: String heading) {
061: createLabel(composite, "Retract the fact");
062:
063: final Combo factsCombo = new Combo(composite, SWT.READ_ONLY);
064:
065: factsCombo.add(heading);
066:
067: List boundFacts = modeller.getModel().getBoundFacts();
068:
069: for (int i = 0; i < boundFacts.size(); i++) {
070: factsCombo.add((String) boundFacts.get(i));
071: }
072: factsCombo.select(0);
073:
074: factsCombo.addListener(SWT.Selection, new Listener() {
075: public void handleEvent(Event event) {
076: if (factsCombo.getSelectionIndex() == 0) {
077: return;
078: }
079:
080: modeller.getModel().addRhsItem(
081: new ActionRetractFact(factsCombo.getText()));
082:
083: modeller.setDirty(true);
084: modeller.reloadRhs();
085: close();
086: }
087: });
088:
089: }
090:
091: private void createModifyFieldPart(Composite composite,
092: String heading) {
093: createLabel(composite, "Modify a field on a fact");
094: final Combo factsCombo = new Combo(composite, SWT.READ_ONLY);
095: factsCombo.add(heading);
096:
097: List boundFacts = modeller.getModel().getBoundFacts();
098:
099: for (int i = 0; i < boundFacts.size(); i++) {
100: factsCombo.add((String) boundFacts.get(i));
101: }
102: factsCombo.select(0);
103:
104: factsCombo.addListener(SWT.Selection, new Listener() {
105: public void handleEvent(Event event) {
106: if (factsCombo.getSelectionIndex() == 0) {
107: return;
108: }
109:
110: modeller.getModel().addRhsItem(
111: new ActionUpdateField(factsCombo.getText()));
112:
113: modeller.setDirty(true);
114: modeller.reloadRhs();
115: close();
116: }
117: });
118:
119: }
120:
121: private void createDslSentences(Composite composite, String heading) {
122: if (getCompletion().getDSLActions().length > 0) {
123: createLabel(composite, "Actions");
124:
125: final Combo dslCombo = new Combo(composite, SWT.READ_ONLY);
126: dslCombo.add(heading);
127: for (int i = 0; i < getCompletion().getDSLActions().length; i++) {
128: DSLSentence sen = getCompletion().getDSLActions()[i];
129: dslCombo.add(sen.toString());
130: }
131:
132: dslCombo.select(0);
133:
134: dslCombo.addListener(SWT.Selection, new Listener() {
135: public void handleEvent(Event event) {
136: if (dslCombo.getSelectionIndex() == 0) {
137: return;
138: }
139:
140: DSLSentence sentence = getCompletion()
141: .getDSLActions()[dslCombo
142: .getSelectionIndex() - 1];
143: modeller.getModel().addRhsItem(sentence.copy());
144: modeller.setDirty(true);
145: modeller.reloadRhs();
146: close();
147: }
148: });
149:
150: }
151: }
152:
153: private void createFactLogicalAssertionPart(Composite composite,
154: String heading, String[] facts) {
155: createLabel(composite, "Logically assert a new fact");
156: final Combo factsCombo = createFactsCombo(composite, heading,
157: facts);
158: factsCombo.addListener(SWT.Selection, new Listener() {
159: public void handleEvent(Event event) {
160:
161: if (factsCombo.getSelectionIndex() == 0) {
162: return;
163: }
164:
165: modeller.getModel().addRhsItem(
166: new ActionInsertLogicalFact(factsCombo
167: .getText()));
168: modeller.setDirty(true);
169: modeller.reloadRhs();
170: close();
171: }
172: });
173: }
174:
175: private void createFactAssertionPart(Composite composite,
176: String heading, String[] facts) {
177: createLabel(composite, "Assert a new fact");
178: final Combo factsCombo = createFactsCombo(composite, heading,
179: facts);
180: factsCombo.addListener(SWT.Selection, new Listener() {
181: public void handleEvent(Event event) {
182: if (factsCombo.getSelectionIndex() == 0) {
183: return;
184: }
185:
186: modeller.getModel().addRhsItem(
187: new ActionInsertFact(factsCombo.getText()));
188: modeller.setDirty(true);
189: modeller.reloadRhs();
190: close();
191: }
192: });
193: }
194:
195: private Combo createFactsCombo(Composite composite, String heading,
196: String[] facts) {
197: Combo factsCombo = new Combo(composite, SWT.READ_ONLY);
198: factsCombo.add(heading);
199: for (int i = 0; i < facts.length; i++) {
200: factsCombo.add(facts[i]);
201: }
202: factsCombo.select(0);
203: return factsCombo;
204: }
205:
206: private void createValuesOfFieldPart(Composite composite,
207: String heading) {
208: createLabel(composite, "Set the values of a field on");
209: final Combo globalVarsCombo = new Combo(composite,
210: SWT.READ_ONLY);
211: globalVarsCombo.add(heading);
212:
213: List boundFacts = modeller.getModel().getBoundFacts();
214:
215: //adding globals
216: String[] globals = modeller.getSuggestionCompletionEngine()
217: .getGlobalVariables();
218: boundFacts.addAll(Arrays.asList(globals));
219:
220: for (int i = 0; i < boundFacts.size(); i++) {
221: globalVarsCombo.add((String) boundFacts.get(i));
222: }
223: globalVarsCombo.select(0);
224:
225: globalVarsCombo.addListener(SWT.Selection, new Listener() {
226: public void handleEvent(Event event) {
227: if (globalVarsCombo.getSelectionIndex() == 0) {
228: return;
229: }
230:
231: modeller.getModel().addRhsItem(
232: new ActionSetField(globalVarsCombo.getText()));
233: modeller.setDirty(true);
234: modeller.reloadRhs();
235: close();
236: }
237: });
238: }
239:
240: public SuggestionCompletionEngine getCompletion() {
241: return modeller.getSuggestionCompletionEngine();
242: }
243:
244: }
|