[jboss-svn-commits] JBL Code SVN: r9858 - in labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide: editors and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Feb 28 18:29:06 EST 2007


Author: woolfel
Date: 2007-02-28 18:29:06 -0500 (Wed, 28 Feb 2007)
New Revision: 9858

Added:
   labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/AbstractRuleEditor.java
   labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/BRLSourceViewerConfig.java
Modified:
   labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/DroolsIDEPlugin.java
   labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLReconcilingStrategy.java
   labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLRuleEditor.java
   labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLSourceViewerConfig.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/outline/RuleContentOutlinePage.java
Log:
I've refactored the editor classes in preperation for making a separate BRLEditor

peter

Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/DroolsIDEPlugin.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/DroolsIDEPlugin.java	2007-02-28 23:11:26 UTC (rev 9857)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/DroolsIDEPlugin.java	2007-02-28 23:29:06 UTC (rev 9858)
@@ -30,6 +30,7 @@
 import org.drools.ide.DRLInfo.RuleInfo;
 import org.drools.ide.builder.DroolsBuilder;
 import org.drools.ide.builder.Util;
+import org.drools.ide.editors.AbstractRuleEditor;
 import org.drools.ide.editors.DRLRuleEditor;
 import org.drools.ide.editors.DSLAdapter;
 import org.drools.ide.preferences.IDroolsConstants;
@@ -223,7 +224,7 @@
 		return generateParsedResource(resource, compile);
 	}
 	
-	public DRLInfo parseResource(DRLRuleEditor editor, boolean useUnsavedContent, boolean compile) throws DroolsParserException {
+	public DRLInfo parseResource(AbstractRuleEditor editor, boolean useUnsavedContent, boolean compile) throws DroolsParserException {
 		IResource resource = editor.getResource();
 		if (!editor.isDirty() || !useUnsavedContent) {
 			DRLInfo result = (DRLInfo) compiledRules.get(resource);

Added: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/AbstractRuleEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/AbstractRuleEditor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/AbstractRuleEditor.java	2007-02-28 23:29:06 UTC (rev 9858)
@@ -0,0 +1,324 @@
+package org.drools.ide.editors;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.drools.compiler.DroolsParserException;
+import org.drools.ide.DRLInfo;
+import org.drools.ide.DroolsIDEPlugin;
+import org.drools.ide.debug.core.IDroolsDebugConstants;
+import org.drools.ide.editors.outline.RuleContentOutlinePage;
+import org.drools.ide.editors.scanners.RuleEditorMessages;
+import org.drools.ide.preferences.IDroolsConstants;
+import org.drools.lang.descr.FactTemplateDescr;
+import org.drools.lang.descr.FunctionDescr;
+import org.drools.lang.descr.FunctionImportDescr;
+import org.drools.lang.descr.ImportDescr;
+import org.drools.lang.descr.PackageDescr;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.debug.ui.actions.IToggleBreakpointsTarget;
+import org.eclipse.debug.ui.actions.ToggleBreakpointAction;
+import org.eclipse.jdt.core.CompletionRequestor;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.preference.PreferenceConverter;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.IVerticalRuler;
+import org.eclipse.jface.text.source.projection.ProjectionAnnotation;
+import org.eclipse.jface.text.source.projection.ProjectionAnnotationModel;
+import org.eclipse.jface.text.source.projection.ProjectionSupport;
+import org.eclipse.jface.text.source.projection.ProjectionViewer;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.editors.text.TextEditor;
+import org.eclipse.ui.texteditor.ITextEditorActionConstants;
+import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
+import org.eclipse.ui.texteditor.SourceViewerDecorationSupport;
+import org.eclipse.ui.texteditor.TextOperationAction;
+import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+
+/**
+ * Generic rule editor for drools.
+ * @author Michael Neale
+ */
+public abstract class AbstractRuleEditor extends TextEditor {
+
+	//used to provide additional content assistance/popups when DSLs are used.
+    protected DSLAdapter dslAdapter;
+    protected List imports;
+    protected List functions;
+    protected Map templates;
+    protected String packageName;
+    protected List classesInPackage;
+	protected RuleContentOutlinePage ruleContentOutline = null;
+
+    protected Annotation[] oldAnnotations;
+    protected ProjectionAnnotationModel annotationModel;
+	protected DroolsPairMatcher bracketMatcher = new DroolsPairMatcher();
+	
+	public AbstractRuleEditor() {
+        super();
+    }
+
+	public void createPartControl(Composite parent) {
+		super.createPartControl(parent);
+		ProjectionViewer viewer = (ProjectionViewer) getSourceViewer();
+		ProjectionSupport projectionSupport = new ProjectionSupport(viewer,
+			getAnnotationAccess(), getSharedColors());
+		projectionSupport.install();
+		// turn projection mode on
+		viewer.doOperation(ProjectionViewer.TOGGLE);
+		annotationModel = viewer.getProjectionAnnotationModel();
+	}
+	
+	protected ISourceViewer createSourceViewer(Composite parent,
+			IVerticalRuler ruler, int styles) {
+		ISourceViewer viewer = new ProjectionViewer(parent, ruler,
+				getOverviewRuler(), isOverviewRulerVisible(), styles);
+		// ensure decoration support has been created and configured.
+		getSourceViewerDecorationSupport(viewer);
+		return viewer;
+	}
+	
+	protected void configureSourceViewerDecorationSupport(SourceViewerDecorationSupport support) {
+		support.setCharacterPairMatcher(bracketMatcher);
+		support.setMatchingCharacterPainterPreferenceKeys(
+			IDroolsConstants.DRL_EDITOR_MATCHING_BRACKETS,
+			IDroolsConstants.DRL_EDITOR_MATCHING_BRACKETS_COLOR);
+		super.configureSourceViewerDecorationSupport(support);
+	}
+	
+	public void updateFoldingStructure(List positions) {
+		Annotation[] annotations = new Annotation[positions.size()];
+		// this will hold the new annotations along
+		// with their corresponding positions
+		HashMap newAnnotations = new HashMap();
+		for (int i = 0; i < positions.size(); i++) {
+			ProjectionAnnotation annotation = new ProjectionAnnotation();
+			newAnnotations.put(annotation, positions.get(i));
+			annotations[i] = annotation;
+		}
+		annotationModel.modifyAnnotations(oldAnnotations, newAnnotations, null);
+		oldAnnotations = annotations;
+	}
+
+	/** For user triggered content assistance */
+	protected void createActions() {
+		super.createActions();
+
+		IAction a = new TextOperationAction(RuleEditorMessages
+				.getResourceBundle(), "ContentAssistProposal.", this,
+				ISourceViewer.CONTENTASSIST_PROPOSALS);
+		a
+				.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS);
+		setAction("ContentAssistProposal", a);
+
+		a = new TextOperationAction(
+				RuleEditorMessages.getResourceBundle(),
+				"ContentAssistTip.", this, ISourceViewer.CONTENTASSIST_CONTEXT_INFORMATION); //$NON-NLS-1$
+		a
+				.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_CONTEXT_INFORMATION);
+		setAction("ContentAssistTip", a);
+		
+		a = new ToggleBreakpointAction(getSite().getPart() , null, getVerticalRuler());
+		setAction(ITextEditorActionConstants.RULER_DOUBLE_CLICK, a);
+
+	}
+	
+	/** Return the DSL adapter if one is present */
+	public DSLAdapter getDSLAdapter() {
+		return dslAdapter;
+	}
+
+	/** Set the DSL adapter, used for content assistance */
+	public void setDSLAdapter(DSLAdapter adapter) {
+		dslAdapter = adapter;
+	}
+
+	public List getImports() {
+		if (imports == null) {
+			loadImportsAndFunctions();
+		}
+		return imports;
+	}
+	
+	public String getContent() {
+		return getSourceViewer().getDocument().get();
+	}
+	
+	public IResource getResource() {
+		if (getEditorInput() instanceof IFileEditorInput) {
+			return ((IFileEditorInput) getEditorInput()).getFile();
+		}
+		return null;
+	}
+	
+	protected abstract void loadImportsAndFunctions();
+
+	public List getFunctions() {
+		if (functions == null) {
+			loadImportsAndFunctions();
+		}
+		return functions;
+	}
+	
+	public Set getTemplates() {
+		if (templates == null) {
+			loadImportsAndFunctions();
+		}
+		return templates.keySet();
+	}
+	
+	public FactTemplateDescr getTemplate(String name) {
+		if (templates == null) {
+			loadImportsAndFunctions();
+		}
+		return (FactTemplateDescr) templates.get(name);
+	}
+	
+	public String getPackage() {
+		if (packageName == null) {
+			loadImportsAndFunctions();
+		}
+		return packageName;
+	}
+	
+	public List getClassesInPackage() {
+		if (classesInPackage == null) {
+			classesInPackage = getAllClassesInPackage(getPackage());
+		}
+		return classesInPackage;
+	}
+	
+	protected List getAllClassesInPackage(String packageName) {
+		final 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
+					}
+				};
+	
+				try {
+					javaProject.newEvaluationContext().codeComplete(packageName + ".", packageName.length() + 1, requestor);
+				} catch (Throwable t) {
+					DroolsIDEPlugin.log(t);
+				}
+			}
+		}
+		return list;
+	}
+
+	protected List getAllStaticMethodsInClass(String className) {
+		final List list = new ArrayList();
+		if (className != 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 functionName = new String(proposal.getCompletion());
+						if (proposal.getKind() == org.eclipse.jdt.core.CompletionProposal.METHOD_REF) {
+							list.add(functionName.substring(0, functionName.length() - 2)); // remove the ()
+						}
+						// ignore all other proposals
+					}
+				};
+	
+				try {
+					javaProject.newEvaluationContext().codeComplete(className + ".", className.length() + 1, requestor);
+				} catch (Throwable t) {
+					DroolsIDEPlugin.log(t);
+				}
+			}
+		}
+		return list;
+	}
+	
+	public Object getAdapter(Class adapter) {
+		if (adapter.equals(IContentOutlinePage.class)) {
+			return getContentOutline();
+		} else if (adapter.equals(IToggleBreakpointsTarget.class)) {
+			return getBreakpointAdapter();
+		}
+		return super.getAdapter(adapter);
+	}
+
+	protected abstract ContentOutlinePage getContentOutline();
+
+	private Object getBreakpointAdapter() {
+		return new DroolsLineBreakpointAdapter();
+	}
+
+	public void doSave(IProgressMonitor monitor) {
+		// invalidate cached parsed rules
+		DroolsIDEPlugin.getDefault().invalidateResource(getResource());
+		// save
+		super.doSave(monitor);
+		// update outline view
+		if (ruleContentOutline != null) {
+			ruleContentOutline.update();
+		}
+		// remove cached content
+		dslAdapter = null;
+		imports = null;
+		functions = null;
+		templates = null;
+		packageName = null;
+		classesInPackage = null;
+	}
+
+	public void gotoMarker(IMarker marker) {
+		try {
+			if (marker.getType().equals(IDroolsDebugConstants.DROOLS_MARKER_TYPE)) {
+				int line = marker.getAttribute(IDroolsDebugConstants.DRL_LINE_NUMBER, -1);
+	            if (line > -1)
+	            	--line;
+	                try {
+	                    IDocument document = getDocumentProvider().getDocument(getEditorInput());
+	                    selectAndReveal(document.getLineOffset(line), document.getLineLength(line));
+	                } catch(BadLocationException exc) {
+	                	DroolsIDEPlugin.log(exc);
+	                }
+			} else {
+				super.gotoMarker(marker);
+			}
+		} catch (CoreException exc) {
+			DroolsIDEPlugin.log(exc);
+		}
+	}
+	
+	public void dispose() {
+		super.dispose();
+		if (bracketMatcher != null) {
+			bracketMatcher.dispose();
+			bracketMatcher = null;
+		}
+	}
+}

Added: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/BRLSourceViewerConfig.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/BRLSourceViewerConfig.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/BRLSourceViewerConfig.java	2007-02-28 23:29:06 UTC (rev 9858)
@@ -0,0 +1,127 @@
+package org.drools.ide.editors;
+
+import org.drools.ide.editors.completion.DefaultCompletionProcessor;
+import org.drools.ide.editors.completion.RuleCompletionProcessor;
+import org.drools.ide.editors.scanners.DRLPartionScanner;
+import org.drools.ide.editors.scanners.DRLScanner;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.jface.text.contentassist.ContentAssistant;
+import org.eclipse.jface.text.contentassist.IContentAssistant;
+import org.eclipse.jface.text.presentation.IPresentationReconciler;
+import org.eclipse.jface.text.presentation.PresentationReconciler;
+import org.eclipse.jface.text.reconciler.IReconciler;
+import org.eclipse.jface.text.reconciler.MonoReconciler;
+import org.eclipse.jface.text.rules.BufferedRuleBasedScanner;
+import org.eclipse.jface.text.rules.DefaultDamagerRepairer;
+import org.eclipse.jface.text.rules.Token;
+import org.eclipse.jface.text.source.DefaultAnnotationHover;
+import org.eclipse.jface.text.source.IAnnotationHover;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.SourceViewerConfiguration;
+import org.eclipse.swt.graphics.Color;
+
+/**
+ * Source viewer config wires up the syntax highlighting, partitioning
+ * and content assistance.
+ * 
+ * @author Michael Neale
+ *
+ */
+public class BRLSourceViewerConfig extends SourceViewerConfiguration {
+
+	private DRLScanner scanner;
+
+	private static Color DEFAULT_COLOR =
+		ColorManager.getInstance().getColor(ColorManager.DEFAULT);
+
+	private AbstractRuleEditor editor;
+
+	public BRLSourceViewerConfig(AbstractRuleEditor editor) {
+		this.editor = editor;
+	}
+
+	protected DRLScanner getScanner() {
+		if (scanner == null) {
+			scanner = new DRLScanner();
+			scanner.setDefaultReturnToken(new Token(new TextAttribute(DEFAULT_COLOR)));
+		}
+		return scanner;
+	}
+
+	/**
+	 * Define reconciler - this has to be done for each partition.
+	 * Currently there are 3 partitions, Inside rule, outside rule and inside comment.
+	 */
+	public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {
+		PresentationReconciler reconciler = new PresentationReconciler();
+
+		//bucket partition... (everything else outside a rule)
+		DefaultDamagerRepairer dr = new DefaultDamagerRepairer(getScanner());
+		reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
+		reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
+
+		//inside a rule partition
+		dr = new DefaultDamagerRepairer(getScanner());
+		reconciler.setDamager(dr, DRLPartionScanner.RULE_PART_CONTENT);
+		reconciler.setRepairer(dr, DRLPartionScanner.RULE_PART_CONTENT);
+
+		//finally, inside a multi line comment.
+		dr = new DefaultDamagerRepairer(new SingleTokenScanner(
+				new TextAttribute(ColorManager.getInstance().getColor(
+						ColorManager.SINGLE_LINE_COMMENT))));
+		reconciler.setDamager(dr, DRLPartionScanner.RULE_COMMENT);
+		reconciler.setRepairer(dr, DRLPartionScanner.RULE_COMMENT);
+
+		return reconciler;
+	}
+
+	/**
+	 * Single token scanner, used for scanning for multiline comments mainly.
+	 */
+	static class SingleTokenScanner extends BufferedRuleBasedScanner {
+		public SingleTokenScanner(TextAttribute attribute) {
+			setDefaultReturnToken(new Token(attribute));
+		}
+	}
+
+	/**
+	 * Get the appropriate content assistance, for each partition.
+	 */
+	public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
+		ContentAssistant assistant = new ContentAssistant();
+		//setup the content assistance, which is
+		//sensitive to the partition that it is in.
+        assistant.setAutoActivationDelay(1);
+		assistant.setContentAssistProcessor(
+			new DefaultCompletionProcessor(editor), IDocument.DEFAULT_CONTENT_TYPE);
+		assistant.setContentAssistProcessor(
+			new RuleCompletionProcessor(editor), DRLPartionScanner.RULE_PART_CONTENT);
+		assistant.setProposalPopupOrientation(IContentAssistant.PROPOSAL_OVERLAY);
+		return assistant;
+	}
+
+	public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
+		return DRLPartionScanner.LEGAL_CONTENT_TYPES;
+	}
+
+	public IReconciler getReconciler(ISourceViewer sourceViewer) {
+		MonoReconciler reconciler = null;
+		if (sourceViewer != null) {
+			reconciler = new MonoReconciler(
+				new DRLReconcilingStrategy(sourceViewer, editor), false);
+			reconciler.setDelay(500);
+			reconciler.setProgressMonitor(new NullProgressMonitor());
+		}
+		return reconciler;
+	}
+
+	public IAnnotationHover getOverviewRulerAnnotationHover(ISourceViewer sourceViewer) {
+		return new DefaultAnnotationHover();
+	}
+
+	public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) {
+		return new DefaultAnnotationHover();
+	}
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLReconcilingStrategy.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLReconcilingStrategy.java	2007-02-28 23:11:26 UTC (rev 9857)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLReconcilingStrategy.java	2007-02-28 23:29:06 UTC (rev 9858)
@@ -31,11 +31,11 @@
     private static final Pattern IMPORT_PATTERN = Pattern.compile("\\n\\s*((\\s*import\\s+[^\\s;]+;?[\\t\\x0B\\f\\r]*\\n)+)", Pattern.DOTALL);
     
 	private ISourceViewer sourceViewer;
-	private DRLRuleEditor editor;
+	private AbstractRuleEditor editor;
 	private IDocument document;
     private boolean folding;
 
-	public DRLReconcilingStrategy(ISourceViewer sourceViewer, final DRLRuleEditor editor) {
+	public DRLReconcilingStrategy(ISourceViewer sourceViewer, final AbstractRuleEditor editor) {
 		this.sourceViewer = sourceViewer;
 		this.editor = editor;
 		IPreferenceStore preferenceStore = DroolsIDEPlugin.getDefault().getPreferenceStore();

Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLRuleEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLRuleEditor.java	2007-02-28 23:11:26 UTC (rev 9857)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLRuleEditor.java	2007-02-28 23:29:06 UTC (rev 9858)
@@ -4,73 +4,28 @@
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
 
 import org.drools.compiler.DroolsParserException;
 import org.drools.ide.DRLInfo;
 import org.drools.ide.DroolsIDEPlugin;
-import org.drools.ide.debug.core.IDroolsDebugConstants;
 import org.drools.ide.editors.outline.RuleContentOutlinePage;
-import org.drools.ide.editors.scanners.RuleEditorMessages;
 import org.drools.ide.preferences.IDroolsConstants;
 import org.drools.lang.descr.FactTemplateDescr;
 import org.drools.lang.descr.FunctionDescr;
 import org.drools.lang.descr.FunctionImportDescr;
 import org.drools.lang.descr.ImportDescr;
 import org.drools.lang.descr.PackageDescr;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.ui.actions.IToggleBreakpointsTarget;
-import org.eclipse.debug.ui.actions.ToggleBreakpointAction;
-import org.eclipse.jdt.core.CompletionRequestor;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jface.action.IAction;
+
 import org.eclipse.jface.preference.PreferenceConverter;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.jface.text.source.IVerticalRuler;
-import org.eclipse.jface.text.source.projection.ProjectionAnnotation;
-import org.eclipse.jface.text.source.projection.ProjectionAnnotationModel;
-import org.eclipse.jface.text.source.projection.ProjectionSupport;
-import org.eclipse.jface.text.source.projection.ProjectionViewer;
 import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.editors.text.TextEditor;
-import org.eclipse.ui.texteditor.ITextEditorActionConstants;
-import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
-import org.eclipse.ui.texteditor.SourceViewerDecorationSupport;
-import org.eclipse.ui.texteditor.TextOperationAction;
 import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
 
 /**
  * Generic rule editor for drools.
  * @author Michael Neale
  */
-public class DRLRuleEditor extends TextEditor {
+public class DRLRuleEditor extends AbstractRuleEditor {
 
-	//used to provide additional content assistance/popups when DSLs are used.
-	private DSLAdapter dslAdapter;
-	private List imports;
-	private List functions;
-	private Map templates;
-	private String packageName;
-	private List classesInPackage;
-	private RuleContentOutlinePage ruleContentOutline = null;
-
-	private Annotation[] oldAnnotations;
-	private ProjectionAnnotationModel annotationModel;
-	protected DroolsPairMatcher bracketMatcher = new DroolsPairMatcher();
-	
 	public DRLRuleEditor() {
 		setSourceViewerConfiguration(new DRLSourceViewerConfig(this));
 		setDocumentProvider(new DRLDocumentProvider());
@@ -78,307 +33,65 @@
 		PreferenceConverter.setDefault(getPreferenceStore(), IDroolsConstants.DRL_EDITOR_MATCHING_BRACKETS_COLOR, new RGB(192, 192, 192));
 	}
 
-	public void createPartControl(Composite parent) {
-		super.createPartControl(parent);
-		ProjectionViewer viewer = (ProjectionViewer) getSourceViewer();
-		ProjectionSupport projectionSupport = new ProjectionSupport(viewer,
-			getAnnotationAccess(), getSharedColors());
-		projectionSupport.install();
-		// turn projection mode on
-		viewer.doOperation(ProjectionViewer.TOGGLE);
-		annotationModel = viewer.getProjectionAnnotationModel();
-	}
-	
-	protected ISourceViewer createSourceViewer(Composite parent,
-			IVerticalRuler ruler, int styles) {
-		ISourceViewer viewer = new ProjectionViewer(parent, ruler,
-				getOverviewRuler(), isOverviewRulerVisible(), styles);
-		// ensure decoration support has been created and configured.
-		getSourceViewerDecorationSupport(viewer);
-		return viewer;
-	}
-	
-	protected void configureSourceViewerDecorationSupport(SourceViewerDecorationSupport support) {
-		support.setCharacterPairMatcher(bracketMatcher);
-		support.setMatchingCharacterPainterPreferenceKeys(
-			IDroolsConstants.DRL_EDITOR_MATCHING_BRACKETS,
-			IDroolsConstants.DRL_EDITOR_MATCHING_BRACKETS_COLOR);
-		super.configureSourceViewerDecorationSupport(support);
-	}
-	
-	public void updateFoldingStructure(List positions) {
-		Annotation[] annotations = new Annotation[positions.size()];
-		// this will hold the new annotations along
-		// with their corresponding positions
-		HashMap newAnnotations = new HashMap();
-		for (int i = 0; i < positions.size(); i++) {
-			ProjectionAnnotation annotation = new ProjectionAnnotation();
-			newAnnotations.put(annotation, positions.get(i));
-			annotations[i] = annotation;
-		}
-		annotationModel.modifyAnnotations(oldAnnotations, newAnnotations, null);
-		oldAnnotations = annotations;
-	}
+    protected ContentOutlinePage getContentOutline() {
+        if (ruleContentOutline == null) {
+            ruleContentOutline = new RuleContentOutlinePage(this);
+            ruleContentOutline.update();
+        }
+        return ruleContentOutline;
+    }
 
-	/** For user triggered content assistance */
-	protected void createActions() {
-		super.createActions();
+    protected void loadImportsAndFunctions() {
+        try {
+            DRLInfo drlInfo = DroolsIDEPlugin.getDefault().parseResource(this, true, false);
+            PackageDescr descr = drlInfo.getPackageDescr();
+            // package
+            this.packageName = drlInfo.getPackageName();
+            // imports
+            List allImports = descr.getImports();
+            this.imports = new ArrayList();
+            Iterator iterator = allImports.iterator();
+            while (iterator.hasNext()) {
+                String importName = ((ImportDescr) iterator.next()).getTarget();
+                if (importName.endsWith(".*")) {
+                    String packageName = importName.substring(0, importName.length() - 2);
+                    imports.addAll(getAllClassesInPackage(packageName));
+                } else {
+                    imports.add(importName);
+                }
+            }
+            // functions
+            List functionDescrs = descr.getFunctions();
+            List functionImports = descr.getFunctionImports();
+            functions = new ArrayList(functionDescrs.size());
+            iterator = functionDescrs.iterator();
+            while (iterator.hasNext()) {
+                functions.add(((FunctionDescr) iterator.next()).getName());
+            }
+            iterator = functionImports.iterator();
+            while (iterator.hasNext()) {
+                String functionImport = ((FunctionImportDescr) iterator.next()).getTarget();
+                if (functionImport.endsWith(".*")) {
+                    String className = functionImport.substring(0, functionImport.length() - 2);
+                    functions.addAll(getAllStaticMethodsInClass(className));
+                } else {
+                    int index = functionImport.lastIndexOf('.');
+                    if (index != -1) {
+                        functions.add(functionImport.substring(index + 1));
+                    }
+                }
+            }
+            // templates
+            List templateDescrs = descr.getFactTemplates();
+            templates = new HashMap(templateDescrs.size());
+            iterator = templateDescrs.iterator();
+            while (iterator.hasNext()) {
+                FactTemplateDescr template = (FactTemplateDescr) iterator.next();
+                templates.put(template.getName(), template);
+            }
+        } catch (DroolsParserException e) {
+            DroolsIDEPlugin.log(e);
+        }
+    }
 
-		IAction a = new TextOperationAction(RuleEditorMessages
-				.getResourceBundle(), "ContentAssistProposal.", this,
-				ISourceViewer.CONTENTASSIST_PROPOSALS);
-		a
-				.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS);
-		setAction("ContentAssistProposal", a);
-
-		a = new TextOperationAction(
-				RuleEditorMessages.getResourceBundle(),
-				"ContentAssistTip.", this, ISourceViewer.CONTENTASSIST_CONTEXT_INFORMATION); //$NON-NLS-1$
-		a
-				.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_CONTEXT_INFORMATION);
-		setAction("ContentAssistTip", a);
-		
-		a = new ToggleBreakpointAction(getSite().getPart() , null, getVerticalRuler());
-		setAction(ITextEditorActionConstants.RULER_DOUBLE_CLICK, a);
-
-	}
-	
-	/** Return the DSL adapter if one is present */
-	public DSLAdapter getDSLAdapter() {
-		return dslAdapter;
-	}
-
-	/** Set the DSL adapter, used for content assistance */
-	public void setDSLAdapter(DSLAdapter adapter) {
-		dslAdapter = adapter;
-	}
-
-	public List getImports() {
-		if (imports == null) {
-			loadImportsAndFunctions();
-		}
-		return imports;
-	}
-	
-	public String getContent() {
-		return getSourceViewer().getDocument().get();
-	}
-	
-	public IResource getResource() {
-		if (getEditorInput() instanceof IFileEditorInput) {
-			return ((IFileEditorInput) getEditorInput()).getFile();
-		}
-		return null;
-	}
-	
-	private void loadImportsAndFunctions() {
-		try {
-	        DRLInfo drlInfo = DroolsIDEPlugin.getDefault().parseResource(this, true, false);
-	        PackageDescr descr = drlInfo.getPackageDescr();
-	        // package
-	        this.packageName = drlInfo.getPackageName();
-	        // imports
-	        List allImports = descr.getImports();
-	        this.imports = new ArrayList();
-	        Iterator iterator = allImports.iterator();
-	        while (iterator.hasNext()) {
-				String importName = ((ImportDescr) iterator.next()).getTarget();
-				if (importName.endsWith(".*")) {
-					String packageName = importName.substring(0, importName.length() - 2);
-					imports.addAll(getAllClassesInPackage(packageName));
-				} else {
-					imports.add(importName);
-				}
-			}
-	        // functions
-	        List functionDescrs = descr.getFunctions();
-	        List functionImports = descr.getFunctionImports();
-	        functions = new ArrayList(functionDescrs.size());
-	        iterator = functionDescrs.iterator();
-	        while (iterator.hasNext()) {
-				functions.add(((FunctionDescr) iterator.next()).getName());
-			}
-	        iterator = functionImports.iterator();
-	        while (iterator.hasNext()) {
-	        	String functionImport = ((FunctionImportDescr) iterator.next()).getTarget();
-	        	if (functionImport.endsWith(".*")) {
-	        		String className = functionImport.substring(0, functionImport.length() - 2);
-	        		functions.addAll(getAllStaticMethodsInClass(className));
-	        	} else {
-	        		int index = functionImport.lastIndexOf('.');
-	        		if (index != -1) {
-	        			functions.add(functionImport.substring(index + 1));
-	        		}
-	        	}
-			}
-	        // templates
-	        List templateDescrs = descr.getFactTemplates();
-	        templates = new HashMap(templateDescrs.size());
-	        iterator = templateDescrs.iterator();
-	        while (iterator.hasNext()) {
-	        	FactTemplateDescr template = (FactTemplateDescr) iterator.next();
-	        	templates.put(template.getName(), template);
-			}
-		} catch (DroolsParserException e) {
-			DroolsIDEPlugin.log(e);
-		}
-	}
-
-	public List getFunctions() {
-		if (functions == null) {
-			loadImportsAndFunctions();
-		}
-		return functions;
-	}
-	
-	public Set getTemplates() {
-		if (templates == null) {
-			loadImportsAndFunctions();
-		}
-		return templates.keySet();
-	}
-	
-	public FactTemplateDescr getTemplate(String name) {
-		if (templates == null) {
-			loadImportsAndFunctions();
-		}
-		return (FactTemplateDescr) templates.get(name);
-	}
-	
-	public String getPackage() {
-		if (packageName == null) {
-			loadImportsAndFunctions();
-		}
-		return packageName;
-	}
-	
-	public List getClassesInPackage() {
-		if (classesInPackage == null) {
-			classesInPackage = getAllClassesInPackage(getPackage());
-		}
-		return classesInPackage;
-	}
-	
-	private List getAllClassesInPackage(String packageName) {
-		final 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
-					}
-				};
-	
-				try {
-					javaProject.newEvaluationContext().codeComplete(packageName + ".", packageName.length() + 1, requestor);
-				} catch (Throwable t) {
-					DroolsIDEPlugin.log(t);
-				}
-			}
-		}
-		return list;
-	}
-
-	private List getAllStaticMethodsInClass(String className) {
-		final List list = new ArrayList();
-		if (className != 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 functionName = new String(proposal.getCompletion());
-						if (proposal.getKind() == org.eclipse.jdt.core.CompletionProposal.METHOD_REF) {
-							list.add(functionName.substring(0, functionName.length() - 2)); // remove the ()
-						}
-						// ignore all other proposals
-					}
-				};
-	
-				try {
-					javaProject.newEvaluationContext().codeComplete(className + ".", className.length() + 1, requestor);
-				} catch (Throwable t) {
-					DroolsIDEPlugin.log(t);
-				}
-			}
-		}
-		return list;
-	}
-	
-	public Object getAdapter(Class adapter) {
-		if (adapter.equals(IContentOutlinePage.class)) {
-			return getContentOutline();
-		} else if (adapter.equals(IToggleBreakpointsTarget.class)) {
-			return getBreakpointAdapter();
-		}
-		return super.getAdapter(adapter);
-	}
-
-	protected ContentOutlinePage getContentOutline() {
-		if (ruleContentOutline == null) {
-			ruleContentOutline = new RuleContentOutlinePage(this);
-			ruleContentOutline.update();
-		}
-		return ruleContentOutline;
-	}
-
-	private Object getBreakpointAdapter() {
-		return new DroolsLineBreakpointAdapter();
-	}
-
-	public void doSave(IProgressMonitor monitor) {
-		// invalidate cached parsed rules
-		DroolsIDEPlugin.getDefault().invalidateResource(getResource());
-		// save
-		super.doSave(monitor);
-		// update outline view
-		if (ruleContentOutline != null) {
-			ruleContentOutline.update();
-		}
-		// remove cached content
-		dslAdapter = null;
-		imports = null;
-		functions = null;
-		templates = null;
-		packageName = null;
-		classesInPackage = null;
-	}
-
-	public void gotoMarker(IMarker marker) {
-		try {
-			if (marker.getType().equals(IDroolsDebugConstants.DROOLS_MARKER_TYPE)) {
-				int line = marker.getAttribute(IDroolsDebugConstants.DRL_LINE_NUMBER, -1);
-	            if (line > -1)
-	            	--line;
-	                try {
-	                    IDocument document = getDocumentProvider().getDocument(getEditorInput());
-	                    selectAndReveal(document.getLineOffset(line), document.getLineLength(line));
-	                } catch(BadLocationException exc) {
-	                	DroolsIDEPlugin.log(exc);
-	                }
-			} else {
-				super.gotoMarker(marker);
-			}
-		} catch (CoreException exc) {
-			DroolsIDEPlugin.log(exc);
-		}
-	}
-	
-	public void dispose() {
-		super.dispose();
-		if (bracketMatcher != null) {
-			bracketMatcher.dispose();
-			bracketMatcher = null;
-		}
-	}
 }

Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLSourceViewerConfig.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLSourceViewerConfig.java	2007-02-28 23:11:26 UTC (rev 9857)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLSourceViewerConfig.java	2007-02-28 23:29:06 UTC (rev 9858)
@@ -36,9 +36,9 @@
 	private static Color DEFAULT_COLOR =
 		ColorManager.getInstance().getColor(ColorManager.DEFAULT);
 
-	private DRLRuleEditor editor;
+	private AbstractRuleEditor editor;
 
-	public DRLSourceViewerConfig(DRLRuleEditor editor) {
+	public DRLSourceViewerConfig(AbstractRuleEditor editor) {
 		this.editor = editor;
 	}
 

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	2007-02-28 23:11:26 UTC (rev 9857)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/DefaultCompletionProcessor.java	2007-02-28 23:29:06 UTC (rev 9858)
@@ -10,6 +10,7 @@
 
 import org.drools.ide.DroolsIDEPlugin;
 import org.drools.ide.DroolsPluginImages;
+import org.drools.ide.editors.AbstractRuleEditor;
 import org.drools.ide.editors.DRLRuleEditor;
 import org.drools.util.StringUtils;
 import org.eclipse.core.resources.IProject;
@@ -49,12 +50,12 @@
     protected static final Image methodIcon = DroolsPluginImages.getImage(DroolsPluginImages.METHOD);
     protected static final Pattern START_OF_NEW_JAVA_STATEMENT = Pattern.compile(".*[;{}]\\s*", Pattern.DOTALL);
 
-    public DefaultCompletionProcessor(DRLRuleEditor editor) {
+    public DefaultCompletionProcessor(AbstractRuleEditor editor) {
     	super(editor);
     }
     
-    protected DRLRuleEditor getDRLEditor() {
-    	return (DRLRuleEditor) getEditor();
+    protected AbstractRuleEditor getDRLEditor() {
+    	return (AbstractRuleEditor) getEditor();
     }
     
 	protected List getCompletionProposals(ITextViewer viewer, int documentOffset) {

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	2007-02-28 23:11:26 UTC (rev 9857)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/RuleCompletionProcessor.java	2007-02-28 23:29:06 UTC (rev 9858)
@@ -18,7 +18,7 @@
 import org.drools.compiler.DroolsParserException;
 import org.drools.ide.DroolsIDEPlugin;
 import org.drools.ide.DroolsPluginImages;
-import org.drools.ide.editors.DRLRuleEditor;
+import org.drools.ide.editors.AbstractRuleEditor;
 import org.drools.ide.editors.DSLAdapter;
 import org.drools.ide.util.ProjectClassLoader;
 import org.drools.lang.descr.AccumulateDescr;
@@ -72,7 +72,7 @@
 
 	private DSLTree dslTree = new DSLTree();
 
-	public RuleCompletionProcessor(DRLRuleEditor editor) {
+	public RuleCompletionProcessor(AbstractRuleEditor editor) {
 		super(editor);
 	}
 

Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/RuleContentOutlinePage.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/RuleContentOutlinePage.java	2007-02-28 23:11:26 UTC (rev 9857)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/RuleContentOutlinePage.java	2007-02-28 23:29:06 UTC (rev 9858)
@@ -17,6 +17,7 @@
 import org.drools.ide.core.ui.DroolsLabelProvider;
 import org.drools.ide.core.ui.DroolsTreeSorter;
 import org.drools.ide.core.ui.FilterActionGroup;
+import org.drools.ide.editors.AbstractRuleEditor;
 import org.drools.ide.editors.DRLRuleEditor;
 import org.drools.lang.descr.AttributeDescr;
 import org.drools.lang.descr.PackageDescr;
@@ -39,7 +40,7 @@
  */
 public class RuleContentOutlinePage extends ContentOutlinePage {
 
-    private DRLRuleEditor editor;
+    private AbstractRuleEditor editor;
     private RuleSet ruleSet = DroolsModelBuilder.createRuleSet();
     private Map rules;
 
@@ -76,7 +77,7 @@
 	private static final Pattern QUERY_PATTERN2 = Pattern.compile(
 			"\\n\\s*query\\s+([^\\s;#\"]+)", Pattern.DOTALL);
 
-    public RuleContentOutlinePage(DRLRuleEditor editor) {
+    public RuleContentOutlinePage(AbstractRuleEditor editor) {
         this.editor = editor;
     }
 




More information about the jboss-svn-commits mailing list