[jboss-svn-commits] JBL Code SVN: r8198 - in labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide: . editors preferences

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Dec 10 19:58:17 EST 2006


Author: KrisVerlaenen
Date: 2006-12-10 19:58:14 -0500 (Sun, 10 Dec 2006)
New Revision: 8198

Added:
   labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DroolsPairMatcher.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/DRLRuleEditor.java
   labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/preferences/DroolsPreferencePage.java
   labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/preferences/IDroolsConstants.java
Log:
JBRULES-581: Pair Matching in DRL editor
 - showing matching pair of '(', ')', '[', ']', '{' and '}'
 - made preference for caching of parsed rules

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	2006-12-11 00:53:07 UTC (rev 8197)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/DroolsIDEPlugin.java	2006-12-11 00:58:14 UTC (rev 8198)
@@ -45,6 +45,8 @@
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 import org.osgi.framework.BundleContext;
@@ -69,6 +71,7 @@
 	private Map parsedRules = new HashMap();
 	private Map compiledRules = new HashMap();
 	private Map ruleInfoByClassNameMap = new HashMap();
+	private boolean useCachePreference;
 	
 	/**
 	 * The constructor.
@@ -83,6 +86,21 @@
 	 */
 	public void start(BundleContext context) throws Exception {
 		super.start(context);
+		IPreferenceStore preferenceStore = getPreferenceStore();
+		useCachePreference = preferenceStore.getBoolean(IDroolsConstants.CACHE_PARSED_RULES);
+    	preferenceStore.addPropertyChangeListener(new IPropertyChangeListener() {
+			public void propertyChange(PropertyChangeEvent event) {
+				if (IDroolsConstants.CACHE_PARSED_RULES.equals(event.getProperty())) {
+					useCachePreference = ((Boolean) event.getNewValue()).booleanValue();
+					if (!useCachePreference) {
+						parsedRules.clear();
+						compiledRules.clear();
+						ruleInfoByClassNameMap.clear();
+					}
+				}
+			}
+    	});
+
     }
 
 	/**
@@ -188,6 +206,7 @@
 	protected void initializeDefaultPreferences(IPreferenceStore store) {
 		store.setDefault(IDroolsConstants.BUILD_ALL, false);
 		store.setDefault(IDroolsConstants.EDITOR_FOLDING, true);
+		store.setDefault(IDroolsConstants.CACHE_PARSED_RULES, true);
 	}
 	
 	public DRLInfo parseResource(IResource resource, boolean compile) throws DroolsParserException {
@@ -252,6 +271,7 @@
 	}
 
 	private DRLInfo generateParsedResource(String content, IResource resource, boolean useCache, boolean compile) throws DroolsParserException {
+		useCache = useCache && useCachePreference;
         DrlParser parser = new DrlParser();
         try {
             Reader dslReader = DSLAdapter.getDSLContent(content, resource);
@@ -303,13 +323,13 @@
         		if (useCache) {
 	    			if (compile && !parser.hasErrors()) {
 	    				parsedRules.remove(resource);
-	    				compiledRules.put(resource, result);
+    					compiledRules.put(resource, result);
 	        			RuleInfo[] ruleInfos = result.getRuleInfos();
 	        			for (int i = 0; i < ruleInfos.length; i++) {
 	        				ruleInfoByClassNameMap.put(ruleInfos[i].getClassName(), ruleInfos[i]);
 	        			}
 	    			} else {
-	    				parsedRules.put(resource, result);
+    					parsedRules.put(resource, result);
 	    			}
         		}
             	return result;

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	2006-12-11 00:53:07 UTC (rev 8197)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLRuleEditor.java	2006-12-11 00:58:14 UTC (rev 8198)
@@ -13,6 +13,7 @@
 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.PackageDescr;
@@ -27,6 +28,7 @@
 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;
@@ -36,12 +38,14 @@
 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;
@@ -63,10 +67,13 @@
 
 	private Annotation[] oldAnnotations;
 	private ProjectionAnnotationModel annotationModel;
+	protected DroolsPairMatcher bracketMatcher = new DroolsPairMatcher();
 	
 	public DRLRuleEditor() {
 		setSourceViewerConfiguration(new DRLSourceViewerConfig(this));
 		setDocumentProvider(new DRLDocumentProvider());
+		getPreferenceStore().setDefault(IDroolsConstants.DRL_EDITOR_MATCHING_BRACKETS, true);
+		PreferenceConverter.setDefault(getPreferenceStore(), IDroolsConstants.DRL_EDITOR_MATCHING_BRACKETS_COLOR, new RGB(192, 192, 192));
 	}
 
 	public void createPartControl(Composite parent) {
@@ -88,7 +95,15 @@
 		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
@@ -356,4 +371,12 @@
 			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/DroolsPairMatcher.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DroolsPairMatcher.java	2006-12-11 00:53:07 UTC (rev 8197)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DroolsPairMatcher.java	2006-12-11 00:58:14 UTC (rev 8198)
@@ -0,0 +1,91 @@
+package org.drools.ide.editors;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Stack;
+
+import org.drools.ide.DroolsIDEPlugin;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.source.ICharacterPairMatcher;
+
+public final class DroolsPairMatcher implements ICharacterPairMatcher {
+
+	private int anchor;
+	private static final char[] leftChars = new char[] { '(', '{', '[' };
+	private static final char[] rightChars = new char[] { ')', '}', ']' };
+
+	public IRegion match(IDocument document, int offset) {
+        if (offset <= 0) {
+        	return null;
+        }
+        try {
+		    char c = document.getChar(offset - 1);
+		    for (int i = 0; i < rightChars.length; i++) {
+			    if (c == rightChars[i]) {
+			        return searchLeft(document, offset, rightChars[i], leftChars[i]);
+			    }
+			    if (c == leftChars[i]) {
+			        return searchRight(document, offset, rightChars[i], leftChars[i]);
+			    }
+		    }
+        } catch (BadLocationException e) {
+        	DroolsIDEPlugin.log(e);
+        }
+        return null;
+    }
+
+	private IRegion searchRight(IDocument document, int offset, char rightChar, char leftChar) throws BadLocationException {
+        Stack stack = new Stack();
+        anchor = ICharacterPairMatcher.LEFT;
+        char[] chars = document.get(offset, document.getLength() - offset).toCharArray();
+        for (int i = 0; i < chars.length; i++) {
+	        if (chars[i] == leftChar) {
+	            stack.push(new Character(chars[i]));
+	            continue;
+	        }
+	        if (chars[i] == rightChar) {
+	        	if (stack.isEmpty()) {
+		            return new Region(offset - 1, i + 2);
+		        } else {
+		        	stack.pop();
+		        }
+	        }
+        }
+        return null;
+    }
+
+	private IRegion searchLeft(IDocument document, int offset, char rightChar, char leftChar)
+			throws BadLocationException {
+		Stack stack = new Stack();
+		anchor = ICharacterPairMatcher.RIGHT;
+		char[] chars = document.get(0, offset - 1).toCharArray();
+        for (int i = chars.length - 1; i >= 0; i--) {
+			if (chars[i] == rightChar) {
+				stack.push(new Character(chars[i]));
+				continue;
+			}
+			if (chars[i] == leftChar) {
+				if (stack.isEmpty()) {
+					return new Region(i, offset - i);
+				} else {
+					stack.pop();
+				}
+			}
+        }
+		return null;
+	}
+
+	public int getAnchor() {
+		return anchor;
+	}
+
+	public void dispose() {
+	}
+
+	public void clear() {
+	}
+
+}

Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/preferences/DroolsPreferencePage.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/preferences/DroolsPreferencePage.java	2006-12-11 00:53:07 UTC (rev 8197)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/preferences/DroolsPreferencePage.java	2006-12-11 00:58:14 UTC (rev 8198)
@@ -15,12 +15,15 @@
 
 	private Button buildAllCheckBox;
 	private Button collapseEditorCheckBox;
+	private Button cacheParsedRulesCheckBox;
 	
 	protected Control createContents(Composite parent) {
 		buildAllCheckBox = createCheckBox(parent,
 			"Automatically reparse all rules if a Java resource is changed.");
 		collapseEditorCheckBox = createCheckBox(parent,
 			"Use code folding in DRL editor.");
+		cacheParsedRulesCheckBox = createCheckBox(parent,
+			"When parsing rules, always cache the result for future use. Warning: when disabled, debugging of rules will not work.");
 
 		initializeValues();
 
@@ -43,12 +46,14 @@
         IPreferenceStore store = getPreferenceStore();
         buildAllCheckBox.setSelection(store.getDefaultBoolean(IDroolsConstants.BUILD_ALL));
         collapseEditorCheckBox.setSelection(store.getDefaultBoolean(IDroolsConstants.EDITOR_FOLDING));
+        cacheParsedRulesCheckBox.setSelection(store.getDefaultBoolean(IDroolsConstants.CACHE_PARSED_RULES));
     }
 
 	private void initializeValues() {
         IPreferenceStore store = getPreferenceStore();
         buildAllCheckBox.setSelection(store.getBoolean(IDroolsConstants.BUILD_ALL));
         collapseEditorCheckBox.setSelection(store.getBoolean(IDroolsConstants.EDITOR_FOLDING));
+        cacheParsedRulesCheckBox.setSelection(store.getBoolean(IDroolsConstants.CACHE_PARSED_RULES));
     }
 
 	protected void performDefaults() {
@@ -66,6 +71,7 @@
         IPreferenceStore store = getPreferenceStore();
         store.setValue(IDroolsConstants.BUILD_ALL, buildAllCheckBox.getSelection());
         store.setValue(IDroolsConstants.EDITOR_FOLDING, collapseEditorCheckBox.getSelection());
+        store.setValue(IDroolsConstants.CACHE_PARSED_RULES, cacheParsedRulesCheckBox.getSelection());
     }
 
 	public void init(IWorkbench workbench) {

Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/preferences/IDroolsConstants.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/preferences/IDroolsConstants.java	2006-12-11 00:53:07 UTC (rev 8197)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/preferences/IDroolsConstants.java	2006-12-11 00:58:14 UTC (rev 8198)
@@ -4,5 +4,8 @@
 
 	String BUILD_ALL = "Drools.BuildAll";
 	String EDITOR_FOLDING = "Drools.EditorFolding";
+	String CACHE_PARSED_RULES = "Drools.CacheParsedRules";
+	String DRL_EDITOR_MATCHING_BRACKETS = "Drools.DRLMatchingBrackets";
+	String DRL_EDITOR_MATCHING_BRACKETS_COLOR = "Drools.DRLMatchingBracketsColor";
 	
 }




More information about the jboss-svn-commits mailing list