package com.python.pydev.analysis.builder; import java.lang.ref.WeakReference; import java.util.ListResourceBundle; import java.util.Map; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IDocumentExtension4; import org.eclipse.ui.IEditorInput; import org.python.pydev.shared_core.cache.LRUMap; import org.python.pydev.shared_core.structure.Tuple3; import org.python.pydev.shared_ui.editor.BaseEditor; import org.python.pydev.shared_ui.editor.IPyEditListener; public class MarkEditorOnSave implements IPyEditListener { public static final Map<IFile, Tuple3<Long, Long, WeakReference<IDocument>>> fileToSavedTime = new LRUMap<>(20); @Override public void onSave(BaseEditor edit, IProgressMonitor monitor) { IEditorInput editorInput = edit.getEditorInput(); if (editorInput != null) { IFile file = editorInput.getAdapter(IFile.class); if (file != null) { IDocument document = edit.getDocument(); if (document != null) { fileToSavedTime.put(file, new Tuple3<Long, Long, WeakReference<IDocument>>( ((IDocumentExtension4) document).getModificationStamp(), file.getModificationStamp(), new WeakReference<>(document))); } } } } @Override public void onCreateActions(ListResourceBundle resources, BaseEditor edit, IProgressMonitor monitor) { } @Override public void onDispose(BaseEditor edit, IProgressMonitor monitor) { } @Override public void onSetDocument(IDocument document, BaseEditor edit, IProgressMonitor monitor) { } public static boolean hasDocumentChanged(IResource resource, IDocument document) { Tuple3<Long, Long, WeakReference<IDocument>> tuple = fileToSavedTime.get(resource); if (tuple == null) { return false; } IDocument cachedDoc = tuple.o3.get(); if (cachedDoc == document) { if (((IDocumentExtension4) document).getModificationStamp() == tuple.o1) { return false; } return true; } return false; } }