/** * (c) 2011, Alejandro Serrano * Released under the terms of the EPL. */ package net.sf.eclipsefp.haskell.browser.views.packages; import java.util.ArrayList; import net.sf.eclipsefp.haskell.browser.BrowserPlugin; import net.sf.eclipsefp.haskell.browser.Database; import net.sf.eclipsefp.haskell.browser.items.HaskellPackage; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; /** * Content provider for packages view. * @author Alejandro Serrano * */ public class PackagesContentProvider implements ITreeContentProvider { private static PackagesItem[] localCache = null; private static PackagesItem[] hackageCache = null; public static void clearCache(){ localCache = null; hackageCache = null; } @Override public Object[] getElements(final Object inputElement) { boolean local = BrowserPlugin.getDefault().isLocalDatabaseLoaded(); boolean hackage = BrowserPlugin.getDefault().isHackageDatabaseLoaded(); if (local && hackage) { return new Object[] { Database.LOCAL, Database.HACKAGE }; } else if (local) { return new Object[] { Database.LOCAL }; } else if (hackage) { return new Object[] { Database.HACKAGE }; } else { return new Object[0]; } } @Override public Object[] getChildren(final Object parentElement) { switch (((Database) parentElement).getType()) { case LOCAL: if (localCache == null) { cacheLocal(); } return PackagesContentProvider.localCache; case HACKAGE: if (hackageCache == null) { cacheHackage(); } return PackagesContentProvider.hackageCache; default: return new Object[0]; } } @Override public Object getParent(final Object element) { if (element instanceof Database) { return PackagesRoot.ROOT; } else { PackagesItem pkg = (PackagesItem)element; return pkg.getDatabase(); } } @Override public boolean hasChildren(final Object element) { return (element instanceof PackagesRoot || element instanceof Database); } public void uncache() { PackagesContentProvider.localCache = null; PackagesContentProvider.hackageCache = null; } private void cacheLocal() { try { //BrowserPlugin.getSharedInstance().setCurrentDatabase(DatabaseType.LOCAL, null); ArrayList<PackagesItem> cache = new ArrayList<>(); for (HaskellPackage pkg : BrowserPlugin.getSharedInstance().getPackages(Database.LOCAL)) { cache.add(new PackagesItem(Database.LOCAL, pkg)); } PackagesContentProvider.localCache = cache.toArray(new PackagesItem[cache.size()]); } catch (Throwable ex) { PackagesContentProvider.localCache = new PackagesItem[0]; } } private void cacheHackage() { try { //BrowserPlugin.getSharedInstance().setCurrentDatabase(DatabaseType.HACKAGE, null); ArrayList<PackagesItem> cache = new ArrayList<>(); for (HaskellPackage pkg : BrowserPlugin.getSharedInstance().getPackages(Database.HACKAGE)) { cache.add(new PackagesItem(Database.HACKAGE, pkg)); } PackagesContentProvider.hackageCache = cache.toArray(new PackagesItem[cache.size()]); } catch (Throwable ex) { PackagesContentProvider.hackageCache = new PackagesItem[0]; } } public PackagesItem[] getLocalCache() { if (localCache == null) { cacheLocal(); } return localCache; } public PackagesItem[] getHackageCache() { if (hackageCache == null) { cacheHackage(); } return hackageCache; } @Override public void dispose() { // Do nothing } @Override public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) { // Do nothing } }