Update of /cvsroot/e-p-i-c/org.epic.perleditor/src/org/epic/perleditor/editors In directory sc8-pr-cvs5.sourceforge.net:/tmp/cvs-serv13634/src/org/epic/perleditor/editors Modified Files: PerlEditor.java PerlPartitioner.java PerlDocumentProvider.java PerlBracketInserter.java Log Message: Merged from 'stable'. Index: PerlDocumentProvider.java =================================================================== RCS file: /cvsroot/e-p-i-c/org.epic.perleditor/src/org/epic/perleditor/editors/PerlDocumentProvider.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- PerlDocumentProvider.java 8 Nov 2006 19:41:05 -0000 1.9 +++ PerlDocumentProvider.java 16 Nov 2006 21:05:39 -0000 1.10 @@ -5,7 +5,6 @@ import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IDocumentPartitioner; import org.eclipse.jface.text.source.IAnnotationModel; -import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.editors.text.TextFileDocumentProvider; import org.epic.perleditor.PerlEditorPlugin; @@ -20,7 +19,7 @@ { super.connect(element); - connectPerlPartitioner((IFileEditorInput) element); + connectPerlPartitioner(element); } protected IAnnotationModel createAnnotationModel(IFile file) @@ -28,10 +27,10 @@ return new PerlSourceAnnotationModel(file); } - private void connectPerlPartitioner(IFileEditorInput input) + private void connectPerlPartitioner(Object input) { - IDocument doc = getFileInfo(input).fTextFileBuffer.getDocument(); - + IDocument doc = getDocument(input); + if (doc.getDocumentPartitioner() == null) { IDocumentPartitioner partitioner = Index: PerlPartitioner.java =================================================================== RCS file: /cvsroot/e-p-i-c/org.epic.perleditor/src/org/epic/perleditor/editors/PerlPartitioner.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- PerlPartitioner.java 12 Jul 2006 19:14:41 -0000 1.5 +++ PerlPartitioner.java 16 Nov 2006 21:05:39 -0000 1.6 @@ -27,8 +27,6 @@ private final ILog log; private IDocument doc; - private boolean ignoreDocumentChangedEvent; - private DocumentEvent ignoredEvent; private DocumentRewriteSession activeRewriteSession; private boolean initialized; private TokensList tokens; @@ -160,13 +158,6 @@ { try { - if (ignoreDocumentChangedEvent) - { - ignoreDocumentChangedEvent = false; - ignoredEvent = event; - return null; - } - synchronized (TOKENS_LOCK) { IRegion ret = documentChanged2Impl(event); @@ -228,16 +219,6 @@ { return TOKENS_LOCK; } - - /** - * Marks the next documentChanged event as coming from PerlBracketInserter - * and therefore safe to ignore (because it is will be followed by another - * event). This helps the smart typing feature improve performance. - */ - public void ignoreSmartTypingEvent() - { - ignoreDocumentChangedEvent = true; - } public void startRewriteSession(DocumentRewriteSession session) throws IllegalStateException @@ -311,15 +292,7 @@ String repl = event.getText(); if (repl == null) repl = ""; int shiftDelta = repl.length() - event.getLength(); - - if (ignoredEvent != null) // compensate for ignoredEvent - { - repl = ignoredEvent.getText(); - if (repl == null) repl = ""; - shiftDelta += repl.length() - ignoredEvent.getLength(); - ignoredEvent = null; - } - + PerlToken sync; if (syncTokenI >= 0 && syncTokenI < tokens.size()) { Index: PerlEditor.java =================================================================== RCS file: /cvsroot/e-p-i-c/org.epic.perleditor/src/org/epic/perleditor/editors/PerlEditor.java,v retrieving revision 1.73 retrieving revision 1.74 diff -u -d -r1.73 -r1.74 --- PerlEditor.java 31 Oct 2006 20:17:38 -0000 1.73 +++ PerlEditor.java 16 Nov 2006 21:05:39 -0000 1.74 @@ -631,6 +631,17 @@ } } + /** + * @return the edited workspace resource or null if the editor's input + * is not a workspace resource (example: remote files opened + * while browsing CVS are not resources) + */ + private IResource getResource() + { + return (IResource) + ((IAdaptable) getEditorInput()).getAdapter(IResource.class); + } + private void installBracketInserter() { bracketInserter = @@ -686,6 +697,9 @@ private void installModuleCompletionHelper() { + IResource resource = getResource(); + if (resource == null) return; + // load the module completion list in a low-priority background thread Thread backgroundLoader = new Thread(new Runnable() { public void run() { @@ -719,12 +733,15 @@ private void installSyntaxValidationThread() { + IResource resource = getResource(); + if (resource == null) return; + // Always check syntax when editor is opened validationThread = new PerlSyntaxValidationThread(); validationThread.setPriority(Thread.MIN_PRIORITY); validationThread.start(); validationThread.setDocument( - (IResource) ((IAdaptable) getEditorInput()).getAdapter(IResource.class), + resource, sourceViewer.getDocument()); // Register the validation thread if automatic checking is enabled @@ -737,6 +754,9 @@ private void installTasksReconciler() { + IResource resource = getResource(); + if (resource == null) return; + tasksReconciler = new TasksReconciler(this); } Index: PerlBracketInserter.java =================================================================== RCS file: /cvsroot/e-p-i-c/org.epic.perleditor/src/org/epic/perleditor/editors/PerlBracketInserter.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- PerlBracketInserter.java 11 Nov 2006 14:51:33 -0000 1.4 +++ PerlBracketInserter.java 16 Nov 2006 21:05:39 -0000 1.5 @@ -3,6 +3,7 @@ import org.eclipse.core.runtime.*; import org.eclipse.jface.text.*; import org.eclipse.jface.text.source.ISourceViewer; +import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.custom.VerifyKeyListener; import org.eclipse.swt.events.VerifyEvent; import org.eclipse.swt.graphics.Point; @@ -86,7 +87,7 @@ char closingChar = getClosingChar(event.character); if (closingChar == NON_BRACKET) return; - processBracketKeyStroke( + event.doit = processBracketKeyStroke( viewer.getDocument(), viewer.getSelectedRange(), event.character, @@ -124,19 +125,6 @@ } /** - * Tells PerlPartitioner to ignore the next document change event. - * It is safe to ignore because the real key stroke event will follow - * and be processed normally. We don't want PerlPartitioner to waste - * time processing the intermediate state occuring between the two events. - */ - private void ignoreSmartTypingEvent(IDocument doc) - { - IDocumentPartitioner partitioner = doc.getDocumentPartitioner(); - if (partitioner instanceof PerlPartitioner) - ((PerlPartitioner) partitioner).ignoreSmartTypingEvent(); - } - - /** * @return true if the given character inserted at the given offset * in the document would act as a "closing" character; * false otherwise @@ -184,8 +172,10 @@ * no selection (x, y = 0) * @param keystrokeChar character entered by the user * @param closingChar the corresponding "closing" character + * @return true if the key stroke event should be processed, + * false if it should be discarded */ - private void processBracketKeyStroke( + private boolean processBracketKeyStroke( IDocument doc, Point selection, char keystrokeChar, @@ -201,7 +191,7 @@ { String partitionType = doc.getPartition(offset-1).getType(); if (PartitionTypes.POD.equals(partitionType) || - PartitionTypes.COMMENT.equals(partitionType)) return; + PartitionTypes.COMMENT.equals(partitionType)) return true; } if (isClosingChar(doc, offset, keystrokeChar)) @@ -211,9 +201,9 @@ if (offset + length < doc.getLength() && doc.getChar(offset + length) == closingChar) { - // There's already a closing char in front of us, so erase it - ignoreSmartTypingEvent(doc); - doc.replace(offset + length, 1, ""); + // There's already a closing char in front of us, so skip it + skipChar(); + return false; } } else @@ -223,18 +213,32 @@ if (offset + length < doc.getLength() && doc.getChar(offset + length) == keystrokeChar) { - // There's already an opening char in front of us, so erase it - ignoreSmartTypingEvent(doc); - doc.replace(offset + length, 1, ""); + // There's already an opening char in front of us, so skip it + skipChar(); + return false; } else { - // Auto-insert the closing char just after it - ignoreSmartTypingEvent(doc); - doc.replace(offset + length, 0, String.valueOf(closingChar)); + // Auto-insert the closing char just after it... + char[] pair = new char[] { keystrokeChar, closingChar }; + doc.replace(offset, 0, String.valueOf(pair)); + // ...and position the caret after the entered char + skipChar(); + return false; } } + return true; } - catch (BadLocationException e) { logBadLocationException(e); } + catch (BadLocationException e) + { + logBadLocationException(e); + return true; + } + } + + private void skipChar() + { + StyledText text = viewer.getTextWidget(); + text.setCaretOffset(text.getCaretOffset()+1); } } \ No newline at end of file |