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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Jun 21 17:43:46 EDT 2007


Author: KrisVerlaenen
Date: 2007-06-21 17:43:46 -0400 (Thu, 21 Jun 2007)
New Revision: 12756

Added:
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/ConstraintCompletionProcessor.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowImportsDialog.java
Modified:
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/DRLRuleEditor.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/RuleCompletionProcessor.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/ConstraintListDialog.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowConstraintDialog.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/util/ProjectClassLoader.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/wizard/rule/NewRulePackagePage.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/resources/org/drools/eclipse/wizard/dsl/template.dsl
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/resources/org/drools/eclipse/wizard/project/DecisionTableLauncherSample.java.template
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/resources/org/drools/eclipse/wizard/project/RuleLauncherSample.java.template
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/resources/org/drools/eclipse/wizard/project/Sample.xls.template
Log:
JBRULES-940: Apply v4.0 API changes to IDE example code
JBRULES-939: globals should show up in code completion of drl editor
JBRULES-618: Ruleflow IDE integration
 - Added code completion to constraint editor
 - Added imports to constraint editor


Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/DRLRuleEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/DRLRuleEditor.java	2007-06-21 21:43:34 UTC (rev 12755)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/DRLRuleEditor.java	2007-06-21 21:43:46 UTC (rev 12756)
@@ -15,6 +15,7 @@
 import org.drools.lang.descr.FactTemplateDescr;
 import org.drools.lang.descr.FunctionDescr;
 import org.drools.lang.descr.FunctionImportDescr;
+import org.drools.lang.descr.GlobalDescr;
 import org.drools.lang.descr.ImportDescr;
 import org.drools.lang.descr.PackageDescr;
 import org.eclipse.core.resources.IMarker;
@@ -39,6 +40,7 @@
     protected List imports;
     protected List functions;
     protected Map templates;
+    protected List globals;
     protected String packageName;
     protected List classesInPackage;
 
@@ -73,6 +75,13 @@
 		return (FactTemplateDescr) templates.get(name);
 	}
 	
+	public List getGlobals() {
+		if (globals == null) {
+			loadImportsAndFunctions();
+		}
+		return globals;
+	}
+	
 	public String getPackage() {
 		if (packageName == null) {
 			loadImportsAndFunctions();
@@ -88,29 +97,34 @@
 	}
 	
 	protected List getAllClassesInPackage(String packageName) {
-		final List list = new ArrayList();
+		List list = new ArrayList();
 		if (packageName != null) {
 			IEditorInput input = 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.TYPE_REF) {
-							list.add(className);
-						}
-						// ignore all other proposals
-					}
-				};
+				list = getAllClassesInPackage(packageName, javaProject);
+			}
+		}
+		return list;
+	}
 	
-				try {
-					javaProject.newEvaluationContext().codeComplete(packageName + ".", packageName.length() + 1, requestor);
-				} catch (Throwable t) {
-					DroolsEclipsePlugin.log(t);
+	public static List getAllClassesInPackage(String packageName, IJavaProject javaProject) {
+		final List list = new ArrayList();
+		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.TYPE_REF) {
+					list.add(className);
 				}
+				// ignore all other proposals
 			}
+		};
+
+		try {
+			javaProject.newEvaluationContext().codeComplete(packageName + ".", packageName.length() + 1, requestor);
+		} catch (Throwable t) {
+			DroolsEclipsePlugin.log(t);
 		}
 		return list;
 	}
@@ -191,6 +205,14 @@
                 FactTemplateDescr template = (FactTemplateDescr) iterator.next();
                 templates.put(template.getName(), template);
             }
+            // globals
+            List globalDescrs = descr.getGlobals();
+            globals = new ArrayList();
+            iterator = globalDescrs.iterator();
+            while (iterator.hasNext()) {
+                GlobalDescr global = (GlobalDescr) iterator.next();
+                globals.add(global);
+            }
         } catch (DroolsParserException e) {
             DroolsEclipsePlugin.log(e);
         }
@@ -213,6 +235,7 @@
 		imports = null;
 		functions = null;
 		templates = null;
+		globals = null;
 		packageName = null;
 		classesInPackage = null;
 	}

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-06-21 21:43:34 UTC (rev 12755)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/AbstractCompletionProcessor.java	2007-06-21 21:43:46 UTC (rev 12756)
@@ -12,7 +12,7 @@
 import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
 import org.eclipse.jface.text.contentassist.IContextInformation;
 import org.eclipse.jface.text.contentassist.IContextInformationValidator;
-import org.eclipse.ui.part.EditorPart;
+import org.eclipse.ui.IEditorPart;
 
 /**
  * 
@@ -20,13 +20,13 @@
  */
 public abstract class AbstractCompletionProcessor implements IContentAssistProcessor {
 
-    private EditorPart editor;
+    private IEditorPart editor;
    
-    public AbstractCompletionProcessor(EditorPart editor) {
+    public AbstractCompletionProcessor(IEditorPart editor) {
     	this.editor = editor;
     }
     
-    protected EditorPart getEditor() {
+    protected IEditorPart getEditor() {
     	return editor;
     }
     

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-06-21 21:43:34 UTC (rev 12755)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/DefaultCompletionProcessor.java	2007-06-21 21:43:46 UTC (rev 12756)
@@ -1,10 +1,12 @@
 package org.drools.eclipse.editors.completion;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -12,6 +14,8 @@
 import org.drools.eclipse.DroolsPluginImages;
 import org.drools.eclipse.editors.AbstractRuleEditor;
 import org.drools.eclipse.editors.DRLRuleEditor;
+import org.drools.lang.descr.FactTemplateDescr;
+import org.drools.lang.descr.GlobalDescr;
 import org.drools.util.StringUtils;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.jdt.core.CompletionProposal;
@@ -34,7 +38,7 @@
  * This processor will also read behind the current editing position, to provide some context to 
  * help provide the pop up list.
  * 
- * @author Michael Neale
+ * @author Michael Neale, Kris Verlaenen
  */
 public class DefaultCompletionProcessor extends AbstractCompletionProcessor {
 
@@ -53,17 +57,12 @@
     	super(editor);
     }
     
-    protected DRLRuleEditor getDRLEditor() {
-    	return (DRLRuleEditor) getEditor();
-    }
-    
 	protected List getCompletionProposals(ITextViewer viewer, int documentOffset) {
         try {
 	        IDocument doc = viewer.getDocument();
 	        String backText = readBackwards( documentOffset, doc );            
 	
-	        String prefix = "";
-	        prefix = CompletionUtil.stripLastWord(backText);
+	        String prefix = CompletionUtil.stripLastWord(backText);
 	        
 	        List props = null;
 	        Matcher matcher = IMPORT_PATTERN.matcher(backText); 
@@ -73,7 +72,16 @@
 	        } 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);
@@ -178,7 +186,7 @@
 
 			try {
 				IEvaluationContext evalContext = javaProject.newEvaluationContext();
-				List imports = getDRLEditor().getImports();
+				List imports = getImports();
 				if (imports != null && imports.size() > 0) {
 					evalContext.setImports((String[]) imports.toArray(new String[imports.size()]));
 				}
@@ -200,6 +208,48 @@
 		return list;
 	}
 	
+	protected List getImports() {
+		if (getEditor() instanceof DRLRuleEditor) {
+			return ((DRLRuleEditor) getEditor()).getImports();
+		}
+		return Collections.EMPTY_LIST;
+	}
+	
+	protected List getFunctions() {
+		if (getEditor() instanceof DRLRuleEditor) {
+			return ((DRLRuleEditor) getEditor()).getFunctions();
+		}
+		return Collections.EMPTY_LIST;
+	}
+	
+	protected Set getTemplates() {
+		if (getEditor() instanceof DRLRuleEditor) {
+			return ((DRLRuleEditor) getEditor()).getTemplates();
+		}
+		return Collections.emptySet();
+	}
+	
+	protected FactTemplateDescr getTemplate(String name) {
+		if (getEditor() instanceof DRLRuleEditor) {
+			return ((DRLRuleEditor) getEditor()).getTemplate(name);
+		}
+		return null;
+	}
+	
+	protected List getGlobals() {
+		if (getEditor() instanceof DRLRuleEditor) {
+			return ((DRLRuleEditor) getEditor()).getGlobals();
+		}
+		return Collections.EMPTY_LIST;
+	}
+	
+	protected List getClassesInPackage() {
+		if (getEditor() instanceof DRLRuleEditor) {
+			return ((DRLRuleEditor) getEditor()).getClassesInPackage();
+		}
+		return Collections.EMPTY_LIST;
+	}
+	
 	protected boolean isStartOfJavaExpression(String text) {
 		return "".equals(text.trim()) || START_OF_NEW_JAVA_STATEMENT.matcher(text).matches();
 	}

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-06-21 21:43:34 UTC (rev 12755)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/RuleCompletionProcessor.java	2007-06-21 21:43:46 UTC (rev 12756)
@@ -6,7 +6,6 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import org.drools.base.ClassTypeResolver;
 import org.drools.compiler.DrlParser;
@@ -24,6 +23,7 @@
 import org.drools.lang.descr.FieldBindingDescr;
 import org.drools.lang.descr.FieldTemplateDescr;
 import org.drools.lang.descr.FromDescr;
+import org.drools.lang.descr.GlobalDescr;
 import org.drools.lang.descr.NotDescr;
 import org.drools.lang.descr.OrDescr;
 import org.drools.lang.descr.PackageDescr;
@@ -131,8 +131,7 @@
 		case Location.LOCATION_LHS_FROM_COLLECT:
 		case Location.LOCATION_LHS_BEGIN_OF_CONDITION_EXISTS:
 			// and add imported classes
-			List imports = getDRLEditor().getImports();
-			Iterator iterator = imports.iterator();
+			Iterator iterator = getImports().iterator();
 			while (iterator.hasNext()) {
 				String name = (String) iterator.next();
 				int index = name.lastIndexOf(".");
@@ -146,8 +145,7 @@
 					list.add(p);
 				}
 			}
-			List classesInPackage = getDRLEditor().getClassesInPackage();
-			iterator = classesInPackage.iterator();
+			iterator = getClassesInPackage().iterator();
 			while (iterator.hasNext()) {
 				String name = (String) iterator.next();
 				int index = name.lastIndexOf(".");
@@ -161,8 +159,7 @@
 					list.add(p);
 				}
 			}
-			Set templates = getDRLEditor().getTemplates();
-			iterator = templates.iterator();
+			iterator = getTemplates().iterator();
 			while (iterator.hasNext()) {
 				String name = (String) iterator.next();
 				RuleCompletionProposal p = new RuleCompletionProposal(
@@ -181,7 +178,7 @@
 						prefix, className, list);
 				if (!isTemplate) {
 					ClassTypeResolver resolver = new ClassTypeResolver(
-							getDRLEditor().getImports(), ProjectClassLoader
+							getImports(), ProjectClassLoader
 									.getProjectClassLoader(getEditor()));
 					try {
 						Class clazz = resolver.resolveType(className);
@@ -299,6 +296,7 @@
 			}
 			list.add(new RuleCompletionProposal(prefix.length(), "()",
 					"(  )", 2, DROOLS_ICON));
+			// add parameters with possibly matching type
 			DrlParser parser = new DrlParser();
 			try {
 				PackageDescr descr = parser.parse(backText);
@@ -316,7 +314,7 @@
 							RuleCompletionProposal proposal = new RuleCompletionProposal(
 									prefix.length(), paramName);
 							proposal.setPriority(-1);
-							proposal.setImage(METHOD_ICON);
+							proposal.setImage(VARIABLE_ICON);
 							list.add(proposal);
 						}
 					}
@@ -324,6 +322,20 @@
 			} catch (DroolsParserException exc) {
 				// do nothing
 			}
+			// add globals with possibly matching type
+			List globals = getGlobals();
+			if (globals != null) {
+				for (iterator = globals.iterator(); iterator.hasNext(); ) {
+					GlobalDescr global = (GlobalDescr) iterator.next();
+					if (isSubtypeOf(global.getType(), type)) {
+						RuleCompletionProposal proposal = new RuleCompletionProposal(
+							prefix.length(), global.getIdentifier());
+						proposal.setPriority(-1);
+						proposal.setImage(VARIABLE_ICON);
+						list.add(proposal);
+					}
+				}
+			}
 			break;
 		case Location.LOCATION_LHS_INSIDE_EVAL:
 			String content = (String) location
@@ -355,7 +367,7 @@
 						"collect", "collect (  )", 10, DROOLS_ICON));
 				// add all functions
 				if ("".equals(fromText)) {
-					List functions = getDRLEditor().getFunctions();
+					List functions = getFunctions();
 					iterator = functions.iterator();
 					while (iterator.hasNext()) {
 						String name = (String) iterator.next() + "()";
@@ -399,7 +411,7 @@
 
 	private String getPropertyClass(String className, String propertyName) {
 		if (className != null && propertyName != null) {
-			FactTemplateDescr template = getDRLEditor().getTemplate(className);
+			FactTemplateDescr template = getTemplate(className);
 			if (template != null) {
 				Iterator iterator = template.getFields().iterator();
 				while (iterator.hasNext()) {
@@ -411,7 +423,7 @@
 							return type;
 						}
 						ClassTypeResolver resolver = new ClassTypeResolver(
-								getDRLEditor().getImports(), ProjectClassLoader
+								getImports(), ProjectClassLoader
 										.getProjectClassLoader(getEditor()));
 						try {
 							Class clazz = resolver.resolveType(type);
@@ -427,7 +439,7 @@
 				// if not found, return null
 			} else {
 				ClassTypeResolver resolver = new ClassTypeResolver(
-						getDRLEditor().getImports(), ProjectClassLoader
+						getImports(), ProjectClassLoader
 								.getProjectClassLoader(getEditor()));
 				try {
 					Class clazz = resolver.resolveType(className);
@@ -450,6 +462,15 @@
 
 	private Map getRuleParameters(String backText) {
 		Map result = new HashMap();
+		// add globals
+		List globals = getGlobals();
+		if (globals != null) {
+			for (Iterator iterator = globals.iterator(); iterator.hasNext(); ) {
+				GlobalDescr global = (GlobalDescr) iterator.next();
+				result.put(global.getIdentifier(), global.getType());
+			}
+		}
+		// add parameters defined in conditions
 		try {
 			DrlParser parser = new DrlParser();
 			PackageDescr descr = parser.parse(backText);
@@ -515,8 +536,7 @@
 		class1 = convertToNonPrimitiveClass(class1);
 		class2 = convertToNonPrimitiveClass(class2);
 		// TODO add code to take primitive types into account
-		ClassTypeResolver resolver = new ClassTypeResolver(getDRLEditor()
-				.getImports(), ProjectClassLoader
+		ClassTypeResolver resolver = new ClassTypeResolver(getImports(), ProjectClassLoader
 				.getProjectClassLoader(getEditor()));
 		try {
 			Class clazz1 = resolver.resolveType(class1);
@@ -558,7 +578,7 @@
 	private void addRHSFunctionCompletionProposals(List list, String prefix) {
 		Iterator iterator;
 		RuleCompletionProposal prop;
-		List functions = getDRLEditor().getFunctions();
+		List functions = getFunctions();
 		iterator = functions.iterator();
 		while (iterator.hasNext()) {
 			String name = (String) iterator.next() + "()";
@@ -686,7 +706,7 @@
 
 	private boolean addFactTemplatePropertyProposals(String prefix,
 			String templateName, List list) {
-		FactTemplateDescr descr = getDRLEditor().getTemplate(templateName);
+		FactTemplateDescr descr = getTemplate(templateName);
 		if (descr == null) {
 			return false;
 		}

Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/ConstraintCompletionProcessor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/ConstraintCompletionProcessor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/ConstraintCompletionProcessor.java	2007-06-21 21:43:46 UTC (rev 12756)
@@ -0,0 +1,119 @@
+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.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.drools.eclipse.editors.DRLRuleEditor;
+import org.drools.eclipse.editors.completion.RuleCompletionProcessor;
+import org.drools.ruleflow.core.RuleFlowProcess;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Completion for ruleflow constraints. 
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class ConstraintCompletionProcessor extends RuleCompletionProcessor {
+
+	private RuleFlowProcess process;
+	private List imports;
+	
+	public ConstraintCompletionProcessor(RuleFlowProcess process) {
+		super(null);
+		this.process = process;
+	}
+	
+	public IEditorPart getEditor() {
+		IWorkbench workbench = PlatformUI.getWorkbench();
+		if (workbench != null) { 
+			IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
+			if (workbenchWindow != null) {
+				IWorkbenchPage workbenchPage = workbenchWindow.getActivePage(); 
+				if (workbenchPage != null) {
+					return workbenchPage.getActiveEditor();
+				}
+			}
+		}
+		return null;
+	}
+
+    protected String readBackwards(int documentOffset, IDocument doc) throws BadLocationException {
+        int startPart = doc.getPartition(documentOffset).getOffset();
+        String prefix = doc.get(startPart, documentOffset - startPart);
+        return "rule dummy \n when \n" + prefix;
+    }
+    
+    public List getImports() {
+    	if (imports == null) {
+    		loadImports();
+    	}
+    	return imports;
+    }
+    
+    private void loadImports() {
+    	this.imports = new ArrayList();
+    	List imports = process.getImports();
+    	if (imports != null) {
+	    	Iterator iterator = imports.iterator();
+	        while (iterator.hasNext()) {
+	            String importName = (String) iterator.next();
+	            if (importName.endsWith(".*")) {
+	            	IJavaProject javaProject = getJavaProject();
+	            	if (javaProject != null) {
+		                String packageName = importName.substring(0, importName.length() - 2);
+		                this.imports.addAll(DRLRuleEditor.getAllClassesInPackage(packageName, javaProject));
+	            	}
+	            } else {
+	            	this.imports.add(importName);
+	            }
+	        }
+    	}
+    }
+    
+    private IJavaProject getJavaProject() {
+    	IEditorPart editor = getEditor();
+    	if (editor != null && editor.getEditorInput() instanceof IFileEditorInput) {
+			IFile file = ((IFileEditorInput) editor.getEditorInput()).getFile();
+	    	try {
+	    		if (file.getProject().getNature("org.eclipse.jdt.core.javanature") != null) {
+	    			return JavaCore.create(file.getProject());
+	    		}
+	    	} catch (CoreException e) {
+	    		// do nothing
+	    	}
+		}
+    	return null;
+    }
+    
+    public void reset() {
+    	this.imports = null;
+    }
+}

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/ConstraintListDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/ConstraintListDialog.java	2007-06-21 21:43:34 UTC (rev 12755)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/ConstraintListDialog.java	2007-06-21 21:43:46 UTC (rev 12756)
@@ -103,8 +103,6 @@
 
 		final Runnable r = new Runnable() {
 			public void run() {
-
-				// swt version
 				RuleFlowConstraintDialog dialog = new RuleFlowConstraintDialog(
 						getShell(), process);
 				dialog.create();
@@ -120,7 +118,6 @@
 			}
 
 		};
-
 		r.run();
 	}
 

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowConstraintDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowConstraintDialog.java	2007-06-21 21:43:34 UTC (rev 12755)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowConstraintDialog.java	2007-06-21 21:43:46 UTC (rev 12756)
@@ -15,11 +15,28 @@
  * limitations under the License.
  */
 
+import java.util.List;
+
+import org.drools.eclipse.editors.DRLSourceViewerConfig;
+import org.drools.eclipse.editors.scanners.DRLPartionScanner;
 import org.drools.ruleflow.core.Constraint;
 import org.drools.ruleflow.core.RuleFlowProcess;
 import org.drools.ruleflow.core.impl.ConstraintImpl;
 import org.eclipse.jface.dialogs.Dialog;
+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.events.SelectionListener;
 import org.eclipse.swt.graphics.Point;
@@ -42,15 +59,18 @@
 public class RuleFlowConstraintDialog extends Dialog {
 
 	private Constraint constraint;
+	private RuleFlowProcess process;
 	private boolean success;
 	private Button alwaysTrue;
 	private Text nameText;
 	private Text priorityText;
 	private TabFolder tabFolder;
-	private Text translation;
+	private SourceViewer constraintViewer;
+	private ConstraintCompletionProcessor completionProcessor;
 
 	public RuleFlowConstraintDialog(Shell parentShell, RuleFlowProcess process) {
 		super(parentShell);
+		this.process = process;
 		setShellStyle(getShellStyle() | SWT.RESIZE);
 	}
 
@@ -64,9 +84,47 @@
 	}
 
 	private Control createTextualEditor(Composite parent) {
-		translation = new Text(parent, SWT.BORDER);
-		return translation;
+		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;
+			}
+		});
+		IDocument document = new Document();
+		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();
+	}
+	
+	private void setConstraintText(String text) {
+		constraintViewer.getDocument().set(text);
+	}
 
 	public Control createDialogArea(Composite parent) {
 
@@ -81,7 +139,7 @@
 		top.setLayoutData(gd);
 
 		layout = new GridLayout();
-		layout.numColumns = 2;
+		layout.numColumns = 3;
 		top.setLayout(layout);
 
 		Label l1 = new Label(top, SWT.None);
@@ -92,6 +150,7 @@
 		gd = new GridData();
 		gd.horizontalAlignment = GridData.FILL;
 		gd.widthHint = 200;
+		gd.horizontalSpan = 2;
 		nameText.setLayoutData(gd);
 
 		Label l2 = new Label(top, SWT.NONE);
@@ -101,6 +160,7 @@
 		priorityText = new Text(top, SWT.BORDER);
 		gd = new GridData();
 		gd.widthHint = 200;
+		gd.horizontalSpan = 2;
 		priorityText.setLayoutData(gd);
 
 		alwaysTrue = new Button(top, SWT.CHECK);
@@ -108,10 +168,22 @@
 		gd = new GridData();
 		gd.horizontalSpan = 2;
 		alwaysTrue.setLayoutData(gd);
+		
+		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 = 2;
+		gd.horizontalSpan = 3;
 		gd.grabExcessHorizontalSpace = true;
 		gd.grabExcessVerticalSpace = true;
 		gd.verticalAlignment = GridData.FILL;
@@ -134,6 +206,23 @@
 
 		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();
+	}
 
 	protected void okPressed() {
 		int selectionIndex = tabFolder.getSelectionIndex();
@@ -150,7 +239,7 @@
 		success = true;
 		constraint = new ConstraintImpl();
 		constraint.setConstraint(null);
-		constraint.setConstraint(translation.getText());
+		constraint.setConstraint(getConstraintText());
 		constraint.setName(nameText.getText());
 		try {
 			constraint.setPriority(Integer.parseInt(priorityText.getText()));
@@ -166,7 +255,7 @@
 	public void updateConstraint() {
 		constraint = new ConstraintImpl();
 		if (!alwaysTrue.getSelection()) {
-			constraint.setConstraint(translation.getText());
+			constraint.setConstraint(getConstraintText());
 		} else {
 			constraint.setConstraint("eval(true)");
 		}
@@ -188,13 +277,13 @@
 			if ("eval(true)".equals(constraint.getConstraint())) {
 				alwaysTrue.setSelection(true);
 			} else {
-				translation.setText(constraint.getConstraint().toString());
+				setConstraintText(constraint.getConstraint().toString());
 			}
 			tabFolder.setVisible(!alwaysTrue.getSelection());
 			nameText.setText(constraint.getName() == null ? "" : constraint
 					.getName());
 			priorityText.setText(constraint.getPriority() + "");
-			translation.setText(constraint.getConstraint());
+			setConstraintText(constraint.getConstraint());
 		} else {
 			priorityText.setText("1");
 			nameText.setText("constraint");

Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowImportsDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowImportsDialog.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowImportsDialog.java	2007-06-21 21:43:46 UTC (rev 12756)
@@ -0,0 +1,138 @@
+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.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.drools.eclipse.editors.DRLSourceViewerConfig;
+import org.drools.ruleflow.core.RuleFlowProcess;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.contentassist.IContentAssistant;
+import org.eclipse.jface.text.reconciler.IReconciler;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+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 imports.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class RuleFlowImportsDialog extends Dialog {
+
+	private static final Pattern IMPORT_PATTERN = Pattern.compile(
+		"\\n\\s*import\\s+([^\\s;#]+);?", Pattern.DOTALL);
+	
+	private RuleFlowProcess process;
+	private boolean success;
+	private TabFolder tabFolder;
+	private SourceViewer importsViewer;
+	private List imports;
+
+	public RuleFlowImportsDialog(Shell parentShell, RuleFlowProcess process) {
+		super(parentShell);
+		this.process = process;
+		setShellStyle(getShellStyle() | SWT.RESIZE);
+	}
+
+	protected void configureShell(Shell newShell) {
+		super.configureShell(newShell);
+		newShell.setText("Imports editor");
+	}
+
+	protected Point getInitialSize() {
+		return new Point(600, 450);
+	}
+
+	private Control createTextualEditor(Composite parent) {
+		importsViewer = new SourceViewer(parent, null, SWT.BORDER);
+		importsViewer.configure(new DRLSourceViewerConfig(null) {
+			public IReconciler getReconciler(ISourceViewer sourceViewer) {
+				return null;
+			}
+			public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
+				return null;
+			}
+		});
+		IDocument document = new Document(getProcessImports());
+		importsViewer.setDocument(document);
+		return importsViewer.getControl();
+	}
+	
+	private String getProcessImports() {
+		String result = "# define your imports here: e.g. import com.sample.MyClass\n";
+		List imports = process.getImports();
+		if (imports != null) {
+			for (Iterator iterator = imports.iterator(); iterator.hasNext(); ) {
+				result += "import " + (String) iterator.next() + "\n";
+			}
+		}
+		return result;
+	}
+	
+	public Control createDialogArea(Composite parent) {
+		GridLayout layout = new GridLayout();
+		parent.setLayout(layout);
+		layout.numColumns = 1;
+		tabFolder = new TabFolder(parent, SWT.NONE);
+		GridData gd = new GridData();
+		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;
+	}
+	
+	protected void okPressed() {
+		success = true;
+		updateImports();
+		super.okPressed();
+	}
+
+	public boolean isSuccess() {
+		return success;
+	}
+
+	public List getImports() {
+		return imports;
+	}
+	
+	private void updateImports() {
+		this.imports = new ArrayList();
+		Matcher matcher = IMPORT_PATTERN.matcher(importsViewer.getDocument().get());
+		while (matcher.find()) {
+			this.imports.add(matcher.group(1));
+		}
+	}
+}

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/util/ProjectClassLoader.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/util/ProjectClassLoader.java	2007-06-21 21:43:34 UTC (rev 12755)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/util/ProjectClassLoader.java	2007-06-21 21:43:46 UTC (rev 12756)
@@ -8,6 +8,7 @@
 import java.util.List;
 
 import org.drools.eclipse.DroolsEclipsePlugin;
+import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.ResourcesPlugin;
@@ -25,13 +26,17 @@
 	public static URLClassLoader getProjectClassLoader(IEditorPart editor) {
 		IEditorInput input = editor.getEditorInput();
 		if (input instanceof IFileEditorInput) {
-			IProject project = ((IFileEditorInput) input).getFile().getProject();
-			IJavaProject javaProject = JavaCore.create(project);
-			return getProjectClassLoader(javaProject);
+			return getProjectClassLoader(((IFileEditorInput) input).getFile());
 		}
 		return null;
 	}
 
+	public static URLClassLoader getProjectClassLoader(IFile file) {
+		IProject project = file.getProject();
+		IJavaProject javaProject = JavaCore.create(project);
+		return getProjectClassLoader(javaProject);
+	}
+
     public static URLClassLoader getProjectClassLoader(IJavaProject project) {
         List pathElements = getProjectClassPathURLs(project);
         URL urlPaths[] = (URL[]) pathElements.toArray(new URL[pathElements.size()]);

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/wizard/rule/NewRulePackagePage.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/wizard/rule/NewRulePackagePage.java	2007-06-21 21:43:34 UTC (rev 12755)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/wizard/rule/NewRulePackagePage.java	2007-06-21 21:43:46 UTC (rev 12756)
@@ -131,8 +131,9 @@
             return false;
         }
         String fileName = getFileName();
-        if (!fileName.endsWith(".drl")) {
-            setFileName(fileName + ".drl");
+        String extension = expander.getSelection() ? ".dslr" : ".drl";
+        if (!fileName.endsWith(extension)) {
+            setFileName(fileName + extension);
         }
         org.eclipse.core.resources.IFile newFile = createNewFile();
         if (newFile == null)

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/resources/org/drools/eclipse/wizard/dsl/template.dsl
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/resources/org/drools/eclipse/wizard/dsl/template.dsl	2007-06-21 21:43:34 UTC (rev 12755)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/resources/org/drools/eclipse/wizard/dsl/template.dsl	2007-06-21 21:43:46 UTC (rev 12756)
@@ -3,7 +3,7 @@
 [when]Instance is at least {number} and field is "{value}"=i: Instance(number > {number}, location=="{value}")
 [then]Log : "{message}"=System.out.println("{message}");
 [then]Set field of instance to "{value}"=i.setField("{value}");
-[then]Create instance : "{value}"=assert(new Instance("{value}"));
+[then]Create instance : "{value}"=insert(new Instance("{value}"));
 [when]There is no current Instance with field : "{value}"=not Instance(field == "{value}")
 [then]Report error : "{error}"=System.err.println("{error}");
 [then]Retract the fact : '{variable}'=retract({variable}); //this would retract bound variable {variable}

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/resources/org/drools/eclipse/wizard/project/DecisionTableLauncherSample.java.template
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/resources/org/drools/eclipse/wizard/project/DecisionTableLauncherSample.java.template	2007-06-21 21:43:34 UTC (rev 12755)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/resources/org/drools/eclipse/wizard/project/DecisionTableLauncherSample.java.template	2007-06-21 21:43:46 UTC (rev 12756)
@@ -39,7 +39,7 @@
             Message message = new Message();
             message.setMessage(  "Hello World" );
             message.setStatus( Message.HELLO );
-            workingMemory.assertObject( message );
+            workingMemory.insert( message );
             workingMemory.fireAllRules();   
             
             

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/resources/org/drools/eclipse/wizard/project/RuleLauncherSample.java.template
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/resources/org/drools/eclipse/wizard/project/RuleLauncherSample.java.template	2007-06-21 21:43:34 UTC (rev 12755)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/resources/org/drools/eclipse/wizard/project/RuleLauncherSample.java.template	2007-06-21 21:43:46 UTC (rev 12756)
@@ -25,7 +25,7 @@
             Message message = new Message();
             message.setMessage(  "Hello World" );
             message.setStatus( Message.HELLO );
-            workingMemory.assertObject( message );
+            workingMemory.insert( message );
             workingMemory.fireAllRules();   
             
             

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/resources/org/drools/eclipse/wizard/project/Sample.xls.template
===================================================================
(Binary files differ)




More information about the jboss-svn-commits mailing list