package com.google.dart.tools.internal.search.ui; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.eclipse.core.filebuffers.FileBuffers; import org.eclipse.core.filebuffers.IFileBuffer; import org.eclipse.core.filebuffers.IFileBufferListener; import org.eclipse.core.filebuffers.ITextFileBuffer; import org.eclipse.core.filebuffers.LocationKind; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IPath; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.Position; import java.util.List; import java.util.Map; /** * Helper for updating search {@link Position}s when corresponding files are changed. * * @coverage dart.editor.ui.search */ class PositionTracker implements IFileBufferListener { private final Map<IFile, List<Position>> fileToPositions = Maps.newHashMap(); public PositionTracker() { FileBuffers.getTextFileBufferManager().addFileBufferListener(this); } @Override public void bufferContentAboutToBeReplaced(IFileBuffer buffer) { bufferDisposed(buffer); } @Override public void bufferContentReplaced(IFileBuffer buffer) { // not interesting for us } @Override public void bufferCreated(IFileBuffer buffer) { if (!(buffer instanceof ITextFileBuffer)) { return; } ITextFileBuffer textFileBuffer = (ITextFileBuffer) buffer; // prepare IFile IFile file = FileBuffers.getWorkspaceFileAtLocation(buffer.getLocation()); if (file == null) { return; } // add positions to ITextFileBuffer document List<Position> positions = fileToPositions.get(file); if (positions != null) { for (Position position : positions) { try { textFileBuffer.getDocument().addPosition(position); } catch (BadLocationException e) { } } } } @Override public void bufferDisposed(IFileBuffer buffer) { if (!(buffer instanceof ITextFileBuffer)) { return; } ITextFileBuffer textFileBuffer = (ITextFileBuffer) buffer; // prepare IFile IFile file = FileBuffers.getWorkspaceFileAtLocation(buffer.getLocation()); if (file == null) { return; } // remove positions from ITextFileBuffer document List<Position> positions = fileToPositions.get(file); if (positions != null) { for (Position position : positions) { textFileBuffer.getDocument().removePosition(position); } } } @Override public void dirtyStateChanged(IFileBuffer buffer, boolean isDirty) { // not interesting for us } @Override public void stateChangeFailed(IFileBuffer buffer) { // not interesting for us } @Override public void stateChanging(IFileBuffer buffer) { // not interesting for us } @Override public void stateValidationChanged(IFileBuffer buffer, boolean isStateValidated) { // not interesting for us } @Override public void underlyingFileDeleted(IFileBuffer buffer) { // not interesting for us } @Override public void underlyingFileMoved(IFileBuffer buffer, IPath path) { // not interesting for us } void dispose() { FileBuffers.getTextFileBufferManager().removeFileBufferListener(this); } void trackPosition(IFile file, Position position) { // remember position to track List<Position> positions = fileToPositions.get(file); if (positions == null) { positions = Lists.newArrayList(); fileToPositions.put(file, positions); } positions.add(position); // track position now ITextFileBuffer textFileBuffer = FileBuffers.getTextFileBufferManager().getTextFileBuffer( file.getFullPath(), LocationKind.IFILE); if (textFileBuffer != null) { try { textFileBuffer.getDocument().addPosition(position); } catch (BadLocationException e) { } } } }