Logo Search packages:      
Sourcecode: aspectj version File versions

StructureViewNodeFactory.java

/* *******************************************************************
 * 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
 */
00028 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.
       */
00095       public static boolean acceptNode(IProgramElement parent, IProgramElement child) {
            if (parent.getKind() == IProgramElement.Kind.CLASS && child.getKind() == IProgramElement.Kind.CODE) {
                  return false;
            } else {
                  return true;
            }
      }
}

Generated by  Doxygen 1.6.0   Back to index