From: <jbo...@li...> - 2006-05-29 23:19:26
|
Author: KrisVerlaenen Date: 2006-05-29 19:19:19 -0400 (Mon, 29 May 2006) New Revision: 4474 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/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 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: added folding in DRL editor + fixed error with newlines 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-05-29 17:52:37 UTC (rev 4473) +++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/DroolsIDEPlugin.java 2006-05-29 23:19:19 UTC (rev 4474) @@ -163,6 +163,7 @@ protected void initializeDefaultPreferences(IPreferenceStore store) { store.setDefault(IDroolsConstants.BUILD_ALL, false); + store.setDefault(IDroolsConstants.EDITOR_FOLDING, true); } } 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 2006-05-29 17:52:37 UTC (rev 4473) +++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLReconcilingStrategy.java 2006-05-29 23:19:19 UTC (rev 4474) @@ -1,10 +1,18 @@ package org.drools.ide.editors; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.StringReader; +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; -import org.drools.ide.builder.DroolsBuildMarker; -import org.drools.ide.builder.DroolsBuilder; +import org.drools.ide.DroolsIDEPlugin; +import org.drools.ide.preferences.IDroolsConstants; import org.eclipse.core.resources.IFile; +import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.Position; @@ -13,50 +21,73 @@ import org.eclipse.jface.text.source.Annotation; import org.eclipse.jface.text.source.IAnnotationModel; import org.eclipse.jface.text.source.ISourceViewer; -import org.eclipse.ui.IEditorInput; -import org.eclipse.ui.IFileEditorInput; -import org.eclipse.ui.texteditor.IDocumentProvider; +import org.eclipse.jface.util.IPropertyChangeListener; +import org.eclipse.jface.util.PropertyChangeEvent; +import org.eclipse.swt.widgets.Display; public class DRLReconcilingStrategy implements IReconcilingStrategy { + private static final Pattern RULE_PATTERN = Pattern.compile("\\s*rule\\s+\"?([^\"]+)\"?.*", Pattern.DOTALL); + private static final Pattern QUERY_PATTERN = Pattern.compile("\\s*query\\s+\"?([^\"]+)\"?.*", Pattern.DOTALL); + private static final Pattern FUNCTION_PATTERN = Pattern.compile("\\s*function\\s+(.*)\\s+(.*)\\(.*\\).*", Pattern.DOTALL); + private static final Pattern END_PATTERN = Pattern.compile("\\s*end.*", Pattern.DOTALL); + private static final Pattern IMPORT_PATTERN = Pattern.compile("\\s*import\\s.*", Pattern.DOTALL); + private ISourceViewer sourceViewer; private DRLRuleEditor editor; + private IDocument document; + private boolean folding; - public DRLReconcilingStrategy(ISourceViewer sourceViewer, DRLRuleEditor editor) { + public DRLReconcilingStrategy(ISourceViewer sourceViewer, final DRLRuleEditor editor) { this.sourceViewer = sourceViewer; this.editor = editor; - } + IPreferenceStore preferenceStore = DroolsIDEPlugin.getDefault().getPreferenceStore(); + folding = preferenceStore.getBoolean(IDroolsConstants.EDITOR_FOLDING); + preferenceStore.addPropertyChangeListener(new IPropertyChangeListener() { + public void propertyChange(PropertyChangeEvent event) { + if (IDroolsConstants.EDITOR_FOLDING.equals(event.getProperty())) { + folding = ((Boolean) event.getNewValue()).booleanValue(); + if (folding) { + reconcile(); + } else { + Display.getDefault().asyncExec(new Runnable() { + public void run() { + editor.updateFoldingStructure(new ArrayList()); + } + }); + } + } + } + }); + } public void setDocument(IDocument document) { + this.document = document; + reconcile(); } public void reconcile(DirtyRegion dirtyRegion, IRegion region) { - //reconcile(); + reconcile(); } public void reconcile(IRegion region) { - //reconcile(); + reconcile(); } private void reconcile() { - IEditorInput input = editor.getEditorInput(); - if (input != null) { - if (!(input instanceof IFileEditorInput)) { - return; - } - IFile file = ((IFileEditorInput) input).getFile(); - IAnnotationModel annotationModel = sourceViewer.getAnnotationModel(); - removeAnnotationsFor(annotationModel); - - IDocumentProvider documentProvider = editor.getDocumentProvider(); - if (documentProvider == null) { - return; + if (document != null) { + String s = document.get(); + if (folding) { + calculateFolding(s); } - String s = documentProvider.getDocument(input).get(); - DroolsBuildMarker[] markers = DroolsBuilder.parseFile(file, s); - for (int i = 0; i < markers.length; i++) { - createAnnotation(file, annotationModel, markers[i].getText(), markers[i].getOffset(), markers[i].getLength()); - } + +// IFile file = ((IFileEditorInput) input).getFile(); +// IAnnotationModel annotationModel = sourceViewer.getAnnotationModel(); +// removeAnnotationsFor(annotationModel); +// DroolsBuildMarker[] markers = DroolsBuilder.parseFile(file, s); +// for (int i = 0; i < markers.length; i++) { +// createAnnotation(file, annotationModel, markers[i].getText(), markers[i].getOffset(), markers[i].getLength()); +// } } } @@ -71,8 +102,118 @@ Iterator iterator = annotationModel.getAnnotationIterator(); while (iterator.hasNext()) { Annotation annotation = (Annotation) iterator.next(); - if (annotation instanceof DRLProblemAnnotation) + if (annotation instanceof DRLProblemAnnotation) { annotationModel.removeAnnotation(annotation); - }; + } + } } + + protected void calculateFolding(String input) { + // TODO replace this parsing by getting this input from the parsed rule file + final List positions = new ArrayList(); + StringReader stringReader = new StringReader( input ); + BufferedReader bufferedReader = new BufferedReader( stringReader ); + try { + int offset = 0; + String st = bufferedReader.readLine(); + int start = -1; + while ( st != null ) { + Matcher matcher = RULE_PATTERN.matcher(st); + if (matcher.matches()) { + start = offset + matcher.start(); + offset += st.length() + System.getProperty("line.separator").length(); // + for the newline + st = bufferedReader.readLine(); + while (st != null) { + Matcher matcher2 = END_PATTERN.matcher(st); + if (matcher2.matches()) { + int end = offset + matcher2.end(); + offset += st.length() + System.getProperty("line.separator").length(); // + for the newline + st = bufferedReader.readLine(); + positions.add(new Position(start, end - start + (st == null ? 0 : System.getProperty("line.separator").length()))); // + for the newline + break; + } + offset += st.length() + System.getProperty("line.separator").length(); // + for the newline + st = bufferedReader.readLine(); + } + } else { + matcher = QUERY_PATTERN.matcher(st); + if (matcher.matches()) { + start = offset + matcher.start(); + offset += st.length() + System.getProperty("line.separator").length(); // + for the newline + st = bufferedReader.readLine(); + while (st != null) { + Matcher matcher2 = END_PATTERN.matcher(st); + if (matcher2.matches()) { + int end = offset + matcher2.end(); + offset += st.length() + System.getProperty("line.separator").length(); // + for the newline + st = bufferedReader.readLine(); + positions.add(new Position(start, end - start + (st == null ? 0 : System.getProperty("line.separator").length()))); // + for the newline + break; + } + offset += st.length() + System.getProperty("line.separator").length(); // + for the newline + st = bufferedReader.readLine(); + } + } else { + matcher = FUNCTION_PATTERN.matcher(st); + if (matcher.matches()) { + start = offset + matcher.start(); + int nbOpenBrackets = 1; + offset += st.length() + System.getProperty("line.separator").length(); // + for the newline + st = bufferedReader.readLine(); + while (st != null) { + byte[] bytes = st.getBytes(); + for (int i = 0; i < bytes.length; i++) { + if (bytes[i] == '{') { + nbOpenBrackets++; + } else if (bytes[i] == '}') { + if (--nbOpenBrackets == 0) { + int end = offset + i + 1; + offset += st.length() + System.getProperty("line.separator").length(); // + for the newline + st = bufferedReader.readLine(); + positions.add(new Position(start, end - start + (st == null ? 0 : System.getProperty("line.separator").length()))); // + for the newline + break; + } + } + } + if (nbOpenBrackets == 0) { + break; + } + offset += st.length() + System.getProperty("line.separator").length(); // + for the newline + st = bufferedReader.readLine(); + } + } else { + matcher = IMPORT_PATTERN.matcher(st); + if (matcher.matches()) { + start = offset + matcher.start(); + offset += st.length() + System.getProperty("line.separator").length(); // + for the newline + st = bufferedReader.readLine(); + while (st != null) { + Matcher matcher2 = IMPORT_PATTERN.matcher(st); + if (!matcher2.matches()) { + int end = offset; + positions.add(new Position(start, end - start)); + break; + } + offset += st.length() + System.getProperty("line.separator").length(); // + for the newline + st = bufferedReader.readLine(); + } + } else { + offset += st.length() + System.getProperty("line.separator").length(); // + for the newline + st = bufferedReader.readLine(); + } + } + } + } + } + } catch ( IOException e ) { + // do nothing + } + + Display.getDefault().asyncExec(new Runnable() { + public void run() { + editor.updateFoldingStructure(positions); + } + }); + } + } \ No newline at end of file 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-05-29 17:52:37 UTC (rev 4473) +++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLRuleEditor.java 2006-05-29 23:19:19 UTC (rev 4474) @@ -1,5 +1,6 @@ package org.drools.ide.editors; +import java.util.HashMap; import java.util.List; import org.drools.ide.DroolsIDEPlugin; @@ -13,7 +14,14 @@ import org.eclipse.jface.action.IAction; 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.widgets.Composite; import org.eclipse.ui.editors.text.TextEditor; import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds; import org.eclipse.ui.texteditor.TextOperationAction; @@ -32,11 +40,48 @@ private List functions; private RuleContentOutlinePage ruleContentOutline = null; + private Annotation[] oldAnnotations; + private ProjectionAnnotationModel annotationModel; + public DRLRuleEditor() { setSourceViewerConfiguration(new DRLSourceViewerConfig(this)); setDocumentProvider(new DRLDocumentProvider()); } + 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; + } + + 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(); Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/DefaultCompletionProcessor.java =================================================================== --- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/DefaultCompletionProcessor.java 2006-05-29 17:52:37 UTC (rev 4473) +++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/DefaultCompletionProcessor.java 2006-05-29 23:19:19 UTC (rev 4474) @@ -30,9 +30,9 @@ */ public class DefaultCompletionProcessor extends AbstractCompletionProcessor { - private static final String NEW_RULE_TEMPLATE = "rule \"new rule\"\n\n\twhen\n\n\tthen\n\nend"; - private static final String NEW_QUERY_TEMPLATE = "query \"query name\"\n\t#conditions\nend"; - private static final String NEW_FUNCTION_TEMPLATE = "function void yourFunction(Type arg) {\n\t/* code goes here*/\n}"; + private static final String NEW_RULE_TEMPLATE = "rule \"new rule\"" + System.getProperty("line.separator") + "\twhen" + System.getProperty("line.separator") + "\t\t" + System.getProperty("line.separator") + "\tthen" + System.getProperty("line.separator") + "\t\t" + System.getProperty("line.separator") + "end"; + private static final String NEW_QUERY_TEMPLATE = "query \"query name\"" + System.getProperty("line.separator") + "\t#conditions" + System.getProperty("line.separator") + "end"; + private static final String NEW_FUNCTION_TEMPLATE = "function void yourFunction(Type arg) {" + System.getProperty("line.separator") + "\t/* code goes here*/" + System.getProperty("line.separator") + "}"; private static final Pattern IMPORT_PATTERN = Pattern.compile(".*\\Wimport\\W[^;]*", Pattern.DOTALL); public DefaultCompletionProcessor(EditorPart editor) { Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/RuleCompletionProcessor.java =================================================================== --- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/RuleCompletionProcessor.java 2006-05-29 17:52:37 UTC (rev 4473) +++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/RuleCompletionProcessor.java 2006-05-29 23:19:19 UTC (rev 4474) @@ -98,7 +98,7 @@ list, prefix ); - // addRHSJavaCompletionProposals(list, backText, prefix); + addRHSJavaCompletionProposals(list, backText, prefix); } } else if (condition(backText)) { List dslConditions = adapter.listConditionItems(); @@ -152,7 +152,7 @@ list.add(p); } } - prop = new RuleCompletionProposal(prefix.length(), "then", "then\n\t"); + prop = new RuleCompletionProposal(prefix.length(), "then", "then" + System.getProperty("line.separator") + "\t"); prop.setImage(droolsIcon); list.add(prop); break; @@ -263,7 +263,6 @@ // do nothing } String consequence = backText.substring(thenPosition + 4); - System.out.println(consequence); list.addAll(getRHSJavaCompletionProposals(consequence, prefix)); } @@ -308,7 +307,6 @@ if (imports != null && imports.size() > 0) { evalContext.setImports((String[]) imports.toArray(new String[imports.size()])); } - // TODO set variables evalContext.codeComplete(consequenceStart, consequenceStart.length(), requestor); } catch (Throwable t) { DroolsIDEPlugin.log(t); @@ -324,7 +322,7 @@ list.add(new RuleCompletionProposal(prefix.length(), "agenda-group", "agenda-group ", droolsIcon)); list.add(new RuleCompletionProposal(prefix.length(), "duration", "duration ", droolsIcon)); list.add(new RuleCompletionProposal(prefix.length(), "auto-focus", "auto-focus ", droolsIcon)); - list.add(new RuleCompletionProposal(prefix.length(), "when", "when\n\t ", droolsIcon)); + list.add(new RuleCompletionProposal(prefix.length(), "when", "when" + System.getProperty("line.separator") + "\t ", droolsIcon)); list.add(new RuleCompletionProposal(prefix.length(), "activation-group", "activation-group ", droolsIcon)); } 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 2006-05-29 17:52:37 UTC (rev 4473) +++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/RuleContentOutlinePage.java 2006-05-29 23:19:19 UTC (rev 4474) @@ -183,7 +183,7 @@ st.length() ); } - offset += st.length() + 2; //+2 for the newline + offset += st.length() + System.getProperty("line.separator").length(); // + for the newline } } catch ( IOException e ) { } 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-05-29 17:52:37 UTC (rev 4473) +++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/preferences/DroolsPreferencePage.java 2006-05-29 23:19:19 UTC (rev 4474) @@ -14,10 +14,13 @@ public class DroolsPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { private Button buildAllCheckBox; + private Button collapseEditorCheckBox; 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."); initializeValues(); @@ -39,11 +42,13 @@ private void initializeDefaults() { IPreferenceStore store = getPreferenceStore(); buildAllCheckBox.setSelection(store.getDefaultBoolean(IDroolsConstants.BUILD_ALL)); + collapseEditorCheckBox.setSelection(store.getDefaultBoolean(IDroolsConstants.EDITOR_FOLDING)); } private void initializeValues() { IPreferenceStore store = getPreferenceStore(); buildAllCheckBox.setSelection(store.getBoolean(IDroolsConstants.BUILD_ALL)); + collapseEditorCheckBox.setSelection(store.getBoolean(IDroolsConstants.EDITOR_FOLDING)); } protected void performDefaults() { @@ -60,11 +65,10 @@ private void storeValues() { IPreferenceStore store = getPreferenceStore(); store.setValue(IDroolsConstants.BUILD_ALL, buildAllCheckBox.getSelection()); + store.setValue(IDroolsConstants.EDITOR_FOLDING, collapseEditorCheckBox.getSelection()); } public void init(IWorkbench workbench) { // do nothing } - - } 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-05-29 17:52:37 UTC (rev 4473) +++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/preferences/IDroolsConstants.java 2006-05-29 23:19:19 UTC (rev 4474) @@ -3,5 +3,6 @@ public interface IDroolsConstants { String BUILD_ALL = "Drools.BuildAll"; + String EDITOR_FOLDING = "Drools.EditorFolding"; } |