001: package org.drools.eclipse.rulebuilder.ui;
002:
003: import java.util.List;
004:
005: import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
006: import org.drools.brms.client.modeldriven.brl.ISingleFieldConstraint;
007: import org.drools.eclipse.DroolsEclipsePlugin;
008: import org.eclipse.jface.resource.ImageDescriptor;
009: import org.eclipse.swt.SWT;
010: import org.eclipse.swt.events.KeyEvent;
011: import org.eclipse.swt.events.KeyListener;
012: import org.eclipse.swt.events.ModifyEvent;
013: import org.eclipse.swt.events.ModifyListener;
014: import org.eclipse.swt.layout.GridData;
015: import org.eclipse.swt.widgets.Combo;
016: import org.eclipse.swt.widgets.Composite;
017: import org.eclipse.swt.widgets.Text;
018: import org.eclipse.ui.forms.events.HyperlinkEvent;
019: import org.eclipse.ui.forms.events.IHyperlinkListener;
020: import org.eclipse.ui.forms.widgets.FormToolkit;
021: import org.eclipse.ui.forms.widgets.ImageHyperlink;
022:
023: public class ConstraintValueEditor {
024:
025: private Composite composite;
026:
027: private ISingleFieldConstraint constraint;
028:
029: private FormToolkit toolkit;
030:
031: private RuleModeller modeller;
032:
033: private boolean numericValue;
034:
035: public ConstraintValueEditor(Composite composite,
036: ISingleFieldConstraint constraint, FormToolkit toolkit,
037: RuleModeller modeller, String numericType /*e.g. is "Numeric"*/) {
038: this .composite = composite;
039: this .constraint = constraint;
040: this .toolkit = toolkit;
041: this .modeller = modeller;
042:
043: if (numericType.equals(SuggestionCompletionEngine.TYPE_NUMERIC)) {
044: this .numericValue = true;
045: }
046: create();
047: }
048:
049: private void create() {
050: if (constraint.constraintValueType == ISingleFieldConstraint.TYPE_UNDEFINED) {
051: ImageHyperlink link = addImage(composite, "icons/edit.gif");
052: link.setToolTipText("Choose value editor type");
053: link.addHyperlinkListener(new IHyperlinkListener() {
054: public void linkActivated(HyperlinkEvent e) {
055: RuleDialog popup = new ValueEditorTypeSelectionDialog(
056: composite.getShell(), toolkit, modeller,
057: constraint);
058: popup.open();
059: }
060:
061: public void linkEntered(HyperlinkEvent e) {
062: }
063:
064: public void linkExited(HyperlinkEvent e) {
065: }
066: });
067:
068: GridData gd = new GridData(GridData.FILL_HORIZONTAL
069: | GridData.GRAB_HORIZONTAL
070: | GridData.HORIZONTAL_ALIGN_BEGINNING);
071: gd.horizontalSpan = 2;
072:
073: link.setLayoutData(gd);
074: } else {
075: switch (constraint.constraintValueType) {
076: case ISingleFieldConstraint.TYPE_LITERAL:
077: literalValueEditor(composite, constraint, new GridData(
078: GridData.FILL_HORIZONTAL));
079: break;
080: case ISingleFieldConstraint.TYPE_RET_VALUE:
081: addImage(composite, "icons/function_assets.gif");
082: formulaValueEditor(composite, constraint, new GridData(
083: GridData.FILL_HORIZONTAL));
084: break;
085: case ISingleFieldConstraint.TYPE_VARIABLE:
086: variableEditor(composite, constraint, new GridData(
087: GridData.FILL_HORIZONTAL));
088: break;
089: default:
090: break;
091: }
092: }
093:
094: }
095:
096: private void literalValueEditor(Composite parent,
097: final ISingleFieldConstraint c, GridData gd) {
098: final Text box = toolkit.createText(parent, "");
099:
100: if (c.value != null) {
101: box.setText(c.value);
102: }
103:
104: gd.horizontalSpan = 2;
105: gd.grabExcessHorizontalSpace = true;
106: gd.minimumWidth = 100;
107: box.setLayoutData(gd);
108:
109: box.addModifyListener(new ModifyListener() {
110: public void modifyText(ModifyEvent e) {
111: c.value = box.getText();
112: modeller.setDirty(true);
113: }
114: });
115:
116: if (this .numericValue) {
117: box.addKeyListener(new KeyListener() {
118:
119: public void keyPressed(KeyEvent e) {
120: if (Character.isLetter(e.character)) {
121: e.doit = false;
122: }
123: }
124:
125: public void keyReleased(KeyEvent e) {
126:
127: }
128:
129: });
130: }
131: }
132:
133: private void formulaValueEditor(Composite parent,
134: final ISingleFieldConstraint c, GridData gd) {
135:
136: final Text box = toolkit.createText(parent, "");
137:
138: if (c.value != null) {
139: box.setText(c.value);
140: }
141:
142: gd.grabExcessHorizontalSpace = true;
143: gd.minimumWidth = 100;
144: box.setLayoutData(gd);
145:
146: box.addModifyListener(new ModifyListener() {
147: public void modifyText(ModifyEvent e) {
148: c.value = box.getText();
149: modeller.setDirty(true);
150: }
151: });
152: }
153:
154: private void variableEditor(Composite composite,
155: final ISingleFieldConstraint c, GridData gd) {
156: List vars = modeller.getModel().getBoundVariablesInScope(c);
157:
158: final Combo combo = new Combo(composite, SWT.READ_ONLY);
159:
160: gd.horizontalSpan = 2;
161: combo.setLayoutData(gd);
162: if (c.value == null) {
163: combo.add("Choose ...");
164: }
165:
166: int idx = 0;
167:
168: for (int i = 0; i < vars.size(); i++) {
169: String var = (String) vars.get(i);
170:
171: if (c.value != null && c.value.equals(var)) {
172: idx = i;
173: }
174: combo.add(var);
175: }
176:
177: combo.select(idx);
178:
179: combo.addModifyListener(new ModifyListener() {
180: public void modifyText(ModifyEvent e) {
181: c.value = combo.getText();
182: }
183: });
184:
185: }
186:
187: public ImageHyperlink addImage(Composite parent, String fileName) {
188: ImageHyperlink imageHyperlink = toolkit.createImageHyperlink(
189: parent, 0);
190: ImageDescriptor imageDescriptor = DroolsEclipsePlugin
191: .getImageDescriptor(fileName);
192: imageHyperlink.setImage(imageDescriptor.createImage());
193: return imageHyperlink;
194: }
195:
196: }
|