/* * Copyright (c) 2012, the Dart project authors. * * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.eclipse.org/legal/epl-v10.html * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.dart.tools.debug.core.util; import com.google.dart.tools.debug.core.DartDebugCorePlugin; 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.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import java.util.ArrayList; import java.util.List; /** * A class to make listening for resource change events easier. */ public class ResourceChangeManager implements IResourceChangeListener { private static ResourceChangeManager manager; public static ResourceChangeManager getManager() { if (manager == null) { manager = new ResourceChangeManager(); } return manager; } public static void removeChangeParticipant(ResourceChangeParticipant listener) { if (manager != null) { manager.listeners.remove(listener); } } public static void shutdown() { if (manager != null) { manager.dispose(); manager = null; } } private List<ResourceChangeParticipant> listeners = new ArrayList<ResourceChangeParticipant>(); private ResourceChangeManager() { ResourcesPlugin.getWorkspace().addResourceChangeListener(this); } public void addChangeParticipant(ResourceChangeParticipant listener) { listeners.add(listener); } @Override public void resourceChanged(IResourceChangeEvent event) { if (listeners.size() == 0) { return; } if (event.getDelta() == null) { return; } final List<ResourceChangeParticipant> listenersCopy = new ArrayList<ResourceChangeParticipant>( listeners); try { event.getDelta().accept(new IResourceDeltaVisitor() { @Override public boolean visit(IResourceDelta delta) throws CoreException { IResource resource = delta.getResource(); if (resource instanceof IFile) { IFile file = (IFile) resource; if (delta.getKind() == IResourceDelta.CHANGED) { notifyChanged(listenersCopy, file); } else if (delta.getKind() == IResourceDelta.ADDED) { notifyAdded(listenersCopy, file); } else if (delta.getKind() == IResourceDelta.REMOVED) { notifyRemoved(listenersCopy, file); } } return true; } }); } catch (CoreException e) { DartDebugCorePlugin.logError(e); } } private void dispose() { ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); } private void notifyAdded(List<ResourceChangeParticipant> listeners, IFile file) { for (ResourceChangeParticipant participant : listeners) { try { participant.handleFileAdded(file); } catch (Throwable t) { DartDebugCorePlugin.logError(t); } } } private void notifyChanged(List<ResourceChangeParticipant> listeners, IFile file) { for (ResourceChangeParticipant participant : listeners) { try { participant.handleFileChanged(file); } catch (Throwable t) { DartDebugCorePlugin.logError(t); } } } private void notifyRemoved(List<ResourceChangeParticipant> listeners, IFile file) { for (ResourceChangeParticipant participant : listeners) { try { participant.handleFileRemoved(file); } catch (Throwable t) { DartDebugCorePlugin.logError(t); } } } }