001: package org.drools.eclipse.rulebuilder.ui;
002:
003: import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
004: import org.drools.brms.client.modeldriven.brl.ActionFieldValue;
005: import org.drools.brms.client.modeldriven.brl.ActionSetField;
006: import org.drools.brms.client.modeldriven.brl.ActionUpdateField;
007: import org.drools.brms.client.modeldriven.brl.FactPattern;
008: import org.drools.brms.client.modeldriven.brl.RuleModel;
009: import org.drools.eclipse.rulebuilder.modeldriven.HumanReadable;
010: import org.eclipse.swt.SWT;
011: import org.eclipse.swt.events.ModifyEvent;
012: import org.eclipse.swt.events.ModifyListener;
013: import org.eclipse.swt.layout.GridData;
014: import org.eclipse.swt.layout.GridLayout;
015: import org.eclipse.swt.widgets.Composite;
016: import org.eclipse.swt.widgets.Display;
017: import org.eclipse.swt.widgets.MessageBox;
018: import org.eclipse.swt.widgets.Text;
019: import org.eclipse.ui.forms.events.HyperlinkEvent;
020: import org.eclipse.ui.forms.events.IHyperlinkListener;
021: import org.eclipse.ui.forms.widgets.FormToolkit;
022: import org.eclipse.ui.forms.widgets.ImageHyperlink;
023:
024: /**
025: * @author Anton Arhipov
026: * @author Ahti Kitsik
027: *
028: */
029: public class ActionSetFieldWidget extends Widget {
030:
031: private ActionSetField set;
032:
033: final private String[] fieldCompletions;
034:
035: private boolean isBoundFact = false;
036:
037: private String variableClass;
038:
039: public ActionSetFieldWidget(FormToolkit toolkit, Composite parent,
040: RuleModeller mod, RuleModel rule, ActionSetField set,
041: int index) {
042:
043: super (parent, toolkit, mod, index);
044:
045: this .set = set;
046:
047: if (getCompletion().isGlobalVariable(set.variable)) {
048: this .fieldCompletions = getCompletion()
049: .getFieldCompletionsForGlobalVariable(set.variable);
050: this .variableClass = (String) getCompletion().globalTypes
051: .get(set.variable);
052: } else {
053: FactPattern pattern = rule.getBoundFact(set.variable);
054: this .fieldCompletions = getCompletion()
055: .getFieldCompletions(pattern.factType);
056: this .isBoundFact = true;
057: this .variableClass = pattern.factType;
058: }
059:
060: GridLayout l = new GridLayout();
061: l.numColumns = 6;
062: l.marginBottom = 0;
063: l.marginHeight = 0;
064: l.marginLeft = 0;
065: l.marginRight = 0;
066: l.marginTop = 0;
067: l.marginWidth = 0;
068: l.verticalSpacing = 0;
069: parent.setLayout(l);
070:
071: create();
072:
073: }
074:
075: private void create() {
076: String modifyType = "set";
077: if (this .set instanceof ActionUpdateField) {
078: modifyType = "modify";
079: }
080:
081: toolkit.createLabel(parent, HumanReadable
082: .getActionDisplayName(modifyType)
083: + " [" + this .set.variable + "]");
084: addDeleteRHSAction();
085: addMoreOptionsAction();
086: addRows();
087: }
088:
089: private void addRows() {
090: Composite constraintComposite = toolkit.createComposite(parent);
091: GridLayout constraintLayout = new GridLayout();
092: constraintLayout.numColumns = 3;
093: constraintComposite.setLayout(constraintLayout);
094:
095: for (int i = 0; i < set.fieldValues.length; i++) {
096: ActionFieldValue val = set.fieldValues[i];
097: toolkit.createLabel(constraintComposite, val.field);
098: valueEditor(constraintComposite, val);
099: addRemoveFieldAction(constraintComposite, i);
100: }
101:
102: toolkit.paintBordersFor(constraintComposite);
103: }
104:
105: private void addMoreOptionsAction() {
106: // ImageHyperlink link = addImage(parent,
107: // "icons/add_field_to_fact.gif");
108: ImageHyperlink link = addImage(parent, "icons/new_item.gif");
109:
110: link.addHyperlinkListener(new IHyperlinkListener() {
111: public void linkActivated(HyperlinkEvent e) {
112: RuleDialog popup = new ActionSetFieldDialog(parent
113: .getShell(), getModeller(), set,
114: fieldCompletions, variableClass);
115: popup.open();
116:
117: }
118:
119: public void linkEntered(HyperlinkEvent e) {
120: }
121:
122: public void linkExited(HyperlinkEvent e) {
123: }
124: });
125: link.setToolTipText("Add a field");
126: }
127:
128: private void addRemoveFieldAction(Composite constraintComposite,
129: final int currentRow) {
130: ImageHyperlink delLink = addImage(constraintComposite,
131: "icons/delete_item_small.gif");
132: delLink.setToolTipText("Remove this field action");
133: delLink.addHyperlinkListener(new IHyperlinkListener() {
134: public void linkActivated(HyperlinkEvent e) {
135: MessageBox dialog = new MessageBox(Display.getCurrent()
136: .getActiveShell(), SWT.YES | SWT.NO
137: | SWT.ICON_WARNING);
138: dialog.setMessage("Remove this item?");
139: dialog.setText("Remove this item?");
140: if (dialog.open() == SWT.YES) {
141: set.removeField(currentRow);
142: getModeller().setDirty(true);
143: getModeller().reloadRhs();
144: }
145: }
146:
147: public void linkEntered(HyperlinkEvent e) {
148: }
149:
150: public void linkExited(HyperlinkEvent e) {
151: }
152: });
153: }
154:
155: private void valueEditor(Composite parent,
156: final ActionFieldValue val) {
157: final Text box = toolkit.createText(parent, "");
158:
159: if (val.value != null) {
160: box.setText(val.value);
161: }
162:
163: GridData gd = new GridData(GridData.FILL_HORIZONTAL);
164: gd.grabExcessHorizontalSpace = true;
165: gd.minimumWidth = 100;
166: box.setLayoutData(gd);
167:
168: box.addModifyListener(new ModifyListener() {
169: public void modifyText(ModifyEvent e) {
170: val.value = box.getText();
171: getModeller().setDirty(true);
172: }
173: });
174:
175: if (val.type.equals(SuggestionCompletionEngine.TYPE_NUMERIC)) {
176: new NumericKeyFilter(box);
177: }
178:
179: }
180:
181: private SuggestionCompletionEngine getCompletion() {
182: return getModeller().getSuggestionCompletionEngine();
183: }
184:
185: }
|