Package org.aspectj.ajde.ui

Source Code of org.aspectj.ajde.ui.StructureViewNodeFactory

/* *******************************************************************
* Copyright (c) 1999-2001 Xerox Corporation,
*               2002 Palo Alto Research Center, Incorporated (PARC).
* All rights reserved.
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License v1.0
* which accompanies this distribution and is available at
* http://www.eclipse.org/legal/epl-v10.html
* Contributors:
*     Xerox/PARC     initial implementation
* ******************************************************************/

package org.aspectj.ajde.ui;

import java.util.Iterator;
import java.util.List;

import org.aspectj.ajde.Ajde;
import org.aspectj.asm.AsmManager;
import org.aspectj.asm.IProgramElement;
import org.aspectj.asm.IRelationship;
import org.aspectj.asm.IRelationshipMap;

/**
* @author Mik Kersten
*/
public abstract class StructureViewNodeFactory {

  private final AbstractIconRegistry iconRegistry;

  public StructureViewNodeFactory(AbstractIconRegistry iconRegistry) {
    this.iconRegistry = iconRegistry;
  }

  public IStructureViewNode createNode(IProgramElement node) {
    return createNode(node, null);
  }

  public IStructureViewNode createNode(IProgramElement node, List children) {
    AbstractIcon icon = iconRegistry.getStructureIcon(node.getKind(), node.getAccessibility());

    IStructureViewNode svNode = createDeclaration(node, icon, children);
    String nodeHandle = node.getHandleIdentifier();
    // Don't put relationships on fields as they can then appear twice when building the outline -
    // once under clinit field-set nodes and once under the field declaration.
    if (nodeHandle != null && !node.getKind().equals(IProgramElement.Kind.FIELD)) {
      AsmManager manager = Ajde.getDefault().getModel();
      IRelationshipMap relMap = (manager == null ? null : manager.getRelationshipMap());
      List relationships = (relMap == null ? null : relMap.get(nodeHandle));
      if (relationships != null) {
        for (Iterator it = relationships.iterator(); it.hasNext();) {
          IRelationship rel = (IRelationship) it.next();
          if (rel != null && rel.getTargets().size() > 0) {
            IStructureViewNode relNode = createRelationship(rel, iconRegistry.getIcon(rel.getKind()));
            if (relNode != null) {
              svNode.add(relNode, 0);
              for (Iterator it2 = rel.getTargets().iterator(); it2.hasNext();) {
                String handle = (String) it2.next();
                IProgramElement link = Ajde.getDefault().getModel().getHierarchy().findElementForHandle(handle);
                if (link != null) {
                  IStructureViewNode linkNode = createLink(link, iconRegistry.getStructureIcon(link.getKind(),
                      link.getAccessibility()));
                  relNode.add(linkNode);
                }
              }
            }
          }
        }
      }
    }
    return svNode;
  }

  /**
   * Implementors must override this method in order to create link new nodes.
   */
  protected abstract IStructureViewNode createLink(IProgramElement node, AbstractIcon icon);

  /**
   * Implementors must override this method in order to create new relationship nodes.
   *
   * If returned node is null it will not be added to the tree.
   */
  protected abstract IStructureViewNode createRelationship(IRelationship relationship, AbstractIcon icon);

  /**
   * Implementors must override this method in order to create new nodes.
   */
  protected abstract IStructureViewNode createDeclaration(IProgramElement node, AbstractIcon icon, List children);

  /**
   * Don't show code elements under types since they show under the corresponding initializers.
   */
  public static boolean acceptNode(IProgramElement parent, IProgramElement child) {
    if (parent.getKind() == IProgramElement.Kind.CLASS && child.getKind() == IProgramElement.Kind.CODE) {
      return false;
    } else {
      return true;
    }
  }
}
TOP

Related Classes of org.aspectj.ajde.ui.StructureViewNodeFactory

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.