| Index: editor/tools/plugins/com.google.dart.tools.search/src/com/google/dart/tools/search/internal/core/text/FileNamePatternSearchScope.java
 | 
| ===================================================================
 | 
| --- editor/tools/plugins/com.google.dart.tools.search/src/com/google/dart/tools/search/internal/core/text/FileNamePatternSearchScope.java	(revision 7355)
 | 
| +++ editor/tools/plugins/com.google.dart.tools.search/src/com/google/dart/tools/search/internal/core/text/FileNamePatternSearchScope.java	(working copy)
 | 
| @@ -1,5 +1,5 @@
 | 
|  /*
 | 
| - * Copyright (c) 2011, the Dart project authors.
 | 
| + * 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
 | 
| @@ -15,6 +15,11 @@
 | 
|  
 | 
|  import com.google.dart.tools.search.core.text.TextSearchScope;
 | 
|  
 | 
| +import org.eclipse.core.resources.IResource;
 | 
| +import org.eclipse.core.resources.IResourceProxy;
 | 
| +import org.eclipse.core.runtime.Assert;
 | 
| +import org.eclipse.core.runtime.IPath;
 | 
| +
 | 
|  import java.io.File;
 | 
|  import java.util.ArrayList;
 | 
|  import java.util.Arrays;
 | 
| @@ -23,15 +28,10 @@
 | 
|  import java.util.regex.Matcher;
 | 
|  import java.util.regex.Pattern;
 | 
|  
 | 
| -import org.eclipse.core.runtime.Assert;
 | 
| -import org.eclipse.core.runtime.IPath;
 | 
| +public class FileNamePatternSearchScope extends TextSearchScope {
 | 
|  
 | 
| -import org.eclipse.core.resources.IResource;
 | 
| -import org.eclipse.core.resources.IResourceProxy;
 | 
| +  private static final boolean IS_CASE_SENSITIVE_FILESYSTEM = !new File("Temp").equals(new File("temp")); //$NON-NLS-1$ //$NON-NLS-2$
 | 
|  
 | 
| -
 | 
| -public class FileNamePatternSearchScope extends TextSearchScope {
 | 
| -
 | 
|    /**
 | 
|     * Returns a scope for the given resources.
 | 
|     * 
 | 
| @@ -46,12 +46,38 @@
 | 
|          includeDerived), includeDerived);
 | 
|    }
 | 
|  
 | 
| -  private static final boolean IS_CASE_SENSITIVE_FILESYSTEM = !new File("Temp").equals(new File("temp")); //$NON-NLS-1$ //$NON-NLS-2$
 | 
| +  private static void addToList(ArrayList<IResource> res, IResource curr, boolean includeDerived) {
 | 
| +    if (!includeDerived && curr.isDerived(IResource.CHECK_ANCESTORS)) {
 | 
| +      return;
 | 
| +    }
 | 
| +    IPath currPath = curr.getFullPath();
 | 
| +    for (int k = res.size() - 1; k >= 0; k--) {
 | 
| +      IResource other = res.get(k);
 | 
| +      IPath otherPath = other.getFullPath();
 | 
| +      if (otherPath.isPrefixOf(currPath)) {
 | 
| +        return;
 | 
| +      }
 | 
| +      if (currPath.isPrefixOf(otherPath)) {
 | 
| +        res.remove(k);
 | 
| +      }
 | 
| +    }
 | 
| +    res.add(curr);
 | 
| +  }
 | 
|  
 | 
| +  private static IResource[] removeRedundantEntries(IResource[] elements, boolean includeDerived) {
 | 
| +    ArrayList<IResource> res = new ArrayList<IResource>();
 | 
| +    for (int i = 0; i < elements.length; i++) {
 | 
| +      IResource curr = elements[i];
 | 
| +      addToList(res, curr, includeDerived);
 | 
| +    }
 | 
| +    return res.toArray(new IResource[res.size()]);
 | 
| +  }
 | 
| +
 | 
|    private final String fDescription;
 | 
|    private final IResource[] fRootElements;
 | 
|  
 | 
|    private final Set<String> fFileNamePatterns;
 | 
| +
 | 
|    private Matcher fFileNameMatcher;
 | 
|  
 | 
|    private boolean fVisitDerived;
 | 
| @@ -66,18 +92,22 @@
 | 
|    }
 | 
|  
 | 
|    /**
 | 
| -   * Returns the description of the scope
 | 
| +   * Adds an file name pattern to the scope.
 | 
|     * 
 | 
| -   * @return the description of the scope
 | 
| +   * @param pattern the pattern
 | 
|     */
 | 
| -  public String getDescription() {
 | 
| -    return fDescription;
 | 
| +  public void addFileNamePattern(String pattern) {
 | 
| +    if (fFileNamePatterns.add(pattern)) {
 | 
| +      fFileNameMatcher = null; // clear cache
 | 
| +    }
 | 
|    }
 | 
|  
 | 
| -  public IResource[] getRoots() {
 | 
| -    return fRootElements;
 | 
| +  @Override
 | 
| +  public boolean contains(File file) {
 | 
| +    return file.isFile() && matchesFileName(file.getName());
 | 
|    }
 | 
|  
 | 
| +  @Override
 | 
|    public boolean contains(IResourceProxy proxy) {
 | 
|      if (!fVisitDerived && proxy.isDerived()) {
 | 
|        return false; // all resources in a derived folder are considered to be derived, see bug 103576
 | 
| @@ -90,25 +120,42 @@
 | 
|    }
 | 
|  
 | 
|    /**
 | 
| -   * Adds an file name pattern to the scope.
 | 
| +   * Returns the description of the scope
 | 
|     * 
 | 
| -   * @param pattern the pattern
 | 
| +   * @return the description of the scope
 | 
|     */
 | 
| -  public void addFileNamePattern(String pattern) {
 | 
| -    if (fFileNamePatterns.add(pattern)) {
 | 
| -      fFileNameMatcher = null; // clear cache
 | 
| -    }
 | 
| +  public String getDescription() {
 | 
| +    return fDescription;
 | 
|    }
 | 
|  
 | 
| -  public void setFileNamePattern(Pattern pattern) {
 | 
| -    fFileNameMatcher = pattern.matcher(""); //$NON-NLS-1$
 | 
| -  }
 | 
| -
 | 
|    public Pattern getFileNamePattern() {
 | 
|      return getFileNameMatcher().pattern();
 | 
|    }
 | 
|  
 | 
|    /**
 | 
| +   * Returns a description for the file name patterns in the scope
 | 
| +   * 
 | 
| +   * @return the description of the scope
 | 
| +   */
 | 
| +  public String getFileNamePatternDescription() {
 | 
| +    String[] ext = fFileNamePatterns.toArray(new String[fFileNamePatterns.size()]);
 | 
| +    Arrays.sort(ext);
 | 
| +    StringBuffer buf = new StringBuffer();
 | 
| +    for (int i = 0; i < ext.length; i++) {
 | 
| +      if (i > 0) {
 | 
| +        buf.append(", "); //$NON-NLS-1$
 | 
| +      }
 | 
| +      buf.append(ext[i]);
 | 
| +    }
 | 
| +    return buf.toString();
 | 
| +  }
 | 
| +
 | 
| +  @Override
 | 
| +  public IResource[] getRoots() {
 | 
| +    return fRootElements;
 | 
| +  }
 | 
| +
 | 
| +  /**
 | 
|     * Returns if derived resources are included in the scope.
 | 
|     * 
 | 
|     * @return if set derived resources are included in the scope.
 | 
| @@ -117,6 +164,10 @@
 | 
|      return fVisitDerived;
 | 
|    }
 | 
|  
 | 
| +  public void setFileNamePattern(Pattern pattern) {
 | 
| +    fFileNameMatcher = pattern.matcher(""); //$NON-NLS-1$
 | 
| +  }
 | 
| +
 | 
|    private Matcher getFileNameMatcher() {
 | 
|      if (fFileNameMatcher == null) {
 | 
|        Pattern pattern;
 | 
| @@ -141,49 +192,4 @@
 | 
|      return getFileNameMatcher().reset(fileName).matches();
 | 
|    }
 | 
|  
 | 
| -  /**
 | 
| -   * Returns a description for the file name patterns in the scope
 | 
| -   * 
 | 
| -   * @return the description of the scope
 | 
| -   */
 | 
| -  public String getFileNamePatternDescription() {
 | 
| -    String[] ext = fFileNamePatterns.toArray(new String[fFileNamePatterns.size()]);
 | 
| -    Arrays.sort(ext);
 | 
| -    StringBuffer buf = new StringBuffer();
 | 
| -    for (int i = 0; i < ext.length; i++) {
 | 
| -      if (i > 0) {
 | 
| -        buf.append(", "); //$NON-NLS-1$
 | 
| -      }
 | 
| -      buf.append(ext[i]);
 | 
| -    }
 | 
| -    return buf.toString();
 | 
| -  }
 | 
| -
 | 
| -  private static IResource[] removeRedundantEntries(IResource[] elements, boolean includeDerived) {
 | 
| -    ArrayList<IResource> res = new ArrayList<IResource>();
 | 
| -    for (int i = 0; i < elements.length; i++) {
 | 
| -      IResource curr = elements[i];
 | 
| -      addToList(res, curr, includeDerived);
 | 
| -    }
 | 
| -    return res.toArray(new IResource[res.size()]);
 | 
| -  }
 | 
| -
 | 
| -  private static void addToList(ArrayList<IResource> res, IResource curr, boolean includeDerived) {
 | 
| -    if (!includeDerived && curr.isDerived(IResource.CHECK_ANCESTORS)) {
 | 
| -      return;
 | 
| -    }
 | 
| -    IPath currPath = curr.getFullPath();
 | 
| -    for (int k = res.size() - 1; k >= 0; k--) {
 | 
| -      IResource other = res.get(k);
 | 
| -      IPath otherPath = other.getFullPath();
 | 
| -      if (otherPath.isPrefixOf(currPath)) {
 | 
| -        return;
 | 
| -      }
 | 
| -      if (currPath.isPrefixOf(otherPath)) {
 | 
| -        res.remove(k);
 | 
| -      }
 | 
| -    }
 | 
| -    res.add(curr);
 | 
| -  }
 | 
| -
 | 
|  }
 | 
| 
 |