/** * This file is licensed under the University of Illinois/NCSA Open Source License. See LICENSE.TXT for details. */ package edu.illinois.codingtracker.listeners; 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.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IPath; import org.eclipse.jface.text.IDocument; import edu.illinois.codingtracker.helpers.ResourceHelper; import edu.illinois.codingtracker.listeners.document.FileDocumentListener; /** * * @author Stas Negara * */ public class FileBufferListener extends BasicListener implements IFileBufferListener { private boolean isPossibleCommitStart= false; public static void register() { FileBuffers.getTextFileBufferManager().addFileBufferListener(new FileBufferListener()); } @Override public void bufferContentAboutToBeReplaced(IFileBuffer buffer) { isBufferContentAboutToBeReplaced= true; } @Override public void bufferContentReplaced(IFileBuffer buffer) { isBufferContentAboutToBeReplaced= false; } @Override public void bufferCreated(IFileBuffer buffer) { if (buffer instanceof ITextFileBuffer) {//actually, should always be ITextFileBuffer addDocumentListener((ITextFileBuffer)buffer); } } private void addDocumentListener(ITextFileBuffer textFileBuffer) { //TODO: Check that there is no need to listen to buffers without the corresponding workspace resources. IResource bufferResource= ResourceHelper.findWorkspaceMember(textFileBuffer.getLocation()); if (bufferResource instanceof IFile && bufferResource.exists()) { IFile bufferFile= (IFile)bufferResource; if (ResourceHelper.isJavaFile(bufferFile)) { IDocument textFileBufferDocument= textFileBuffer.getDocument(); textFileBufferDocument.addDocumentListener(new FileDocumentListener(bufferFile)); } } } @Override public void stateChanging(IFileBuffer buffer) { if (buffer.isDirty()) { isPossibleCommitStart= true; } } @Override public void stateChangeFailed(IFileBuffer buffer) { isPossibleCommitStart= false; } @Override public void dirtyStateChanged(IFileBuffer buffer, boolean isDirty) { if (isPossibleCommitStart && !isDirty && buffer.isSynchronized()) { //was committed IResource resource= ResourceHelper.findWorkspaceMember(buffer.getLocation()); if (resource instanceof IFile) { IFile file= (IFile)resource; if (ResourceHelper.isJavaFile(file)) { operationRecorder.recordSavedFile(file, true); } } } isPossibleCommitStart= false; } @Override public void bufferDisposed(IFileBuffer buffer) { //do nothing } @Override public void stateValidationChanged(IFileBuffer buffer, boolean isStateValidated) { //do nothing } @Override public void underlyingFileMoved(IFileBuffer buffer, IPath path) { //do nothing } @Override public void underlyingFileDeleted(IFileBuffer buffer) { //do nothing } }