///******************************************************************************* // * Copyright (c) 2000, 2006 IBM Corporation 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: // * IBM Corporation - initial API and implementation // *******************************************************************************/ // //package org.eclipse.search.ui.text; // //import java.io.File; //import java.util.ArrayList; //import java.util.Arrays; //import java.util.regex.Matcher; //import java.util.regex.Pattern; // //import org.eclipse.core.runtime.IAdaptable; //import org.eclipse.core.runtime.IPath; //import org.eclipse.core.runtime.content.IContentType; // //import org.eclipse.core.resources.IResource; //import org.eclipse.core.resources.IResourceProxy; //import org.eclipse.core.resources.ResourcesPlugin; // //import org.eclipse.ui.IWorkingSet; // //import org.eclipse.search.core.text.TextSearchScope; // //import org.eclipse.search.internal.core.text.PatternConstructor; //import org.eclipse.search.internal.ui.Messages; //import org.eclipse.search.internal.ui.SearchMessages; //import org.eclipse.search.internal.ui.WorkingSetComparator; //import org.eclipse.search.internal.ui.util.FileTypeEditor; // ///** // * A text search scope used by the file search dialog. Additionally to roots it allows to define file name // * patterns and exclude all derived resources. // * // * <p> // * Clients should not instantiate or subclass this class. // * </p> // * @since 3.2 // */ //public final class FileTextSearchScope extends TextSearchScope { // // private static final boolean IS_CASE_SENSITIVE_FILESYSTEM = !new File("Temp").equals(new File("temp")); //$NON-NLS-1$ //$NON-NLS-2$ // // /** // * Returns a scope for the workspace. The created scope contains all resources in the workspace // * that match the given file name patterns. Depending on <code>includeDerived</code>, derived resources or // * resources inside a derived container are part of the scope or not. // * // * @param fileNamePatterns file name pattern that all files have to match <code>null</code> to include all file names. // * @param includeDerived defines if derived files and files inside derived containers are included in the scope. // * @return a scope containing all files in the workspace that match the given file name patterns. // */ // public static FileTextSearchScope newWorkspaceScope(String[] fileNamePatterns, boolean includeDerived) { // return new FileTextSearchScope(SearchMessages.WorkspaceScope, new IResource[] { ResourcesPlugin.getWorkspace().getRoot() }, null, fileNamePatterns, includeDerived); // } // // /** // * Returns a scope for the given root resources. The created scope contains all root resources and their // * children that match the given file name patterns. Depending on <code>includeDerived</code>, derived resources or // * resources inside a derived container are part of the scope or not. // * // * @param roots the roots resources defining the scope. // * @param fileNamePatterns file name pattern that all files have to match <code>null</code> to include all file names. // * @param includeDerived defines if derived files and files inside derived containers are included in the scope. // * @return a scope containing the resources and its children if they match the given file name patterns. // */ // public static FileTextSearchScope newSearchScope(IResource[] roots, String[] fileNamePatterns, boolean includeDerived) { // roots= removeRedundantEntries(roots, includeDerived); // // String description; // if (roots.length == 0) { // description= SearchMessages.FileTextSearchScope_scope_empty; // } else if (roots.length == 1) { // String label= SearchMessages.FileTextSearchScope_scope_single; // description= Messages.format(label, roots[0].getName()); // } else if (roots.length == 2) { // String label= SearchMessages.FileTextSearchScope_scope_double; // description= Messages.format(label, new String[] { roots[0].getName(), roots[1].getName()}); // } else { // String label= SearchMessages.FileTextSearchScope_scope_multiple; // description= Messages.format(label, new String[] { roots[0].getName(), roots[1].getName()}); // } // return new FileTextSearchScope(description, roots, null, fileNamePatterns, includeDerived); // } // // /** // * Returns a scope for the given working sets. The created scope contains all resources in the // * working sets that match the given file name patterns. Depending on <code>includeDerived</code>, derived resources or // * resources inside a derived container are part of the scope or not. // * // * @param workingSets the working sets defining the scope. // * @param fileNamePatterns file name pattern that all files have to match <code>null</code> to include all file names. // * @param includeDerived defines if derived files and files inside derived containers are included in the scope. // * @return a scope containing the resources in the working set if they match the given file name patterns. // */ // public static FileTextSearchScope newSearchScope(IWorkingSet[] workingSets, String[] fileNamePatterns, boolean includeDerived) { // String description; // Arrays.sort(workingSets, new WorkingSetComparator()); // if (workingSets.length == 0) { // description= SearchMessages.FileTextSearchScope_ws_scope_empty; // } else if (workingSets.length == 1) { // String label= SearchMessages.FileTextSearchScope_ws_scope_single; // description= Messages.format(label, workingSets[0].getLabel()); // } else if (workingSets.length == 2) { // String label= SearchMessages.FileTextSearchScope_ws_scope_double; // description= Messages.format(label, new String[] { workingSets[0].getLabel(), workingSets[1].getLabel()}); // } else { // String label= SearchMessages.FileTextSearchScope_ws_scope_multiple; // description= Messages.format(label, new String[] { workingSets[0].getLabel(), workingSets[1].getLabel()}); // } // FileTextSearchScope scope= new FileTextSearchScope(description, convertToResources(workingSets, includeDerived), workingSets, fileNamePatterns, includeDerived); // return scope; // } // // private final String fDescription; // private final IResource[] fRootElements; // private final String[] fFileNamePatterns; // private final Matcher fPositiveFileNameMatcher; // private final Matcher fNegativeFileNameMatcher; // // private boolean fVisitDerived; // private IWorkingSet[] fWorkingSets; // // private FileTextSearchScope(String description, IResource[] resources, IWorkingSet[] workingSets, String[] fileNamePatterns, boolean visitDerived) { // fDescription= description; // fRootElements= resources; // fFileNamePatterns= fileNamePatterns; // fVisitDerived= visitDerived; // fWorkingSets= workingSets; // fPositiveFileNameMatcher= createMatcher(fileNamePatterns, false); // fNegativeFileNameMatcher= createMatcher(fileNamePatterns, true); // } // // /** // * Returns the description of the scope // * // * @return the description of the scope // */ // public String getDescription() { // return fDescription; // } // // /** // * Returns the file name pattern configured for this scope or <code>null</code> to match // * all file names. // * // * @return the file name pattern starings // */ // public String[] getFileNamePatterns() { // return fFileNamePatterns; // } // // /** // * Returns the working-sets that were used to configure this scope or <code>null</code> // * if the scope was not created off working sets. // * // * @return the working-sets the scope is based on. // */ // public IWorkingSet[] getWorkingSets() { // return fWorkingSets; // } // // /** // * Returns the content types configured for this scope or <code>null</code> to match // * all content types. // * // * @return the file name pattern starings // */ // public IContentType[] getContentTypes() { // return null; // to be implemented in the future // } // // /** // * Returns a description describing the file name patterns and content types. // * // * @return the description of the scope // */ // public String getFilterDescription() { // String[] ext= fFileNamePatterns; // if (ext == null) { // return "*"; //$NON-NLS-1$ // } // 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(); // } // // /** // * Returns whether derived resources are included in this search scope. // * // * @return whether derived resources are included in this search scope. // */ // public boolean includeDerived() { // return fVisitDerived; // } // // /* (non-Javadoc) // * @see org.eclipse.search.core.text.FileSearchScope#getRoots() // */ // public IResource[] getRoots() { // return fRootElements; // } // // /* (non-Javadoc) // * @see org.eclipse.search.core.text.FileSearchScope#contains(org.eclipse.core.resources.IResourceProxy) // */ // 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 // } // // if (proxy.getType() == IResource.FILE) { // return matchesFileName(proxy.getName()); // } // return true; // } // // private boolean matchesFileName(String fileName) { // if (fPositiveFileNameMatcher != null && !fPositiveFileNameMatcher.reset(fileName).matches()) { // return false; // } // if (fNegativeFileNameMatcher != null && fNegativeFileNameMatcher.reset(fileName).matches()) { // return false; // } // return true; // } // // private Matcher createMatcher(String[] fileNamePatterns, boolean negativeMatcher) { // if (fileNamePatterns == null || fileNamePatterns.length == 0) { // return null; // } // ArrayList patterns= new ArrayList(); // for (int i= 0; i < fileNamePatterns.length; i++) { // String pattern= fFileNamePatterns[i]; // if (negativeMatcher == pattern.startsWith(FileTypeEditor.FILE_PATTERN_NEGATOR)) { // if (negativeMatcher) { // pattern= pattern.substring(FileTypeEditor.FILE_PATTERN_NEGATOR.length()).trim(); // } // if (pattern.length() > 0) { // patterns.add(pattern); // } // } // } // if (!patterns.isEmpty()) { // String[] patternArray= (String[]) patterns.toArray(new String[patterns.size()]); // Pattern pattern= PatternConstructor.createPattern(patternArray, IS_CASE_SENSITIVE_FILESYSTEM); // return pattern.matcher(""); //$NON-NLS-1$ // } // return null; // } // // private static IResource[] removeRedundantEntries(IResource[] elements, boolean includeDerived) { // ArrayList res= new ArrayList(); // for (int i= 0; i < elements.length; i++) { // IResource curr= elements[i]; // addToList(res, curr, includeDerived); // } // return (IResource[])res.toArray(new IResource[res.size()]); // } // // private static IResource[] convertToResources(IWorkingSet[] workingSets, boolean includeDerived) { // ArrayList res= new ArrayList(); // for (int i= 0; i < workingSets.length; i++) { // IWorkingSet workingSet= workingSets[i]; // if (workingSet.isAggregateWorkingSet() && workingSet.isEmpty()) { // return new IResource[] { ResourcesPlugin.getWorkspace().getRoot() }; // } // IAdaptable[] elements= workingSet.getElements(); // for (int k= 0; k < elements.length; k++) { // IResource curr= (IResource) elements[k].getAdapter(IResource.class); // if (curr != null) { // addToList(res, curr, includeDerived); // } // } // } // return (IResource[]) res.toArray(new IResource[res.size()]); // } // // private static void addToList(ArrayList res, IResource curr, boolean includeDerived) { // if (!includeDerived && isDerived(curr)) { // return; // } // IPath currPath= curr.getFullPath(); // for (int k= res.size() - 1; k >= 0 ; k--) { // IResource other= (IResource) res.get(k); // IPath otherPath= other.getFullPath(); // if (otherPath.isPrefixOf(currPath)) { // return; // } // if (currPath.isPrefixOf(otherPath)) { // res.remove(k); // } // } // res.add(curr); // } // // private static boolean isDerived(IResource curr) { // do { // if (curr.isDerived()) { // return true; // } // curr= curr.getParent(); // } while (curr != null); // return false; // } //}