[jboss-svn-commits] JBL Code SVN: r13829 - in labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin: src/main/java/org/drools/eclipse and 8 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Jul 29 19:24:33 EDT 2007


Author: KrisVerlaenen
Date: 2007-07-29 19:24:33 -0400 (Sun, 29 Jul 2007)
New Revision: 13829

Added:
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/icons/question.gif
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/SubFlowWrapper.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/SubFlowEditPart.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/MilestoneConstraintCellEditor.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/MilestoneConstraintDialog.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/MilestoneConstraintPropertyDescriptor.java
Removed:
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/JavaCompletionRequestor.java
Modified:
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/DroolsEclipsePlugin.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/builder/DroolsBuilder.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/core/DroolsLineBreakpoint.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/dsl/editor/completion/DSLRuleCompletionProcessor.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/AbstractCompletionProcessor.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/DefaultCompletionProcessor.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/MvelCompletionRequestor.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/RuleCompletionProcessor.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/RuleCompletionProposal.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/MilestoneWrapper.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/RuleFlowPaletteFactory.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/EndNodeEditPart.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/MilestoneEditPart.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/RuleFlowEditPartFactory.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/StartNodeEditPart.java
Log:
JBRULES-1043: Enhanced Java completion proposals
 - reuse of standard Java completion proposals
JBRULES-981: Milestone
 - end of impl. in core + integrated into Eclipse IDE
JBRULES-1041: Subflow
 - impl. in core + eclipse IDE
JBRULES-1038: addRuleFlow throws Exceptions
 - ruleflows are checking before parsing
JBRULES-1042: Integrate ruleflows in drools build

Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/icons/question.gif
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/icons/question.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/DroolsEclipsePlugin.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/DroolsEclipsePlugin.java	2007-07-29 23:24:18 UTC (rev 13828)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/DroolsEclipsePlugin.java	2007-07-29 23:24:33 UTC (rev 13829)
@@ -268,7 +268,7 @@
 		return generateParsedResource(content, resource, false, true);
 	}
 	
-public void invalidateResource(IResource resource) {
+	public void invalidateResource(IResource resource) {
 		DRLInfo cached = (DRLInfo) compiledRules.remove(resource);
 		if (cached != null) {
 			RuleInfo[] ruleInfos = cached.getRuleInfos();

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/builder/DroolsBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/builder/DroolsBuilder.java	2007-07-29 23:24:18 UTC (rev 13828)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/builder/DroolsBuilder.java	2007-07-29 23:24:33 UTC (rev 13829)
@@ -20,12 +20,15 @@
 import org.drools.compiler.FieldTemplateError;
 import org.drools.compiler.FunctionError;
 import org.drools.compiler.GlobalError;
+import org.drools.compiler.PackageBuilder;
 import org.drools.compiler.ParserError;
+import org.drools.compiler.ProcessBuilder;
 import org.drools.compiler.RuleError;
 import org.drools.decisiontable.InputType;
 import org.drools.decisiontable.SpreadsheetCompiler;
 import org.drools.eclipse.DRLInfo;
 import org.drools.eclipse.DroolsEclipsePlugin;
+import org.drools.eclipse.flow.ruleflow.core.RuleFlowProcessWrapper;
 import org.drools.eclipse.preferences.IDroolsConstants;
 import org.drools.lang.ExpanderException;
 import org.eclipse.core.resources.IFile;
@@ -46,6 +49,8 @@
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.core.JavaModelException;
 
+import com.thoughtworks.xstream.XStream;
+
 /**
  * Automatically syntax checks .drl files and adds possible
  * errors or warnings to the problem list. Nominally is triggerd on save.
@@ -86,7 +91,6 @@
     
     protected void fullBuild(IProgressMonitor monitor)
             throws CoreException {
-    	DroolsEclipsePlugin.getDefault().clearCache();
         getProject().accept(new DroolsBuildVisitor());
     }
     
@@ -103,17 +107,17 @@
 
     private class DroolsBuildVisitor implements IResourceVisitor {
         public boolean visit(IResource res) {
-            return parseResource(res);
+            return parseResource(res, true);
         }
     }
 
     private class DroolsBuildDeltaVisitor implements IResourceDeltaVisitor {
         public boolean visit(IResourceDelta delta) throws CoreException {
-            return parseResource(delta.getResource());
+            return parseResource(delta.getResource(), false);
         }
     }
     
-    private boolean parseResource(IResource res) {
+    private boolean parseResource(IResource res, boolean clean) {
         try {
             IJavaProject project = JavaCore.create(res.getProject());
             // exclude files that are located in the output directory,
@@ -132,6 +136,9 @@
     				|| ".package".equals(res.getName()))) {
             removeProblemsFor(res);
             try {
+            	if (clean) {
+            		DroolsEclipsePlugin.getDefault().invalidateResource(res);
+            	}
             	DroolsBuildMarker[] markers = parseDRLFile((IFile) res, new String(Util.getResourceContentsAsCharArray((IFile) res)));
 		        for (int i = 0; i < markers.length; i++) {
 		        	createMarker(res, markers[i].getText(), markers[i].getLine());
@@ -143,6 +150,9 @@
         } else if (res instanceof IFile && "xls".equals(res.getFileExtension())) {
             removeProblemsFor(res);
             try {
+            	if (clean) {
+            		DroolsEclipsePlugin.getDefault().invalidateResource(res);
+            	}
             	DroolsBuildMarker[] markers = parseXLSFile((IFile) res);
 		        for (int i = 0; i < markers.length; i++) {
 		        	createMarker(res, markers[i].getText(), markers[i].getLine());
@@ -154,6 +164,9 @@
         } else if (res instanceof IFile && "brl".equals(res.getFileExtension())) {
             removeProblemsFor(res);
             try {
+            	if (clean) {
+            		DroolsEclipsePlugin.getDefault().invalidateResource(res);
+            	}
             	DroolsBuildMarker[] markers = parseBRLFile((IFile) res);
 		        for (int i = 0; i < markers.length; i++) {
 		        	createMarker(res, markers[i].getText(), markers[i].getLine());
@@ -162,6 +175,20 @@
             	createMarker(res, t.getMessage(), -1);
             }
             return false;
+        } else if (res instanceof IFile && "rf".equals(res.getFileExtension())) {
+            removeProblemsFor(res);
+            try {
+            	if (clean) {
+            		DroolsEclipsePlugin.getDefault().invalidateResource(res);
+            	}
+            	DroolsBuildMarker[] markers = parseRuleFlowFile((IFile) res);
+		        for (int i = 0; i < markers.length; i++) {
+		        	createMarker(res, markers[i].getText(), markers[i].getLine());
+		        }
+            } catch (Throwable t) {
+            	createMarker(res, t.getMessage(), -1);
+            }
+            return false;
         }
 
         return true;
@@ -250,6 +277,36 @@
         return (DroolsBuildMarker[]) markers.toArray(new DroolsBuildMarker[markers.size()]);
     }
     
+    private DroolsBuildMarker[] parseRuleFlowFile(IFile file) {
+    	List markers = new ArrayList();
+		try {
+			String ruleflow = convertToString(file.getContents());
+			XStream stream = new XStream();
+	        stream.setMode(XStream.ID_REFERENCES);
+	        
+	        ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
+	        ClassLoader newLoader = this.getClass().getClassLoader();
+	        try {
+	            Thread.currentThread().setContextClassLoader(newLoader);
+	            Object o = stream.fromXML(ruleflow);
+	            if (o instanceof RuleFlowProcessWrapper) {
+	            	ProcessBuilder processBuilder = new ProcessBuilder(new PackageBuilder());
+	            	processBuilder.addProcess(((RuleFlowProcessWrapper) o).getRuleFlowProcess());
+	            	markParseErrors(markers, processBuilder.getErrors());
+	            }
+	        } finally {
+	            Thread.currentThread().setContextClassLoader(oldLoader);
+	        }			
+        } catch (Exception t) {
+        	String message = t.getMessage();
+            if (message == null || message.trim().equals( "" )) {
+                message = "Error: " + t.getClass().getName();
+            }
+            markers.add(new DroolsBuildMarker(message));
+        }
+        return (DroolsBuildMarker[]) markers.toArray(new DroolsBuildMarker[markers.size()]);
+    }
+    
     private static String convertToString(final InputStream inputStream) throws IOException {
     	Reader reader = new InputStreamReader(inputStream);
     	final StringBuffer text = new StringBuffer();

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/core/DroolsLineBreakpoint.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/core/DroolsLineBreakpoint.java	2007-07-29 23:24:18 UTC (rev 13828)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/core/DroolsLineBreakpoint.java	2007-07-29 23:24:33 UTC (rev 13829)
@@ -13,7 +13,6 @@
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
-import org.eclipse.jdt.core.IJavaElement;
 import org.eclipse.jdt.internal.debug.core.breakpoints.JavaLineBreakpoint;
 
 public class DroolsLineBreakpoint extends JavaLineBreakpoint {

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/dsl/editor/completion/DSLRuleCompletionProcessor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/dsl/editor/completion/DSLRuleCompletionProcessor.java	2007-07-29 23:24:18 UTC (rev 13828)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/dsl/editor/completion/DSLRuleCompletionProcessor.java	2007-07-29 23:24:33 UTC (rev 13829)
@@ -33,19 +33,19 @@
     	return (DSLRuleEditor) getEditor();
     }
     
-	protected void addRHSCompletionProposals(List list, String prefix, String backText,
+	protected void addRHSCompletionProposals(List list, int documentOffset, String prefix, String backText,
 			String conditions, String consequence) {
-		super.addRHSCompletionProposals(list, prefix, backText, conditions, consequence);
+		super.addRHSCompletionProposals(list, documentOffset, prefix, backText, conditions, consequence);
 		DSLAdapter adapter = getDSLRuleEditor().getDSLAdapter();
 		if (adapter != null) {
 			List dslConsequences = adapter.getDSLTree().getConsequenceChildrenList(prefix, true);
-			addDSLProposals(list, prefix, dslConsequences);
+			addDSLProposals(list, documentOffset, prefix, dslConsequences);
 		}
 	}
 	
-	protected void addLHSCompletionProposals(List list,
+	protected void addLHSCompletionProposals(List list, int documentOffset,
 			Location location, String prefix, String backText) {
-		super.addLHSCompletionProposals(list, location, prefix, backText);
+		super.addLHSCompletionProposals(list, documentOffset, location, prefix, backText);
 		DSLAdapter adapter = getDSLRuleEditor().getDSLAdapter();
 		if (adapter != null) {
 			String lastobj = this.getLastNonDashLine(backText);
@@ -63,16 +63,16 @@
 			if (dslConditions.size() == 0) {
 				dslConditions.addAll(adapter.listConditionItems());
 			}
-			addDSLProposals(list, prefix, dslConditions);
+			addDSLProposals(list, documentOffset, prefix, dslConditions);
 		}
 	}
 	
-	private void addDSLProposals(final List list, final String prefix, List dslItems) {
+	private void addDSLProposals(final List list, int documentOffset, final String prefix, List dslItems) {
 		Iterator iterator = dslItems.iterator();
 		while (iterator.hasNext()) {
 			String consequence = (String) iterator.next();
 			RuleCompletionProposal p = new RuleCompletionProposal(
-				prefix.length(), consequence);
+				documentOffset - prefix.length(), prefix.length(), consequence);
 			p.setImage(DSL_ICON);
 			list.add(p);
 		}

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/AbstractCompletionProcessor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/AbstractCompletionProcessor.java	2007-07-29 23:24:18 UTC (rev 13828)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/AbstractCompletionProcessor.java	2007-07-29 23:24:33 UTC (rev 13829)
@@ -7,7 +7,6 @@
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.contentassist.CompletionProposal;
 import org.eclipse.jface.text.contentassist.ICompletionProposal;
 import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
 import org.eclipse.jface.text.contentassist.IContextInformation;
@@ -36,8 +35,7 @@
     		return new ICompletionProposal[0];
     	}
         Collections.sort(proposals, new RuleCompletionProposal.RuleCompletionProposalComparator());
-        ICompletionProposal[] result = makeProposals(proposals, documentOffset);
-        return result;
+        return (ICompletionProposal[]) proposals.toArray(new ICompletionProposal[proposals.size()]);
 	}
 	
 	/**
@@ -49,19 +47,6 @@
 	 */
 	protected abstract List getCompletionProposals(ITextViewer viewer, int documentOffset);
 
-    protected ICompletionProposal[] makeProposals(List props, int documentOffset) {
-        ICompletionProposal[] result = new ICompletionProposal[props.size()];
-        Iterator iterator = props.iterator();
-        int i = 0;
-        while (iterator.hasNext()) {
-            RuleCompletionProposal proposal = (RuleCompletionProposal) iterator.next();
-            result[i++] = new CompletionProposal(proposal.getContent(), 
-        		documentOffset - proposal.getReplacementLength(), proposal.getReplacementLength(), 
-                proposal.getCursorPosition(), proposal.getImage(), proposal.getDisplay(), null, null);
-        }        
-        return result;
-    }
-
     /**
      *  Filter out the proposals whose content does not start with the given prefix.
      */
@@ -69,9 +54,11 @@
     	if (prefix != null) {
     		Iterator iterator = props.iterator();
     		while ( iterator.hasNext() ) {
-    			RuleCompletionProposal item = (RuleCompletionProposal) iterator.next();
-    			if (!item.getContent().startsWith(prefix)) {
-    				iterator.remove();
+    			ICompletionProposal item = (ICompletionProposal) iterator.next();
+    			if (item instanceof RuleCompletionProposal) {
+	    			if (!((RuleCompletionProposal) item).getContent().startsWith(prefix)) {
+	    				iterator.remove();
+	    			}
     			}
     		}
     	}

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/DefaultCompletionProcessor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/DefaultCompletionProcessor.java	2007-07-29 23:24:18 UTC (rev 13828)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/DefaultCompletionProcessor.java	2007-07-29 23:24:33 UTC (rev 13829)
@@ -20,10 +20,16 @@
 import org.drools.lang.descr.GlobalDescr;
 import org.drools.util.StringUtils;
 import org.eclipse.core.resources.IProject;
+import org.eclipse.jdt.core.CompletionContext;
+import org.eclipse.jdt.core.CompletionProposal;
 import org.eclipse.jdt.core.CompletionRequestor;
 import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.core.eval.IEvaluationContext;
+import org.eclipse.jdt.internal.ui.text.java.AbstractJavaCompletionProposal;
+import org.eclipse.jdt.internal.ui.text.java.JavaMethodCompletionProposal;
+import org.eclipse.jdt.ui.text.java.CompletionProposalCollector;
+import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.ITextViewer;
 import org.eclipse.swt.graphics.Image;
@@ -66,48 +72,39 @@
     protected List getCompletionProposals(ITextViewer viewer,
                                           int documentOffset) {
         try {
-            IDocument doc = viewer.getDocument();
-            String backText = readBackwards( documentOffset,
-                                             doc );
-
-            String prefix = CompletionUtil.stripLastWord( backText );
-
-            List props = null;
-            Matcher matcher = IMPORT_PATTERN.matcher( backText );
-            if ( matcher.matches() ) {
-                String classNameStart = backText.substring( backText.lastIndexOf( "import" ) + 7 );
-                props = getAllClassProposals( classNameStart,
-                                              documentOffset );
-            } else {
-                matcher = FUNCTION_PATTERN.matcher( backText );
-                if ( matcher.matches() ) {
-                    // extract function parameters
-                    Map params = extractParams( matcher.group( 3 ) );
-                    // add global parameters
-                    List globals = getGlobals();
-                    if ( globals != null ) {
-                        for ( Iterator iterator = globals.iterator(); iterator.hasNext(); ) {
-                            GlobalDescr global = (GlobalDescr) iterator.next();
-                            params.put( global.getIdentifier(),
-                                        global.getType() );
-                        }
-                    }
-                    String functionText = matcher.group( 4 );
-                    props = getJavaCompletionProposals( functionText,
-                                                        prefix,
-                                                        params );
-                    filterProposalsOnPrefix( prefix,
-                                             props );
-                } else {
-                    props = getPossibleProposals( viewer,
-                                                  documentOffset,
-                                                  backText,
-                                                  prefix );
-                }
-            }
-            return props;
-        } catch ( Throwable t ) {
-            DroolsEclipsePlugin.log( t );
+	        IDocument doc = viewer.getDocument();
+	        String backText = readBackwards( documentOffset, doc );            
+	
+	        String prefix = CompletionUtil.stripLastWord(backText);
+	        
+	        List props = null;
+	        Matcher matcher = IMPORT_PATTERN.matcher(backText); 
+	        if (matcher.matches()) {
+	        	String classNameStart = backText.substring(backText.lastIndexOf("import") + 7);
+	        	props = getAllClassProposals(classNameStart, documentOffset, prefix);
+	        } else {
+	        	matcher = FUNCTION_PATTERN.matcher(backText);
+	        	if (matcher.matches()) {
+	        		// extract function parameters
+		        	Map params = extractParams(matcher.group(3));
+		        	// add global parameters
+		        	List globals = getGlobals();
+		    		if (globals != null) {
+		    			for (Iterator iterator = globals.iterator(); iterator.hasNext(); ) {
+		    				GlobalDescr global = (GlobalDescr) iterator.next();
+		    				params.put(global.getIdentifier(), global.getType());
+		    			}
+		    		}
+		        	String functionText = matcher.group(4);
+	        		props = getJavaCompletionProposals(documentOffset, functionText, prefix, params);
+	        		filterProposalsOnPrefix(prefix, props);
+	        	} else {
+	        		props = getPossibleProposals(viewer, documentOffset, backText, prefix);
+	        	}
+	        }
+	        return props;
+        } catch (Throwable t) {
+        	DroolsEclipsePlugin.log(t);
         }
         return null;
     }
@@ -125,35 +122,30 @@
         }
         return result;
     }
+    
+	private List getAllClassProposals(final String classNameStart, final int documentOffset, final String prefix) {
+		final List list = new ArrayList();
+		IEditorInput input = getEditor().getEditorInput();
+		if (input instanceof IFileEditorInput) {
+			IProject project = ((IFileEditorInput) input).getFile().getProject();
+			IJavaProject javaProject = JavaCore.create(project);
+			
+			CompletionRequestor requestor = new CompletionRequestor() {
+				public void accept(org.eclipse.jdt.core.CompletionProposal proposal) {
+					String className = new String(proposal.getCompletion());
+					if (proposal.getKind() == org.eclipse.jdt.core.CompletionProposal.PACKAGE_REF) {
+						RuleCompletionProposal prop = new RuleCompletionProposal(documentOffset - prefix.length(), classNameStart.length(), className, className + ".");
+						prop.setImage(DroolsPluginImages.getImage(DroolsPluginImages.PACKAGE));
+						list.add(prop);
+					} else if (proposal.getKind() == org.eclipse.jdt.core.CompletionProposal.TYPE_REF) {
+						RuleCompletionProposal prop = new RuleCompletionProposal(documentOffset - prefix.length(), classNameStart.length() - proposal.getReplaceStart(), className, className + ";"); 
+						prop.setImage(DroolsPluginImages.getImage(DroolsPluginImages.CLASS));
+						list.add(prop);
+					}
+					// ignore all other proposals
+				}
+			};
 
-    private List getAllClassProposals(final String classNameStart,
-                                      final int documentOffset) {
-        final List list = new ArrayList();
-        IEditorInput input = getEditor().getEditorInput();
-        if ( input instanceof IFileEditorInput ) {
-            IProject project = ((IFileEditorInput) input).getFile().getProject();
-            IJavaProject javaProject = JavaCore.create( project );
-
-            CompletionRequestor requestor = new CompletionRequestor() {
-                public void accept(org.eclipse.jdt.core.CompletionProposal proposal) {
-                    String className = new String( proposal.getCompletion() );
-                    if ( proposal.getKind() == org.eclipse.jdt.core.CompletionProposal.PACKAGE_REF ) {
-                        RuleCompletionProposal prop = new RuleCompletionProposal( classNameStart.length(),
-                                                                                  className,
-                                                                                  className + "." );
-                        prop.setImage( DroolsPluginImages.getImage( DroolsPluginImages.PACKAGE ) );
-                        list.add( prop );
-                    } else if ( proposal.getKind() == org.eclipse.jdt.core.CompletionProposal.TYPE_REF ) {
-                        RuleCompletionProposal prop = new RuleCompletionProposal( classNameStart.length() - proposal.getReplaceStart(),
-                                                                                  className,
-                                                                                  className + ";" );
-                        prop.setImage( DroolsPluginImages.getImage( DroolsPluginImages.CLASS ) );
-                        list.add( prop );
-                    }
-                    // ignore all other proposals
-                }
-            };
-
             try {
                 javaProject.newEvaluationContext().codeComplete( classNameStart,
                                                                  classNameStart.length(),
@@ -170,82 +162,63 @@
                                         String backText,
                                         final String prefix) {
         List list = new ArrayList();
-        list.add( new RuleCompletionProposal( prefix.length(),
-                                              "rule",
-                                              NEW_RULE_TEMPLATE,
-                                              6 ) );
-        list.add( new RuleCompletionProposal( prefix.length(),
-                                              "import",
-                                              "import " ) );
-        list.add( new RuleCompletionProposal( prefix.length(),
-                                              "expander",
-                                              "expander " ) );
-        list.add( new RuleCompletionProposal( prefix.length(),
-                                              "global",
-                                              "global " ) );
-        list.add( new RuleCompletionProposal( prefix.length(),
-                                              "package",
-                                              "package " ) );
-        list.add( new RuleCompletionProposal( prefix.length(),
-                                              "query",
-                                              NEW_QUERY_TEMPLATE ) );
-        list.add( new RuleCompletionProposal( prefix.length(),
-                                              "function",
-                                              NEW_FUNCTION_TEMPLATE,
-                                              14 ) );
-        list.add( new RuleCompletionProposal( prefix.length(),
-                                              "template",
-                                              NEW_TEMPLATE_TEMPLATE,
-                                              9 ) );
-        filterProposalsOnPrefix( prefix,
-                                 list );
+        list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "rule", NEW_RULE_TEMPLATE, 6));
+        list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "import", "import "));
+        list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "expander", "expander "));
+        list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "global", "global "));
+        list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "package", "package "));
+        list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "query", NEW_QUERY_TEMPLATE));
+        list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "function", NEW_FUNCTION_TEMPLATE, 14));
+        list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "template", NEW_TEMPLATE_TEMPLATE, 9));
+        list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "dialect \"java\"", "dialect \"java\" "));
+        list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "dialect \"mvel\"", "dialect \"mvel\" "));
+        filterProposalsOnPrefix(prefix, list);
         return list;
     }
 
-    /**
-     * @return a list of regular Java'ish RuleCompletionProposal
-     */
-    protected List getJavaCompletionProposals(final String javaText,
-                                              final String prefix,
-                                              Map params) {
-        final List list = new ArrayList();
-        CompletionRequestor requestor = new JavaCompletionRequestor( prefix,
-                                                                     javaText,
-                                                                     list );
+	protected List getJavaCompletionProposals(final int documentOffset, final String javaText, final String prefix, Map params) {
+		final List list = new ArrayList();
+		requestJavaCompletionProposals(javaText, prefix, documentOffset, params, list);
+		return list;
+	}
 
-        requestJavaCompletionProposals( javaText,
-                                        prefix,
-                                        params,
-                                        requestor );
-        return list;
-    }
-
     /**
      * @return a list of "MVELified" RuleCompletionProposal. Thta list contains only unqiue proposal based on
      * the overrriden equals in {@link RuleCompletionProposal} to avoid the situation when several
      * accessors can exist for one property. for that case we want to keep only one proposal.
      */
     protected Collection getJavaMvelCompletionProposals(final String javaText,
-                                                  final String prefix,
+                                                  final String prefix, int documentOffset,
                                                   Map params) {
-        final Collection set = new HashSet();
-        CompletionRequestor requestor = new MvelCompletionRequestor( prefix,
-                                                                     javaText,
-                                                                     set );
-//        System.out.println("MVEL: java text sent to JDT is:"+javaText);
+        final Collection javaCompletionProposals = new HashSet();
         requestJavaCompletionProposals( javaText,
                                         prefix,
+                                        documentOffset,
                                         params,
-                                        requestor );
-        return set;
+                                        javaCompletionProposals );
+        final Collection result  = new HashSet();
+        CompletionRequestor requestor = new MvelCompletionRequestor( prefix,
+        															 documentOffset,
+        															 javaText,
+        															 result );
+        for (Iterator iterator = javaCompletionProposals.iterator(); iterator.hasNext(); ) {
+        	requestor.accept((CompletionProposal) iterator.next());
+        }
+        return result;
     }
 
     protected void requestJavaCompletionProposals(final String javaText,
                                                   final String prefix,
+                                                  final int documentOffset,
                                                   Map params,
-                                                  CompletionRequestor requestor) {
-//    	System.out.println("MVEL: java text sent to JDT is:"+javaText);
+                                                  Collection results) {
 
+		String javaTextWithoutPrefix = javaText.substring(0, javaText.length() - prefix.length());
+		// boolean to filter default Object methods produced by code completion when in the beginning of a statement
+		boolean filterObjectMethods = false;
+		if ("".equals(javaTextWithoutPrefix.trim()) || START_OF_NEW_JAVA_STATEMENT.matcher(javaTextWithoutPrefix).matches()) {
+			filterObjectMethods = true;
+		}
         IEditorInput input = getEditor().getEditorInput();
         if ( !(input instanceof IFileEditorInput) ) {
             return;
@@ -253,6 +226,9 @@
         IProject project = ((IFileEditorInput) input).getFile().getProject();
         IJavaProject javaProject = JavaCore.create( project );
 
+		CompletionProposalCollector collector = new CompletionProposalCollector(javaProject);
+		collector.acceptContext(new CompletionContext());
+		
         try {
             IEvaluationContext evalContext = javaProject.newEvaluationContext();
             List imports = getImports();
@@ -270,11 +246,19 @@
             javaTextWithParams.append( "org.drools.spi.KnowledgeHelper drools;" );
             javaTextWithParams.append( javaText );
             String text = javaTextWithParams.toString();
-//            System.out.println( "" );
-//            System.out.println( "MVEL: synthetic Java text:" + text );
             evalContext.codeComplete( text,
                                       text.length(),
-                                      requestor );
+                                      collector );
+			IJavaCompletionProposal[] proposals = collector.getJavaCompletionProposals();
+			int replacementOffset = documentOffset - prefix.length();
+			for (int i = 0; i < proposals.length; i++) {
+				if (proposals[i] instanceof AbstractJavaCompletionProposal) {
+					((AbstractJavaCompletionProposal) proposals[i]).setReplacementOffset(replacementOffset);
+					if (!filterObjectMethods || !(proposals[i] instanceof JavaMethodCompletionProposal)) {
+						results.add(proposals[i]);
+					}
+				}
+			}
         } catch ( Throwable t ) {
             DroolsEclipsePlugin.log( t );
         }

Deleted: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/JavaCompletionRequestor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/JavaCompletionRequestor.java	2007-07-29 23:24:18 UTC (rev 13828)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/JavaCompletionRequestor.java	2007-07-29 23:24:33 UTC (rev 13829)
@@ -1,43 +0,0 @@
-package org.drools.eclipse.editors.completion;
-
-import java.util.Collection;
-
-import org.eclipse.jdt.core.CompletionProposal;
-import org.eclipse.jdt.core.CompletionRequestor;
-
-public class JavaCompletionRequestor extends CompletionRequestor {
-    private final String prefix;
-    private final String text;
-    private final Collection   list;
-
-    public JavaCompletionRequestor(String prefix,
-                                   String text,
-                                   Collection list) {
-        this.prefix = prefix;
-        this.text = text;
-        this.list = list;
-    }
-
-    public void accept(CompletionProposal proposal) {
-        // TODO set other proposal properties too (display name, icon, ...)
-        String completion = new String( proposal.getCompletion() );
-        RuleCompletionProposal prop = new RuleCompletionProposal( prefix.length(),
-                                                                  completion );
-
-        switch ( proposal.getKind() ) {
-            case CompletionProposal.LOCAL_VARIABLE_REF :
-                prop.setImage( DefaultCompletionProcessor.VARIABLE_ICON );
-                break;
-            case CompletionProposal.METHOD_REF :
-                // TODO: Object methods are proposed when in the start of a line
-                if ( CompletionUtil.isStartOfNewStatement( text,
-                                                           prefix ) ) {
-                    return;
-                }
-                prop.setImage( DefaultCompletionProcessor.METHOD_ICON );
-                break;
-            default :
-        }
-        list.add( prop );
-    }
-}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/MvelCompletionRequestor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/MvelCompletionRequestor.java	2007-07-29 23:24:18 UTC (rev 13828)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/MvelCompletionRequestor.java	2007-07-29 23:24:33 UTC (rev 13829)
@@ -9,20 +9,23 @@
     private final String     prefix;
     private final String     text;
     private final Collection list;
+    private final int        documentOffset;
 
     public MvelCompletionRequestor(String prefix,
+    							   int documentOffset,
                                    String text,
                                    Collection list) {
         this.prefix = prefix;
         this.text = text;
         this.list = list;
+        this.documentOffset = documentOffset;
     }
 
     public void accept(CompletionProposal proposal) {
         // TODO set other proposal properties too (display name, icon, ...)
         String completion = new String( proposal.getCompletion() );
-        RuleCompletionProposal prop = new RuleCompletionProposal( prefix.length(),
-                                                                  completion );;
+        RuleCompletionProposal prop = new RuleCompletionProposal( 
+        		documentOffset - prefix.length(), prefix.length(), completion );;
 
         switch ( proposal.getKind() ) {
             case CompletionProposal.LOCAL_VARIABLE_REF :
@@ -38,8 +41,8 @@
                 //is the completion for a bean accessor?
                 boolean isAccessor = completion.equals( propertyOrMethodName );
 
-                prop = new RuleCompletionProposal( prefix.length(),
-                                                   propertyOrMethodName );
+                prop = new RuleCompletionProposal(
+        			documentOffset - prefix.length(), prefix.length(), propertyOrMethodName );
                 boolean startOfNewStatement = CompletionUtil.isStartOfNewStatement( text,
                                                                                     prefix );
                 if ( startOfNewStatement ) {

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/RuleCompletionProcessor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/RuleCompletionProcessor.java	2007-07-29 23:24:18 UTC (rev 13828)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/RuleCompletionProcessor.java	2007-07-29 23:24:33 UTC (rev 13829)
@@ -39,7 +39,6 @@
 import org.mvel.CompiledExpression;
 import org.mvel.ExpressionCompiler;
 import org.mvel.ParserContext;
-import org.mvel.PropertyVerifier;
 
 /**
  * For handling within rules.
@@ -67,13 +66,12 @@
 	protected List getCompletionProposals(ITextViewer viewer, int documentOffset) {
 		try {
 			final List list = new ArrayList();
-
 			IDocument doc = viewer.getDocument();
-
+			
 			String backText = readBackwards(documentOffset, doc);
 			final String prefix = CompletionUtil.stripLastWord(backText);
 
-			// FIXME:where does the magic number 5 come from? "rule "?
+			// if inside the keyword "rule ", no code completion
 			if (backText.length() < 5) {
 				return list;
 			}
@@ -82,85 +80,90 @@
 			Location location = context.getLocation();
 
 			if (location.getType() == Location.LOCATION_RULE_HEADER) {
-				addRuleHeaderProposals(list, prefix, backText);
+				addRuleHeaderProposals(list, documentOffset, prefix, backText);
 			} else if (location.getType() == Location.LOCATION_RHS) {
-				addRHSCompletionProposals(list, prefix, backText,
-						(String) location
-								.getProperty(Location.LOCATION_LHS_CONTENT),
-						(String) location
-								.getProperty(Location.LOCATION_RHS_CONTENT));
+				addRHSCompletionProposals(list, documentOffset, prefix, backText,
+					(String) location.getProperty(Location.LOCATION_LHS_CONTENT),
+					(String) location.getProperty(Location.LOCATION_RHS_CONTENT));
 			} else {
-				addLHSCompletionProposals(list, location, prefix, backText);
+				addLHSCompletionProposals(list, documentOffset, location, prefix, backText);
 			}
 
 			filterProposalsOnPrefix(prefix, list);
 			return list;
 		} catch (Throwable t) {
-			t.printStackTrace();
 			DroolsEclipsePlugin.log(t);
 		}
 		return null;
 	}
 
-	protected void addRHSCompletionProposals(List list, String prefix,
-			String backText, String conditions, String consequence) {
+	protected void addRHSCompletionProposals(List list, int documentOffset, String prefix, String backText,
+			String conditions, String consequence) {
 		// only add functions and keywords if at the beginning of a
 		// new statement
-		String consequenceWithoutPrefix = consequence.substring(0, consequence
-				.length()
-				- prefix.length());
-		if (context == null) {
-			context = new CompletionContext(backText);
+		if (consequence == null || consequence.length() < prefix.length()) {
+			// possible if doing code completion directly after "then"
+			return;
 		}
+		String consequenceWithoutPrefix = 
+			consequence.substring(0,consequence.length() - prefix.length());
 
-		boolean startOfDialectExpression = isStartOfDialectExpression(consequenceWithoutPrefix);
+        if ( context == null ) {
+            context = new CompletionContext( backText );
+        }
+
+        boolean startOfDialectExpression = isStartOfDialectExpression( consequenceWithoutPrefix );
 		if (startOfDialectExpression) {
-			addRHSKeywordCompletionProposals(list, prefix);
-			addRHSFunctionCompletionProposals(list, prefix);
+			addRHSKeywordCompletionProposals(list, documentOffset, prefix);
+			addRHSFunctionCompletionProposals(list, documentOffset, prefix);
 		}
-
-		if (context.isJavaDialect()) {
-			// System.out.println( "MVEL: Adding Java Dialect completions" );
-			addRHSJavaCompletionProposals(list, prefix, backText, consequence);
-		} else {
-			// System.out.println( "MVEL: Adding MVEL Dialect completions" );
-			addRHSMvelCompletionProposals(list, prefix, backText, consequence,
-					startOfDialectExpression);
-		}
+		if ( context.isJavaDialect() ) {
+            addRHSJavaCompletionProposals( list,
+            							   documentOffset,
+            							   prefix,
+                                           backText,
+                                           consequence );
+        } else {
+            addRHSMvelCompletionProposals( list,
+            							   documentOffset,
+                                           prefix,
+                                           backText,
+                                           consequence,
+                                           startOfDialectExpression );
+        }
 	}
 
-	protected void addLHSCompletionProposals(List list, Location location,
-			String prefix, String backText) {
+	protected void addLHSCompletionProposals(List list, int documentOffset, 
+			Location location, String prefix, String backText) {
 		switch (location.getType()) {
 		case Location.LOCATION_LHS_BEGIN_OF_CONDITION:
 			// if we are at the beginning of a new condition
 			// add drools keywords
-			list.add(new RuleCompletionProposal(prefix.length(), "and", "and ",
-					DROOLS_ICON));
-			list.add(new RuleCompletionProposal(prefix.length(), "or", "or ",
-					DROOLS_ICON));
-			list.add(new RuleCompletionProposal(prefix.length(), "from",
+			list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "and",
+					"and ", DROOLS_ICON));
+			list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "or",
+					"or ", DROOLS_ICON));
+			list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "from",
 					"from ", DROOLS_ICON));
-			list.add(new RuleCompletionProposal(prefix.length(), "forall",
+			list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "forall",
 					"forall(  )", 8, DROOLS_ICON));
-
-			RuleCompletionProposal prop = new RuleCompletionProposal(prefix
+			RuleCompletionProposal prop = new RuleCompletionProposal(documentOffset - prefix.length(), prefix
 					.length(), "eval", "eval(  )", 6);
 			prop.setImage(DROOLS_ICON);
 			list.add(prop);
-			prop = new RuleCompletionProposal(prefix.length(), "then", "then"
-					+ System.getProperty("line.separator") + "\t");
+			prop = new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "then",
+					"then" + System.getProperty("line.separator") + "\t");
 			prop.setImage(DROOLS_ICON);
 			list.add(prop);
 			// we do not break but also add all elements that are needed for
 			// and/or
 		case Location.LOCATION_LHS_BEGIN_OF_CONDITION_AND_OR:
-			list.add(new RuleCompletionProposal(prefix.length(), "not", "not ",
-					DROOLS_ICON));
+			list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "not",
+					"not ", DROOLS_ICON));
 			// we do not break but also add all elements that are needed for
 			// not
 		case Location.LOCATION_LHS_BEGIN_OF_CONDITION_NOT:
-			list.add(new RuleCompletionProposal(prefix.length(), "exists",
+			list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "exists",
 					"exists ", DROOLS_ICON));
 			// we do not break but also add all elements that are needed for
 			// exists
@@ -175,7 +178,7 @@
 				if (index != -1) {
 					String className = name.substring(index + 1);
 					RuleCompletionProposal p = new RuleCompletionProposal(
-							prefix.length(), className, className + "(  )",
+							documentOffset - prefix.length(), prefix.length(), className, className + "(  )",
 							className.length() + 2);
 					p.setPriority(-1);
 					p.setImage(CLASS_ICON);
@@ -189,7 +192,7 @@
 				if (index != -1) {
 					String className = name.substring(index + 1);
 					RuleCompletionProposal p = new RuleCompletionProposal(
-							prefix.length(), className, className + "(  )",
+							documentOffset - prefix.length(), prefix.length(), className, className + "(  )",
 							className.length() + 2);
 					p.setPriority(-1);
 					p.setImage(CLASS_ICON);
@@ -199,8 +202,9 @@
 			iterator = getTemplates().iterator();
 			while (iterator.hasNext()) {
 				String name = (String) iterator.next();
-				RuleCompletionProposal p = new RuleCompletionProposal(prefix
-						.length(), name, name + "(  )", name.length() + 2);
+				RuleCompletionProposal p = new RuleCompletionProposal(
+						documentOffset - prefix.length(), prefix.length(), name, name + "(  )",
+						name.length() + 2);
 				p.setPriority(-1);
 				p.setImage(CLASS_ICON);
 				list.add(p);
@@ -212,8 +216,8 @@
 			String propertyName = (String) location
 					.getProperty(Location.LOCATION_PROPERTY_PROPERTY_NAME);
 			if (className != null) {
-				boolean isTemplate = addFactTemplatePropertyProposals(prefix,
-						className, list);
+				boolean isTemplate = addFactTemplatePropertyProposals(
+						documentOffset, prefix, className, list);
 				if (!isTemplate) {
 					ClassTypeResolver resolver = new ClassTypeResolver(
 							getImports(), ProjectClassLoader
@@ -221,49 +225,42 @@
 					try {
 						String currentClass = className;
 						if (propertyName != null) {
-							String[] nestedProperties = propertyName
-									.split("\\.");
+							String[] nestedProperties = propertyName.split("\\.");
 							int nbSuperProperties = nestedProperties.length - 1;
 							if (propertyName.endsWith(".")) {
 								nbSuperProperties++;
 							}
 							for (int i = 0; i < nbSuperProperties; i++) {
 								String simplePropertyName = nestedProperties[i];
-								currentClass = getSimplePropertyClass(
-										currentClass, simplePropertyName);
+								currentClass = getSimplePropertyClass(currentClass, simplePropertyName);
 								currentClass = convertToNonPrimitiveClass(currentClass);
 							}
 						}
-						RuleCompletionProposal p = new RuleCompletionProposal(
-								prefix.length(), "this");
-						p.setImage(METHOD_ICON);
-						list.add(p);
+						RuleCompletionProposal p = new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "this");
+							p.setImage(METHOD_ICON);
+							list.add(p);
 						Class clazz = resolver.resolveType(currentClass);
 						if (clazz != null) {
 							if (Map.class.isAssignableFrom(clazz)) {
-								p = new RuleCompletionProposal(prefix.length(),
-										"this['']", "this['']", 6);
+								p = new RuleCompletionProposal(documentOffset - prefix.length(), 
+									prefix.length(), "this['']", "this['']", 6);
 								p.setImage(METHOD_ICON);
 								list.add(p);
 							}
-							ClassFieldInspector inspector = new ClassFieldInspector(
-									clazz);
+							ClassFieldInspector inspector = new ClassFieldInspector(clazz);
 							Map types = inspector.getFieldTypes();
-							Iterator iterator2 = inspector.getFieldNames()
-									.keySet().iterator();
+							Iterator iterator2 = inspector.getFieldNames().keySet().iterator();
 							while (iterator2.hasNext()) {
 								String name = (String) iterator2.next();
-								p = new RuleCompletionProposal(prefix.length(),
-										name, name + " ");
+								p = new RuleCompletionProposal(documentOffset - prefix.length(), 
+										prefix.length(), name, name + " ");
 								p.setImage(METHOD_ICON);
 								list.add(p);
 								Class type = (Class) types.get(name);
-								if (type != null
-										&& Map.class.isAssignableFrom(type)) {
+								if (type != null && Map.class.isAssignableFrom(type)) {
 									name += "['']";
-									p = new RuleCompletionProposal(prefix
-											.length(), name, name, name
-											.length() - 2);
+									p = new RuleCompletionProposal(documentOffset - prefix.length(), 
+										prefix.length(), name, name, name.length() - 2);
 									p.setImage(METHOD_ICON);
 									list.add(p);
 								}
@@ -284,43 +281,43 @@
 					.getProperty(Location.LOCATION_PROPERTY_PROPERTY_NAME);
 			String type = getPropertyClass(className, property);
 
-			list.add(new RuleCompletionProposal(prefix.length(), "==", "== ",
+			list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "==",
+					"== ", DROOLS_ICON));
+			list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "!=",
+					"!= ", DROOLS_ICON));
+			list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), ":", ": ",
 					DROOLS_ICON));
-			list.add(new RuleCompletionProposal(prefix.length(), "!=", "!= ",
-					DROOLS_ICON));
-			list.add(new RuleCompletionProposal(prefix.length(), ":", ": ",
-					DROOLS_ICON));
-			list.add(new RuleCompletionProposal(prefix.length(), "->",
+			list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "->",
 					"-> (  )", 5, DROOLS_ICON));
-			list.add(new RuleCompletionProposal(prefix.length(), "memberOf",
+			list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "memberOf",
 					"memberOf ", DROOLS_ICON));
-			list.add(new RuleCompletionProposal(prefix.length(),
-					"not memberOf", "not memberOf ", DROOLS_ICON));
-			list.add(new RuleCompletionProposal(prefix.length(), "in",
+			list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "not memberOf",
+					"not memberOf ", DROOLS_ICON));
+			list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "in",
 					"in (  )", 5, DROOLS_ICON));
-			list.add(new RuleCompletionProposal(prefix.length(), "not in",
+			list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "not in",
 					"not in (  )", 9, DROOLS_ICON));
 
 			if (isComparable(type)) {
-				list.add(new RuleCompletionProposal(prefix.length(), "<", "< ",
-						DROOLS_ICON));
-				list.add(new RuleCompletionProposal(prefix.length(), "<=",
+				list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "<",
+						"< ", DROOLS_ICON));
+				list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "<=",
 						"<= ", DROOLS_ICON));
-				list.add(new RuleCompletionProposal(prefix.length(), ">", "> ",
-						DROOLS_ICON));
-				list.add(new RuleCompletionProposal(prefix.length(), ">=",
+				list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), ">",
+						"> ", DROOLS_ICON));
+				list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), ">=",
 						">= ", DROOLS_ICON));
 			}
 			if (type.equals("java.lang.String")) {
-				list.add(new RuleCompletionProposal(prefix.length(), "matches",
+				list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "matches",
 						"matches \"\"", 9, DROOLS_ICON));
-				list.add(new RuleCompletionProposal(prefix.length(),
+				list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(),
 						"not matches", "not matches \"\"", 13, DROOLS_ICON));
 			}
 			if (isSubtypeOf(type, "java.util.Collection")) {
-				list.add(new RuleCompletionProposal(prefix.length(),
+				list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(),
 						"contains", "contains ", DROOLS_ICON));
-				list.add(new RuleCompletionProposal(prefix.length(),
+				list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(),
 						"not contains", "not contains ", DROOLS_ICON));
 			}
 			break;
@@ -335,8 +332,8 @@
 			type = getPropertyClass(className, property);
 
 			if ("in".equals(operator)) {
-				list.add(new RuleCompletionProposal(prefix.length(), "()",
-						"(  )", 2, DROOLS_ICON));
+				list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "()",
+					"(  )", 2, DROOLS_ICON));
 				break;
 			}
 
@@ -353,24 +350,26 @@
 				isObject = true;
 			}
 
-			list.add(new RuleCompletionProposal(prefix.length(), "null",
+			list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "null",
 					"null ", DROOLS_ICON));
 			if ("boolean".equals(type)) {
-				list.add(new RuleCompletionProposal(prefix.length(), "true",
-						"true ", DROOLS_ICON));
-				list.add(new RuleCompletionProposal(prefix.length(), "false",
-						"false ", DROOLS_ICON));
+				list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(),
+						"true", "true ", DROOLS_ICON));
+				list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(),
+						"false", "false ", DROOLS_ICON));
 			}
 			if (isObject || "java.lang.String".equals(type)) {
-				list.add(new RuleCompletionProposal(prefix.length(), "\"\"",
-						"\"\"", 1, DROOLS_ICON));
+				list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(),
+						"\"\"", "\"\"", 1, DROOLS_ICON));
 			}
 			if (isObject || "java.util.Date".equals(type)) {
-				list.add(new RuleCompletionProposal(prefix.length(),
-						"\"dd-mmm-yyyy\"", "\"dd-mmm-yyyy\"", 1, DROOLS_ICON));
+				list
+						.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(),
+								"\"dd-mmm-yyyy\"", "\"dd-mmm-yyyy\"", 1,
+								DROOLS_ICON));
 			}
-			list.add(new RuleCompletionProposal(prefix.length(), "()", "(  )",
-					2, DROOLS_ICON));
+			list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "()",
+					"(  )", 2, DROOLS_ICON));
 			// add parameters with possibly matching type
 			if (context == null) {
 				context = new CompletionContext(backText);
@@ -387,20 +386,21 @@
 					String paramType = (String) entry.getValue();
 					if (isSubtypeOf(paramType, type)) {
 						RuleCompletionProposal proposal = new RuleCompletionProposal(
-								prefix.length(), paramName);
+								documentOffset - prefix.length(), prefix.length(), paramName);
 						proposal.setPriority(-1);
 						proposal.setImage(VARIABLE_ICON);
 						list.add(proposal);
 					}
 				}
-			} // add globals with possibly matching type
+			}
+			// add globals with possibly matching type
 			List globals = getGlobals();
 			if (globals != null) {
-				for (iterator = globals.iterator(); iterator.hasNext();) {
+				for (iterator = globals.iterator(); iterator.hasNext(); ) {
 					GlobalDescr global = (GlobalDescr) iterator.next();
 					if (isSubtypeOf(global.getType(), type)) {
 						RuleCompletionProposal proposal = new RuleCompletionProposal(
-								prefix.length(), global.getIdentifier());
+								documentOffset - prefix.length(), prefix.length(), global.getIdentifier());
 						proposal.setPriority(-1);
 						proposal.setImage(VARIABLE_ICON);
 						list.add(proposal);
@@ -411,15 +411,15 @@
 		case Location.LOCATION_LHS_INSIDE_EVAL:
 			String content = (String) location
 					.getProperty(Location.LOCATION_EVAL_CONTENT);
-			list.addAll(getJavaCompletionProposals(content, prefix,
+			list.addAll(getJavaCompletionProposals(documentOffset, content, prefix,
 					getRuleParameters(backText)));
 			break;
 		case Location.LOCATION_LHS_INSIDE_CONDITION_END:
-			list.add(new RuleCompletionProposal(prefix.length(), "&&", "&& ",
+			list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "&&", "&& ",
 					DROOLS_ICON));
-			list.add(new RuleCompletionProposal(prefix.length(), "||", "|| ",
+			list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "||", "|| ",
 					DROOLS_ICON));
-			list.add(new RuleCompletionProposal(prefix.length(), ",", ", ",
+			list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), ",", ", ",
 					DROOLS_ICON));
 			break;
 		case Location.LOCATION_LHS_FROM:
@@ -430,45 +430,44 @@
 				// add accumulate and collect keyword
 				list
 						.add(new RuleCompletionProposal(
-								prefix.length(),
+								documentOffset - prefix.length(), prefix.length(),
 								"accumulate",
 								"accumulate (  , init (  ), action (  ), result (  ) )",
 								13, DROOLS_ICON));
 				PackageBuilderConfiguration config = new PackageBuilderConfiguration(
-						ProjectClassLoader.getProjectClassLoader(getEditor()),
-						null);
+					ProjectClassLoader.getProjectClassLoader(getEditor()), null);
 				Map accumulateFunctions = config.getAccumulateFunctionsMap();
-				for (Iterator iterator2 = accumulateFunctions.keySet()
-						.iterator(); iterator2.hasNext();) {
+				for (Iterator iterator2 = accumulateFunctions.keySet().iterator(); iterator2.hasNext(); ) {
 					String accumulateFunction = (String) iterator2.next();
-					list.add(new RuleCompletionProposal(prefix.length(),
+					list.add(new RuleCompletionProposal(
+							documentOffset - prefix.length(), prefix.length(),
 							"accumulate " + accumulateFunction,
 							"accumulate (  , " + accumulateFunction + "(  ) )",
 							13, DROOLS_ICON));
 				}
-				list.add(new RuleCompletionProposal(prefix.length(), "collect",
-						"collect (  )", 10, DROOLS_ICON));
+				list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(),
+						"collect", "collect (  )", 10, DROOLS_ICON));
 				// add all functions
 				if ("".equals(fromText)) {
 					List functions = getFunctions();
 					iterator = functions.iterator();
 					while (iterator.hasNext()) {
 						String name = (String) iterator.next() + "()";
-						prop = new RuleCompletionProposal(prefix.length(),
+						prop = new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(),
 								name, name, name.length() - 1);
 						prop.setPriority(-1);
 						prop.setImage(METHOD_ICON);
 						list.add(prop);
 					}
 				}
-				list.addAll(getJavaCompletionProposals(fromText, prefix,
+				list.addAll(getJavaCompletionProposals(documentOffset, fromText, prefix,
 						getRuleParameters(backText)));
 			}
 			break;
 		case Location.LOCATION_LHS_FROM_ACCUMULATE_INIT_INSIDE:
 			content = (String) location
 					.getProperty(Location.LOCATION_PROPERTY_FROM_ACCUMULATE_INIT_CONTENT);
-			list.addAll(getJavaCompletionProposals(content, prefix,
+			list.addAll(getJavaCompletionProposals(documentOffset, content, prefix,
 					getRuleParameters(backText)));
 			break;
 		case Location.LOCATION_LHS_FROM_ACCUMULATE_ACTION_INSIDE:
@@ -476,7 +475,7 @@
 					.getProperty(Location.LOCATION_PROPERTY_FROM_ACCUMULATE_INIT_CONTENT);
 			content += (String) location
 					.getProperty(Location.LOCATION_PROPERTY_FROM_ACCUMULATE_ACTION_CONTENT);
-			list.addAll(getJavaCompletionProposals(content, prefix,
+			list.addAll(getJavaCompletionProposals(documentOffset, content, prefix,
 					getRuleParameters(backText)));
 			break;
 		case Location.LOCATION_LHS_FROM_ACCUMULATE_RESULT_INSIDE:
@@ -486,7 +485,7 @@
 					.getProperty(Location.LOCATION_PROPERTY_FROM_ACCUMULATE_ACTION_CONTENT);
 			content += (String) location
 					.getProperty(Location.LOCATION_PROPERTY_FROM_ACCUMULATE_RESULT_CONTENT);
-			list.addAll(getJavaCompletionProposals(content, prefix,
+			list.addAll(getJavaCompletionProposals(documentOffset, content, prefix,
 					getRuleParameters(backText)));
 			break;
 		}
@@ -525,8 +524,7 @@
 				String currentClass = className;
 				for (int i = 0; i < nestedProperties.length; i++) {
 					String simplePropertyName = nestedProperties[i];
-					currentClass = getSimplePropertyClass(currentClass,
-							simplePropertyName);
+					currentClass = getSimplePropertyClass(currentClass, simplePropertyName);
 				}
 				return currentClass;
 			}
@@ -542,8 +540,9 @@
 			// TODO can we take advantage of generics here?
 			return "java.lang.Object";
 		}
-		ClassTypeResolver resolver = new ClassTypeResolver(getImports(),
-				ProjectClassLoader.getProjectClassLoader(getEditor()));
+		ClassTypeResolver resolver = new ClassTypeResolver(
+			getImports(), ProjectClassLoader
+				.getProjectClassLoader(getEditor()));
 		try {
 			Class clazz = resolver.resolveType(className);
 			if (clazz != null) {
@@ -566,7 +565,7 @@
 		// add globals
 		List globals = getGlobals();
 		if (globals != null) {
-			for (Iterator iterator = globals.iterator(); iterator.hasNext();) {
+			for (Iterator iterator = globals.iterator(); iterator.hasNext(); ) {
 				GlobalDescr global = (GlobalDescr) iterator.next();
 				result.put(global.getIdentifier(), global.getType());
 			}
@@ -578,7 +577,6 @@
 		if (context.getRule() == null) {
 			return result;
 		}
-
 		// add parameters defined in conditions
 		addRuleParameters(result, context.getRule().getLhs().getDescrs());
 		return result;
@@ -635,8 +633,8 @@
 		class1 = convertToNonPrimitiveClass(class1);
 		class2 = convertToNonPrimitiveClass(class2);
 		// TODO add code to take primitive types into account
-		ClassTypeResolver resolver = new ClassTypeResolver(getImports(),
-				ProjectClassLoader.getProjectClassLoader(getEditor()));
+		ClassTypeResolver resolver = new ClassTypeResolver(getImports(), ProjectClassLoader
+				.getProjectClassLoader(getEditor()));
 		try {
 			Class clazz1 = resolver.resolveType(class1);
 			Class clazz2 = resolver.resolveType(class2);
@@ -674,14 +672,14 @@
 		return null;
 	}
 
-	private void addRHSFunctionCompletionProposals(List list, String prefix) {
+	private void addRHSFunctionCompletionProposals(List list, int documentOffset, String prefix) {
 		Iterator iterator;
 		RuleCompletionProposal prop;
 		List functions = getFunctions();
 		iterator = functions.iterator();
 		while (iterator.hasNext()) {
 			String name = (String) iterator.next() + "()";
-			prop = new RuleCompletionProposal(prefix.length(), name,
+			prop = new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), name,
 					name + ";", name.length() - 1);
 			prop.setPriority(-1);
 			prop.setImage(METHOD_ICON);
@@ -689,42 +687,43 @@
 		}
 	}
 
-	private void addRHSKeywordCompletionProposals(List list, String prefix) {
-		RuleCompletionProposal prop = new RuleCompletionProposal(prefix
+	private void addRHSKeywordCompletionProposals(
+			List list, int documentOffset, String prefix) {
+		RuleCompletionProposal prop = new RuleCompletionProposal(documentOffset - prefix.length(), prefix
 				.length(), "update", "update();", 7);
 		prop.setImage(DROOLS_ICON);
 		list.add(prop);
-		prop = new RuleCompletionProposal(prefix.length(), "retract",
+		prop = new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "retract",
 				"retract();", 8);
 		prop.setImage(DROOLS_ICON);
 		list.add(prop);
-		prop = new RuleCompletionProposal(prefix.length(), "insert",
+		prop = new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "insert",
 				"insert();", 7);
 		prop.setImage(DROOLS_ICON);
 		list.add(prop);
-		prop = new RuleCompletionProposal(prefix.length(), "insertLogical",
+		prop = new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "insertLogical",
 				"insertLogical();", 14);
 		prop.setImage(DROOLS_ICON);
 		list.add(prop);
 	}
 
-	private void addRHSJavaCompletionProposals(List list, String prefix,
-			String backText, String consequence) {
-		list.addAll(getJavaCompletionProposals(consequence, prefix,
+	private void addRHSJavaCompletionProposals(List list, int documentOffset, String prefix, String backText, 
+			String consequence) {
+		list.addAll(getJavaCompletionProposals(documentOffset, consequence, prefix,
 				getRuleParameters(backText)));
 	}
 
-	private void addRHSMvelCompletionProposals(List list, String prefix,
+	private void addRHSMvelCompletionProposals(List list, final int documentOffset, String prefix,
 			String backText, String consequence, boolean expressionStart) {
 
 		Collection mvelCompletionProposals = getMvelCompletionProposals(
-				consequence, prefix, getRuleParameters(backText), backText,
+				consequence, documentOffset, prefix, getRuleParameters(backText), backText,
 				expressionStart);
 		list.addAll(mvelCompletionProposals);
 	}
 
 	private Collection getMvelCompletionProposals(final String consequence,
-			final String prefix, Map params, String backText,
+			final int documentOffset, final String prefix, Map params, String backText,
 			boolean startOfExpression) {
 
 		final Set proposals = new HashSet();
@@ -749,11 +748,11 @@
 
 			if (startOfExpression) {
 				Collection jdtProps = getJavaMvelCompletionProposals("",
-						prefix, params);
+						prefix, documentOffset, params);
 				proposals.addAll(jdtProps);
-				addMvelVariables(proposals, compilationContext);
+				addMvelVariables(proposals, compilationContext, documentOffset, prefix);
 
-				addMvelInputs(proposals, compilationContext);
+				addMvelInputs(proposals, compilationContext, documentOffset, prefix);
 
 			} else {
 				// we are completing the methods for an existing type or
@@ -773,7 +772,7 @@
 					String javaText = "\n" + lastType.getName() + " o = new "
 							+ lastType.getName() + "();\no.";
 					Collection jdtProps = getJavaMvelCompletionProposals(
-							javaText, prefix, params);
+							javaText, prefix, documentOffset, params);
 					proposals.addAll(jdtProps);
 				}
 			}
@@ -822,28 +821,27 @@
 		} catch (Exception e) {
 			return initialContext;
 		}
-
 	}
 
 	private void addMvelInputs(final Collection proposals,
-			ParserContext compilationContext) {
+			ParserContext compilationContext, int documentOffset, String prefix) {
 		Map inputs = compilationContext.getInputs();
 		for (Iterator iter = inputs.keySet().iterator(); iter.hasNext();) {
 			String prop = (String) iter.next();
-			RuleCompletionProposal rcp = new RuleCompletionProposal(prop
-					.length(), prop);
+			RuleCompletionProposal rcp = new RuleCompletionProposal(
+				documentOffset - prefix.length(), prefix.length(), prop);
 			rcp.setImage(DefaultCompletionProcessor.VARIABLE_ICON);
 			proposals.add(rcp);
 		}
 	}
 
 	private void addMvelVariables(final Collection proposals,
-			ParserContext compilationContext) {
+			ParserContext compilationContext, int documentOffset, String prefix) {
 		Map variables = compilationContext.getVariables();
 		for (Iterator iter = variables.keySet().iterator(); iter.hasNext();) {
 			String prop = (String) iter.next();
-			RuleCompletionProposal rcp = new RuleCompletionProposal(prop
-					.length(), prop);
+			RuleCompletionProposal rcp = new RuleCompletionProposal(
+				documentOffset - prefix.length(), prefix.length(), prop);
 			rcp.setImage(DefaultCompletionProcessor.VARIABLE_ICON);
 			proposals.add(rcp);
 		}
@@ -901,39 +899,38 @@
 		}
 	}
 
-	private void addRuleHeaderProposals(List list, String prefix,
-			String backText) {
-		list.add(new RuleCompletionProposal(prefix.length(), "salience",
+	private void addRuleHeaderProposals(List list, int documentOffset, String prefix, String backText) {
+		list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "salience",
 				"salience ", DROOLS_ICON));
-		list.add(new RuleCompletionProposal(prefix.length(), "no-loop",
+		list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "no-loop",
 				"no-loop ", DROOLS_ICON));
-		list.add(new RuleCompletionProposal(prefix.length(), "agenda-group",
+		list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "agenda-group",
 				"agenda-group ", DROOLS_ICON));
-		list.add(new RuleCompletionProposal(prefix.length(), "duration",
+		list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "duration",
 				"duration ", DROOLS_ICON));
-		list.add(new RuleCompletionProposal(prefix.length(), "auto-focus",
+		list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "auto-focus",
 				"auto-focus ", DROOLS_ICON));
-		list.add(new RuleCompletionProposal(prefix.length(), "when", "when"
+		list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "when", "when"
 				+ System.getProperty("line.separator") + "\t ", DROOLS_ICON));
-		list.add(new RuleCompletionProposal(prefix.length(),
+		list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(),
 				"activation-group", "activation-group ", DROOLS_ICON));
-		list.add(new RuleCompletionProposal(prefix.length(), "date-effective",
+		list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "date-effective",
 				"date-effective \"dd-MMM-yyyy\"", 16, DROOLS_ICON));
-		list.add(new RuleCompletionProposal(prefix.length(), "date-expires",
+		list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "date-expires",
 				"date-expires \"dd-MMM-yyyy\"", 14, DROOLS_ICON));
-		list.add(new RuleCompletionProposal(prefix.length(), "enabled",
+		list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "enabled",
 				"enabled false", DROOLS_ICON));
-		list.add(new RuleCompletionProposal(prefix.length(), "ruleflow-group",
+		list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "ruleflow-group",
 				"ruleflow-group \"\"", 16, DROOLS_ICON));
-		list.add(new RuleCompletionProposal(prefix.length(), "lock-on-active",
-				"lock-on-active ", DROOLS_ICON));
-		list.add(new RuleCompletionProposal(prefix.length(),
-				"dialect \"java\"", "dialect \"java\"", DROOLS_ICON));
-		list.add(new RuleCompletionProposal(prefix.length(),
-				"dialect \"mvel\"", "dialect \"mvel\"", DROOLS_ICON));
+        list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "lock-on-active",
+                "lock-on-active ", DROOLS_ICON));
+        list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "dialect \"java\"",
+        		"dialect \"java\" ", DROOLS_ICON));
+        list.add(new RuleCompletionProposal(documentOffset - prefix.length(), prefix.length(), "dialect \"mvel\"",
+        		"dialect \"mvel\" ", DROOLS_ICON));
 	}
 
-	private boolean addFactTemplatePropertyProposals(String prefix,
+	private boolean addFactTemplatePropertyProposals(int documentOffset, String prefix,
 			String templateName, List list) {
 		FactTemplateDescr descr = getTemplate(templateName);
 		if (descr == null) {
@@ -943,7 +940,7 @@
 		while (iterator.hasNext()) {
 			FieldTemplateDescr field = (FieldTemplateDescr) iterator.next();
 			String fieldName = field.getName();
-			RuleCompletionProposal p = new RuleCompletionProposal(prefix
+			RuleCompletionProposal p = new RuleCompletionProposal(documentOffset - prefix.length(), prefix
 					.length(), fieldName, fieldName + " ");
 			p.setImage(METHOD_ICON);
 			list.add(p);

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/RuleCompletionProposal.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/RuleCompletionProposal.java	2007-07-29 23:24:18 UTC (rev 13828)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/RuleCompletionProposal.java	2007-07-29 23:24:33 UTC (rev 13829)
@@ -2,7 +2,12 @@
 
 import java.util.Comparator;
 
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.IContextInformation;
 import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
 
 /**
  * Holds a completion proposal to be popped up.
@@ -10,73 +15,45 @@
  * @author Michael Neale
  *
  */
-public class RuleCompletionProposal {
+public class RuleCompletionProposal implements ICompletionProposal {
 
     private String content;
     private String display;
-    private int    replacementLength;
-    private int    cursorPosition;
-    private Image  image;
-    private int    priority;
-
+    private int replacementOffset;
+    private int replacementLength;
+    private int cursorPosition;
+    private Image image;
+    private int priority;
+    
     /** This is used when the stuff that is displayed, is the stuff that is used. */
-    public RuleCompletionProposal(int replacementLength,
-                                  String content) {
-        this( replacementLength,
-              content,
-              content );
+    public RuleCompletionProposal(int replacementOffset, int replacementLength, String content) {
+        this(replacementOffset, replacementLength, content, content);
     }
 
     /** This is used when a different display value is shown to what is put in when selected. */
-    public RuleCompletionProposal(int replacementLength,
-                                  String display,
-                                  String content) {
-        this( replacementLength,
-              display,
-              content,
-              content.length() );
+    public RuleCompletionProposal(int replacementOffset, int replacementLength, String display, String content) {
+        this(replacementOffset, replacementLength, display, content, content.length());
     }
 
     /** Also allows an icon to be used */
-    public RuleCompletionProposal(int replacementLength,
-                                  String display,
-                                  String content,
-                                  Image image) {
-        this( replacementLength,
-              display,
-              content,
-              content.length(),
-              image );
+    public RuleCompletionProposal(int replacementOffset, int replacementLength, String display, String content, Image image) {
+        this(replacementOffset, replacementLength, display, content, content.length(), image);
     }
 
-    public RuleCompletionProposal(int replacementLength,
-                                  String display,
-                                  String content,
-                                  int cursorPosition) {
-        this( replacementLength,
-              display,
-              content,
-              cursorPosition,
-              null );
+    public RuleCompletionProposal(int replacementOffset, int replacementLength, String display, String content, int cursorPosition) {
+    	this(replacementOffset, replacementLength, display, content, cursorPosition, null);
     }
 
     /** This is used when a different display value is shown to what is put in when selected. */
-    public RuleCompletionProposal(int replacementLength,
-                                  String display,
-                                  String content,
-                                  int cursorPosition,
-                                  Image image) {
-        this.replacementLength = replacementLength;
+    public RuleCompletionProposal(int replacementOffset, int replacementLength, String display, String content, int cursorPosition, Image image) {
+    	this.replacementOffset = replacementOffset;
+    	this.replacementLength = replacementLength;
         this.content = content;
         this.display = display;
         this.cursorPosition = cursorPosition;
         this.image = image;
     }
 
-    public String getContent() {
-        return content;
-    }
-
     public String getDisplay() {
         return display;
     }
@@ -93,6 +70,10 @@
         return image;
     }
 
+	public String getContent() {
+		return content;
+	}
+    
     public void setImage(Image image) {
         this.image = image;
     }
@@ -108,24 +89,55 @@
     public String toString() {
         return content;
     }
-
-    public static class RuleCompletionProposalComparator
-        implements
-        Comparator {
-        public int compare(Object arg0,
-                           Object arg1) {
-            RuleCompletionProposal prop0 = (RuleCompletionProposal) arg0;
-            RuleCompletionProposal prop1 = (RuleCompletionProposal) arg1;
-            if ( prop0.getPriority() == prop1.getPriority() ) {
-                return prop0.getDisplay().compareTo( prop1.getDisplay() );
-            } else if ( prop0.getPriority() > prop1.getPriority() ) {
-                return -1;
-            } else {
-                return 1;
-            }
-        }
+    
+    public static class RuleCompletionProposalComparator implements Comparator {
+		public int compare(Object arg0, Object arg1) {
+			if (arg0 instanceof RuleCompletionProposal) {
+				if (arg1 instanceof RuleCompletionProposal) {
+					RuleCompletionProposal prop0 = (RuleCompletionProposal) arg0;
+					RuleCompletionProposal prop1 = (RuleCompletionProposal) arg1;
+					if (prop0.getPriority() == prop1.getPriority()) {
+						return prop0.display.compareTo(prop1.display);
+					} else if (prop0.getPriority() > prop1.getPriority()) {
+						return -1;
+					} else {
+						return 1;
+					}
+				} else {
+					return -1;
+				}
+			} else {
+				if (arg1 instanceof RuleCompletionProposal) {
+					return 1;
+				}
+				return 0;
+			}
+		}
     }
 
+	public void apply(IDocument document) {
+		try {
+			document.replace(replacementOffset, replacementLength, content);
+		} catch (BadLocationException x) {
+			// ignore
+		}
+	}
+
+	public String getAdditionalProposalInfo() {
+		return null;
+	}
+
+	public IContextInformation getContextInformation() {
+		return null;
+	}
+
+	public String getDisplayString() {
+		if (display != null) {
+			return display;
+		}
+		return content;
+	}
+
     public int hashCode() {
         final int PRIME = 31;
         int result = 1;
@@ -147,4 +159,8 @@
         } else if ( !display.equals( other.display ) ) return false;
         return true;
     }
-}
\ No newline at end of file
+
+	public Point getSelection(IDocument document) {
+		return new Point(replacementOffset + cursorPosition, 0);
+	}
+}

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/MilestoneWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/MilestoneWrapper.java	2007-07-29 23:24:18 UTC (rev 13828)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/MilestoneWrapper.java	2007-07-29 23:24:33 UTC (rev 13829)
@@ -17,10 +17,10 @@
 
 import org.drools.eclipse.flow.common.editor.core.DefaultElementWrapper;
 import org.drools.eclipse.flow.common.editor.core.ElementConnection;
+import org.drools.eclipse.flow.ruleflow.view.property.constraint.MilestoneConstraintPropertyDescriptor;
 import org.drools.ruleflow.core.MilestoneNode;
 import org.drools.ruleflow.core.impl.MilestoneNodeImpl;
 import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
 
 /**
  * Wrapper for a milestone node.
@@ -30,26 +30,30 @@
 public class MilestoneWrapper extends NodeWrapper {
 
 	private static final long serialVersionUID = -5976489437109982927L;
-	private static IPropertyDescriptor[] descriptors;
+	private IPropertyDescriptor[] descriptors;
 
     public static final String CONSTRAINT = "Constraint";
-    static {
-        descriptors = new IPropertyDescriptor[DefaultElementWrapper.descriptors.length + 1];
-        System.arraycopy(DefaultElementWrapper.descriptors, 0, descriptors, 0, DefaultElementWrapper.descriptors.length);
-        descriptors[descriptors.length - 1] = 
-            new TextPropertyDescriptor(CONSTRAINT, "Constraint");
-    }
 
     public MilestoneWrapper() {
         setNode(new MilestoneNodeImpl());
         getMilestoneNode().setName("Milestone");
     }
     
+    private void setDescriptors() {
+        descriptors = new IPropertyDescriptor[DefaultElementWrapper.descriptors.length + 1];
+        System.arraycopy(DefaultElementWrapper.descriptors, 0, descriptors, 0, DefaultElementWrapper.descriptors.length);
+        descriptors[descriptors.length - 1] = 
+            new MilestoneConstraintPropertyDescriptor(CONSTRAINT, "Constraint", getMilestoneNode(), ((RuleFlowProcessWrapper) getParent()).getRuleFlowProcess());
+    }
+    
     public MilestoneNode getMilestoneNode() {
         return (MilestoneNode) getNode();
     }
     
     public IPropertyDescriptor[] getPropertyDescriptors() {
+    	if (descriptors == null) {
+    		setDescriptors();
+    	}
         return descriptors;
     }
 

Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/SubFlowWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/SubFlowWrapper.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/SubFlowWrapper.java	2007-07-29 23:24:33 UTC (rev 13829)
@@ -0,0 +1,88 @@
+package org.drools.eclipse.flow.ruleflow.core;
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.drools.eclipse.flow.common.editor.core.DefaultElementWrapper;
+import org.drools.eclipse.flow.common.editor.core.ElementConnection;
+import org.drools.ruleflow.core.SubFlowNode;
+import org.drools.ruleflow.core.impl.SubFlowNodeImpl;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+
+/**
+ * Wrapper for a SubFlow node.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class SubFlowWrapper extends NodeWrapper {
+
+	private static final long serialVersionUID = 3668348577732020324L;
+    private static IPropertyDescriptor[] descriptors;
+    
+    public static final String PROCESS_ID = "ProcessId";
+
+    static {
+        descriptors = new IPropertyDescriptor[DefaultElementWrapper.descriptors.length + 1];
+        System.arraycopy(DefaultElementWrapper.descriptors, 0, descriptors, 0, DefaultElementWrapper.descriptors.length);
+        descriptors[descriptors.length - 1] = 
+        	new TextPropertyDescriptor(PROCESS_ID, "ProcessId");
+    }
+    
+    public SubFlowWrapper() {
+        setNode(new SubFlowNodeImpl());
+        getSubFlowNode().setName("SubFlow");
+    }
+    
+    public SubFlowNode getSubFlowNode() {
+        return (SubFlowNode) getNode();
+    }
+    
+    public IPropertyDescriptor[] getPropertyDescriptors() {
+        return descriptors;
+    }
+
+    public boolean acceptsIncomingConnection(ElementConnection connection) {
+        return getIncomingConnections().isEmpty();
+    }
+
+    public boolean acceptsOutgoingConnection(ElementConnection connection) {
+        return getOutgoingConnections().isEmpty();
+    }
+    
+    public Object getPropertyValue(Object id) {
+        if (PROCESS_ID.equals(id)) {
+        	String processId = getSubFlowNode().getProcessId();
+            return processId == null ? "" : processId;
+        }
+        return super.getPropertyValue(id);
+    }
+
+    public void resetPropertyValue(Object id) {
+        if (PROCESS_ID.equals(id)) {
+        	getSubFlowNode().setProcessId("");
+        } else {
+            super.resetPropertyValue(id);
+        }
+    }
+
+    public void setPropertyValue(Object id, Object value) {
+        if (PROCESS_ID.equals(id)) {
+        	getSubFlowNode().setProcessId((String) value);
+        } else {
+            super.setPropertyValue(id, value);
+        }
+    }
+}

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/RuleFlowPaletteFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/RuleFlowPaletteFactory.java	2007-07-29 23:24:18 UTC (rev 13828)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/RuleFlowPaletteFactory.java	2007-07-29 23:24:33 UTC (rev 13829)
@@ -28,6 +28,7 @@
 import org.drools.eclipse.flow.ruleflow.core.RuleSetNodeWrapper;
 import org.drools.eclipse.flow.ruleflow.core.SplitWrapper;
 import org.drools.eclipse.flow.ruleflow.core.StartNodeWrapper;
+import org.drools.eclipse.flow.ruleflow.core.SubFlowWrapper;
 import org.drools.ruleflow.core.Connection;
 import org.eclipse.gef.palette.CombinedTemplateCreationEntry;
 import org.eclipse.gef.palette.ConnectionCreationToolEntry;
@@ -118,16 +119,26 @@
         );
         entries.add(combined);
                         
-//        combined = new CombinedTemplateCreationEntry(
-//            "Milestone",
-//            "Create a new Milestone",
-//            MilestoneWrapper.class,
-//            new SimpleFactory(MilestoneWrapper.class),
-//            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/activity.gif")), 
-//            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/activity.gif"))
-//        );
-//        entries.add(combined);
+        combined = new CombinedTemplateCreationEntry(
+            "Milestone",
+            "Create a new Milestone",
+            MilestoneWrapper.class,
+            new SimpleFactory(MilestoneWrapper.class),
+            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/question.gif")), 
+            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/question.gif"))
+        );
+        entries.add(combined);
                             
+        combined = new CombinedTemplateCreationEntry(
+            "SubFlow",
+            "Create a new SubFlow",
+            SubFlowWrapper.class,
+            new SimpleFactory(SubFlowWrapper.class),
+            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/process.gif")), 
+            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/process.gif"))
+        );
+        entries.add(combined);
+                                
         drawer.addAll(entries);
         return drawer;
     }

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/EndNodeEditPart.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/EndNodeEditPart.java	2007-07-29 23:24:18 UTC (rev 13828)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/EndNodeEditPart.java	2007-07-29 23:24:33 UTC (rev 13829)
@@ -36,7 +36,7 @@
 
     public static class EndNodeFigure extends ElementFigure {
         
-        private static Image icon = ImageDescriptor.createFromURL(
+        private static final Image icon = ImageDescriptor.createFromURL(
         	DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/process_stop.gif")).createImage();
             
         protected void customizeFigure() {

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/MilestoneEditPart.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/MilestoneEditPart.java	2007-07-29 23:24:18 UTC (rev 13828)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/MilestoneEditPart.java	2007-07-29 23:24:33 UTC (rev 13829)
@@ -15,13 +15,16 @@
  * limitations under the License.
  */
 
+import org.drools.eclipse.DroolsEclipsePlugin;
 import org.drools.eclipse.flow.common.editor.editpart.ElementEditPart;
 import org.drools.eclipse.flow.common.editor.editpart.figure.ElementFigure;
 import org.eclipse.draw2d.IFigure;
 import org.eclipse.draw2d.RoundedRectangle;
 import org.eclipse.draw2d.geometry.Dimension;
 import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.widgets.Display;
 
 /**
@@ -37,8 +40,11 @@
         return new RuleSetNodeFigure();
     }
     
-    public class RuleSetNodeFigure extends ElementFigure {
+    public static class RuleSetNodeFigure extends ElementFigure {
         
+        private static final Image ICON = ImageDescriptor.createFromURL(
+    		DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/question.gif")).createImage();
+            
         private RoundedRectangle rectangle;
         
         protected void customizeFigure() {
@@ -48,6 +54,7 @@
             rectangle.setBackgroundColor(color);
             rectangle.setBounds(getBounds());
             setSelected(false);
+            setIcon(ICON);
         }
         
         public void setBounds(Rectangle rectangle) {

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/RuleFlowEditPartFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/RuleFlowEditPartFactory.java	2007-07-29 23:24:18 UTC (rev 13828)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/RuleFlowEditPartFactory.java	2007-07-29 23:24:33 UTC (rev 13829)
@@ -24,6 +24,7 @@
 import org.drools.eclipse.flow.ruleflow.core.RuleSetNodeWrapper;
 import org.drools.eclipse.flow.ruleflow.core.SplitWrapper;
 import org.drools.eclipse.flow.ruleflow.core.StartNodeWrapper;
+import org.drools.eclipse.flow.ruleflow.core.SubFlowWrapper;
 import org.eclipse.gef.EditPart;
 import org.eclipse.gef.EditPartFactory;
 
@@ -52,6 +53,8 @@
             result = new JoinEditPart();
         } else if (model instanceof MilestoneWrapper) {
             result = new MilestoneEditPart();
+        } else if (model instanceof SubFlowWrapper) {
+            result = new SubFlowEditPart();
         } else {
             throw new IllegalArgumentException(
                 "Unknown model object " + model);

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/StartNodeEditPart.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/StartNodeEditPart.java	2007-07-29 23:24:18 UTC (rev 13828)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/StartNodeEditPart.java	2007-07-29 23:24:33 UTC (rev 13829)
@@ -36,7 +36,7 @@
 
     public static class StartNodeFigure extends ElementFigure {
         
-        private static Image icon = ImageDescriptor.createFromURL(
+        private static final Image icon = ImageDescriptor.createFromURL(
     		DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/process_start.gif")).createImage();
         
         protected void customizeFigure() {

Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/SubFlowEditPart.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/SubFlowEditPart.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/SubFlowEditPart.java	2007-07-29 23:24:33 UTC (rev 13829)
@@ -0,0 +1,71 @@
+package org.drools.eclipse.flow.ruleflow.editor.editpart;
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.drools.eclipse.DroolsEclipsePlugin;
+import org.drools.eclipse.flow.common.editor.editpart.ElementEditPart;
+import org.drools.eclipse.flow.common.editor.editpart.figure.ElementFigure;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.RoundedRectangle;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * EditPart for a SubFlow node.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class SubFlowEditPart extends ElementEditPart {
+
+    private static final Color color = new Color(Display.getCurrent(), 255, 250, 205);
+    
+    protected IFigure createFigure() {
+        return new SubFlowNodeFigure();
+    }
+    
+    public static class SubFlowNodeFigure extends ElementFigure {
+        
+        private static final Image ICON = ImageDescriptor.createFromURL(
+        		DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/process.gif")).createImage();
+                
+        private RoundedRectangle rectangle;
+        
+        protected void customizeFigure() {
+            rectangle = new RoundedRectangle();
+            rectangle.setCornerDimensions(new Dimension(25, 25));
+            add(rectangle, 0);
+            rectangle.setBackgroundColor(color);
+            rectangle.setBounds(getBounds());
+            setSelected(false);
+            setIcon(ICON);
+        }
+        
+        public void setBounds(Rectangle rectangle) {
+            super.setBounds(rectangle);
+            this.rectangle.setBounds(rectangle);
+        }
+        
+        public void setSelected(boolean b) {
+            super.setSelected(b);
+            rectangle.setLineWidth(b ? 3 : 1);
+            repaint();
+        }
+    }
+}

Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/MilestoneConstraintCellEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/MilestoneConstraintCellEditor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/MilestoneConstraintCellEditor.java	2007-07-29 23:24:33 UTC (rev 13829)
@@ -0,0 +1,51 @@
+package org.drools.eclipse.flow.ruleflow.view.property.constraint;
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.drools.eclipse.flow.common.view.property.BeanDialogCellEditor;
+import org.drools.eclipse.flow.common.view.property.EditBeanDialog;
+import org.drools.ruleflow.core.MilestoneNode;
+import org.drools.ruleflow.core.RuleFlowProcess;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Cell editor for milestone constraints.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class MilestoneConstraintCellEditor extends BeanDialogCellEditor {
+
+    private RuleFlowProcess process;
+    private MilestoneNode milestone;
+    
+    public MilestoneConstraintCellEditor(Composite parent, RuleFlowProcess process, MilestoneNode milestone) {
+        super(parent);
+        this.process = process;
+        this.milestone = milestone;
+    }
+
+    protected EditBeanDialog createDialog(Shell shell) {
+        return new MilestoneConstraintDialog(shell, process, milestone);
+    }
+    
+    protected String getLabelText(Object value) {
+    	if (milestone == null || milestone.getConstraint() == null) {
+    		return "";
+    	}
+        return milestone.getConstraint();
+    }
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/MilestoneConstraintDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/MilestoneConstraintDialog.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/MilestoneConstraintDialog.java	2007-07-29 23:24:33 UTC (rev 13829)
@@ -0,0 +1,180 @@
+package org.drools.eclipse.flow.ruleflow.view.property.constraint;
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.util.List;
+
+import org.drools.eclipse.editors.DRLSourceViewerConfig;
+import org.drools.eclipse.editors.scanners.DRLPartionScanner;
+import org.drools.eclipse.flow.common.view.property.EditBeanDialog;
+import org.drools.ruleflow.core.MilestoneNode;
+import org.drools.ruleflow.core.RuleFlowProcess;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentPartitioner;
+import org.eclipse.jface.text.contentassist.ContentAssistant;
+import org.eclipse.jface.text.contentassist.IContentAssistant;
+import org.eclipse.jface.text.reconciler.IReconciler;
+import org.eclipse.jface.text.rules.FastPartitioner;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.TabFolder;
+import org.eclipse.swt.widgets.TabItem;
+
+/**
+ * Dialog for editing constraints.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class MilestoneConstraintDialog extends EditBeanDialog {
+
+	private RuleFlowProcess process;
+	private TabFolder tabFolder;
+	private SourceViewer constraintViewer;
+	private ConstraintCompletionProcessor completionProcessor;
+
+	public MilestoneConstraintDialog(Shell parentShell, RuleFlowProcess process, MilestoneNode milestone) {
+		super(parentShell, "Constraint editor");
+		this.process = process;
+		setValue(milestone.getConstraint());
+	}
+
+	protected Object updateValue(Object value) {
+		if (tabFolder.getSelectionIndex() == 0) {
+			return getConstraintText();
+		}
+		return null;
+	}
+
+	protected Point getInitialSize() {
+		return new Point(600, 450);
+	}
+
+	private Control createTextualEditor(Composite parent) {
+		constraintViewer = new SourceViewer(parent, null, SWT.BORDER);
+		constraintViewer.configure(new DRLSourceViewerConfig(null) {
+			public IReconciler getReconciler(ISourceViewer sourceViewer) {
+				return null;
+			}
+			public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
+				ContentAssistant assistant = new ContentAssistant();
+				completionProcessor = new ConstraintCompletionProcessor(process);
+				assistant.setContentAssistProcessor(
+					completionProcessor, IDocument.DEFAULT_CONTENT_TYPE);
+				assistant.setProposalPopupOrientation(IContentAssistant.PROPOSAL_OVERLAY);
+				return assistant;
+			}
+		});
+		String value = (String) getValue();
+		if (value == null) {
+			value = "";
+		}
+		IDocument document = new Document(value);
+		constraintViewer.setDocument(document);
+		IDocumentPartitioner partitioner =
+            new FastPartitioner(
+                new DRLPartionScanner(),
+                DRLPartionScanner.LEGAL_CONTENT_TYPES);
+        partitioner.connect(document);
+        document.setDocumentPartitioner(partitioner);
+        constraintViewer.getControl().addKeyListener(new KeyListener() {
+			public void keyPressed(KeyEvent e) {
+				if (e.character == ' ' && e.stateMask == SWT.CTRL) {
+					constraintViewer.doOperation(ISourceViewer.CONTENTASSIST_PROPOSALS);
+				}
+			}
+			public void keyReleased(KeyEvent e) {
+			}
+        });
+		return constraintViewer.getControl();
+	}
+	
+	private String getConstraintText() {
+		return constraintViewer.getDocument().get();
+	}
+	
+	public Control createDialogArea(Composite parent) {
+		GridLayout layout = new GridLayout();
+		parent.setLayout(layout);
+		layout.numColumns = 2;
+
+		Composite top = new Composite(parent, SWT.NONE);
+		GridData gd = new GridData();
+		gd.horizontalSpan = 2;
+		gd.grabExcessHorizontalSpace = true;
+		top.setLayoutData(gd);
+
+		layout = new GridLayout();
+		layout.numColumns = 3;
+		top.setLayout(layout);
+
+		Button importButton = new Button(top, SWT.PUSH);
+		importButton.setText("Imports ...");
+		importButton.setFont(JFaceResources.getDialogFont());
+		importButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent event) {
+				importButtonPressed();
+			}
+		});
+		gd = new GridData();
+		gd.horizontalAlignment = GridData.END;
+		importButton.setLayoutData(gd);
+
+		tabFolder = new TabFolder(parent, SWT.NONE);
+		gd = new GridData();
+		gd.horizontalSpan = 3;
+		gd.grabExcessHorizontalSpace = true;
+		gd.grabExcessVerticalSpace = true;
+		gd.verticalAlignment = GridData.FILL;
+		gd.horizontalAlignment = GridData.FILL;
+		tabFolder.setLayoutData(gd);
+		TabItem textEditorTab = new TabItem(tabFolder, SWT.NONE);
+		textEditorTab.setText("Textual Editor");
+
+		textEditorTab.setControl(createTextualEditor(tabFolder));
+		return tabFolder;
+	}
+	
+	private void importButtonPressed() {
+		final Runnable r = new Runnable() {
+			public void run() {
+				RuleFlowImportsDialog dialog =
+					new RuleFlowImportsDialog(getShell(), process);
+				dialog.create();
+				int code = dialog.open();
+				if (code != CANCEL) {
+					List imports = dialog.getImports();
+					process.setImports(imports);
+					completionProcessor.reset();
+				}
+			}
+		};
+		r.run();
+	}
+}

Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/MilestoneConstraintPropertyDescriptor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/MilestoneConstraintPropertyDescriptor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/MilestoneConstraintPropertyDescriptor.java	2007-07-29 23:24:33 UTC (rev 13829)
@@ -0,0 +1,51 @@
+package org.drools.eclipse.flow.ruleflow.view.property.constraint;
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.drools.ruleflow.core.MilestoneNode;
+import org.drools.ruleflow.core.RuleFlowProcess;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+/**
+ * Property descriptor for a milestone constraint.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class MilestoneConstraintPropertyDescriptor extends PropertyDescriptor {
+    
+    private RuleFlowProcess process;
+    private MilestoneNode milestone;
+    
+    public MilestoneConstraintPropertyDescriptor(Object id, String displayName, MilestoneNode milestone, RuleFlowProcess process) {
+        super(id, displayName);
+        this.milestone = milestone;
+        this.process = process;
+    }
+    
+    public RuleFlowProcess getProcess() {
+        return process;
+    }
+    
+    public CellEditor createPropertyEditor(Composite parent) {
+    	MilestoneConstraintCellEditor editor = new MilestoneConstraintCellEditor(parent, process, milestone);
+        if (getValidator() != null) {
+            editor.setValidator(getValidator());
+        }
+        return editor;
+    }
+}




More information about the jboss-svn-commits mailing list