[jboss-svn-commits] JBL Code SVN: r25432 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/guided and 5 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Feb 26 06:26:41 EST 2009


Author: ahtik
Date: 2009-02-26 06:26:41 -0500 (Thu, 26 Feb 2009)
New Revision: 25432

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/guided/
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/guided/ConstraintValueEditorHelper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/rulebuilder/ui/ModelWidget.java
Removed:
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ConstraintValueEditorHelper.java
Modified:
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/rulebuilder/editors/RuleEditor.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/rulebuilder/ui/DSLSentenceWidget.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/rulebuilder/ui/RHSDSLSentenceWidget.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/rulebuilder/ui/RuleModeller.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/decisiontable/GuidedDecisionTableWidget.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ConstraintValueEditor.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/DSLSentenceWidget.java
   labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/client/modeldriven/ui/ConstraintValueEditorTest.java
Log:
#JBRULES:1983
 * Eclipse guided editor: Add support for dates/drop downs/regex validation in DSL sentences
 * Initial primitive start for extracting guided editor common parts from guvnor and eclipse (moved ConstraintValueEditorHelper to core)

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/guided/ConstraintValueEditorHelper.java (from rev 25334, labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ConstraintValueEditorHelper.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/guided/ConstraintValueEditorHelper.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/guided/ConstraintValueEditorHelper.java	2009-02-26 11:26:41 UTC (rev 25432)
@@ -0,0 +1,20 @@
+package org.drools.guided;
+
+public class ConstraintValueEditorHelper {
+
+    /**
+     * 'Person.age' : ['M=Male', 'F=Female']
+     *
+     * This will split the drop down item into a value and a key.
+     * eg key=value
+     *
+     */
+    public static String[] splitValue(String v) {
+        String[] s = new String[2];
+        int pos = v.indexOf( '=' );
+        s[0] = v.substring( 0, pos );
+        s[1] = v.substring( pos + 1, v.length() );
+        return s;
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/rulebuilder/editors/RuleEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/rulebuilder/editors/RuleEditor.java	2009-02-26 11:15:58 UTC (rev 25431)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/rulebuilder/editors/RuleEditor.java	2009-02-26 11:26:41 UTC (rev 25432)
@@ -8,6 +8,7 @@
 import java.io.StringReader;
 import java.io.StringWriter;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import org.drools.compiler.DrlParser;
@@ -194,15 +195,16 @@
             // Load all .dsl files from current dir
             IPath p = (packageEditorInput).getFile().getFullPath().removeLastSegments( 1 );
 
-            Container folder = (Container) ResourcesPlugin.getWorkspace().getRoot().findMember( p,
-                                                                                                false );
+            Container folder = (Container) ResourcesPlugin.getWorkspace().getRoot().findMember( p,                                                                                                false );
 
             IResource[] files = folder.members( false );
 
             List dslList = new ArrayList();
+            List enumList = new ArrayList();
 
             for ( int i = 0; i < files.length; i++ ) {
-                if ( files[i].getName().endsWith( ".dsl" ) ) {
+                String fn = files[i].getName();
+                if ( fn.endsWith( ".dsl" ) ) {
                     String contents = getFileContents( (IFile) files[i] );
                     DSLTokenizedMappingFile dsl = new DSLTokenizedMappingFile();
 
@@ -211,15 +213,20 @@
                     } else {
                         //TODO report dsl parse error
                     }
+                } else if ( fn.endsWith( ".enum" ) ) {
+                    String contents = getFileContents( (IFile) files[i] );
+                    enumList.add(contents);
                 }
+                
             }
 
             // Load suggestion engine
             String str = getFileContents( packageEditorInput.getFile() );
 
             completion = loader.getSuggestionEngine( str,
+                                                     Collections.EMPTY_LIST,
                                                      dslList,
-                                                     dslList );
+                                                     enumList);
 
         } catch ( Exception e ) {
             DroolsEclipsePlugin.log( e );

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/rulebuilder/ui/DSLSentenceWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/rulebuilder/ui/DSLSentenceWidget.java	2009-02-26 11:15:58 UTC (rev 25431)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/rulebuilder/ui/DSLSentenceWidget.java	2009-02-26 11:26:41 UTC (rev 25432)
@@ -1,26 +1,42 @@
 package org.drools.eclipse.rulebuilder.ui;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
 
+import org.drools.guided.ConstraintValueEditorHelper;
+import org.drools.guvnor.client.modeldriven.SuggestionCompletionEngine;
 import org.drools.guvnor.client.modeldriven.brl.DSLSentence;
+import org.drools.util.DateUtils;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.FillLayout;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.RowLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.DateTime;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.MessageBox;
+import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Text;
 import org.eclipse.ui.forms.events.HyperlinkEvent;
 import org.eclipse.ui.forms.events.IHyperlinkListener;
 import org.eclipse.ui.forms.widgets.FormToolkit;
 import org.eclipse.ui.forms.widgets.ImageHyperlink;
 
+
 /**
  * This displays a widget to edit a DSL sentence.
  * 
@@ -29,10 +45,18 @@
  */
 public abstract class DSLSentenceWidget extends Widget {
 
+    private static final String        ENUM_TAG    = "ENUM";
+    private static final String        DATE_TAG    = "DATE";
+    private static final String        BOOLEAN_TAG = "BOOLEAN";
+
+    private static final String ITEM_ = "ITEM_";
+
     private final DSLSentence sentence;
+    
+    protected SuggestionCompletionEngine completions;
+    
+    private List<ModelWidget>              widgets = new ArrayList<ModelWidget>();
 
-    private List              widgets = new ArrayList();
-
     public DSLSentenceWidget(FormToolkit toolkit,
                              Composite parent,
                              DSLSentence sentence,
@@ -44,14 +68,17 @@
                index );
 
         this.sentence = sentence;
-
-        makeWidget();
-        addDeleteAction();
+        completions = modeller.getSuggestionCompletionEngine();
+        
+        Composite lastRow = makeWidgets( this.sentence.sentence );
+        addDeleteAction(lastRow);
+        toolkit.paintBordersFor( parent);
     }
 
+    
     protected abstract void updateModel();
 
-    private void addDeleteAction() {
+    private void addDeleteAction(Composite parent) {
 
         ImageHyperlink delLink = addImage( parent,
                                            "icons/delete_item_small.gif" );
@@ -76,99 +103,610 @@
         delLink.setToolTipText( "Remove this condition." );
     }
 
-    private void makeWidget() {
 
-        int elems = 0;
+    /**
+     * This will take a DSL line item, and split it into widget thingamies for
+     * displaying. One day, if this is too complex, this will have to be done on
+     * the server side.
+     * @return 
+     */
+    public Composite makeWidgets(String dslLine) {
+        
+        List<ModelWidget> lineWidgets = new ArrayList<ModelWidget>();
+        
+        int startVariable = dslLine.indexOf( "{" );
 
-        char[] chars = this.sentence.sentence.toCharArray();
-        Text currentBox = null;
-        Label currentLabel = null;
-        for ( int i = 0; i < chars.length; i++ ) {
-            char c = chars[i];
-            if ( c == '{' ) {
-                currentLabel = null;
+        boolean firstOneIsBracket = (dslLine.indexOf( "{" ) == 0);
 
-                currentBox = toolkit.createText( parent,
-                                                 "" );
+        String startLabel = "";
+        if ( startVariable > 0 ) {
+            startLabel = dslLine.substring( 0,
+                                            startVariable );
+        } else if ( !firstOneIsBracket ) {
+            // There are no curly brackets in the text.
+            // Just print it
+            startLabel = dslLine;
+        }
 
-                //final Text thisBox = currentBox;
-                elems++;
+        parent.setLayout( new GridLayout(1, true) );
+        
+        Composite row = toolkit.createComposite( parent);
+        RowLayout rl = new RowLayout();
+        rl.marginBottom=0;
+        rl.marginHeight=0;
+        rl.marginLeft=0;
+        rl.marginRight=0;
+        rl.pack=true;
+        rl.spacing=0;
+        rl.center=true;
+        //rl.fill=true;
+        
+        row.setLayout( rl );
+        
+        lineWidgets.add( new LabelWidget( row, startLabel ));
+        
+        while ( startVariable > 0 || firstOneIsBracket ) {
+            firstOneIsBracket = false;
 
-                GridData gd = new GridData( GridData.FILL_HORIZONTAL );
-                gd.grabExcessHorizontalSpace = true;
-                gd.minimumWidth = 100;
-                currentBox.setLayoutData( gd );
-                
-                widgets.add( currentBox );
+            int endVariable = dslLine.indexOf( "}",
+                                               startVariable );
+            String currVariable = dslLine.substring( startVariable + 1,
+                                                     endVariable );
 
-            } else if ( c == '}' ) {
-                currentBox = null;
+            lineWidgets.add( addVariable(row, currVariable));    
+
+            // Parse out the next label between variables
+            startVariable = dslLine.indexOf( "{",
+                                             endVariable );
+            String lbl;
+            if ( startVariable > 0 ) {
+                lbl = dslLine.substring( endVariable + 1,
+                                         startVariable );
             } else {
-                if ( currentBox == null && currentLabel == null ) {
-                    currentLabel = toolkit.createLabel( parent,
-                                                        "" );
-                    elems++;
+                lbl = dslLine.substring( endVariable + 1,
+                                         dslLine.length() );
+            }
 
-                    widgets.add( currentLabel );
+            if ( lbl.indexOf( "\\n" ) > -1 ) {
+                String[] lines = lbl.split( "\\\\n" );
+                for ( int i = 0; i < lines.length; i++ ) {
+                    row = toolkit.createComposite( parent );
+                    row.setLayout( rl );
+                    lineWidgets.add( new DSLSentenceWidget.NewLine(row) );
+                    lineWidgets.add( new LabelWidget(row, lines[i] ) );                    
                 }
-                if ( currentLabel != null ) {
-                    currentLabel.setText( currentLabel.getText() + c );
-                } else if ( currentBox != null ) {
-                    currentBox.setText( currentBox.getText() + c );
+            } else {
+                lineWidgets.add( new LabelWidget(row, lbl));                
+            }
+
+        }
+
+        for ( ModelWidget widg : lineWidgets ) {
+            widgets.add( widg );
+        }
+        
+        updateSentence();
+        return row;
+    }
+
+
+    public ModelWidget addVariable(Composite parent, String currVariable) {
+
+        // Formats are: <varName>:ENUM:<Field.type>
+        // <varName>:DATE:<dateFormat>
+        // <varName>:BOOLEAN:[checked | unchecked] <-initial value
+
+        int colonIndex = currVariable.indexOf( ":" );
+        if ( colonIndex > 0 ) {
+
+            String definition = currVariable.substring( colonIndex + 1,
+                                                        currVariable.length() );
+
+            int secondColonIndex = definition.indexOf( ":" );
+            if ( secondColonIndex > 0 ) {
+
+                String type = currVariable.substring( colonIndex + 1,
+                                                      colonIndex + secondColonIndex + 1 );
+                if ( type.equalsIgnoreCase( ENUM_TAG ) ) {
+                    return addEnumDropdown( parent, currVariable );
+                } else if ( type.equalsIgnoreCase( DATE_TAG ) ) {
+                    return addDateSelector( parent, currVariable );
+                } else if ( type.equalsIgnoreCase( BOOLEAN_TAG ) ) {
+                    return addCheckbox( parent, currVariable );
                 }
+            } else {
+                String regex = currVariable.substring( colonIndex + 1,
+                                                       currVariable.length() );
+                return addBox( parent, currVariable,
+                                 regex );
             }
         }
 
-        GridLayout l = new GridLayout();
-        int cols = elems + 1;
-        l.numColumns = cols;
-        l.verticalSpacing = 0;
-        l.marginTop = 0;
-        l.marginHeight = 2;
-        l.marginBottom = 0;
-        parent.setLayout( l );
+        return addBox( parent, currVariable, "" );        
 
-        // Attach listeners
-        Iterator widgetiter = widgets.iterator();
-        while ( widgetiter.hasNext() ) {
-            Object o = (Object) widgetiter.next();
-            if (o instanceof Text) {
-                ((Text)o).addModifyListener( new ModifyListener() {
-                    public void modifyText(ModifyEvent e) {
+    }
+        
+    public ModelWidget addBox(Composite parent, String variableDef,
+                         String regex) {
+
+        int colonIndex = variableDef.indexOf( ":" );
+        if ( colonIndex > 0 ) {
+            variableDef = variableDef.substring( 0,
+                                                 colonIndex );
+        }
+        FieldEditor currentBox = new FieldEditor(parent);
+        currentBox.setVisibleLength( variableDef.length() + 1 );
+        currentBox.setText( variableDef );
+        currentBox.setRestriction( regex );
+        return currentBox;
+
+    }
+
+
+    public ModelWidget addCheckbox(Composite parent, String variableDef) {
+        return new DSLCheckBox( parent, variableDef );
+    }
+
+    
+    public ModelWidget addDateSelector(Composite parent, String variableDef) {
+        return new DSLDateSelector( parent, variableDef );       
+    }
+
+
+    private ModelWidget addEnumDropdown(Composite parent, String variableDef) {
+        return new DSLDropDown( parent, variableDef );
+    }
+
+
+    protected void updateSentence() {
+        String newSentence = "";
+        for ( Iterator iter = widgets.iterator(); iter.hasNext(); ) {
+            ModelWidget wid = (ModelWidget) iter.next();
+            if ( wid instanceof LabelWidget) {
+                newSentence = newSentence + ((LabelWidget) wid).getText();
+            } else if ( wid instanceof FieldEditor ) {
+                FieldEditor editor = (FieldEditor) wid;
+
+                String varString = editor.getText();
+                String restriction = editor.getRestriction();
+                if ( !restriction.equals( "" ) ) {
+                    varString = varString + ":" + restriction;
+                }
+
+                newSentence = newSentence + " {" + varString + "} ";
+            } else if ( wid instanceof DSLDropDown ) {
+
+                // Add the meta-data back to the field so that is shows up as a
+                // dropdown when refreshed from repo
+                DSLDropDown drop = (DSLDropDown) wid;
+                Combo box = (Combo) drop.getControl();
+                String type = drop.getType();
+                String factAndField = drop.getFactAndField();
+
+                String key = ITEM_+(box.getSelectionIndex()+1);
+                
+                Object keyval = box.getData(key );
+                
+                newSentence = newSentence + "{" + keyval + ":" + type + ":" + factAndField + "} ";
+            } else if ( wid instanceof DSLCheckBox ) {
+
+                DSLCheckBox check = (DSLCheckBox) wid;
+                String checkValue = check.getCheckedValue();
+                newSentence = newSentence + "{" + checkValue + ":" + check.getType() + ":" + checkValue + "} ";
+            } else if ( wid instanceof DSLDateSelector ) {
+                DSLDateSelector dateSel = (DSLDateSelector) wid;
+                String dateString = dateSel.getDateString();
+                String format = dateSel.getJavascriptFormat();
+                newSentence = newSentence + "{" + dateString + ":" + dateSel.getType() + ":" + format + "} ";
+            } else if ( wid instanceof NewLine ) {
+                newSentence = newSentence + "\\n";
+            }
+
+        }
+        this.sentence.sentence = newSentence.trim();
+    }
+    
+    class LabelWidget implements ModelWidget {
+        
+        private Label control;
+        private String val;
+        
+        public LabelWidget(Composite parent, String text) {
+            val = text;        
+            control = toolkit.createLabel( parent, text);
+        }
+        
+        public Control getControl() {
+            return control;
+        }
+        
+        public String getText() {
+            return val;
+        }
+        
+    }
+    
+    class NewLine implements ModelWidget {
+        
+        private Composite control;
+
+        public NewLine(Composite parent) {
+            control = toolkit.createComposite( parent );
+        }
+
+        public Control getControl() {
+            return control;
+        }
+    }
+    
+    class FieldEditor implements ModelWidget {
+
+        private Text         control;
+
+        private String          oldValue  = "";
+        private String          regex     = "";
+
+
+        public FieldEditor(Composite parent) {
+                        
+            control = toolkit.createText( parent, "" );
+            // box.setStyleName( "dsl-field-TextBox" );
+
+            control.addModifyListener( new ModifyListener() {
+                public void modifyText(ModifyEvent e) {
+                    Text otherBox = control;
+
+                    if ( !regex.equals( "" ) && !otherBox.getText().matches( regex ) ) {
+                        System.err.println("VALUE IS NOT VALID: "+otherBox.getText());
+                        control.setText( oldValue );
+                    } else {
+                        oldValue = otherBox.getText();
                         updateSentence();
-                        /*                        Point p = thisBox.getSize();
-                         
-                         GC gc = new GC(thisBox);
-                         gc.setFont(thisBox.getFont());
-                         FontMetrics fontMetrics = gc.getFontMetrics();
-                         int w = fontMetrics.getAverageCharWidth()*thisBox.getText().length();
-                         gc.dispose();
-                         
-                         
-                         thisBox.setSize( w, p.y );
-                         thisBox.redraw();
-                         parent.redraw();
-                         */
                         getModeller().setDirty( true );
                     }
-                } );
+                }
+            } );
+
+        }
+
+        public void setText(String t) {
+            control.setText( t );
+        }
+
+        public void setVisibleLength(int l) {
+            //box.set
+            //TODO Implement!
+        }
+
+        public Control getControl() {
+            return control;
+        }
+        
+        public String getText() {
+            return control.getText();
+        }
+
+        public void setRestriction(String regex) {
+            this.regex = regex;
+        }
+
+        public String getRestriction() {
+            return this.regex;
+        }
+
+        public boolean isValid() {
+            boolean result = true;
+            if ( !regex.equals( "" ) ) result = this.control.getText().matches( this.regex );
+
+            return result;
+        }
+    }
+
+    class DSLDropDown implements ModelWidget {
+
+        Combo        resultWidget = null;
+        // Format for the dropdown def is <varName>:<type>:<Fact.field>
+        private String varName      = "";
+        private String type         = "";
+        private String factAndField = "";
+
+        public DSLDropDown(Composite parent, String variableDef) {
+            Composite comp = toolkit.createComposite( parent );
+            
+            comp.setLayout( new FillLayout() );
+            
+            int firstIndex = variableDef.indexOf( ":" );
+            int lastIndex = variableDef.lastIndexOf( ":" );
+            varName = variableDef.substring( 0,
+                                             firstIndex );
+            type = variableDef.substring( firstIndex + 1,
+                                          lastIndex );
+            factAndField = variableDef.substring( lastIndex + 1,
+                                                  variableDef.length() );
+
+            int dotIndex = factAndField.indexOf( "." );
+            String type = factAndField.substring( 0,
+                                                  dotIndex );
+            String field = factAndField.substring( dotIndex + 1,
+                                                   factAndField.length() );
+
+            String[] data = completions.getEnumValues( type,
+                                                       field );
+            
+            Combo list = new Combo(comp,SWT.DROP_DOWN|SWT.READ_ONLY);
+            
+            if ( data != null ) {
                 
+                int selected = 0; // Select first item for now by default. Null values are not allowed.
+                
+                for ( int i = 0; i < data.length; i++ ) {
+                    String realValue = data[i];
+                    String display = data[i];
+                    if ( data[i].indexOf( '=' ) > -1 ) {
+                        String[] vs = ConstraintValueEditorHelper.splitValue( data[i] );
+                        realValue = vs[0];
+                        display = vs[1];
+                    }
+                    if ( varName.equals( realValue ) ) {
+                        selected = i;
+                    }
+                    
+                    list.add( display);
+                    
+                    String key = ITEM_+list.getItemCount();
+                    list.setData(key, realValue);
+                    
+                }
+                if ( selected >= 0 ) list.select( selected );
             }
+            
+            list.addModifyListener(new ModifyListener() {
+                
+                public void modifyText(ModifyEvent e) {
+                    updateSentence();
+                    getModeller().setDirty( true );
+                }
+                
+            });
+
+            resultWidget = list;
+            comp.layout();
         }
-        toolkit.paintBordersFor( parent );
+
+        public Control getControl() {
+            return resultWidget;
+        }
+
+        public String getType() {
+            return type;
+        }
+
+        public void setType(String type) {
+            this.type = type;
+        }
+
+        public String getFactAndField() {
+            return factAndField;
+        }
+
+        public void setFactAndField(String factAndField) {
+            this.factAndField = factAndField;
+        }
     }
 
-    protected void updateSentence() {
-        String newSentence = "";
-        for ( Iterator iter = widgets.iterator(); iter.hasNext(); ) {
-            Control wid = (Control) iter.next();
-            if ( wid instanceof Label ) {
-                newSentence = newSentence + ((Label) wid).getText();
-            } else if ( wid instanceof Text ) {
-                newSentence = newSentence + "{" + ((Text) wid).getText() + "}";
+    class DSLCheckBox implements ModelWidget {
+        Combo        resultWidget = null;
+        // Format for the dropdown def is <varName>:<type>:<Fact.field>
+        private String varName      = "";
+        private Composite control;
+
+        public DSLCheckBox(Composite parent, String variableDef) {
+            
+            control = toolkit.createComposite( parent );
+            control.setLayout( new RowLayout() );
+            
+            int firstIndex = variableDef.indexOf( ":" );
+            int lastIndex = variableDef.lastIndexOf( ":" );
+            varName = variableDef.substring( 0,
+                                             firstIndex );
+            String checkedUnchecked = variableDef.substring( lastIndex + 1,
+                                                             variableDef.length() );
+
+            resultWidget = new Combo(control, SWT.READ_ONLY);
+            resultWidget.add( "true" );
+            resultWidget.add( "false" );
+
+            if ( checkedUnchecked.equalsIgnoreCase( "checked" ) ) {
+                resultWidget.select( 0 );
+            } else {
+                resultWidget.select( 1 );
             }
+
+            resultWidget.addModifyListener(new ModifyListener() {
+
+                public void modifyText(ModifyEvent e) {
+                    updateSentence();
+                    modeller.setDirty( true );
+                }
+                
+            });
+            
+            resultWidget.setVisible( true );
+           control.layout();
+            
         }
-        this.sentence.sentence = newSentence;
+                
+        public Control getControl() {
+            return control;
+        }
+        
+        public Combo getListBox() {
+            return resultWidget;
+        }
+
+        public void setListBox(Combo resultWidget) {
+            this.resultWidget = resultWidget;
+        }
+
+        public String getType() {
+            return BOOLEAN_TAG;
+        }
+
+        public String getVarName() {
+            return varName;
+        }
+
+        public void setVarName(String varName) {
+            this.varName = varName;
+        }
+
+        public String getCheckedValue() {
+            return this.resultWidget.getSelectionIndex() == 0?"checked":"checked";
+
+        }
     }
 
+    class DSLDateSelector implements ModelWidget {
+        
+        //DateTime              resultWidget            = null;
+        
+        // Format for the dropdown def is <varName>:<type>:<Fact.field>
+        private String         varName                 = "";
+        private String         javascriptFormat        = "";
+        private final String   defaultJavascriptFormat = "d-M-y";
+        private final String   javaFormat              = DateUtils.getDateFormatMask();
+        private SimpleDateFormat formatter               = null;
+        private Composite control;
+        private Text field;
+        
+        public DSLDateSelector(final Composite parent, String variableDef) {
+            
+            control = toolkit.createComposite( parent );
+            control.setLayout( new RowLayout() );
+            
+            
+            
+            int firstIndex = variableDef.indexOf( ":" );
+            int lastIndex = variableDef.lastIndexOf( ":" );
+            varName = variableDef.substring( 0,
+                                             firstIndex );
+            javascriptFormat = variableDef.substring( lastIndex + 1,
+                                                      variableDef.length() );
+
+            // Resolve the javascript format
+            if ( javascriptFormat.equals( "" ) || javascriptFormat.equals( "default" ) ) {
+                javascriptFormat = defaultJavascriptFormat;
+            }
+
+            // Set the java format for formatter
+            formatter = new SimpleDateFormat( javaFormat );
+
+            Date origDate = new Date();
+            if ( !varName.equals( "" ) ) {
+                try {
+                    origDate = formatter.parse( varName );
+                } catch ( Exception e ) {
+                    e.printStackTrace();
+                }
+            }
+
+            field = toolkit.createText( control, "" );            
+            final Button open = new Button (control, SWT.ARROW | SWT.DOWN);
+            //open.setText ("Set");
+
+            if ( origDate != null ) field.setText( formatter.format(origDate));
+
+            field.addModifyListener( new ModifyListener() {
+                public void modifyText(ModifyEvent e) {
+                    updateSentence();
+                    modeller.setDirty( true );                    
+                }
+            } );
+            
+            open.addSelectionListener (new SelectionAdapter () {
+                public void widgetSelected (SelectionEvent e) {
+                    final Shell dialog = new Shell (open.getShell(), SWT.DIALOG_TRIM|SWT.APPLICATION_MODAL);
+                    dialog.setText( "Set date:" );
+                    dialog.setLayout (new GridLayout (1, false));
+                    final DateTime calendar = new DateTime (dialog, SWT.CALENDAR);
+                    
+                    Date date = new Date();
+                    try {
+                        String txt = field.getText();
+                        if (txt!=null && txt.length()>0) {
+                            date = formatter.parse(txt);                            
+                        }
+                    } catch ( ParseException e1 ) {
+                        e1.printStackTrace();
+                    }
+
+                    calendar.setDate(date.getYear()+1900, date.getMonth(), date.getDate());
+                    
+                    Point p2 = open.toDisplay( 0, 0 );
+                    
+                    int x = p2.x;
+                    int y = p2.y+20;
+                                        
+                    dialog.setLocation(x,y);
+                    
+                    Button ok = new Button (dialog, SWT.PUSH);           
+                    ok.setText ("OK");
+                    ok.setLayoutData(new GridData (SWT.FILL, SWT.CENTER, false, false));
+                    ok.addSelectionListener (new SelectionAdapter () {
+                        public void widgetSelected (SelectionEvent e) {
+                            field.setText( formatter.format( new Date(calendar.getYear()-1900, calendar.getMonth(), calendar.getDay())));
+                            updateSentence();
+                            modeller.setDirty( true );
+                            dialog.close ();
+                        }
+                    });
+                    dialog.setDefaultButton (ok);
+                    dialog.pack ();
+                    dialog.open ();
+                }
+            });
+            
+            control.layout();
+            
+        }
+        
+        public Control getControl() {
+            return control;
+        }
+
+        public String getType() {
+            return DATE_TAG;
+        }
+
+        public String getJavascriptFormat() {
+            return this.javascriptFormat;
+        }
+
+        public String getDateString() {
+            Date value = new Date();
+            try {
+                String txt = field.getText();
+                if (txt!=null && txt.length()>0) {
+                    value = formatter.parse(txt);
+                }            } catch ( ParseException e ) {
+                e.printStackTrace();
+                return "";
+            }
+            String result = "";
+            if ( value != null ) result = formatter.format( value );
+            else result = varName;
+
+            return result;
+        }
+
+        public String getVarName() {
+            return varName;
+        }
+
+        public void setVarName(String varName) {
+            this.varName = varName;
+        }
+
+    }
+
 }

Added: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/rulebuilder/ui/ModelWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/rulebuilder/ui/ModelWidget.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/rulebuilder/ui/ModelWidget.java	2009-02-26 11:26:41 UTC (rev 25432)
@@ -0,0 +1,9 @@
+package org.drools.eclipse.rulebuilder.ui;
+
+import org.eclipse.swt.widgets.Control;
+
+public interface ModelWidget {
+
+    Control getControl();
+    
+}

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/rulebuilder/ui/RHSDSLSentenceWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/rulebuilder/ui/RHSDSLSentenceWidget.java	2009-02-26 11:15:58 UTC (rev 25431)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/rulebuilder/ui/RHSDSLSentenceWidget.java	2009-02-26 11:26:41 UTC (rev 25432)
@@ -1,5 +1,6 @@
 package org.drools.eclipse.rulebuilder.ui;
 
+import org.drools.guvnor.client.modeldriven.SuggestionCompletionEngine;
 import org.drools.guvnor.client.modeldriven.brl.DSLSentence;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.forms.widgets.FormToolkit;
@@ -15,7 +16,7 @@
                parent,
                sentence,
                modeller,
-               index );
+               index);
     }
 
     protected void updateModel() {

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/rulebuilder/ui/RuleModeller.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/rulebuilder/ui/RuleModeller.java	2009-02-26 11:15:58 UTC (rev 25431)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/rulebuilder/ui/RuleModeller.java	2009-02-26 11:26:41 UTC (rev 25432)
@@ -300,7 +300,7 @@
                                   comp,
                                   pattern,
                                   this,
-                                  idx );
+                                  idx);
     }
 
     private void addLHSDSLSentenceWidget(int idx,

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/decisiontable/GuidedDecisionTableWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/decisiontable/GuidedDecisionTableWidget.java	2009-02-26 11:15:58 UTC (rev 25431)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/decisiontable/GuidedDecisionTableWidget.java	2009-02-26 11:26:41 UTC (rev 25432)
@@ -6,6 +6,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.drools.guided.ConstraintValueEditorHelper;
 import org.drools.guvnor.client.common.DirtyableHorizontalPane;
 import org.drools.guvnor.client.common.FormStylePopup;
 import org.drools.guvnor.client.common.ImageButton;
@@ -23,7 +24,6 @@
 import org.drools.guvnor.client.modeldriven.dt.MetadataCol;
 import org.drools.guvnor.client.modeldriven.ui.ActionValueEditor;
 import org.drools.guvnor.client.modeldriven.ui.RuleAttributeWidget;
-import org.drools.guvnor.client.modeldriven.ui.ConstraintValueEditorHelper;
 import org.drools.guvnor.client.packages.SuggestionCompletionCache;
 import org.drools.guvnor.client.rpc.RuleAsset;
 import org.drools.guvnor.client.ruleeditor.RuleViewer;

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ConstraintValueEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ConstraintValueEditor.java	2009-02-26 11:15:58 UTC (rev 25431)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ConstraintValueEditor.java	2009-02-26 11:26:41 UTC (rev 25432)
@@ -19,6 +19,7 @@
 
 import java.util.List;
 
+import org.drools.guided.ConstraintValueEditorHelper;
 import org.drools.guvnor.client.common.DirtyableComposite;
 import org.drools.guvnor.client.common.FieldEditListener;
 import org.drools.guvnor.client.common.FormStylePopup;

Deleted: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ConstraintValueEditorHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ConstraintValueEditorHelper.java	2009-02-26 11:15:58 UTC (rev 25431)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ConstraintValueEditorHelper.java	2009-02-26 11:26:41 UTC (rev 25432)
@@ -1,20 +0,0 @@
-package org.drools.guvnor.client.modeldriven.ui;
-
-public class ConstraintValueEditorHelper {
-
-    /**
-     * 'Person.age' : ['M=Male', 'F=Female']
-     *
-     * This will split the drop down item into a value and a key.
-     * eg key=value
-     *
-     */
-    public static String[] splitValue(String v) {
-        String[] s = new String[2];
-        int pos = v.indexOf( '=' );
-        s[0] = v.substring( 0, pos );
-        s[1] = v.substring( pos + 1, v.length() );
-        return s;
-    }
-
-}

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/DSLSentenceWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/DSLSentenceWidget.java	2009-02-26 11:15:58 UTC (rev 25431)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/DSLSentenceWidget.java	2009-02-26 11:26:41 UTC (rev 25432)
@@ -21,6 +21,7 @@
 import java.util.Iterator;
 import java.util.List;
 
+import org.drools.guided.ConstraintValueEditorHelper;
 import org.drools.guvnor.client.common.DirtyableComposite;
 import org.drools.guvnor.client.common.SmallLabel;
 import org.drools.guvnor.client.explorer.Preferences;
@@ -271,7 +272,7 @@
             } else if ( wid instanceof DSLCheckBox ) {
 
                 DSLCheckBox check = (DSLCheckBox) wid;
-                boolean checkValue = check.getCheckedValue();
+                String checkValue = check.getCheckedValue();
                 newSentence = newSentence + "{" + checkValue + ":" + check.getType() + ":" + checkValue + "} ";
             } else if ( wid instanceof DSLDateSelector ) {
                 DSLDateSelector dateSel = (DSLDateSelector) wid;
@@ -484,8 +485,8 @@
             this.varName = varName;
         }
 
-        public boolean getCheckedValue() {
-            return this.resultWidget.getSelectedIndex() == 0;
+        public String getCheckedValue() {
+            return this.resultWidget.getSelectedIndex() == 0?"checked":"checked";
 
         }
     }

Modified: labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/client/modeldriven/ui/ConstraintValueEditorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/client/modeldriven/ui/ConstraintValueEditorTest.java	2009-02-26 11:15:58 UTC (rev 25431)
+++ labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/client/modeldriven/ui/ConstraintValueEditorTest.java	2009-02-26 11:26:41 UTC (rev 25432)
@@ -1,5 +1,7 @@
 package org.drools.guvnor.client.modeldriven.ui;
 
+import org.drools.guided.ConstraintValueEditorHelper;
+
 import junit.framework.TestCase;
 
 public class ConstraintValueEditorTest extends TestCase {




More information about the jboss-svn-commits mailing list