From: <jbo...@li...> - 2006-03-02 21:49:24
|
Author: brown_j Date: 2006-03-02 16:49:19 -0500 (Thu, 02 Mar 2006) New Revision: 2714 Added: trunk/labs/jbossrules/drools-ide/src/main/java/org/drools/ide/editors/RuleFileTreeNode.java Modified: trunk/labs/jbossrules/drools-ide/src/main/java/org/drools/ide/editors/DRLRuleSetEditor.java trunk/labs/jbossrules/drools-ide/src/main/java/org/drools/ide/editors/RuleContentOutlinePage.java Log: JBRULES-36 refactoring to clean up outline view Modified: trunk/labs/jbossrules/drools-ide/src/main/java/org/drools/ide/editors/DRLRuleSetEditor.java =================================================================== --- trunk/labs/jbossrules/drools-ide/src/main/java/org/drools/ide/editors/DRLRuleSetEditor.java 2006-03-02 18:57:24 UTC (rev 2713) +++ trunk/labs/jbossrules/drools-ide/src/main/java/org/drools/ide/editors/DRLRuleSetEditor.java 2006-03-02 21:49:19 UTC (rev 2714) @@ -4,8 +4,6 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.action.IAction; import org.eclipse.jface.text.source.ISourceViewer; -import org.eclipse.ui.IEditorInput; -import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.editors.text.TextEditor; import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds; import org.eclipse.ui.texteditor.TextOperationAction; @@ -71,13 +69,8 @@ protected ContentOutlinePage getContentOutline() { if ( ruleContentOutline == null ) { - - ruleContentOutline = new RuleContentOutlinePage( this ); - IEditorInput editorInput = getEditorInput(); - if ( editorInput instanceof IFileEditorInput ) { - ruleContentOutline.setInput( (IFileEditorInput) editorInput ); - } + ruleContentOutline.update(); } return ruleContentOutline; } Modified: trunk/labs/jbossrules/drools-ide/src/main/java/org/drools/ide/editors/RuleContentOutlinePage.java =================================================================== --- trunk/labs/jbossrules/drools-ide/src/main/java/org/drools/ide/editors/RuleContentOutlinePage.java 2006-03-02 18:57:24 UTC (rev 2713) +++ trunk/labs/jbossrules/drools-ide/src/main/java/org/drools/ide/editors/RuleContentOutlinePage.java 2006-03-02 21:49:19 UTC (rev 2714) @@ -8,15 +8,15 @@ import org.eclipse.jface.text.IDocument; import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; -import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; -import org.eclipse.ui.IFileEditorInput; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; +import org.eclipse.ui.texteditor.IDocumentProvider; import org.eclipse.ui.views.contentoutline.ContentOutlinePage; /** @@ -29,22 +29,20 @@ public class RuleContentOutlinePage extends ContentOutlinePage { //the editor that this outline view is linked to. - private DRLRuleSetEditor editor; + private DRLRuleSetEditor editor; //the "root" node - private PackageTreeNode packageTreeNode = new PackageTreeNode(); - + private final RuleFileTreeNode ruleFileTreeNode = new RuleFileTreeNode(); + /////////////////////////////////// // Patterns that the parser uses /////////////////////////////////// - private static final Pattern rulePattern = Pattern.compile( "rule\\s*\"?([^\"]+)\"?.*", - Pattern.DOTALL ); + private static final Pattern rulePattern = Pattern.compile( "rule\\s*\"?([^\"]+)\"?.*", + Pattern.DOTALL ); - private static final Pattern packagePattern = Pattern.compile( "package\\s*([^\"]+)", - Pattern.DOTALL ); + private static final Pattern packagePattern = Pattern.compile( "package\\s*([^\"]+)", + Pattern.DOTALL ); - - public RuleContentOutlinePage(DRLRuleSetEditor editor) { super(); this.editor = editor; @@ -53,10 +51,10 @@ public void createControl(Composite parent) { super.createControl( parent ); TreeViewer viewer = getTreeViewer(); - viewer.setContentProvider( new ContentProvider() ); + viewer.setContentProvider( new WorkbenchContentProvider() ); viewer.setLabelProvider( new WorkbenchLabelProvider() ); - if ( fileEditorInput != null ) viewer.setInput( fileEditorInput ); + viewer.setInput( ruleFileTreeNode ); update(); //add the listener for navigation of the rule document. @@ -75,13 +73,6 @@ } ); } - private IFileEditorInput fileEditorInput = null; - - public void setInput(IFileEditorInput input) { - fileEditorInput = input; - update(); - } - /** * Updates the outline page. */ @@ -91,8 +82,10 @@ if ( viewer != null ) { Control control = viewer.getControl(); if ( control != null && !control.isDisposed() ) { + PackageTreeNode packageTreeNode = createPackageTreeNode(); + ruleFileTreeNode.setPackageTreeNode( packageTreeNode ); + viewer.refresh(); control.setRedraw( false ); - viewer.setInput( fileEditorInput ); viewer.expandAll(); control.setRedraw( true ); } @@ -100,93 +93,60 @@ } /** - * Simple content provider for a primitive understanding of a rule DRL file. - * The day may come where we hook into an official AST, - * But that is not this day. This day, we parse ! (apologies to J.R.R. Tolkien). + * + * @return a PackageTreeNode representing the current state of the + * document, populated with all of the package's child elements */ - class ContentProvider - implements - ITreeContentProvider { + private PackageTreeNode createPackageTreeNode() { + PackageTreeNode packageTreeNode = new PackageTreeNode(); + populatePackageTreeNode( packageTreeNode ); + return packageTreeNode; + } - /** - * A simple line by line parse of the document, using the precompiled regex to tease out a rule structure. - * In future, this may hook into the AST from the parser/incremental compiler, thus rendering the regex obsolete. - */ - protected void parse(IDocument document) { + /** + * populates the PackageTreeNode with all of its child elements + * + * @param packageTreeNode the node to populate + */ + private void populatePackageTreeNode(PackageTreeNode packageTreeNode) { + String ruleFileContents = getRuleFileContents(); + StringReader stringReader = new StringReader( ruleFileContents ); + BufferedReader bufferedReader = new BufferedReader( stringReader ); + try { + int offset = 0; + String st; + while ( (st = bufferedReader.readLine()) != null ) { - String ruleFileContents = document.get(); - StringReader stringReader = new StringReader( ruleFileContents ); - BufferedReader bufferedReader = new BufferedReader( stringReader ); - try { - int offset = 0; - String st; - while ( (st = bufferedReader.readLine()) != null ) { + Matcher matcher = rulePattern.matcher( st ); - Matcher matcher = rulePattern.matcher( st ); - - if ( matcher.matches() ) { - String rule = matcher.group( 1 ); - packageTreeNode.addRule( rule, - offset, - st.length() ); - } - matcher = packagePattern.matcher( st ); - if ( matcher.matches() ) { - String packageName = matcher.group( 1 ); - packageTreeNode.setPackageName( packageName ); - packageTreeNode.setOffset( offset ); - packageTreeNode.setLength( st.length() ); - } - offset += st.length() + 1; //+1 for the newline + if ( matcher.matches() ) { + String rule = matcher.group( 1 ); + packageTreeNode.addRule( rule, + offset, + st.length() ); } - } catch ( IOException e ) { - } - } - - /* - * @see IContentProvider#inputChanged(Viewer, Object, Object) - */ - public void inputChanged(Viewer viewer, - Object oldInput, - Object newInput) { - - packageTreeNode = new PackageTreeNode(); - - if ( newInput != null ) { - IDocument document = editor.getDocumentProvider().getDocument( newInput ); - if ( document != null ) { - parse( document ); + matcher = packagePattern.matcher( st ); + if ( matcher.matches() ) { + String packageName = matcher.group( 1 ); + packageTreeNode.setPackageName( packageName ); + packageTreeNode.setOffset( offset ); + packageTreeNode.setLength( st.length() ); } + offset += st.length() + 1; //+1 for the newline } + } catch ( IOException e ) { } + } - public void dispose() { - } - - public boolean isDeleted(Object element) { - return false; - } - - public Object[] getElements(Object element) { - return new Object[]{packageTreeNode}; - } - - public boolean hasChildren(Object element) { - boolean hasChildren = element == fileEditorInput || element == packageTreeNode; - return hasChildren; - } - - public Object getParent(Object element) { - if ( element instanceof RuleTreeNode ) return packageTreeNode; - return null; - } - - public Object[] getChildren(Object element) { - if ( element == packageTreeNode ) { - return packageTreeNode.getChildren( element ); - } - - return new Object[0]; - } + /** + * + * @return the current contents of the document + */ + private String getRuleFileContents() { + IDocumentProvider documentProvider = editor.getDocumentProvider(); + IEditorInput editorInput = editor.getEditorInput(); + IDocument document = documentProvider.getDocument( editorInput ); + String ruleFileContents = document.get(); + return ruleFileContents; } } \ No newline at end of file Added: trunk/labs/jbossrules/drools-ide/src/main/java/org/drools/ide/editors/RuleFileTreeNode.java =================================================================== --- trunk/labs/jbossrules/drools-ide/src/main/java/org/drools/ide/editors/RuleFileTreeNode.java 2006-03-02 18:57:24 UTC (rev 2713) +++ trunk/labs/jbossrules/drools-ide/src/main/java/org/drools/ide/editors/RuleFileTreeNode.java 2006-03-02 21:49:19 UTC (rev 2714) @@ -0,0 +1,46 @@ +package org.drools.ide.editors; + +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.ui.model.IWorkbenchAdapter; + +/** + * This represents a rule file in the outline view. + * + * @author Jeff Brown + */ +public class RuleFileTreeNode extends OutlineNode { + + private PackageTreeNode packageTreeNode = null; + + public Object[] getChildren(Object o) { + if(packageTreeNode == null) return new Object[0]; + return new Object[]{packageTreeNode}; + } + + public ImageDescriptor getImageDescriptor(Object object) { + return null; + } + + public String getLabel(Object o) { + return null; + } + + public Object getParent(Object o) { + return null; + } + + public Object getAdapter(Class adapter) { + if ( adapter == IWorkbenchAdapter.class ) { + return this; + } + return null; + } + + public PackageTreeNode getPackageTreeNode() { + return packageTreeNode; + } + + public void setPackageTreeNode(PackageTreeNode packageTreeNode) { + this.packageTreeNode = packageTreeNode; + } +} |