001: package org.drools.eclipse.rulebuilder.ui;
002:
003: import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
004: import org.drools.brms.client.modeldriven.brl.ActionInsertFact;
005: import org.drools.brms.client.modeldriven.brl.ActionRetractFact;
006: import org.drools.brms.client.modeldriven.brl.ActionSetField;
007: import org.drools.brms.client.modeldriven.brl.CompositeFactPattern;
008: import org.drools.brms.client.modeldriven.brl.DSLSentence;
009: import org.drools.brms.client.modeldriven.brl.FactPattern;
010: import org.drools.brms.client.modeldriven.brl.IAction;
011: import org.drools.brms.client.modeldriven.brl.IPattern;
012: import org.drools.brms.client.modeldriven.brl.RuleModel;
013: import org.drools.eclipse.rulebuilder.editors.RuleEditor;
014: import org.eclipse.jface.dialogs.Dialog;
015: import org.eclipse.jface.window.Window;
016: import org.eclipse.swt.SWT;
017: import org.eclipse.swt.graphics.Font;
018: import org.eclipse.swt.graphics.FontData;
019: import org.eclipse.swt.widgets.Composite;
020: import org.eclipse.swt.widgets.Control;
021: import org.eclipse.swt.widgets.Display;
022: import org.eclipse.swt.widgets.Event;
023: import org.eclipse.swt.widgets.Listener;
024: import org.eclipse.swt.widgets.Shell;
025: import org.eclipse.swt.widgets.ToolBar;
026: import org.eclipse.swt.widgets.ToolItem;
027: import org.eclipse.ui.ISharedImages;
028: import org.eclipse.ui.PlatformUI;
029: import org.eclipse.ui.forms.FormColors;
030: import org.eclipse.ui.forms.widgets.ColumnLayout;
031: import org.eclipse.ui.forms.widgets.ExpandableComposite;
032: import org.eclipse.ui.forms.widgets.FormToolkit;
033: import org.eclipse.ui.forms.widgets.ScrolledForm;
034: import org.eclipse.ui.forms.widgets.Section;
035:
036: /**
037: * Main modeling class responsible for Eclipse Forms-based rule builder widget
038: * rendering
039: *
040: * @author Anton Arhipov
041: * @author Ahti Kitsik
042: *
043: */
044: public class RuleModeller {
045:
046: private Composite ifComposite;
047:
048: private Composite thenComposite;
049:
050: private Composite optionsComposite;
051:
052: private final ScrolledForm form;
053:
054: private final FormToolkit toolkit;
055:
056: private RuleModel model;
057:
058: private boolean dirty;
059:
060: private RuleEditor editor;
061:
062: public boolean isDirty() {
063: return dirty;
064: }
065:
066: public void setDirty(boolean dirty) {
067: this .dirty = dirty;
068: editor.dirtyPropertyChanged();
069: }
070:
071: public RuleModeller(ScrolledForm form, FormToolkit toolkit,
072: RuleModel model, RuleEditor editor) {
073:
074: this .form = form;
075: this .toolkit = toolkit;
076: this .model = model;
077: this .editor = editor;
078:
079: setTitleAndFont(form);
080:
081: ColumnLayout colLayout = new ColumnLayout();
082: colLayout.minNumColumns = 1;
083: colLayout.maxNumColumns = 1;
084:
085: form.getBody().setLayout(colLayout);
086:
087: // addToolBar(toolkit, form);
088:
089: Shell shell = new Shell(Display.getCurrent());
090: Window conditionPopup = new AddNewConditionDialog(shell, this );
091: Window actionPopup = new AddNewActionDialog(shell, this );
092:
093: Window optionsPopup = new RuleAttributesDialog(shell, this );
094:
095: Section ifSection = createMainSection(form, toolkit, "WHEN",
096: conditionPopup);
097: Section thenSection = createMainSection(form, toolkit, "THEN",
098: actionPopup);
099: Section optionsSection = createMainSection(form, toolkit,
100: "(options)", optionsPopup);
101:
102: ColumnLayout layout = new ColumnLayout();
103: layout.minNumColumns = 1;
104: layout.maxNumColumns = 1;
105: // layout.verticalSpacing = 0;
106:
107: ((Composite) (ifSection.getClient())).setLayout(layout);
108: ((Composite) (thenSection.getClient())).setLayout(layout);
109: ((Composite) (optionsSection.getClient())).setLayout(layout);
110: ifSection.setLayout(layout);
111: thenSection.setLayout(layout);
112: optionsSection.setLayout(layout);
113:
114: ifComposite = (Composite) ifSection.getClient();
115: thenComposite = (Composite) thenSection.getClient();
116: optionsComposite = (Composite) optionsSection.getClient();
117:
118: }
119:
120: private void setTitleAndFont(ScrolledForm form) {
121: form.setText("Guided rule editor");
122:
123: Font systemFont = form.getDisplay().getSystemFont();
124: FontData[] exfds = systemFont.getFontData();
125: if (exfds.length > 0) {
126: FontData fd = exfds[0];
127: fd.setHeight(fd.getHeight() + 2);
128: fd.setStyle(SWT.BOLD);
129: Font f = new Font(systemFont.getDevice(), fd);
130: form.setFont(f);
131: }
132: }
133:
134: public SuggestionCompletionEngine getSuggestionCompletionEngine() {
135: return editor.getCompletionEngine();
136: }
137:
138: public RuleModel getModel() {
139: return model;
140: }
141:
142: public void setModel(RuleModel model) {
143: this .model = model;
144: }
145:
146: private void clearComposite(Composite composite) {
147: if (composite != null) {
148: Control[] c = composite.getChildren();
149: for (int i = 0; i < c.length; i++) {
150: Control c2 = c[i];
151: c2.dispose();
152: }
153: }
154: }
155:
156: private void reloadCommon() {
157: toolkit.paintBordersFor(form.getBody());
158: form.redraw();
159: Dialog.applyDialogFont(form.getBody());
160: form.reflow(true);
161: }
162:
163: public void reloadRhs() {
164: clearComposite(thenComposite);
165: redrawRhs();
166: reloadCommon();
167: }
168:
169: public void reloadLhs() {
170: clearComposite(ifComposite);
171: redrawLhs();
172: reloadCommon();
173: }
174:
175: public void reloadOptions() {
176: clearComposite(optionsComposite);
177: redrawOptions();
178: reloadCommon();
179: }
180:
181: public void reloadWidgets() {
182: reloadLhs();
183: reloadRhs();
184: reloadOptions();
185: }
186:
187: private void redrawOptions() {
188: Composite comp = toolkit.createComposite(optionsComposite);
189: new RuleAttributeWidget(toolkit, comp, this );
190: }
191:
192: private void redrawRhs() {
193: for (int i = 0; i < model.rhs.length; i++) {
194: IAction action = model.rhs[i];
195:
196: if (action instanceof ActionSetField) {
197: addActionSetFieldWidget(action, i);
198: } else if (action instanceof ActionInsertFact) {
199: addActionInsertFactWidget(action, i);
200: } else if (action instanceof ActionRetractFact) {
201: addActionRetractFactWidget(action, i);
202: } else if (action instanceof DSLSentence) {
203: addRHSDSLSentenceWidget(i, (DSLSentence) action);
204: }
205:
206: }
207: }
208:
209: private void addActionInsertFactWidget(IAction action, int i) {
210: Composite comp = toolkit.createComposite(thenComposite);
211: new ActionInsertFactWidget(toolkit, comp, this ,
212: (ActionInsertFact) action, i);
213: }
214:
215: private void redrawLhs() {
216: for (int i = 0; i < model.lhs.length; i++) {
217: IPattern pattern = model.lhs[i];
218:
219: if (pattern instanceof FactPattern) {
220: addFactPatternWidget(i, (FactPattern) pattern);
221: }
222: if (pattern instanceof CompositeFactPattern) {
223: addCompositeFactPatternWidget(i,
224: (CompositeFactPattern) pattern);
225: } else if (pattern instanceof DSLSentence) {
226: // skip for now
227: } else {
228: // dont' care
229: }
230: }
231:
232: for (int i = 0; i < model.lhs.length; i++) {
233: IPattern pattern = model.lhs[i];
234: if (pattern instanceof DSLSentence) {
235: addLHSDSLSentenceWidget(i, (DSLSentence) pattern);
236: }
237: }
238: }
239:
240: private void addActionRetractFactWidget(IAction action, int i) {
241: Composite comp = toolkit.createComposite(thenComposite);
242: new ActionRetractFactWidget(toolkit, comp, this ,
243: (ActionRetractFact) action, i);
244: }
245:
246: /*private void addActionAssertFactWidget(IAction action,
247: int i) {
248: Composite comp = toolkit.createComposite( thenComposite );
249: new ActionInsertFactWidget( toolkit,
250: comp,
251: this,
252: (ActionInsertFact) action,
253: i );
254:
255: }*/
256:
257: private void addActionSetFieldWidget(IAction action, int i) {
258: Composite comp = toolkit.createComposite(thenComposite);
259: new ActionSetFieldWidget(toolkit, comp, this , model,
260: (ActionSetField) action, i);
261: }
262:
263: private void addRHSDSLSentenceWidget(int idx, DSLSentence pattern) {
264: Composite comp = toolkit.createComposite(thenComposite);
265: new RHSDSLSentenceWidget(toolkit, comp, pattern, this , idx);
266: }
267:
268: private void addLHSDSLSentenceWidget(int idx, DSLSentence pattern) {
269: Composite comp = toolkit.createComposite(ifComposite);
270: new LHSDSLSentenceWidget(toolkit, comp, pattern, this , idx);
271: }
272:
273: private void addCompositeFactPatternWidget(int idx,
274: CompositeFactPattern pattern) {
275: Composite comp = toolkit.createComposite(ifComposite);
276: new CompositeFactPatternWidget(toolkit, comp, this , pattern,
277: idx);
278: }
279:
280: private void addFactPatternWidget(int idx, FactPattern pattern) {
281: Composite comp = toolkit.createComposite(ifComposite);
282: new FactPatternWidget(toolkit, comp, this , pattern, null, idx,
283: true);
284: }
285:
286: private Section createMainSection(final ScrolledForm form,
287: FormToolkit toolkit, String title, Window popup) {
288: ColumnLayout layout = new ColumnLayout();
289: layout.minNumColumns = 1;
290: layout.maxNumColumns = 1;
291: Section l1Sect = toolkit.createSection(form.getBody(),
292: ExpandableComposite.TWISTIE
293: | ExpandableComposite.TITLE_BAR
294: | ExpandableComposite.EXPANDED);
295: l1Sect.setActiveToggleColor(toolkit.getHyperlinkGroup()
296: .getActiveForeground());
297: l1Sect.setToggleColor(toolkit.getColors().getColor(
298: FormColors.SEPARATOR));
299: l1Sect.setText(title);
300: createAddToolItem(l1Sect, popup);
301: Composite comp = toolkit.createComposite(l1Sect);
302: l1Sect.setClient(comp);
303: return l1Sect;
304: }
305:
306: private void createAddToolItem(Section sect, final Window popup) {
307: ToolBar tbar = new ToolBar(sect, SWT.FLAT | SWT.HORIZONTAL);
308: ToolItem titem = new ToolItem(tbar, SWT.SEPARATOR);
309: titem = new ToolItem(tbar, SWT.PUSH);
310: titem.setImage(PlatformUI.getWorkbench().getSharedImages()
311: .getImage(ISharedImages.IMG_TOOL_NEW_WIZARD));
312:
313: titem.addListener(SWT.Selection, new Listener() {
314: public void handleEvent(Event event) {
315: popup.open();
316: }
317: });
318: sect.setTextClient(tbar);
319: }
320:
321: public void refresh() {
322: ifComposite.layout();
323: ifComposite.redraw();
324:
325: thenComposite.layout();
326: thenComposite.redraw();
327:
328: optionsComposite.layout();
329: optionsComposite.redraw();
330: }
331:
332: }
|