package org.python.pydev.debug.referrers; import java.util.HashMap; import java.util.Map; import org.eclipse.debug.core.model.IVariable; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.python.pydev.core.log.Log; import org.python.pydev.debug.model.PyVariable; import org.python.pydev.debug.model.XMLUtils.XMLToReferrersInfo; public class ReferrersViewContentProvider implements ITreeContentProvider { @Override public boolean hasChildren(Object element) { try { if (element instanceof XMLToReferrersInfo) { return true; } if (element instanceof IVariable) { Object[] objects = childrenCache.get(element); if (objects != null && objects.length > 0) { return true; } IVariable iVariable = (IVariable) element; return iVariable.getValue().hasVariables(); } } catch (Exception e) { Log.log(e); } return false; } @Override public void dispose() { childrenCache.clear(); parentCache.clear(); } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { childrenCache.clear(); parentCache.clear(); } @Override public Object[] getElements(Object inputElement) { XMLToReferrersInfo[] arr = (XMLToReferrersInfo[]) inputElement; Object[] ret = new Object[arr.length]; int len = arr.length; for (int i = 0; i < len; i++) { ret[i] = getChildren(arr[i])[0]; } return ret; } private final Map<Object, Object[]> childrenCache = new HashMap<>(); private final Map<Object, Object> parentCache = new HashMap<>(); @Override public Object[] getChildren(Object element) { Object[] inCache = childrenCache.get(element); if (inCache != null) { return inCache; } if (element != null) { try { if (element instanceof XMLToReferrersInfo) { XMLToReferrersInfo xmlToReferrersInfo = (XMLToReferrersInfo) element; //Set that the for is the direct child of our root. childrenCache.put(element, new Object[] { xmlToReferrersInfo.forVar }); parentCache.put(xmlToReferrersInfo.forVar, element); //Add forVar children (and set them as parents). childrenCache.put(xmlToReferrersInfo.forVar, xmlToReferrersInfo.vars); PyVariable[] vars = xmlToReferrersInfo.vars; for (PyVariable pyVariable : vars) { parentCache.put(pyVariable, xmlToReferrersInfo.forVar); } } else if (element instanceof IVariable) { IVariable parentVariable = (IVariable) element; IVariable[] childrenVariables = parentVariable.getValue().getVariables(); for (IVariable childVariable : childrenVariables) { parentCache.put(childVariable, parentVariable); } childrenCache.put(parentVariable, childrenVariables); } } catch (Exception e) { Log.log(e); } } Object[] objects = childrenCache.get(element); if (objects == null) { Log.log("Children of: " + element + " is null"); objects = new Object[0]; } return objects; } @Override public Object getParent(Object element) { return parentCache.get(element); } }