/**
* 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.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import net.sf.eclipsefp.haskell.buildwrapper.types.SearchResultLocation;
import net.sf.eclipsefp.haskell.buildwrapper.types.UsageResults;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
/**
* Content provider for search results
* @author JP Moresmau
*
*/
public class UsageResultContentProvider implements ITreeContentProvider {
/**
* children by parents
*/
private Map<Object,Collection<Object>> uiresults=new HashMap<>();
/**
* roots
*/
private Object[] roots=new Object[0];
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
@Override
public void dispose() {
uiresults=null;
roots=null;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
@Override
public void inputChanged( final Viewer arg0, final Object arg1, final Object arg2 ) {
uiresults.clear();
roots=new Object[0];
if (arg2 instanceof UsageSearchResult){
UsageResults results=((UsageSearchResult)arg2).getResults();
if (results!=null){
Set<IProject> ps=results.listProjects();
roots=ps.toArray( new Object[ps.size()] );
for (IProject p:ps){
Map<IFile,Map<String,Collection<SearchResultLocation>>> m=results.getUsageInProject( p );
for (IFile f:m.keySet()){
Map<String,Collection<SearchResultLocation>> uls=m.get( f );
Collection<Object> l=new ArrayList<>();
for (String sec:uls.keySet()){
l.add(new SectionSearchResult( f,sec, uls.get( sec ) ));
}
uiresults.put( f, l);
IContainer parent=f.getParent();
Object child=f;
while (!(parent instanceof IWorkspaceRoot)){
add(parent,child);
child=parent;
parent=parent.getParent();
}
}
}
}
}
}
private void add(final Object parent,final Object child){
Collection<Object> cs=uiresults.get( parent );
if (cs==null){
cs=new HashSet<>();
uiresults.put( parent, cs );
}
cs.add( child );
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
*/
@Override
public Object[] getChildren( final Object arg0 ) {
Collection<Object> c=uiresults.get( arg0 );
if (c!=null){
return c.toArray( new Object[c.size()] );
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#getElements(java.lang.Object)
*/
@Override
public Object[] getElements( final Object arg0 ) {
return roots;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
*/
@Override
public Object getParent( final Object arg0 ) {
// unused
return null;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
*/
@Override
public boolean hasChildren( final Object arg0 ) {
return arg0 instanceof IProject || arg0 instanceof IFile || arg0 instanceof IFolder;
}
}