[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