From 88a3de11fdc748578387c9bdff5bca869a9322a1 Mon Sep 17 00:00:00 2001 From: Anton Leherbauer Date: Fri, 7 Dec 2007 12:42:18 +0000 Subject: [PATCH] Fix for 211423: TextFileBufferManager failed to notify an ITextFileBufferListener --- .../internal/ui/editor/CDocumentProvider.java | 61 +++++++++++-------- 1 file changed, 35 insertions(+), 26 deletions(-) diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CDocumentProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CDocumentProvider.java index 28414c00816..0acbe5ffb69 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CDocumentProvider.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CDocumentProvider.java @@ -26,6 +26,7 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.ListenerList; import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.text.BadLocationException; @@ -626,7 +627,9 @@ public class CDocumentProvider extends TextFileDocumentProvider { } private Object getAnnotations(Position position) { - return fReverseMap.get(position); + synchronized (getLockObject()) { + return fReverseMap.get(position); + } } /* @@ -635,17 +638,19 @@ public class CDocumentProvider extends TextFileDocumentProvider { protected void addAnnotation(Annotation annotation, Position position, boolean fireModelChanged) throws BadLocationException { super.addAnnotation(annotation, position, fireModelChanged); - Object cached= fReverseMap.get(position); - if (cached == null) - fReverseMap.put(position, annotation); - else if (cached instanceof List) { - List list= (List) cached; - list.add(annotation); - } else if (cached instanceof Annotation) { - List list= new ArrayList(2); - list.add(cached); - list.add(annotation); - fReverseMap.put(position, list); + synchronized (getLockObject()) { + Object cached= fReverseMap.get(position); + if (cached == null) + fReverseMap.put(position, annotation); + else if (cached instanceof List) { + List list= (List) cached; + list.add(annotation); + } else if (cached instanceof Annotation) { + List list= new ArrayList(2); + list.add(cached); + list.add(annotation); + fReverseMap.put(position, list); + } } } @@ -654,7 +659,9 @@ public class CDocumentProvider extends TextFileDocumentProvider { */ protected void removeAllAnnotations(boolean fireModelChanged) { super.removeAllAnnotations(fireModelChanged); - fReverseMap.clear(); + synchronized (getLockObject()) { + fReverseMap.clear(); + } } /* @@ -662,16 +669,18 @@ public class CDocumentProvider extends TextFileDocumentProvider { */ protected void removeAnnotation(Annotation annotation, boolean fireModelChanged) { Position position= getPosition(annotation); - Object cached= fReverseMap.get(position); - if (cached instanceof List) { - List list= (List) cached; - list.remove(annotation); - if (list.size() == 1) { - fReverseMap.put(position, list.get(0)); - list.clear(); + synchronized (getLockObject()) { + Object cached= fReverseMap.get(position); + if (cached instanceof List) { + List list= (List) cached; + list.remove(annotation); + if (list.size() == 1) { + fReverseMap.put(position, list.get(0)); + list.clear(); + } + } else if (cached instanceof Annotation) { + fReverseMap.remove(position); } - } else if (cached instanceof Annotation) { - fReverseMap.remove(position); } super.removeAnnotation(annotation, fireModelChanged); } @@ -679,17 +688,17 @@ public class CDocumentProvider extends TextFileDocumentProvider { protected static class GlobalAnnotationModelListener implements IAnnotationModelListener, IAnnotationModelListenerExtension { - private ArrayList fListenerList; + private ListenerList fListenerList; public GlobalAnnotationModelListener() { - fListenerList= new ArrayList(); + fListenerList= new ListenerList(ListenerList.IDENTITY); } /** * @see IAnnotationModelListener#modelChanged(IAnnotationModel) */ public void modelChanged(IAnnotationModel model) { - Object[] listeners= fListenerList.toArray(); + Object[] listeners= fListenerList.getListeners(); for (int i= 0; i < listeners.length; i++) { ((IAnnotationModelListener) listeners[i]).modelChanged(model); } @@ -699,7 +708,7 @@ public class CDocumentProvider extends TextFileDocumentProvider { * @see IAnnotationModelListenerExtension#modelChanged(AnnotationModelEvent) */ public void modelChanged(AnnotationModelEvent event) { - Object[] listeners= fListenerList.toArray(); + Object[] listeners= fListenerList.getListeners(); for (int i= 0; i < listeners.length; i++) { Object curr= listeners[i]; if (curr instanceof IAnnotationModelListenerExtension) {