package org.eclipse.ui.views.file;
import org.eclipse.core.resources.IFile;
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.IResourceDeltaVisitor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.util.UiUtils;
/**
* Refreshes the file views that display files that were changed in the
* workspace.
*/
public class ViewedFileChangeListener implements IResourceChangeListener {
private static final IResourceDeltaVisitor VISITOR = new IResourceDeltaVisitor() {
@Override
public boolean visit(IResourceDelta delta) throws CoreException {
final IResource resource = delta.getResource();
final String extension = resource.getFileExtension();
if ((resource instanceof IFile) && (extension != null)) {
Display.getDefault().asyncExec(new Runnable() { // The view can be accessed only in UI thread
@Override
public void run() {
IWorkbenchPage workbenchPage = UiUtils.getWorkbenchPage();
if (workbenchPage != null) {
for (IViewReference viewReference : workbenchPage.getViewReferences()) {
IViewPart view = viewReference.getView(false);
if (view instanceof FileView) {
FileView fileView = (FileView)view;
IFile file = (IFile)resource;
if (fileView.getExtensions().contains(file.getFileExtension())) {
fileView.reload(file);
}
}
}
}
}
});
}
return true;
}
};
@Override
public void resourceChanged(IResourceChangeEvent event) {
try {
event.getDelta().accept(VISITOR);
} catch (CoreException e) {
Activator.logError("Couldn't refresh the file view, try to reopen it", e);
}
}
}