/******************************************************************************* * Copyright (c) 2007, 2008 Edgar Espina. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * *******************************************************************************/ package org.deved.antlride.core.resources; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.deved.antlride.core.AntlrCore; 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; public final class AntlrResourceTracker implements IResourceChangeListener { private static final List<AntlrResourceListener> listeners = Collections .synchronizedList(new ArrayList<AntlrResourceListener>()); private static AntlrResourceTracker tracker = null; private AntlrResourceTracker() { } public static void startTracking() { if (tracker == null) { tracker = new AntlrResourceTracker(); ResourcesPlugin.getWorkspace().addResourceChangeListener(tracker); } } public static void addResourceChangeListener(AntlrResourceListener listener) { listeners.add(listener); } public static void removeResourceChangeListener( AntlrResourceListener listener) { listeners.remove(listener); } public static void stopTracking() { if (tracker != null) { ResourcesPlugin.getWorkspace() .removeResourceChangeListener(tracker); listeners.clear(); tracker = null; } } private void fireResourceAdded(IResource resource) { List<AntlrResourceListener> list = new ArrayList<AntlrResourceListener>( listeners); for (AntlrResourceListener listener : list) { listener.added(resource); } } private void fireResourceChanged(IResource resource) { List<AntlrResourceListener> list = new ArrayList<AntlrResourceListener>( listeners); for (AntlrResourceListener listener : list) { listener.changed(resource); } } private void fireResourceRemoved(IResource resource) { List<AntlrResourceListener> list = new ArrayList<AntlrResourceListener>( listeners); for (AntlrResourceListener listener : list) { listener.removed(resource); } } public void resourceChanged(IResourceChangeEvent event) { try { IResourceDelta delta = event.getDelta(); if (delta == null) return; delta.accept(new IResourceDeltaVisitor() { private boolean isValid(IResource resource) { return "g".equals(resource.getFileExtension()); } public boolean visit(IResourceDelta delta) throws CoreException { IResource resource = delta.getResource(); if (isValid(resource)) { switch (delta.getKind()) { case IResourceDelta.ADDED: fireResourceAdded(resource); break; case IResourceDelta.REMOVED: fireResourceRemoved(resource); break; case IResourceDelta.CHANGED: fireResourceChanged(resource); break; } return false; } // return true to continue visiting children. return true; } }); } catch (CoreException ex) { AntlrCore.error(ex); } } }