From: Jochen L. <lue...@us...> - 2004-09-05 15:49:14
|
Update of /cvsroot/e-p-i-c/org.epic.perleditor/src/org/epic/perleditor/editors In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12275/src/org/epic/perleditor/editors Modified Files: PerlSyntaxValidationThread.java PerlEditor.java PerlSourceViewer.java IdleTimer.java PerlToDoMarkerThread.java Added Files: PerlFoldingThread.java Log Message: Source Folding added Index: IdleTimer.java =================================================================== RCS file: /cvsroot/e-p-i-c/org.epic.perleditor/src/org/epic/perleditor/editors/IdleTimer.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- IdleTimer.java 17 Aug 2004 16:25:39 -0000 1.3 +++ IdleTimer.java 5 Sep 2004 15:48:39 -0000 1.4 @@ -122,7 +122,8 @@ try { // Get checksum - hashCode = sourceViewer.getTextWidget().getText().hashCode(); + //hashCode = sourceViewer.getTextWidget().getText().hashCode(); + hashCode = sourceViewer.getDocument().get().hashCode(); if (((SourceViewer) viewer).getTextWidget().isVisible() && hashCode != previousHashCode) { Index: PerlToDoMarkerThread.java =================================================================== RCS file: /cvsroot/e-p-i-c/org.epic.perleditor/src/org/epic/perleditor/editors/PerlToDoMarkerThread.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- PerlToDoMarkerThread.java 27 Aug 2004 07:43:09 -0000 1.2 +++ PerlToDoMarkerThread.java 5 Sep 2004 15:48:39 -0000 1.3 @@ -40,7 +40,8 @@ public void onEditorIdle(ISourceViewer viewer) { System.out.println("editor is idle...setting source viewer"); this.fSourceViewer = viewer; - this.setText(fSourceViewer.getTextWidget().getText()); + //this.setText(fSourceViewer.getTextWidget().getText()); + this.setText(fSourceViewer.getDocument().get()); } public void setText(String newText) { --- NEW FILE: PerlFoldingThread.java --- package org.epic.perleditor.editors; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.Position; import org.eclipse.jface.text.source.IAnnotationModel; import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.jface.text.source.projection.ProjectionAnnotation; import org.eclipse.jface.text.source.projection.ProjectionAnnotationModel; import org.eclipse.ui.editors.text.TextEditor; import org.epic.perleditor.PerlEditorPlugin; import org.epic.perleditor.preferences.PreferenceConstants; import org.epic.perleditor.views.model.Model; import org.epic.perleditor.views.util.SourceParser; public class PerlFoldingThread extends Thread implements IdleTimerListener { private final Object lock1 = new Object(); private ISourceViewer fSourceViewer; private TextEditor fTextEditor; private String text = null; private static final Integer ANNOTATION_NEW = new Integer(1); private static final Integer ANNOTATION_EXISTS = new Integer(2); public PerlFoldingThread(TextEditor textEditor, ISourceViewer viewer) { super(); this.fTextEditor = textEditor; this.fSourceViewer = viewer; } public void onEditorIdle(ISourceViewer viewer) { this.fSourceViewer = viewer; //this.setText(fSourceViewer.getTextWidget().getText()); this.setText(fSourceViewer.getDocument().get()); } public void setText(String newText) { synchronized (this.lock1) { this.text = newText; this.lock1.notifyAll(); } } public void run() { try { while (!Thread.interrupted()) { synchronized (this.lock1) { this.lock1.wait(); } try { this.updateFoldingAnnotations(); } catch (Exception e) { e.printStackTrace(); } } } catch (InterruptedException e) { //everything is fine, and this thread will terminate } } public void updateFoldingAnnotations() { IAnnotationModel model = (IAnnotationModel) fTextEditor .getAdapter(ProjectionAnnotationModel.class); HashMap positionHash = new HashMap(); if (model != null) { // Remove all annotations // for (Iterator i = model.getAnnotationIterator(); i.hasNext();) { // ProjectionAnnotation annotation = (ProjectionAnnotation) i // .next(); // model.removeAnnotation(annotation); // } IPreferenceStore store = PerlEditorPlugin.getDefault() .getPreferenceStore(); boolean foldingEnabled = store .getBoolean(PreferenceConstants.SOURCE_FOLDING); List podList = new ArrayList(); List subList = new ArrayList(); if (foldingEnabled) { String lineSep = null; if (text.indexOf(System.getProperty("line.separator")) != -1) { lineSep = System.getProperty("line.separator"); } else { if (text.indexOf("\r\n") > 0) { lineSep = "\r\n"; } else if (text.indexOf("\n") > 0) { lineSep = "\n"; } else if (text.indexOf("\r") > 0) { lineSep = "\r"; } } // Get all pod comments String podExpr = "^(=head.*(" + lineSep + ".*)+?" + lineSep + "=cut)$"; podList = SourceParser.getElements(text, podExpr, "", "", SourceParser.DO_NOT_DELETE_COMMENT_POD); // Get all subroutines //String subExpr = "^\\s*sub\\s+(.*{.*(" + lineSep + // ".*)+?.*\\n})"; String subExpr = "^[\\s]*(sub\\s+[^\\n\\r{]+)"; List subListTmp = SourceParser.getElements(text, subExpr, "", "", SourceParser.DELETE_COMMENT | SourceParser.DELETE_POD); subList = new ArrayList(); // Find closing brackets for subs manually for (int i = 0; i < subListTmp.size(); i++) { try { Model sub = (Model) subListTmp.get(i); int pos = searchForClosingBracket(sub.getStart() + sub.getLength() + 1, '{', '}', fSourceViewer .getDocument()); if (pos != -1) { subList.add(new Model(sub.getName(), sub.getStart(), pos - sub.getStart())); } } catch (BadLocationException e) { } } } List completeList = new ArrayList(); completeList.add(podList); completeList.add(subList); for (int i = 0; i < completeList.size(); i++) { if (!(completeList.get(i) instanceof List)) { continue; } List list = (List) completeList.get(i); for (int j = 0; j < list.size(); j++) { if (!(list.get(j) instanceof Model)) { continue; } int start = ((Model) list.get(j)).getStart(); int length = ((Model) list.get(j)).getLength(); Position position = new Position(start, length); //model.addAnnotation(new ProjectionAnnotation(), // position); positionHash.put(position, ANNOTATION_NEW); } } } // Delete unnecessary annotations and mark existig annotations for (Iterator i = model.getAnnotationIterator(); i.hasNext();) { ProjectionAnnotation annotation = (ProjectionAnnotation) i.next(); Position pos = model.getPosition(annotation); if (positionHash.get(pos) == null) { model.removeAnnotation(annotation); } else { positionHash.put(pos, ANNOTATION_EXISTS); } } // Add new annotations for (Iterator it = positionHash.keySet().iterator(); it.hasNext();) { Position pos = (Position) it.next(); Integer val = (Integer) positionHash.get(pos); if (val != ANNOTATION_EXISTS) { model.addAnnotation(new ProjectionAnnotation(), pos); } } } /** * Returns the position of the closing bracket after startPosition. * * @returns the location of the closing bracket. * @param startPosition - * the beginning position * @param openBracket - * the character that represents the open bracket * @param closeBracket - * the character that represents the close bracket * @param document - * the document being searched */ protected int searchForClosingBracket(int startPosition, char openBracket, char closeBracket, IDocument document) throws BadLocationException { int stack = 1; int closePosition = startPosition + 1; int length = document.getLength(); char nextChar; while (closePosition < length && stack > 0) { nextChar = document.getChar(closePosition); if (nextChar == openBracket && nextChar != closeBracket) stack++; else if (nextChar == closeBracket) stack--; closePosition++; } if (stack == 0) return closePosition; else return -1; } public void dispose() throws InterruptedException { this.interrupt(); this.join(); } } Index: PerlSyntaxValidationThread.java =================================================================== RCS file: /cvsroot/e-p-i-c/org.epic.perleditor/src/org/epic/perleditor/editors/PerlSyntaxValidationThread.java,v retrieving revision 1.24 retrieving revision 1.25 diff -u -d -r1.24 -r1.25 --- PerlSyntaxValidationThread.java 27 Aug 2004 07:43:09 -0000 1.24 +++ PerlSyntaxValidationThread.java 5 Sep 2004 15:48:39 -0000 1.25 @@ -218,6 +218,7 @@ * @see org.epic.perleditor.editors.IdleTimerListener#onEditorIdle(org.eclipse.jface.text.source.ISourceViewer) */ public synchronized void onEditorIdle(ISourceViewer viewer) { - this.setText(((SourceViewer) viewer).getTextWidget().getText()); + //this.setText(((SourceViewer) viewer).getTextWidget().getText()); + this.setText(((SourceViewer) viewer).getDocument().get()); } } Index: PerlSourceViewer.java =================================================================== RCS file: /cvsroot/e-p-i-c/org.epic.perleditor/src/org/epic/perleditor/editors/PerlSourceViewer.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- PerlSourceViewer.java 29 Dec 2003 19:39:41 -0000 1.2 +++ PerlSourceViewer.java 5 Sep 2004 15:48:39 -0000 1.3 @@ -3,12 +3,13 @@ import org.eclipse.jface.text.source.IOverviewRuler; import org.eclipse.jface.text.source.IVerticalRuler; import org.eclipse.jface.text.source.SourceViewer; +import org.eclipse.jface.text.source.projection.ProjectionViewer; import org.eclipse.swt.widgets.Composite; import org.eclipse.jface.text.DocumentCommand; import org.epic.perleditor.editors.util.PreferenceUtil; -public class PerlSourceViewer extends SourceViewer { +public class PerlSourceViewer extends ProjectionViewer { public PerlSourceViewer( Composite parent, Index: PerlEditor.java =================================================================== RCS file: /cvsroot/e-p-i-c/org.epic.perleditor/src/org/epic/perleditor/editors/PerlEditor.java,v retrieving revision 1.33 retrieving revision 1.34 diff -u -d -r1.33 -r1.34 --- PerlEditor.java 28 Aug 2004 10:07:27 -0000 1.33 +++ PerlEditor.java 5 Sep 2004 15:48:39 -0000 1.34 @@ -16,6 +16,9 @@ import org.eclipse.jface.text.source.IVerticalRuler; import org.eclipse.jface.text.source.LineNumberRulerColumn; import org.eclipse.jface.text.source.SourceViewer; +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.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.viewers.ISelectionChangedListener; @@ -35,6 +38,7 @@ import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds; import org.eclipse.ui.texteditor.TextOperationAction; import org.eclipse.ui.views.contentoutline.IContentOutlinePage; +import org.epic.core.util.FileUtilities; import org.epic.perleditor.PerlEditorPlugin; import org.epic.perleditor.actions.IPerlEditorActionDefinitionIds; import org.epic.perleditor.editors.util.PerlColorProvider; @@ -45,11 +49,6 @@ import org.epic.perleditor.views.model.Subroutine; import cbg.editor.ColoringSourceViewerConfiguration; -//import java.util.Map; -//import java.util.HashMap; -//import org.eclipse.swt.graphics.Color; - -import org.epic.core.util.FileUtilities; /** @@ -67,6 +66,7 @@ protected PerlOutlinePage page; protected PerlSyntaxValidationThread fValidationThread = null; protected PerlToDoMarkerThread fTodoMarkerThread = null; + protected PerlFoldingThread fFoldingThread = null; protected CompositeRuler ruler; protected LineNumberRulerColumn numberRuler; private boolean lineRulerActive = false; @@ -75,6 +75,8 @@ private IdleTimer idleTimer; private final static String PERL_MODE = "perl"; + + private ProjectionSupport projectionSupport; /** * Default constructor(); @@ -170,8 +172,8 @@ e.printStackTrace(); } // Always check syntax when editor is opened - fValidationThread.setText( - getSourceViewer().getTextWidget().getText()); + //fValidationThread.setText(getSourceViewer().getTextWidget().getText()); + fValidationThread.setText(getSourceViewer().getDocument().get()); } //set up the ToDoMarkerThread @@ -179,6 +181,12 @@ fTodoMarkerThread = new PerlToDoMarkerThread(this, getSourceViewer()); fTodoMarkerThread.start(); } + + // set up the FoldingThread + if ((fFoldingThread == null) && isPerlMode()) { + fFoldingThread = new PerlFoldingThread(this, getSourceViewer()); + fFoldingThread.start(); + } setEditorForegroundColor(); @@ -189,6 +197,7 @@ // Register the validation thread this.registerIdleListener(fValidationThread); this.registerIdleListener(fTodoMarkerThread); + this.registerIdleListener(fFoldingThread); } @@ -220,6 +229,10 @@ if (fTodoMarkerThread != null) { fTodoMarkerThread.dispose(); } + + if (fFoldingThread != null) { + fFoldingThread.dispose(); + } super.dispose(); } catch (Exception ex) { @@ -252,8 +265,8 @@ } if (fValidationThread != null) { - fValidationThread.setText( - getSourceViewer().getTextWidget().getText()); + //fValidationThread.setText(getSourceViewer().getTextWidget().getText()); + fValidationThread.setText(getSourceViewer().getDocument().get()); } } @@ -272,8 +285,8 @@ } if (fValidationThread != null) { - fValidationThread.setText( - getSourceViewer().getTextWidget().getText()); + //fValidationThread.setText(getSourceViewer().getTextWidget().getText()); + fValidationThread.setText(getSourceViewer().getDocument().get()); } } @@ -336,8 +349,18 @@ * outline page. */ - public Object getAdapter(Class required) { - if (required.equals(IContentOutlinePage.class)) { + public Object getAdapter(Class adapter) { + + if (ProjectionAnnotationModel.class.equals(adapter)) { + if (this.projectionSupport != null) { + Object result = this.projectionSupport.getAdapter(getSourceViewer(), adapter); + if (result != null) { + return result; + } + } + } + + if (adapter.equals(IContentOutlinePage.class)) { IEditorInput input = getEditorInput(); if (input instanceof IFileEditorInput) { @@ -351,7 +374,7 @@ } - return super.getAdapter(required); + return super.getAdapter(adapter); } public void updateOutline() { @@ -423,9 +446,8 @@ public void revalidateSyntax(boolean forceUpdate) { if (fValidationThread != null) { - fValidationThread.setText( - getSourceViewer().getTextWidget().getText(), - forceUpdate); + //fValidationThread.setText(getSourceViewer().getTextWidget().getText(), forceUpdate); + fValidationThread.setText(getSourceViewer().getDocument().get(), forceUpdate); } } @@ -444,14 +466,15 @@ return; } - PerlSourceViewerConfiguration viewerConfiguration = - (PerlSourceViewerConfiguration) this.getSourceViewerConfiguration(); - viewerConfiguration.adaptToPreferenceChange(event); - - IAnnotationModel model = fSourceViewer.getAnnotationModel(); - IDocument document = fDocumentProvider.getDocument(getEditorInput()); - fSourceViewer.refresh(); - fSourceViewer.setDocument(document, model); +// PerlSourceViewerConfiguration viewerConfiguration = +// (PerlSourceViewerConfiguration) this.getSourceViewerConfiguration(); +// viewerConfiguration.adaptToPreferenceChange(event); +// +// //IAnnotationModel model = fSourceViewer.getAnnotationModel(); +// IAnnotationModel model = (IAnnotationModel) this.getAdapter(ProjectionAnnotationModel.class); +// IDocument document = fDocumentProvider.getDocument(getEditorInput()); +// fSourceViewer.refresh(); +// fSourceViewer.setDocument(document, model); setEditorForegroundColor(); @@ -494,5 +517,24 @@ getSourceViewer().getTextWidget().setForeground( PerlColorProvider.getColor(rgb)); } + + public void createPartControl(Composite parent) { + super.createPartControl(parent); + ProjectionViewer viewer = (ProjectionViewer) getSourceViewer(); + projectionSupport = new ProjectionSupport(viewer, getAnnotationAccess(), getSharedColors()); + projectionSupport.addSummarizableAnnotationType("org.eclipse.ui.workbench.texteditor.error"); + projectionSupport.addSummarizableAnnotationType("org.eclipse.ui.workbench.texteditor.warning"); + +// projectionSupport.setHoverControlCreator(new IInformationControlCreator() { +// public IInformationControl createInformationControl(Shell shell) { +// //return new CustomSourceInformationControl(shell, IDocument.DEFAULT_CONTENT_TYPE); +// return new SourceViewerInformationControl(shell); +// } +// }); + + projectionSupport.install(); + + viewer.doOperation(ProjectionViewer.TOGGLE); + } } \ No newline at end of file |