/**
* (c) 2011, Alejandro Serrano
* Released under the terms of the EPL.
*/
package net.sf.eclipsefp.haskell.browser.views.hoogle;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import net.sf.eclipsefp.haskell.browser.items.HoogleResult;
import net.sf.eclipsefp.haskell.browser.views.SpecialRoot;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
/**
* Content provider for Hoogle results.
* @author Alejandro Serrano, JP Moresmau
*
*/
public class HoogleContentProvider implements ITreeContentProvider {
List<Object> shownElements = null;
public HoogleContentProvider() {
}
@Override
public void inputChanged( final Viewer viewer, final Object oldInput,
final Object newInput ) {
if (newInput instanceof SpecialRoot){
shownElements=Collections.singletonList( newInput );
} else if (newInput instanceof HoogleSearchResult){
HoogleSearchResult newResult = ( ( HoogleSearchResult )newInput );
shownElements = newResult.getShownElements();
} else {
shownElements = null;
}
}
@Override
public Object[] getElements( final Object inputElement ) {
if( shownElements == null ) {
return new Object[ 0 ];
} else {
return shownElements.toArray();
}
}
public Object getFirstElement() {
if( shownElements == null || shownElements.size() == 0 ) {
return null;
} else {
return shownElements.get( 0 );
}
}
@Override
@SuppressWarnings ( "unchecked" )
public Object[] getChildren( final Object parentElement ) {
if (parentElement instanceof Map.Entry) {
Map.Entry<String, Object> entry = (Map.Entry<String, Object>)parentElement;
if (entry.getValue() instanceof ArrayList) {
ArrayList<Map.Entry<String, HoogleResult>> results = new ArrayList<>();
for (HoogleResult result : (ArrayList<HoogleResult>)entry.getValue()) {
results.add( new SimpleEntry( entry.getKey(), result ) );
}
return results.toArray();
}
}
return new Object[0];
}
@Override
public Object getParent( final Object element ) {
return null;
}
@Override
@SuppressWarnings ( "unchecked" )
public boolean hasChildren( final Object element ) {
if (element instanceof Map.Entry) {
Map.Entry<String, Object> entry = (Map.Entry<String, Object>)element;
return (entry.getValue() instanceof ArrayList);
} else {
return false;
}
}
@Override
public void dispose() {
// Do nothing
}
public class SimpleEntry<K, V> implements Map.Entry<K, V>{
private K key;
private V value;
public SimpleEntry( final K key, final V value ) {
super();
this.key = key;
this.value = value;
}
@Override
public K getKey() {
return key;
}
@Override
public V getValue() {
return value;
}
public void setKey( final K key ) {
this.key = key;
}
@Override
public V setValue( final V value ) {
V ret=this.value;
this.value = value;
return ret;
}
}
}