/** * Copyright (c) 2012 by JP Moresmau * This code is made available under the terms of the Eclipse Public License, * version 1.0 (EPL). See http://www.eclipse.org/legal/epl-v10.html */ package net.sf.eclipsefp.haskell.ui.internal.search; import java.util.Collection; import java.util.LinkedList; import java.util.Set; import net.sf.eclipsefp.haskell.buildwrapper.BuildWrapperPlugin; import net.sf.eclipsefp.haskell.buildwrapper.types.UsageResults; import net.sf.eclipsefp.haskell.buildwrapper.usage.UsageAPI; import net.sf.eclipsefp.haskell.buildwrapper.usage.UsageQueryFlags; import net.sf.eclipsefp.haskell.ui.internal.util.UITexts; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Status; import org.eclipse.search.ui.ISearchQuery; import org.eclipse.search.ui.ISearchResult; /** * Haskell Usage Query * @author JP Moresmau * */ public class UsageQuery implements ISearchQuery { /** * the term to search for */ private final String term; /** * projects to search into (if it contains null -> all projects) */ private final Collection<IProject> projects=new LinkedList<>(); /** * result structure */ private final UsageSearchResult sr; /** * type flags */ private int typeFlags=UsageQueryFlags.TYPE_ALL; /** * scope flags */ private int scopeFlags=UsageQueryFlags.SCOPE_ALL; /** * exact or LIKE search */ private boolean exact=true; /** * restrict results to specified resources */ private Set<IResource> restrictedResources=null; public UsageQuery( final String term,final IProject p ) { super(); this.term = term; this.projects.add(p); sr=new UsageSearchResult( this,term, p ); } public UsageQuery( final String term,final Collection<IProject> projects ) { super(); this.term = term; this.projects.addAll(projects); if (this.projects.isEmpty()){ this.projects.add(null); } sr=new UsageSearchResult( this,term, null ); } /* (non-Javadoc) * @see org.eclipse.search.ui.ISearchQuery#run(org.eclipse.core.runtime.IProgressMonitor) */ @Override public IStatus run( final IProgressMonitor paramIProgressMonitor ) throws OperationCanceledException { /*UsageResults resultsRefs=BuildWrapperPlugin.getDefault().getUsageAPI().getModuleReferences( null, module,project ); UsageResults resultsDefs=BuildWrapperPlugin.getDefault().getUsageAPI().getModuleDefinitions( null, module,project ); resultsRefs.add(resultsDefs);*/ UsageAPI api=BuildWrapperPlugin.getDefault().getUsageAPI(); UsageResults results=new UsageResults(); if (api!=null){ for (IProject p:projects){ // search for each project UsageResults res=exact? api.exactSearch( null, term, p, typeFlags, scopeFlags ) :api.likeSearch( null, term, p, typeFlags, scopeFlags ); // restrict if needed if (restrictedResources!=null){ res.filter( restrictedResources ); } // add to global results.add(res); } } sr.setResults( results); return Status.OK_STATUS; } /* (non-Javadoc) * @see org.eclipse.search.ui.ISearchQuery#getLabel() */ @Override public String getLabel() { return UITexts.References_query_label; } /* (non-Javadoc) * @see org.eclipse.search.ui.ISearchQuery#canRerun() */ @Override public boolean canRerun() { return true; } /* (non-Javadoc) * @see org.eclipse.search.ui.ISearchQuery#canRunInBackground() */ @Override public boolean canRunInBackground() { return true; } /* (non-Javadoc) * @see org.eclipse.search.ui.ISearchQuery#getSearchResult() */ @Override public ISearchResult getSearchResult() { return sr; } public int getTypeFlags() { return typeFlags; } public void setTypeFlags( final int typeFlags ) { this.typeFlags = typeFlags; } public int getScopeFlags() { return scopeFlags; } public void setScopeFlags( final int scopeFlags ) { this.scopeFlags = scopeFlags; } public boolean isExact() { return exact; } public void setExact( final boolean exact ) { this.exact = exact; } public Set<IResource> getRestrictedResources() { return restrictedResources; } public void setRestrictedResources( final Set<IResource> restrictedResources ) { this.restrictedResources = restrictedResources; } }