/** * (c) 2011, Alejandro Serrano * Released under the terms of the EPL. */ package net.sf.eclipsefp.haskell.browser.views.modules; 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.Module; import net.sf.eclipsefp.haskell.browser.views.packages.PackagesItem; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.ui.IMemento; /** * Content provider for modules view. * @author Alejandro Serrano * */ public class ModulesContentProvider implements ITreeContentProvider { boolean isHierarchical; static final String MEMENTO_KEY = "isHierarchical"; ArrayList<ModulesItem> linearCache = null; ArrayList<ModulesItem> hierarchicalCache = null; public ModulesContentProvider(final IMemento memento) { super(); if (memento == null) { isHierarchical = false; } else { Boolean value = memento.getBoolean(MEMENTO_KEY); if (value == null) { isHierarchical = false; } else { isHierarchical = value; } } } public void saveState(final IMemento memento) { memento.putBoolean(MEMENTO_KEY, isHierarchical); } @Override public Object[] getElements(final Object inputElement) { return isHierarchical ? hierarchicalCache.toArray() : linearCache.toArray(); } @Override public Object[] getChildren(final Object parentElement) { if (!isHierarchical) { return new Object[0]; } else { ModulesItem item = (ModulesItem) parentElement; return item.getChildren(); } } @Override public Object getParent(final Object element) { ModulesItem item = (ModulesItem) element; return item.getParent(); } @Override public boolean hasChildren(final Object element) { if (!isHierarchical) { return false; } else { ModulesItem item = (ModulesItem) element; return item.hasChildren(); } } @Override public void dispose() { // Do nothing } @Override public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) { // Do nothing if (newInput == null) { linearCache = new ArrayList<>(); hierarchicalCache = new ArrayList<>(); } else { try { Database db=Database.ALL; if( newInput instanceof Database ) { //BrowserPlugin.getSharedInstance().setCurrentDatabase( // ( DatabaseType )newInput, null ); db=(Database)newInput; } else { PackagesItem item = ( PackagesItem )newInput; // BrowserPlugin.getSharedInstance().setCurrentDatabase( // DatabaseType.PACKAGE, item.getPackage().getIdentifier() ); db=Database.Package( item.getPackage().getIdentifier() ); } linearCache = new ArrayList<>(); hierarchicalCache = new ArrayList<>(); Module[] modules = BrowserPlugin.getSharedInstance().getAllModules(db); for (Module module : modules) { linearCache.add(new ModulesItem(newInput, module.getName(), module)); addModuleToHierarchy(newInput, module); } } catch (Throwable ex) { linearCache = new ArrayList<>(); hierarchicalCache = new ArrayList<>(); } } } public void addModuleToHierarchy(final Object dbInfo, final Module m) { String[] names = m.getName().split("\\."); ArrayList<ModulesItem> currentList = hierarchicalCache; ModulesItem currentParent = null; for (int i = 0; i < names.length; i++) { ModulesItem currentItem = null; for (ModulesItem item : currentList) { if (item.getShownName().equals(names[i])) { currentItem = item; break; } } if (currentItem == null) { if (i == names.length - 1) { currentItem = new ModulesItem(dbInfo, names[i], m, currentParent); } else { currentItem = new ModulesItem(dbInfo, names[i], null, currentParent); } currentList.add(currentItem); } else { if (i == names.length - 1) { // Maybe we have newer information if (currentItem.getModule() == null) { currentItem.setModule(m); } } } currentList = currentItem.getModulesArrayList(); currentParent = currentItem; } } public boolean getHierarchical() { return this.isHierarchical; } public void setHierarchical(final boolean isH) { this.isHierarchical = isH; } }