/** * (c) 2011, Alejandro Serrano * Released under the terms of the EPL. */ package net.sf.eclipsefp.haskell.ui.internal.editors.cabal.forms.stanzas; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import net.sf.eclipsefp.haskell.browser.BrowserPlugin; import net.sf.eclipsefp.haskell.browser.Database; import net.sf.eclipsefp.haskell.browser.items.HaskellPackage; import net.sf.eclipsefp.haskell.browser.items.PackageIdentifier; import net.sf.eclipsefp.haskell.core.cabal.CabalPackageRef; import net.sf.eclipsefp.haskell.ui.HaskellUIPlugin; import net.sf.eclipsefp.haskell.ui.internal.backend.BackendManager; import net.sf.eclipsefp.haskell.ui.internal.backend.CabalPackageHelper; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; /** * Content provider for the list of available dependencies. * @author Alejandro Serrano * */ public class DependenciesDialogContentProvider implements ITreeContentProvider { private HaskellPackage[] elements; public DependenciesDialogContentProvider( final List<String> alreadySelected,final String projectName ) { super(); try { Set<String> names=new HashSet<>(alreadySelected); //BrowserPlugin.getSharedInstance().setCurrentDatabase( DatabaseType.ALL, // null ); ArrayList<HaskellPackage> pkgs = new ArrayList<>(); for( HaskellPackage pkg: BrowserPlugin.getSharedInstance().getPackages(Database.ALL) ) { if(! names.contains( pkg.getIdentifier().getName() ) ) { pkgs.add( pkg ); names.add( pkg.getIdentifier().getName() ); } } // if we don't have Hackage loaded, ask Cabal for all packages boolean hasHackage=BrowserPlugin.getSharedInstance().isHackageDatabaseLoaded(); List<CabalPackageRef> cabalPkgs=hasHackage ?CabalPackageHelper.getInstance().getInstalled() :CabalPackageHelper.getInstance().getAll(); /* * we may have installed packages not from hackage! */ for (CabalPackageRef r:cabalPkgs){ if (!names.contains( r.getName() )) { List<String> versions=new ArrayList<String>(hasHackage ?r.getInstalled() :r.getVersions()); Collections.reverse(versions); HaskellPackage pkg=new HaskellPackage( "", new PackageIdentifier( r.getName(), versions.iterator().next() ) ) ; pkgs.add(pkg ); names.add( r.getName() ); } } for (HaskellPackage pkg:BackendManager.listProjectPackages()){ // we can reference ourselves, or reference other projects if we're sandboxed if (BackendManager.getCabalImplDetails().isSandboxed() || pkg.getIdentifier().getName().equals( projectName ) ){ if(! names.contains( pkg.getIdentifier().getName() ) ) { pkgs.add( pkg ); } } } this.elements = pkgs.toArray( new HaskellPackage[ pkgs.size() ] ); } catch( Throwable ex ) { HaskellUIPlugin.log( ex ); this.elements = new HaskellPackage[ 0 ]; } } @Override public void dispose() { // Do nothing } @Override public void inputChanged( final Viewer viewer, final Object oldInput, final Object newInput ) { // Do nothing } @Override public Object[] getElements( final Object inputElement ) { return elements; } @Override public Object[] getChildren( final Object parentElement ) { return new Object[ 0 ]; } @Override public Object getParent( final Object element ) { // one level return null; } @Override public boolean hasChildren( final Object element ) { // one level return false; } }