From f4f78d731d3b972a0281812bf46cfc0abfa4a351 Mon Sep 17 00:00:00 2001 From: Chris Recoskie Date: Mon, 2 May 2011 15:04:43 +0000 Subject: [PATCH] Bug 133881 - Make refreshing after building optional Fixing project close/delete and open workflows. --- .../core/resources/RefreshScopeManager.java | 75 ++++++++++++++----- 1 file changed, 57 insertions(+), 18 deletions(-) diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/RefreshScopeManager.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/RefreshScopeManager.java index b367fd25171..7019d9fdb64 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/RefreshScopeManager.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/RefreshScopeManager.java @@ -103,30 +103,54 @@ public class RefreshScopeManager { ResourcesPlugin.getWorkspace().addResourceChangeListener(new IResourceChangeListener() { public void resourceChanged(IResourceChangeEvent event) { - IResourceDelta delta = event.getDelta(); - try { - delta.accept(new IResourceDeltaVisitor() { - - public boolean visit(IResourceDelta delta) throws CoreException { - if(delta.getResource() instanceof IProject && delta.getKind() == IResourceDelta.ADDED) { - IProject project = (IProject) delta.getResource(); - loadSettings(ResourcesPlugin.getWorkspace().getRoot(), project); - return false; - } - - return true; + + if(event.getType() == IResourceChangeEvent.PRE_CLOSE || event.getType() == IResourceChangeEvent.PRE_DELETE) { + IProject project = event.getResource().getProject(); + + try { + if(project.exists() && project.isOpen() && project.hasNature(CProjectNature.C_NATURE_ID)) { + clearDataForProject(project); } - + } catch (CoreException e) { + // should never happen due to checks above } - ); - } catch (CoreException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + + return; } + + IResourceDelta delta = event.getDelta(); + + if (delta != null) { + try { + delta.accept(new IResourceDeltaVisitor() { + + public boolean visit(IResourceDelta delta) throws CoreException { + if (delta.getResource() instanceof IProject) { + IProject project = (IProject) delta.getResource(); + + if (delta.getKind() == IResourceDelta.ADDED + || (delta.getKind() == IResourceDelta.CHANGED && (delta + .getFlags() & IResourceDelta.OPEN) != 0)) { + loadSettings(ResourcesPlugin.getWorkspace() + .getRoot(), project); + return false; + } + + } + + return true; + } + + }); + } catch (CoreException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } } - }, IResourceChangeEvent.POST_CHANGE); + }, IResourceChangeEvent.POST_CHANGE | IResourceChangeEvent.PRE_CLOSE | IResourceChangeEvent.PRE_DELETE); } public synchronized void loadExtensions() { @@ -255,6 +279,7 @@ public class RefreshScopeManager { if(resourceSet == null) { resourceSet = new LinkedHashSet(); + fProjectToResourcesMap.put(project, resourceSet); return; } @@ -517,6 +542,20 @@ public class RefreshScopeManager { if(fResourceToExclusionsMap != null) fResourceToExclusionsMap.clear(); } + + public void clearExclusionsForProject(IProject project) { + for(IResource resource : fResourceToExclusionsMap.keySet()) { + IProject project2 = resource.getProject(); + if(project2.equals(project)) { + fResourceToExclusionsMap.remove(resource); + } + } + } + + private void clearDataForProject(IProject project) { + clearResourcesToRefresh(project); + clearExclusionsForProject(project); + } public ExclusionInstance getInstanceForClassName(String className) { RefreshExclusionFactory factory = getFactoryForClassName(className);