/******************************************************************************* * Copyright (c) 2014 Zend Technologies and others. * 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 * * Contributors: * Zend Technologies - initial API and implementation *******************************************************************************/ package org.eclipse.php.internal.core.libfolders; import java.util.*; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IResourceDelta; /** * A resource change listener that automatically marks source folders as library * folders based on predefined set of rules. * * @author Kaloyan Raev */ public class AutoDetectLibraryFolderListener implements IResourceChangeListener { private final Set<IProject> suspendedProjects = Collections.synchronizedSet(new HashSet<IProject>()); private boolean suspendDetection = false; @Override public void resourceChanged(IResourceChangeEvent event) { if (suspendDetection) return; if (event.getType() != IResourceChangeEvent.POST_CHANGE) return; IResourceDelta delta = event.getDelta(); // find all projects in the delta that may potentially have folders to // be marked as library folders IProject[] projects = new OpenedAndChangedProjectsFinder(delta).getFoundProjects(); if (projects.length == 0) { return; } projects = filterSuspended(projects); if (projects.length == 0) { return; } // schedule a workspace job to process the projects new AutoDetectLibraryFolderJob(projects).schedule(); } /** * WARNING: This method should not be used by the clients. * * Enables/disables detection for given project. * * @param project * @param suspend */ public void suspendDetection(IProject project, boolean suspend) { if (suspend) suspendedProjects.add(project); else suspendedProjects.remove(project); } /** * WARNING: This method should not be used by the clients. * * Enables/disables whole detection. * * @param suspend */ public void suspendAllDetection(boolean suspend) { suspendDetection = suspend; } private IProject[] filterSuspended(IProject[] projects) { List<IProject> filtered = new ArrayList<IProject>(); for (int i = 0; i < projects.length; i++) { if (!suspendedProjects.contains(projects[i])) { filtered.add(projects[i]); } } return filtered.toArray(new IProject[filtered.size()]); } }