/* * Created on Jan 13, 2005 * */ package org.rubypeople.rdt.internal.ui.text; import org.eclipse.core.resources.IMarkerDelta; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IWorkspace; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.reconciler.DirtyRegion; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.texteditor.ITextEditor; import org.rubypeople.rdt.core.RubyCore; import org.rubypeople.rdt.internal.ui.rubyeditor.RubyEditor; /** * @author cawilliams * */ public class RubyReconciler extends NotifyingReconciler { /** * Internal resource change listener. * * @since 3.0 */ class ResourceChangeListener implements IResourceChangeListener { private IResource getResource() { if (fTextEditor == null) return null; IEditorInput input = fTextEditor.getEditorInput(); if (input instanceof IFileEditorInput) { IFileEditorInput fileInput = (IFileEditorInput) input; return fileInput.getFile(); } return null; } /* * @see IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent) */ public void resourceChanged(IResourceChangeEvent e) { IResourceDelta delta = e.getDelta(); IResource resource = getResource(); if (delta != null && resource != null) { IResourceDelta child = delta.findMember(resource.getFullPath()); if (child != null) { IMarkerDelta[] deltas = child.getMarkerDeltas(); if (deltas.length > 0) forceReconciling(); } } } } /** * The mutex that keeps us from running multiple reconcilers on one editor. * TODO remove once we have ensured that there is only one reconciler per * editor. */ private Object fMutex; private boolean fIninitalProcessDone = false; private ResourceChangeListener fResourceChangeListener; private ITextEditor fTextEditor; /** * @param strategy * @param isIncremental */ public RubyReconciler(ITextEditor editor, RubyCompositeReconcilingStrategy strategy, boolean isIncremental) { super(strategy, isIncremental); this.fTextEditor = editor; if (editor instanceof RubyEditor) fMutex = ((RubyEditor) editor).getReconcilerLock(); else fMutex = new Object(); // Null Object } /* * @see org.eclipse.jface.text.reconciler.MonoReconciler#process(org.eclipse.jface.text.reconciler.DirtyRegion) */ protected void process(DirtyRegion dirtyRegion) { // TODO remove once we have ensured that there is only one reconciler // per editor. synchronized (fMutex) { super.process(dirtyRegion); } } /* * (non-Javadoc) * * @see org.eclipse.jface.text.reconciler.AbstractReconciler#install(org.eclipse.jface.text.ITextViewer) */ public void install(ITextViewer textViewer) { super.install(textViewer); fResourceChangeListener = new ResourceChangeListener(); IWorkspace workspace = RubyCore.getWorkspace(); workspace.addResourceChangeListener(fResourceChangeListener); } /* * @see org.eclipse.jface.text.reconciler.AbstractReconciler#forceReconciling() */ protected void forceReconciling() { if (!fIninitalProcessDone) return; super.forceReconciling(); RubyCompositeReconcilingStrategy strategy= (RubyCompositeReconcilingStrategy) getReconcilingStrategy(IDocument.DEFAULT_CONTENT_TYPE); strategy.notifyListeners(false); } /* * @see org.eclipse.jface.text.reconciler.MonoReconciler#initialProcess() */ protected void initialProcess() { // TODO remove once we have ensured that there is only one reconciler // per editor. synchronized (fMutex) { super.initialProcess(); } fIninitalProcessDone = true; } @Override protected void reconcilerReset() { super.reconcilerReset(); RubyCompositeReconcilingStrategy strategy= (RubyCompositeReconcilingStrategy) getReconcilingStrategy(IDocument.DEFAULT_CONTENT_TYPE); strategy.notifyListeners(true); } @Override protected void aboutToBeReconciled() { RubyCompositeReconcilingStrategy strategy= (RubyCompositeReconcilingStrategy) getReconcilingStrategy(IDocument.DEFAULT_CONTENT_TYPE); strategy.aboutToBeReconciled(); } }