### Eclipse Workspace Patch 1.0 #P org.eclipse.mylyn.resources.ui Index: src/org/eclipse/mylyn/internal/resources/ui/ResourceChangeMonitor.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceChangeMonitor.java,v retrieving revision 1.20 diff -u -r1.20 ResourceChangeMonitor.java --- src/org/eclipse/mylyn/internal/resources/ui/ResourceChangeMonitor.java 3 Nov 2008 04:38:04 -0000 1.20 +++ src/org/eclipse/mylyn/internal/resources/ui/ResourceChangeMonitor.java 27 Dec 2008 10:59:52 -0000 @@ -14,6 +14,7 @@ import java.util.HashSet; import java.util.Set; +import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; @@ -35,87 +36,116 @@ */ public class ResourceChangeMonitor implements IResourceChangeListener { - private boolean enabled = true; + private class ResourceDeltaVisitor implements IResourceDeltaVisitor { - public ResourceChangeMonitor() { - } + private final Set addedResources; - public void resourceChanged(IResourceChangeEvent event) { - if (!enabled || !ContextCore.getContextManager().isContextActive()) { - return; + private final Set changedResources; + + private final Set excludedPatterns; + + private boolean haveTeamPrivateMember; + + public ResourceDeltaVisitor() { + Set excludedResourcePatterns = ResourcesUiPreferenceInitializer.getExcludedResourcePatterns(); + excludedResourcePatterns.addAll(ResourcesUiPreferenceInitializer.getForcedExcludedResourcePatterns()); + this.excludedPatterns = new HashSet(); + for (String pattern : excludedResourcePatterns) { + if (pattern != null && pattern.length() > 0) { + pattern = createRegexFromPattern(pattern); + this.excludedPatterns.add(pattern); + } + } + this.addedResources = new HashSet(); + this.changedResources = new HashSet(); } - if (event.getType() != IResourceChangeEvent.POST_CHANGE) { - return; + + public boolean hasValidResult() { + return !haveTeamPrivateMember; } - final Set addedResources = new HashSet(); - final Set changedResources = new HashSet(); - final Set excludedPatterns = getExclusionPatterns(); - IResourceDelta rootDelta = event.getDelta(); - IResourceDeltaVisitor visitor = new IResourceDeltaVisitor() { - public boolean visit(IResourceDelta delta) { - if (isExcluded(delta.getResource().getProjectRelativePath(), delta.getResource(), excludedPatterns)) { - return false; - } + public boolean visit(IResourceDelta delta) { + if (haveTeamPrivateMember) { + return false; + } + if (delta.getResource().isTeamPrivateMember()) { + haveTeamPrivateMember = true; + return false; + } + if (isExcluded(delta.getResource().getProjectRelativePath(), delta.getResource(), excludedPatterns)) { + return false; + } - IResourceDelta[] added = delta.getAffectedChildren(IResourceDelta.ADDED); - for (IResourceDelta element : added) { - IResource resource = element.getResource(); - if ((resource instanceof IFile || resource instanceof IFolder) - && !isExcluded(resource.getProjectRelativePath(), resource, excludedPatterns)) { - addedResources.add(resource); - } + IResourceDelta[] added = delta.getAffectedChildren(IResourceDelta.ADDED); + for (IResourceDelta element : added) { + IResource resource = element.getResource(); + if ((resource instanceof IFile || resource instanceof IFolder) + && !isExcluded(resource.getProjectRelativePath(), resource, excludedPatterns)) { + addedResources.add(resource); } + } - IResourceDelta[] changed = delta.getAffectedChildren(IResourceDelta.CHANGED | IResourceDelta.REMOVED); - for (IResourceDelta element : changed) { - IResource resource = element.getResource(); - // special rule for feature.xml files: bug 249856 - if (resource instanceof IFile - && !isExcluded(resource.getProjectRelativePath(), resource, excludedPatterns) - && !"feature.xml".equals(resource.getName())) { //$NON-NLS-1$ - if (element.getKind() == IResourceDelta.CHANGED - && (element.getFlags() & IResourceDelta.CONTENT) == 0) { - // make sure that there was a content change and not just a markers change - continue; - } - changedResources.add(resource); + IResourceDelta[] changed = delta.getAffectedChildren(IResourceDelta.CHANGED | IResourceDelta.REMOVED); + for (IResourceDelta element : changed) { + IResource resource = element.getResource(); + // special rule for feature.xml files: bug 249856 + if (resource instanceof IFile + && !isExcluded(resource.getProjectRelativePath(), resource, excludedPatterns) + && !"feature.xml".equals(resource.getName())) { //$NON-NLS-1$ + if (element.getKind() == IResourceDelta.CHANGED + && (element.getFlags() & IResourceDelta.CONTENT) == 0) { + // make sure that there was a content change and not just a markers change + continue; } + changedResources.add(resource); } - return true; } - }; - try { - rootDelta.accept(visitor); - ResourcesUi.addResourceToContext(changedResources, InteractionEvent.Kind.PREDICTION); - ResourcesUi.addResourceToContext(addedResources, InteractionEvent.Kind.PROPAGATION); - } catch (CoreException e) { - StatusHandler.log(new Status(IStatus.ERROR, ResourcesUiBridgePlugin.ID_PLUGIN, - "Could not accept marker visitor", e)); //$NON-NLS-1$ + return true; + } + + public Set getChangedResources() { + return changedResources; + } + + public Set getAddedResources() { + return addedResources; } - } - private Set getExclusionPatterns() { - Set excludedResourcePatterns = ResourcesUiPreferenceInitializer.getExcludedResourcePatterns(); - excludedResourcePatterns.addAll(ResourcesUiPreferenceInitializer.getForcedExcludedResourcePatterns()); + }; - Set excludedPatterns = new HashSet(); + private boolean enabled; - for (String pattern : excludedResourcePatterns) { - if (pattern != null && pattern.length() > 0) { - pattern = createRegexFromPattern(pattern); + public ResourceChangeMonitor() { + this.enabled = true; + } - excludedPatterns.add(pattern); + public void resourceChanged(IResourceChangeEvent event) { + if (!enabled || !ContextCore.getContextManager().isContextActive()) { + return; + } + if (event.getType() != IResourceChangeEvent.POST_CHANGE) { + return; + } + IResourceDelta rootDelta = event.getDelta(); + if (rootDelta != null) { + ResourceDeltaVisitor visitor = new ResourceDeltaVisitor(); + try { + rootDelta.accept(visitor, IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS | IContainer.INCLUDE_HIDDEN); + if (visitor.hasValidResult()) { + ResourcesUi.addResourceToContext(visitor.getChangedResources(), InteractionEvent.Kind.PREDICTION); + ResourcesUi.addResourceToContext(visitor.getAddedResources(), InteractionEvent.Kind.PROPAGATION); + } + } catch (CoreException e) { + StatusHandler.log(new Status(IStatus.ERROR, ResourcesUiBridgePlugin.ID_PLUGIN, + "Could not accept marker visitor", e)); //$NON-NLS-1$ } } - - return excludedPatterns; } /** - * Public for testing * + * Public for testing. */ - public String createRegexFromPattern(String pattern) { + public static String createRegexFromPattern(String pattern) { // prepare the pattern to be a regex pattern = pattern.replaceAll("\\.", "\\\\."); //$NON-NLS-1$ //$NON-NLS-2$ pattern = pattern.replaceAll("\\*", ".*"); //$NON-NLS-1$ //$NON-NLS-2$ @@ -128,7 +158,7 @@ * @param resource * can be null */ - public boolean isExcluded(IPath path, IResource resource, Set excludedPatterns) { + public static boolean isExcluded(IPath path, IResource resource, Set excludedPatterns) { if (resource != null && resource.isDerived()) { return true; } @@ -158,7 +188,7 @@ /** * Public for testing. */ - public boolean isUriExcluded(String uri, String pattern) { + public static boolean isUriExcluded(String uri, String pattern) { if (uri != null && uri.startsWith(pattern)) { return true; } else { @@ -173,4 +203,5 @@ public void setEnabled(boolean enabled) { this.enabled = enabled; } + }