Author: KrisVerlaenen Date: 2006-04-17 19:04:51 -0400 (Mon, 17 Apr 2006) New Revision: 3747 Added: labs/jbossrules/trunk/drools-ide/icons/class_obj.gif labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/AbstractCompletionProcessor.java Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/DroolsPluginImages.java labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DSLAdapter.java labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/DefaultCompletionProcessor.java labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/RuleCompletionProcessor.java labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/RuleCompletionProposal.java labs/jbossrules/trunk/drools-ide/src/test/java/org/drools/ide/editors/completion/DRLCompletionProcessorTest.java Log: updated code completion Added: labs/jbossrules/trunk/drools-ide/icons/class_obj.gif =================================================================== (Binary files differ) Property changes on: labs/jbossrules/trunk/drools-ide/icons/class_obj.gif ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/DroolsPluginImages.java =================================================================== --- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/DroolsPluginImages.java 2006-04-17 22:50:46 UTC (rev 3746) +++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/DroolsPluginImages.java 2006-04-17 23:04:51 UTC (rev 3747) @@ -27,6 +27,8 @@ public static final String CREATE_ACTIVATION = "CreateActivation"; public static final String CANCEL_ACTIVATION = "CancelActivation"; public static final String EXECUTE_ACTIVATION = "ExecuteActivation"; + public static final String CLASS = "Class"; + public static final String PACKAGE = "Package"; private static ImageRegistry imageRegistry; private static final String PATH_SUFFIX = "/icons/"; @@ -47,6 +49,8 @@ declareRegistryImage(CREATE_ACTIVATION, "arrowright.GIF"); declareRegistryImage(CANCEL_ACTIVATION, "arrowleft.GIF"); declareRegistryImage(EXECUTE_ACTIVATION, "bluediamond.GIF"); + declareRegistryImage(CLASS, "class_obj.gif"); + declareRegistryImage(PACKAGE, "package_obj.gif"); } /** Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DSLAdapter.java =================================================================== --- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DSLAdapter.java 2006-04-17 22:50:46 UTC (rev 3746) +++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DSLAdapter.java 2006-04-17 23:04:51 UTC (rev 3747) @@ -107,20 +107,18 @@ List conditions = grammar.getMappings( "when" ); List consequences = grammar.getMappings( "then" ); - conditionProposals = new ArrayList(conditions.size()); - consequenceProposals = new ArrayList(consequences.size()); - - buildProposals( conditions, conditionProposals ); - buildProposals( consequences, consequenceProposals ); - + conditionProposals = buildProposals(conditions); + consequenceProposals = buildProposals(consequences); } - private void buildProposals(List suggestions, List proposals) { - for ( Iterator iter = suggestions.iterator(); iter.hasNext(); ) { - NLMappingItem text = (NLMappingItem) iter.next(); - RuleCompletionProposal proposal = new RuleCompletionProposal(text.getNaturalTemplate()); - proposals.add(proposal); + private List buildProposals(List suggestions) { + List result = new ArrayList(suggestions.size()); + Iterator iterator = suggestions.iterator(); + while (iterator.hasNext()) { + NLMappingItem text = (NLMappingItem) iterator.next(); + result.add(text.getNaturalTemplate()); } + return result; } private void closeStream(InputStream stream) { Added: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/AbstractCompletionProcessor.java =================================================================== --- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/AbstractCompletionProcessor.java 2006-04-17 22:50:46 UTC (rev 3746) +++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/AbstractCompletionProcessor.java 2006-04-17 23:04:51 UTC (rev 3747) @@ -0,0 +1,113 @@ +package org.drools.ide.editors.completion; + +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +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; +import org.eclipse.jface.text.contentassist.IContextInformationValidator; +import org.eclipse.ui.part.EditorPart; + + +/** + * + * @author <a href="mailto:kri...@ho...">kris verlaenen </a> + */ +public abstract class AbstractCompletionProcessor implements IContentAssistProcessor { + + private EditorPart editor; + + public AbstractCompletionProcessor(EditorPart editor) { + this.editor = editor; + } + + protected EditorPart getEditor() { + return editor; + } + + public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int documentOffset) { + List proposals = getCompletionProposals(viewer, documentOffset); + if (proposals == null) { + return new ICompletionProposal[0]; + } + Collections.sort(proposals, new RuleCompletionProposal.RuleCompletionProposalComparator()); + ICompletionProposal[] result = makeProposals(proposals, documentOffset); + return result; + } + + /** + * Returns a list of RuleCompletionProposals. + * + * @param viewer + * @param documentOffset + * @return + */ + 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. + */ + protected void filterProposalsOnPrefix(String prefix, List props) { + if (prefix != null) { + Iterator iterator = props.iterator(); + while ( iterator.hasNext() ) { + RuleCompletionProposal item = (RuleCompletionProposal) iterator.next(); + if (!item.getContent().startsWith(prefix)) { + iterator.remove(); + } + } + } + } + + /* + * @see IContentAssistProcessor + */ + public char[] getCompletionProposalAutoActivationCharacters() { + return null; + } + + /* + * @see IContentAssistProcessor + */ + public char[] getContextInformationAutoActivationCharacters() { + return null; + } + + /* + * @see IContentAssistProcessor + */ + public IContextInformationValidator getContextInformationValidator() { + return null; + } + + /* + * @see IContentAssistProcessor + */ + public IContextInformation[] computeContextInformation(ITextViewer viewer, int documentOffset) { + return null; + } + + /* + * @see IContentAssistProcessor + */ + public String getErrorMessage() { + return null; + } +} Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/DefaultCompletionProcessor.java =================================================================== --- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/DefaultCompletionProcessor.java 2006-04-17 22:50:46 UTC (rev 3746) +++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/DefaultCompletionProcessor.java 2006-04-17 23:04:51 UTC (rev 3747) @@ -1,11 +1,11 @@ package org.drools.ide.editors.completion; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.regex.Pattern; import org.drools.ide.DroolsIDEPlugin; +import org.drools.ide.DroolsPluginImages; import org.eclipse.core.resources.IProject; import org.eclipse.jdt.core.CompletionRequestor; import org.eclipse.jdt.core.IJavaProject; @@ -13,12 +13,6 @@ import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextViewer; -import org.eclipse.jface.text.ITypedRegion; -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; -import org.eclipse.jface.text.contentassist.IContextInformationValidator; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.part.EditorPart; @@ -29,100 +23,47 @@ * partition. * The provides the content assistance for basic rule assembly stuff. * - * Subclasses enhance this when a user is actually editing a rule. - * * This processor will also read behind the current editing position, to provide some context to * help provide the pop up list. * * @author Michael Neale */ -public class DefaultCompletionProcessor implements IContentAssistProcessor { +public class DefaultCompletionProcessor extends AbstractCompletionProcessor { private static final String NEW_RULE_TEMPLATE = "rule \"new rule\"\n\n\twhen\n\n\tthen\n\nend"; private static final String NEW_QUERY_TEMPLATE = "query \"query name\"\n\t#conditions\nend"; private static final String NEW_FUNCTION_TEMPLATE = "function void yourFunction(Type arg) {\n\t/* code goes here*/\n}"; private static final Pattern IMPORT_PATTERN = Pattern.compile(".*\\Wimport\\W[^;]*", Pattern.DOTALL); - private EditorPart editor; - - public DefaultCompletionProcessor() { - } - public DefaultCompletionProcessor(EditorPart editor) { - this.editor = editor; + super(editor); } - /** Subclasses *should* override this to change the list. */ - protected List getPossibleProposals(ITextViewer viewer, String backText) { - List list = new ArrayList(); - list.add(new RuleCompletionProposal("rule", NEW_RULE_TEMPLATE, 6)); - list.add(new RuleCompletionProposal("import")); - list.add(new RuleCompletionProposal("expander")); - list.add(new RuleCompletionProposal("global")); - list.add(new RuleCompletionProposal("package")); - list.add(new RuleCompletionProposal("query", NEW_QUERY_TEMPLATE)); - list.add(new RuleCompletionProposal("function", NEW_FUNCTION_TEMPLATE)); - return list; - } - - - /** - * This will filter based on what was typed in previously. - */ - public ICompletionProposal[] computeCompletionProposals( - ITextViewer viewer, - int documentOffset) { - -// partitionDebug( viewer, -// documentOffset ); - - Offset offset = new Offset(documentOffset); - - + protected List getCompletionProposals(ITextViewer viewer, int documentOffset) { try { - IDocument doc = viewer.getDocument(); - - - String backText = readBackwards( offset, - doc ); - - //System.out.println("back text: " + backText); - - if (doesPrefixExist(backText)) { - String prefix = stripWhiteSpace(backText); - offset.prefix = prefix; - } - - List props = null; - if (IMPORT_PATTERN.matcher(backText).matches()) { - String classNameStart = backText.substring(backText.lastIndexOf("import") + 7); - props = getAllClassProposals(classNameStart); - } else { - props = getPossibleProposals(viewer, backText); - props = filterProposals(offset, props); - } - Collections.sort(props, new RuleCompletionProposal.RuleCompletionProposalComparator()); - - ICompletionProposal[] result = new ICompletionProposal[props.size()]; - for (int i = 0; i < props.size(); i++) { - result[i] = makeProposal( documentOffset, - offset, - props, - i ); - } - return result; - - } catch (BadLocationException e) { + IDocument doc = viewer.getDocument(); + String backText = readBackwards( documentOffset, doc ); + + String prefix = ""; + prefix = stripWhiteSpace(backText); + + List props = null; + if (IMPORT_PATTERN.matcher(backText).matches()) { + String classNameStart = backText.substring(backText.lastIndexOf("import") + 7); + props = getAllClassProposals(classNameStart, documentOffset); + } else { + props = getPossibleProposals(viewer, documentOffset, backText, prefix); + } + return props; + } catch (Throwable t) { + DroolsIDEPlugin.log(t); } - return null; - } - - private List getAllClassProposals(String classNameStart) { + private List getAllClassProposals(final String classNameStart, final int documentOffset) { final List list = new ArrayList(); - IEditorInput input = editor.getEditorInput(); + IEditorInput input = getEditor().getEditorInput(); if (input instanceof IFileEditorInput) { IProject project = ((IFileEditorInput) input).getFile().getProject(); IJavaProject javaProject = JavaCore.create(project); @@ -130,13 +71,22 @@ CompletionRequestor requestor = new CompletionRequestor() { public void accept(org.eclipse.jdt.core.CompletionProposal proposal) { String className = new String(proposal.getCompletion()); - String completion = className + (proposal.getKind() == org.eclipse.jdt.core.CompletionProposal.PACKAGE_REF ? "." : ";"); - list.add(new RuleCompletionProposal(className, completion)); + System.out.println(className); + 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(), className, className + ";"); + prop.setImage(DroolsPluginImages.getImage(DroolsPluginImages.CLASS)); + list.add(prop); + } + // ignore all other proposals } }; try { - javaProject.newEvaluationContext().codeComplete("import " + classNameStart, classNameStart.length() + 7, requestor); + javaProject.newEvaluationContext().codeComplete(classNameStart, classNameStart.length(), requestor); } catch (Throwable t) { DroolsIDEPlugin.log(t); } @@ -144,163 +94,54 @@ return list; } - /** - * Just used for debugging, when it all gets to much. - */ - private void partitionDebug(ITextViewer viewer, - int documentOffset) { - try { - ITypedRegion region = viewer.getDocument().getPartition(documentOffset); - System.out.println("Region type: " + region.getType()); - System.out.println("Offset: " + documentOffset); - System.out.println("Region offset: " + region.getOffset()); - System.out.println("Region length: " + region.getLength()); - - - } - catch ( BadLocationException e1 ) { - - e1.printStackTrace(); - } + protected List getPossibleProposals(ITextViewer viewer, int documentOffset, 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)); + filterProposalsOnPrefix(prefix, list); + return list; } - - protected CompletionProposal makeProposal(int documentOffset, - Offset offset, - List props, - int i) { - RuleCompletionProposal proposal = (RuleCompletionProposal) props.get(i); - -// return new CompletionProposal(replacement, -// documentOffset - offset.getPrefixLength(), offset.getPrefixLength(), replacement.length()); - return new CompletionProposal(proposal.getContent(), - documentOffset - offset.getPrefixLength(), offset.getPrefixLength(), proposal.getOffset(), - null, proposal.getDisplay(), null, null); - - } - - - - - /** Filter the proposals based on what was typed. */ - private List filterProposals(Offset offset, List props) throws BadLocationException { - if (offset.prefix != null) { - props = filterList(props, offset.prefix); - } - return props; - } - - /** * Read some text from behind the cursor position. * This provides context to both filter what is shown based * on what the user has typed in, and also to provide more information for the * list of suggestions based on context. */ - private String readBackwards(Offset offset, - IDocument doc) throws BadLocationException { - int startPart = doc.getPartition(offset.documentOffset).getOffset(); + protected String readBackwards(int documentOffset, IDocument doc) throws BadLocationException { + int startPart = doc.getPartition(documentOffset).getOffset(); if (startPart == 0) { - if (offset.documentOffset < 32) { + if (documentOffset < 32) { startPart = 0; } else { - startPart = offset.documentOffset - 32; + startPart = documentOffset - 32; } } - String prefix = doc.get(startPart, - offset.documentOffset - startPart); + String prefix = doc.get(startPart, documentOffset - startPart); return prefix; } - - /** Filter the list by prefix */ - List filterList(List list, String prefix) { - - List result = new ArrayList(); - for ( int i = 0; i < list.size(); i++ ) { - RuleCompletionProposal item = (RuleCompletionProposal) list.get(i); - if (item.getDisplay().startsWith(prefix)) { - result.add(item); - } - } - return result; - } - - boolean doesPrefixExist(String s) { - if (s.length() == 0) return false; - return !(s.charAt(s.length() - 1) == ' '); - } - /** Looks behind, gets stuff after the white space. Basically ripping out the last word.*/ - String stripWhiteSpace(String prefix) { - - char[] c = prefix.toCharArray(); - - int start = 0; - for (int i = c.length - 1; i >=0; i-- ) { - if (Character.isWhitespace(c[i])) { - start = i + 1; - break; - } - } - - prefix = prefix.substring(start, prefix.length()); - return prefix; + protected String stripWhiteSpace(String prefix) { + if (prefix.charAt(prefix.length() - 1) == ' ') { + return ""; + } else { + char[] c = prefix.toCharArray(); + int start = 0; + for (int i = c.length - 1; i >=0; i-- ) { + if (Character.isWhitespace(c[i])) { + start = i + 1; + break; + } + } + prefix = prefix.substring(start, prefix.length()); + return prefix; + } } - - /* (non-Javadoc) - * Method declared on IContentAssistProcessor - */ - public char[] getCompletionProposalAutoActivationCharacters() { - return null; - } - - /* (non-Javadoc) - * Method declared on IContentAssistProcessor - */ - public char[] getContextInformationAutoActivationCharacters() { - return null; - } - - // For Context information - /* (non-Javadoc) - * Method declared on IContentAssistProcessor - */ - public IContextInformationValidator getContextInformationValidator() { - return null; - } - - /* (non-Javadoc) - * Method declared on IContentAssistProcessor - */ - public IContextInformation[] computeContextInformation( - ITextViewer viewer, - int documentOffset) { - return null; - } - - /* (non-Javadoc) - * Method declared on IContentAssistProcessor - */ - public String getErrorMessage() { - return null; - } - - - /** used to track where to drop in replacement stuff */ - static class Offset { - - public int documentOffset; - public String prefix; - public Offset(int documentOffset) { - this.documentOffset = documentOffset; - } - - - public int getPrefixLength() { - if (prefix == null) return 0; - return prefix.length(); - } - } } Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/RuleCompletionProcessor.java =================================================================== --- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/RuleCompletionProcessor.java 2006-04-17 22:50:46 UTC (rev 3746) +++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/RuleCompletionProcessor.java 2006-04-17 23:04:51 UTC (rev 3747) @@ -4,9 +4,17 @@ import java.util.List; import java.util.regex.Pattern; +import org.drools.ide.DroolsIDEPlugin; import org.drools.ide.editors.DRLRuleEditor; import org.drools.ide.editors.DSLAdapter; +import org.eclipse.core.resources.IProject; +import org.eclipse.jdt.core.CompletionRequestor; +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.JavaCore; +import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextViewer; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.part.FileEditorInput; @@ -25,53 +33,88 @@ */ public class RuleCompletionProcessor extends DefaultCompletionProcessor { - static final Pattern condition = Pattern.compile(".*\\Wwhen\\W.*", Pattern.DOTALL); + private static final Pattern condition = Pattern.compile(".*\\Wwhen\\W.*", Pattern.DOTALL); + private static final Pattern consequence = Pattern.compile(".*\\Wthen\\W.*", Pattern.DOTALL); + private static final Pattern query = Pattern.compile(".*\\Wquery\\W.*", Pattern.DOTALL); - static final Pattern consequence = Pattern.compile(".*\\Wthen\\W.*", Pattern.DOTALL); - static final Pattern query = Pattern.compile(".*\\Wquery\\W.*", Pattern.DOTALL); - - private DRLRuleEditor editor; - public RuleCompletionProcessor(DRLRuleEditor editor) { super(editor); - this.editor = editor; } - protected List getPossibleProposals(ITextViewer viewer, String backText) { - - List list = new ArrayList(); - DSLAdapter adapter = getDSLAdapter(viewer, editor); - - if (query.matcher( backText ).matches()) { - list.addAll(adapter.listConditionItems()); - } else if (consequence.matcher(backText).matches()) { - list.addAll(adapter.listConsequenceItems()); - if (!adapter.hasConsequences()) { - list.add(new RuleCompletionProposal("modify", "modify( );")); - list.add(new RuleCompletionProposal("retract", "retract( );")); - list.add(new RuleCompletionProposal("assert", "assert( );")); - } - } else if (condition.matcher(backText).matches()) { - list.addAll(adapter.listConditionItems()); - if (!adapter.hasConditions()) { - list.add( new RuleCompletionProposal("exists") ); - list.add( new RuleCompletionProposal("not") ); - list.add( new RuleCompletionProposal("and") ); - list.add( new RuleCompletionProposal("or") ); - list.add( new RuleCompletionProposal("eval", "eval( )") ); - } - list.add(new RuleCompletionProposal("then", "then\n\t")); - } else { - //we are in rule header - list.add(new RuleCompletionProposal("salience")); - list.add(new RuleCompletionProposal("no-loop")); - list.add(new RuleCompletionProposal("agenda-group")); - list.add(new RuleCompletionProposal("duration")); - list.add(new RuleCompletionProposal("auto-focus")); - list.add(new RuleCompletionProposal("when", "when\n\t")); + protected DRLRuleEditor getDRLEditor() { + return (DRLRuleEditor) getEditor(); + } + + protected List getCompletionProposals(ITextViewer viewer, final int documentOffset) { + try { + final List list = new ArrayList(); + DSLAdapter adapter = getDSLAdapter(viewer); + + IDocument doc = viewer.getDocument(); + String backText = readBackwards(documentOffset, doc); + + final String prefix = stripWhiteSpace(backText); + + if (query.matcher(backText).matches()) { + list.addAll(adapter.listConditionItems()); + } else if (consequence.matcher(backText).matches()) { + list.addAll(adapter.listConsequenceItems()); + if (!adapter.hasConsequences()) { + list.add(new RuleCompletionProposal(prefix.length(), "modify", "modify( );")); + list.add(new RuleCompletionProposal(prefix.length(), "retract", "retract( );")); + list.add(new RuleCompletionProposal(prefix.length(), "assert", "assert( );")); + filterProposalsOnPrefix(prefix, list); + +// 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 display = new String(proposal.getCompletion()); +// String completion = display; +// if (prefix.lastIndexOf(".") != -1) { +// completion = prefix.substring(0, prefix.lastIndexOf(".") + 1) + completion; +// } +// System.out.println(completion); +// list.add(new RuleCompletionProposal(documentOffset, prefix.length(), display, completion)); +// } +// }; +// +// try { +// javaProject.newEvaluationContext().codeComplete(backText, backText.length(), requestor); +// } catch (Throwable t) { +// DroolsIDEPlugin.log(t); +// } +// } + } + } else if (condition.matcher(backText).matches()) { + list.addAll(adapter.listConditionItems()); + if (!adapter.hasConditions()) { + list.add(new RuleCompletionProposal(prefix.length(), "exists")); + list.add(new RuleCompletionProposal(prefix.length(), "not")); + list.add(new RuleCompletionProposal(prefix.length(), "and")); + list.add(new RuleCompletionProposal(prefix.length(), "or")); + list.add(new RuleCompletionProposal(prefix.length(), "eval", "eval( )")); + } + list.add(new RuleCompletionProposal(prefix.length(), "then", "then\n\t")); + filterProposalsOnPrefix(prefix, list); + } else { + //we are in rule header + list.add(new RuleCompletionProposal(prefix.length(), "salience")); + list.add(new RuleCompletionProposal(prefix.length(), "no-loop")); + list.add(new RuleCompletionProposal(prefix.length(), "agenda-group")); + list.add(new RuleCompletionProposal(prefix.length(), "duration")); + list.add(new RuleCompletionProposal(prefix.length(), "auto-focus")); + list.add(new RuleCompletionProposal(prefix.length(), "when", "when\n\t")); + filterProposalsOnPrefix(prefix, list); + } + return list; + } catch (Throwable t) { + DroolsIDEPlugin.log(t); } - - return list; + return null; } /** @@ -81,16 +124,20 @@ * * This delegates to DSLAdapter to poke around the project to try and load the DSL. */ - private DSLAdapter getDSLAdapter(ITextViewer viewer, DRLRuleEditor editor) { - DSLAdapter adapter = editor.getDSLAdapter(); - if (adapter == null) { - String content = viewer.getDocument().get(); - adapter = new DSLAdapter(content, ((FileEditorInput) editor.getEditorInput()).getFile()); - if (adapter.isValid()) { - editor.setDSLAdapter( adapter ); - } - } - return adapter; + private DSLAdapter getDSLAdapter(ITextViewer viewer) { + // TODO: cache DSL adapter in plugin, and reset when dsl file saved + // retrieve dsl name always (might have changed) and try retrieving + // cached dsl from plugin first + return new DSLAdapter(viewer.getDocument().get(), ((FileEditorInput) getEditor().getEditorInput()).getFile()); +// DSLAdapter adapter = getDRLEditor().getDSLAdapter(); +// if (adapter == null) { +// String content = viewer.getDocument().get(); +// adapter = new DSLAdapter(content, ((FileEditorInput) getEditor().getEditorInput()).getFile()); +// if (adapter.isValid()) { +// getDRLEditor().setDSLAdapter(adapter); +// } +// } +// return adapter; } Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/RuleCompletionProposal.java =================================================================== --- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/RuleCompletionProposal.java 2006-04-17 22:50:46 UTC (rev 3746) +++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/RuleCompletionProposal.java 2006-04-17 23:04:51 UTC (rev 3747) @@ -2,6 +2,8 @@ import java.util.Comparator; +import org.eclipse.swt.graphics.Image; + /** * Holds a completion proposal to be popped up. * @@ -12,23 +14,26 @@ private String content; private String display; - private int offset; + private int replacementLength; + private int cursorPosition; + private Image image; /** This is used when the stuff that is displayed, is the stuff that is used. */ - public RuleCompletionProposal(String content) { - this(content, content); + public RuleCompletionProposal(int replacementLength, String content) { + this(replacementLength, content, content); } /** This is used when a different display value is shown to what is put in when selected. */ - public RuleCompletionProposal(String display, String content) { - this(display, content, content.length()); + public RuleCompletionProposal(int replacementLength, String display, String content) { + this(replacementLength, display, content, content.length()); } /** This is used when a different display value is shown to what is put in when selected. */ - public RuleCompletionProposal(String display, String content, int offset) { + public RuleCompletionProposal(int replacementLength, String display, String content, int cursorPosition) { + this.replacementLength = replacementLength; this.content = content; this.display = display; - this.offset = offset; + this.cursorPosition = cursorPosition; } public String getContent() { @@ -39,10 +44,22 @@ return display; } - public int getOffset() { - return offset; + public int getReplacementLength() { + return replacementLength; + } + + public int getCursorPosition() { + return cursorPosition; } + public Image getImage() { + return image; + } + + public void setImage(Image image) { + this.image = image; + } + public String toString() { return content; } @@ -53,5 +70,4 @@ .compareTo(((RuleCompletionProposal) arg1).getDisplay()); } } - } Modified: labs/jbossrules/trunk/drools-ide/src/test/java/org/drools/ide/editors/completion/DRLCompletionProcessorTest.java =================================================================== --- labs/jbossrules/trunk/drools-ide/src/test/java/org/drools/ide/editors/completion/DRLCompletionProcessorTest.java 2006-04-17 22:50:46 UTC (rev 3746) +++ labs/jbossrules/trunk/drools-ide/src/test/java/org/drools/ide/editors/completion/DRLCompletionProcessorTest.java 2006-04-17 23:04:51 UTC (rev 3747) @@ -18,32 +18,28 @@ } - public void testPrefixExist() { - DefaultCompletionProcessor proc = new DefaultCompletionProcessor(null); - assertFalse(proc.doesPrefixExist("something ")); - assertTrue(proc.doesPrefixExist("y")); - } - public void testPrefixFiltering() { DefaultCompletionProcessor proc = new DefaultCompletionProcessor(null); - List raw = new ArrayList(); - raw.add(new RuleCompletionProposal("aardvark", "something")); - raw.add(new RuleCompletionProposal("smeg")); - raw.add(new RuleCompletionProposal("apple")); - raw.add(new RuleCompletionProposal("ape", "zzzzz")); + List list = new ArrayList(); + list.add(new RuleCompletionProposal(0, "aardvark", "something")); + list.add(new RuleCompletionProposal(0, "smeg")); + list.add(new RuleCompletionProposal(0, "apple")); + list.add(new RuleCompletionProposal(0, "ape", "ape")); - List result = proc.filterList(raw, "a"); - assertEquals(3, result.size()); - assertEquals("something", result.get(0).toString()); - assertEquals("apple", result.get(1).toString()); - assertEquals("zzzzz", result.get(2).toString()); + proc.filterProposalsOnPrefix("a", list); + assertEquals(2, list.size()); + assertEquals("apple", list.get(0).toString()); + assertEquals("ape", list.get(1).toString()); - result = proc.filterList(raw, "xzyz"); - assertEquals(0, result.size()); - - + list = new ArrayList(); + list.add(new RuleCompletionProposal(0, "aardvark", "something")); + list.add(new RuleCompletionProposal(0, "smeg")); + list.add(new RuleCompletionProposal(0, "apple")); + list.add(new RuleCompletionProposal(0, "ape", "zzzzz")); + proc.filterProposalsOnPrefix("xzyz", list); + assertEquals(0, list.size()); } } |