package org.incha.ui.classview; import java.util.Collection; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IMember; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaModelException; import org.incha.core.jswingripples.eig.JSwingRipplesEIGNode; public class MemberHierarchySupport { private List<JSwingRipplesEIGNode> nodes = new LinkedList<JSwingRipplesEIGNode>(); private Map<IMember, JSwingRipplesEIGNode> membersToNodes = new HashMap<IMember, JSwingRipplesEIGNode>(); /** * Default constructor. */ public MemberHierarchySupport(final Collection<JSwingRipplesEIGNode> listOfMembers) { super(); //create maps. for (final JSwingRipplesEIGNode node : listOfMembers) { nodes.add(node); membersToNodes.put(node.getNodeIMember(), node); } } /** * @param m the member. * @return parent registered in given support. */ public JSwingRipplesEIGNode getParent(final JSwingRipplesEIGNode m) { return membersToNodes.get(m.getNodeIMember().getParent()); } /** * @param m the member. * @return the hierarchy depth of given member, i.e. number of parents hierarchically. */ public int getHierarchyDepth(final JSwingRipplesEIGNode m) { int depth = 0; JSwingRipplesEIGNode current = m; while (current != null) { current = getParent(current); if (current != null) { depth++; } } return depth; } /** * @return */ public JSwingRipplesEIGNode[] getRootTypes() { final List<JSwingRipplesEIGNode> roots = new LinkedList<JSwingRipplesEIGNode>(); for (final JSwingRipplesEIGNode m : getMembers()) { if (m.getNodeIMember() instanceof IType && isTopNode(m)) { roots.add(m); } } return roots.toArray(new JSwingRipplesEIGNode[roots.size()]); } /** * @param m * @return */ private boolean isTopNode(final JSwingRipplesEIGNode m) { final IJavaElement parent = m.getNodeIMember().getParent(); return parent == null || parent instanceof ICompilationUnit; } /** * @return list of members. */ public List<JSwingRipplesEIGNode> getMembers() { return new LinkedList<JSwingRipplesEIGNode>(nodes); } /** * @param parent parent. * @return array of children. */ public JSwingRipplesEIGNode[] getChildren(final JSwingRipplesEIGNode parent) { try { final IJavaElement[] elements = parent.getNodeIMember().getChildren(); final List<JSwingRipplesEIGNode> set = new LinkedList<JSwingRipplesEIGNode>(); for (final IJavaElement e : elements) { final JSwingRipplesEIGNode eigNode = this.membersToNodes.get(e); if (eigNode != null) { set.add(eigNode); } } return set.toArray(new JSwingRipplesEIGNode[set.size()]); } catch (final JavaModelException e) { throw new RuntimeException(e); } } /** * @param parent the parent. * @return */ public boolean hasChildren(final JSwingRipplesEIGNode parent) { return getChildren(parent).length > 0; } /** * Clears data. */ public void clear() { this.nodes.clear(); this.membersToNodes.clear(); } }