package com.aptana.editor.php.internal.ui.editor.outline; import java.util.ArrayList; import java.util.List; import com.aptana.editor.common.AbstractThemeableEditor; import com.aptana.editor.common.outline.CommonOutlineItem; import com.aptana.editor.html.outline.HTMLOutlineContentProvider; import com.aptana.editor.html.parsing.ast.HTMLTextNode; import com.aptana.editor.php.internal.parser.nodes.IPHPParseNode; import com.aptana.parsing.ast.IParseNode; /** * An outline content provider for PHTML (PHP & HTML) content. * * @author Shalom Gibly <sgibly@aptana.com> */ public class PHTMLOutlineContentProvider extends HTMLOutlineContentProvider { public PHTMLOutlineContentProvider(AbstractThemeableEditor editor) { super(editor); } @Override public CommonOutlineItem getOutlineItem(IParseNode node) { if (node == null) { return null; } if (node instanceof IPHPParseNode) { return new PHPOutlineItem(node.getNameNode().getNameRange(), node); } else { return super.getOutlineItem(node); } } @Override protected Object[] filter(IParseNode[] nodes) { List<CommonOutlineItem> list = new ArrayList<CommonOutlineItem>(); filterRecursively(nodes, list); return list.toArray(new CommonOutlineItem[list.size()]); } private void filterRecursively(IParseNode[] nodes, List<CommonOutlineItem> list) { IPHPParseNode element; for (IParseNode node : nodes) { if (node instanceof IPHPParseNode) { element = (IPHPParseNode) node; // filters out any item that should not be in the outline if (!element.isFilteredFromOutline()) { list.add(getOutlineItem(element)); } else { // the node may have children that we don't want to filter (like a function within an 'if' // statement). filterRecursively(node.getChildren(), list); } } else if (!(node instanceof HTMLTextNode)) { list.add(getOutlineItem(node)); } } } }