diff --git a/core/org.eclipse.cdt.ui.tests/icons/sample.gif b/core/org.eclipse.cdt.ui.tests/icons/sample.gif
new file mode 100644
index 00000000000..7952e2ef215
Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/sample.gif differ
diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/brkpd_obj.gif b/core/org.eclipse.cdt.ui.tests/icons/used/brkpd_obj.gif
new file mode 100644
index 00000000000..8e8cac5a9d7
Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/brkpd_obj.gif differ
diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/cdeclaration_obj.gif b/core/org.eclipse.cdt.ui.tests/icons/used/cdeclaration_obj.gif
new file mode 100644
index 00000000000..d079ebb14fa
Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/cdeclaration_obj.gif differ
diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/define_obj.gif b/core/org.eclipse.cdt.ui.tests/icons/used/define_obj.gif
new file mode 100644
index 00000000000..b3ddb5deebc
Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/define_obj.gif differ
diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/disassembly.gif b/core/org.eclipse.cdt.ui.tests/icons/used/disassembly.gif
new file mode 100644
index 00000000000..dbde1a090aa
Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/disassembly.gif differ
diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/enumerator_obj.gif b/core/org.eclipse.cdt.ui.tests/icons/used/enumerator_obj.gif
new file mode 100644
index 00000000000..a73f31a81f6
Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/enumerator_obj.gif differ
diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/expression_obj.gif b/core/org.eclipse.cdt.ui.tests/icons/used/expression_obj.gif
new file mode 100644
index 00000000000..870df5c473a
Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/expression_obj.gif differ
diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/jump_co.gif b/core/org.eclipse.cdt.ui.tests/icons/used/jump_co.gif
new file mode 100644
index 00000000000..0107e2ecc6c
Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/jump_co.gif differ
diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/method_public_obj.gif b/core/org.eclipse.cdt.ui.tests/icons/used/method_public_obj.gif
new file mode 100644
index 00000000000..18103b11fc7
Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/method_public_obj.gif differ
diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/output_obj.gif b/core/org.eclipse.cdt.ui.tests/icons/used/output_obj.gif
new file mode 100644
index 00000000000..d90a51c0220
Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/output_obj.gif differ
diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/showasarray_co.gif b/core/org.eclipse.cdt.ui.tests/icons/used/showasarray_co.gif
new file mode 100644
index 00000000000..a87ddbf9ca8
Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/showasarray_co.gif differ
diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/source_attach_attrib.gif b/core/org.eclipse.cdt.ui.tests/icons/used/source_attach_attrib.gif
new file mode 100644
index 00000000000..3976f8f7913
Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/source_attach_attrib.gif differ
diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/statement_obj.gif b/core/org.eclipse.cdt.ui.tests/icons/used/statement_obj.gif
new file mode 100644
index 00000000000..eccb83c6975
Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/statement_obj.gif differ
diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/tnames_co.gif b/core/org.eclipse.cdt.ui.tests/icons/used/tnames_co.gif
new file mode 100644
index 00000000000..764201b3783
Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/tnames_co.gif differ
diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/types.gif b/core/org.eclipse.cdt.ui.tests/icons/used/types.gif
new file mode 100644
index 00000000000..5ba5b91c5bb
Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/types.gif differ
diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/var_declaration_obj.gif b/core/org.eclipse.cdt.ui.tests/icons/used/var_declaration_obj.gif
new file mode 100644
index 00000000000..74a3d222c70
Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/var_declaration_obj.gif differ
diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/var_pointer.gif b/core/org.eclipse.cdt.ui.tests/icons/used/var_pointer.gif
new file mode 100644
index 00000000000..ca17bd232f6
Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/var_pointer.gif differ
diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/var_simple.gif b/core/org.eclipse.cdt.ui.tests/icons/used/var_simple.gif
new file mode 100644
index 00000000000..600d968f7cf
Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/var_simple.gif differ
diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/variable_local_obj.gif b/core/org.eclipse.cdt.ui.tests/icons/used/variable_local_obj.gif
new file mode 100644
index 00000000000..461c4e79feb
Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/variable_local_obj.gif differ
diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/variable_obj.gif b/core/org.eclipse.cdt.ui.tests/icons/used/variable_obj.gif
new file mode 100644
index 00000000000..9fa6383efc9
Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/variable_obj.gif differ
diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/warning_obj.gif b/core/org.eclipse.cdt.ui.tests/icons/used/warning_obj.gif
new file mode 100644
index 00000000000..cf8d571833d
Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/warning_obj.gif differ
diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/watch_globals.gif b/core/org.eclipse.cdt.ui.tests/icons/used/watch_globals.gif
new file mode 100644
index 00000000000..797b0e0e7b4
Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/watch_globals.gif differ
diff --git a/core/org.eclipse.cdt.ui.tests/plugin.xml b/core/org.eclipse.cdt.ui.tests/plugin.xml
index 51d6d1b2015..87a40fc35d7 100644
--- a/core/org.eclipse.cdt.ui.tests/plugin.xml
+++ b/core/org.eclipse.cdt.ui.tests/plugin.xml
@@ -17,6 +17,9 @@
+
+
+
@@ -37,6 +40,48 @@
id="org.eclipse.cdt.ui.tests.chelp.extension.3"/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/CPPPopulateASTViewAction.java b/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/CPPPopulateASTViewAction.java
new file mode 100644
index 00000000000..aa96859eb28
--- /dev/null
+++ b/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/CPPPopulateASTViewAction.java
@@ -0,0 +1,165 @@
+/**********************************************************************
+ * Copyright (c) 2005 IBM Canada and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v0.5
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v05.html
+ *
+ * Contributors:
+ * IBM Rational Software - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.cdt.ui.tests.DOMAST;
+
+import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
+import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
+import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
+import org.eclipse.cdt.core.dom.ast.IASTExpression;
+import org.eclipse.cdt.core.dom.ast.IASTInitializer;
+import org.eclipse.cdt.core.dom.ast.IASTName;
+import org.eclipse.cdt.core.dom.ast.IASTNode;
+import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration;
+import org.eclipse.cdt.core.dom.ast.IASTStatement;
+import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
+import org.eclipse.cdt.core.dom.ast.IASTTypeId;
+import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier;
+import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction;
+
+/**
+ * @author dsteffle
+ */
+public class CPPPopulateASTViewAction extends CPPBaseVisitorAction implements IPopulateDOMASTAction {
+ {
+ processNames = true;
+ processDeclarations = true;
+ processInitializers = true;
+ processParameterDeclarations = true;
+ processDeclarators = true;
+ processDeclSpecifiers = true;
+ processExpressions = true;
+ processStatements = true;
+ processTypeIds = true;
+ processEnumerators = true;
+ processBaseSpecifiers = true;
+ processNamespaces = true;
+ }
+
+ TreeParent root = null;
+
+ public CPPPopulateASTViewAction(IASTTranslationUnit tu) {
+ root = new TreeParent(tu);
+ }
+
+ private void addRoot(IASTNode node) {
+ TreeParent parent = root.findParentOfNode(node);
+
+ if ( parent != null ) {
+ parent.addChild(new TreeParent(node));
+ } else {
+ root.addChild(new TreeParent(node));
+ }
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processDeclaration(org.eclipse.cdt.core.dom.ast.IASTDeclaration)
+ */
+ public int processDeclaration(IASTDeclaration declaration) {
+ addRoot(declaration);
+ return PROCESS_CONTINUE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processDeclarator(org.eclipse.cdt.core.dom.ast.IASTDeclarator)
+ */
+ public int processDeclarator(IASTDeclarator declarator) {
+ addRoot(declarator);
+ return PROCESS_CONTINUE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processBaseSpecifier(org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier)
+ */
+ public int processBaseSpecifier(ICPPASTBaseSpecifier specifier) {
+ addRoot(specifier);
+ return PROCESS_CONTINUE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processDeclSpecifier(org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier)
+ */
+ public int processDeclSpecifier(IASTDeclSpecifier declSpec) {
+ addRoot(declSpec);
+ return PROCESS_CONTINUE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processEnumerator(org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator)
+ */
+ public int processEnumerator(IASTEnumerator enumerator) {
+ addRoot(enumerator);
+ return PROCESS_CONTINUE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processExpression(org.eclipse.cdt.core.dom.ast.IASTExpression)
+ */
+ public int processExpression(IASTExpression expression) {
+ addRoot(expression);
+ return PROCESS_CONTINUE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processInitializer(org.eclipse.cdt.core.dom.ast.IASTInitializer)
+ */
+ public int processInitializer(IASTInitializer initializer) {
+ addRoot(initializer);
+ return PROCESS_CONTINUE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processName(org.eclipse.cdt.core.dom.ast.IASTName)
+ */
+ public int processName(IASTName name) {
+ addRoot(name);
+ return PROCESS_CONTINUE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processNamespace(org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition)
+ */
+ public int processNamespace(ICPPASTNamespaceDefinition namespace) {
+ addRoot(namespace);
+ return PROCESS_CONTINUE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processParameterDeclaration(org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration)
+ */
+ public int processParameterDeclaration(
+ IASTParameterDeclaration parameterDeclaration) {
+ addRoot(parameterDeclaration);
+ return PROCESS_CONTINUE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processStatement(org.eclipse.cdt.core.dom.ast.IASTStatement)
+ */
+ public int processStatement(IASTStatement statement) {
+ addRoot(statement);
+ return PROCESS_CONTINUE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processTypeId(org.eclipse.cdt.core.dom.ast.IASTTypeId)
+ */
+ public int processTypeId(IASTTypeId typeId) {
+ addRoot(typeId);
+ return PROCESS_CONTINUE;
+ }
+
+ public TreeParent getTree() {
+ return root;
+ }
+}
diff --git a/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/CPopulateASTViewAction.java b/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/CPopulateASTViewAction.java
new file mode 100644
index 00000000000..354b91fe955
--- /dev/null
+++ b/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/CPopulateASTViewAction.java
@@ -0,0 +1,146 @@
+/**********************************************************************
+ * Copyright (c) 2005 IBM Canada and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v0.5
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v05.html
+ *
+ * Contributors:
+ * IBM Rational Software - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.cdt.ui.tests.DOMAST;
+
+import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
+import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
+import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
+import org.eclipse.cdt.core.dom.ast.IASTExpression;
+import org.eclipse.cdt.core.dom.ast.IASTInitializer;
+import org.eclipse.cdt.core.dom.ast.IASTName;
+import org.eclipse.cdt.core.dom.ast.IASTNode;
+import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration;
+import org.eclipse.cdt.core.dom.ast.IASTStatement;
+import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
+import org.eclipse.cdt.core.dom.ast.IASTTypeId;
+import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator;
+import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction;
+
+/**
+ * @author dsteffle
+ */
+public class CPopulateASTViewAction extends CBaseVisitorAction implements IPopulateDOMASTAction {
+ {
+ processNames = true;
+ processDeclarations = true;
+ processInitializers = true;
+ processParameterDeclarations = true;
+ processDeclarators = true;
+ processDeclSpecifiers = true;
+ processExpressions = true;
+ processStatements = true;
+ processTypeIds = true;
+ processEnumerators = true;
+ }
+
+ TreeParent root = null; // TODO what about using a hashtable/hashmap for the tree?
+
+ public CPopulateASTViewAction(IASTTranslationUnit tu) {
+ root = new TreeParent(tu);
+ }
+
+ private void addRoot(IASTNode node) {
+ TreeParent parent = root.findParentOfNode(node);
+
+ if ( parent != null ) {
+ parent.addChild(new TreeParent(node));
+ } else {
+ root.addChild(new TreeParent(node));
+ }
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processDeclaration(org.eclipse.cdt.core.dom.ast.IASTDeclaration)
+ */
+ public int processDeclaration(IASTDeclaration declaration) {
+ addRoot(declaration);
+ return PROCESS_CONTINUE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processDeclarator(org.eclipse.cdt.core.dom.ast.IASTDeclarator)
+ */
+ public int processDeclarator(IASTDeclarator declarator) {
+ addRoot(declarator);
+ return PROCESS_CONTINUE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processDeclSpecifier(org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier)
+ */
+ public int processDeclSpecifier(IASTDeclSpecifier declSpec) {
+ addRoot(declSpec);
+ return PROCESS_CONTINUE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processEnumerator(org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator)
+ */
+ public int processEnumerator(IASTEnumerator enumerator) {
+ addRoot(enumerator);
+ return PROCESS_CONTINUE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processExpression(org.eclipse.cdt.core.dom.ast.IASTExpression)
+ */
+ public int processExpression(IASTExpression expression) {
+ addRoot(expression);
+ return PROCESS_CONTINUE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processInitializer(org.eclipse.cdt.core.dom.ast.IASTInitializer)
+ */
+ public int processInitializer(IASTInitializer initializer) {
+ addRoot(initializer);
+ return PROCESS_CONTINUE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processName(org.eclipse.cdt.core.dom.ast.IASTName)
+ */
+ public int processName(IASTName name) {
+ addRoot(name);
+ return PROCESS_CONTINUE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processParameterDeclaration(org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration)
+ */
+ public int processParameterDeclaration(
+ IASTParameterDeclaration parameterDeclaration) {
+ addRoot(parameterDeclaration);
+ return PROCESS_CONTINUE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processStatement(org.eclipse.cdt.core.dom.ast.IASTStatement)
+ */
+ public int processStatement(IASTStatement statement) {
+ addRoot(statement);
+ return PROCESS_CONTINUE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processTypeId(org.eclipse.cdt.core.dom.ast.IASTTypeId)
+ */
+ public int processTypeId(IASTTypeId typeId) {
+ addRoot(typeId);
+ return PROCESS_CONTINUE;
+ }
+
+ public TreeParent getTree() {
+ return root;
+ }
+
+}
diff --git a/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/DOMAST.java b/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/DOMAST.java
new file mode 100644
index 00000000000..8f0fd355692
--- /dev/null
+++ b/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/DOMAST.java
@@ -0,0 +1,535 @@
+/**********************************************************************
+ * Copyright (c) 2005 IBM Canada and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v0.5
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v05.html
+ *
+ * Contributors:
+ * IBM Rational Software - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.cdt.ui.tests.DOMAST;
+
+import java.io.IOException;
+import java.util.Hashtable;
+import java.util.Map;
+
+import org.eclipse.cdt.ui.tests.DOMAST.DOMASTPluginImages;
+import org.eclipse.cdt.ui.tests.DOMAST.CPPPopulateASTViewAction;
+import org.eclipse.cdt.ui.tests.DOMAST.CPopulateASTViewAction;
+import org.eclipse.cdt.ui.tests.DOMAST.IPopulateDOMASTAction;
+import org.eclipse.cdt.ui.tests.DOMAST.TreeObject;
+import org.eclipse.cdt.ui.tests.DOMAST.TreeParent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.part.*;
+import org.eclipse.jface.viewers.*;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.jface.action.*;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.ui.*;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.SWT;
+import org.eclipse.cdt.core.parser.CodeReader;
+import org.eclipse.cdt.core.parser.IScannerInfo;
+import org.eclipse.cdt.core.parser.NullLogService;
+import org.eclipse.cdt.core.parser.NullSourceElementRequestor;
+import org.eclipse.cdt.core.parser.ParserFactory;
+import org.eclipse.cdt.core.parser.ParserLanguage;
+import org.eclipse.cdt.core.parser.IScanner;
+import org.eclipse.cdt.core.parser.ParserMode;
+import org.eclipse.cdt.core.parser.ScannerInfo;
+import org.eclipse.cdt.core.parser.ast.IASTEnumerator;
+import org.eclipse.cdt.core.dom.ast.IASTArrayModifier;
+import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
+import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
+import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
+import org.eclipse.cdt.core.dom.ast.IASTExpression;
+import org.eclipse.cdt.core.dom.ast.IASTInitializer;
+import org.eclipse.cdt.core.dom.ast.IASTName;
+import org.eclipse.cdt.core.dom.ast.IASTNode;
+import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration;
+import org.eclipse.cdt.core.dom.ast.IASTPointerOperator;
+import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement;
+import org.eclipse.cdt.core.dom.ast.IASTProblem;
+import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
+import org.eclipse.cdt.core.dom.ast.IASTStatement;
+import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
+import org.eclipse.cdt.core.dom.ast.IASTTypeId;
+import org.eclipse.cdt.core.dom.ast.c.ICASTDesignator;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorChainInitializer;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter;
+import org.eclipse.cdt.internal.core.dom.parser.AbstractGNUSourceCodeParser;
+import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor;
+import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction;
+import org.eclipse.cdt.internal.core.dom.parser.c.GCCParserExtensionConfiguration;
+import org.eclipse.cdt.internal.core.dom.parser.c.GNUCSourceParser;
+import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor;
+import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction;
+import org.eclipse.cdt.internal.core.dom.parser.cpp.GNUCPPSourceParser;
+import org.eclipse.cdt.internal.core.dom.parser.cpp.GPPParserExtensionConfiguration;
+import org.eclipse.cdt.internal.ui.editor.CEditor;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+
+
+/**
+ * This sample class demonstrates how to plug-in a new
+ * workbench view. The view shows data obtained from the
+ * model. The sample creates a dummy model on the fly,
+ * but a real implementation would connect to the model
+ * available either in this or another plug-in (e.g. the workspace).
+ * The view is connected to the model using a content provider.
+ *
+ * The view uses a label provider to define how model
+ * objects should be presented in the view. Each
+ * view can present the same model objects using
+ * different labels and icons, if needed. Alternatively,
+ * a single label provider can be shared between views
+ * in order to ensure that objects of the same type are
+ * presented in the same way everywhere.
+ *
+ */
+
+public class DOMAST extends ViewPart {
+ private static final String VIEW_NAME = "DOM View"; //$NON-NLS-1$
+ private static final String POPUPMENU = "#PopupMenu"; //$NON-NLS-1$
+ private static final String OPEN_DEFINITIONS = "Open Definitions"; //$NON-NLS-1$
+ private static final String OPEN_REFERENCES = "Open References"; //$NON-NLS-1$
+ private TreeViewer viewer;
+ private DrillDownAdapter drillDownAdapter;
+ private Action action1;
+ private Action action2;
+ private Action singleClickAction;
+ private IFile file = null;
+ private IEditorPart part = null;
+ private ParserLanguage lang = null;
+
+ /*
+ * The content provider class is responsible for
+ * providing objects to the view. It can wrap
+ * existing objects in adapters or simply return
+ * objects as-is. These objects may be sensitive
+ * to the current input of the view, or ignore
+ * it and always show the same content
+ * (like Task List, for example).
+ */
+
+ public class ViewContentProvider implements IStructuredContentProvider,
+ ITreeContentProvider {
+ private TreeParent invisibleRoot;
+ private IFile aFile = null;
+
+ /**
+ *
+ */
+ public ViewContentProvider() {}
+
+ /**
+ *
+ */
+ public ViewContentProvider(IFile file) {
+ this.aFile = file;
+ }
+
+ public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+ }
+ public void dispose() {
+ }
+ public Object[] getElements(Object parent) {
+ if (parent.equals(getViewSite())) {
+ if (invisibleRoot==null) initialize();
+ return getChildren(invisibleRoot);
+ }
+ return getChildren(parent);
+ }
+ public Object getParent(Object child) {
+ if (child instanceof TreeObject) {
+ return ((TreeObject)child).getParent();
+ }
+ return null;
+ }
+ public Object [] getChildren(Object parent) {
+ if (parent instanceof TreeParent) {
+ return ((TreeParent)parent).getChildren();
+ }
+ return new Object[0];
+ }
+ public boolean hasChildren(Object parent) {
+ if (parent instanceof TreeParent)
+ return ((TreeParent)parent).hasChildren();
+ return false;
+ }
+
+ private void initialize() {
+ if ( aFile == null || lang == null) return;
+
+ IPopulateDOMASTAction action = null;
+
+ // TODO could use something like below to work with working copy... i.e. refresh button
+// IProject currentProject = aFile.getProject();
+// IWorkingCopy workingCopy = null;
+// if( editor.isDirty() ){
+// IWorkingCopy [] workingCopies = CUIPlugin.getSharedWorkingCopies();
+// if( workingCopies != null ){
+// for( int i = 0; i < workingCopies.length; i++ ){
+// if( workingCopies[i].getUnderlyingResource().equals( file ) ){
+// workingCopy = workingCopies[i];
+// break;
+// }
+// }
+// }
+// }
+
+ CodeReader reader = null;
+ try {
+// if( workingCopy == null )
+ reader = new CodeReader(aFile.getLocation().toOSString(), aFile.getCharset() );
+// else
+// reader = new CodeReader(file.getLocation().toOSString(), workingCopy.getContents());
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch ( CoreException e ) {
+ e.printStackTrace();
+ }
+
+ // get IFile
+// IWorkspace workspace= ResourcesPlugin.getWorkspace();
+// workspace.setDescription(desc);
+// getWorkbench().getActiveWorkbenchWindow();
+
+ // parse IFile
+ ParserMode mode = ParserMode.COMPLETE_PARSE;
+ Map definitions = new Hashtable();
+
+ String [] includePaths = new String[0];
+ IScannerInfo scannerInfo = new ScannerInfo( definitions, includePaths );
+ IScanner scanner = ParserFactory.createScanner(
+ reader,
+ scannerInfo,
+ mode,
+ lang,
+ new NullSourceElementRequestor(),
+ null,
+ null );
+ AbstractGNUSourceCodeParser parser = null;
+ if ( lang == ParserLanguage.C ) {
+ parser = new GNUCSourceParser(
+ scanner,
+ mode,
+ new NullLogService(),
+ new GCCParserExtensionConfiguration()
+ );
+
+ IASTTranslationUnit tu = parser.parse();
+
+ action = new CPopulateASTViewAction(tu);
+ CVisitor.visitTranslationUnit(tu, (CBaseVisitorAction)action);
+ } else if ( lang == ParserLanguage.CPP ){
+ parser = new GNUCPPSourceParser(
+ scanner,
+ mode,
+ new NullLogService(),
+ new GPPParserExtensionConfiguration()
+ );
+
+ IASTTranslationUnit tu = parser.parse();
+
+ action = new CPPPopulateASTViewAction(tu);
+ CPPVisitor.visitTranslationUnit(tu, (CPPBaseVisitorAction)action);
+ }
+
+ // display roots
+ invisibleRoot = new TreeParent(null); //$NON-NLS-1$
+ invisibleRoot.addChild(action.getTree());
+
+ }
+ }
+
+ class ViewLabelProvider extends LabelProvider {
+
+ public String getText(Object obj) {
+ return obj.toString();
+ }
+ public Image getImage(Object obj) {
+ String imageKey = DOMASTPluginImages.IMG_DEFAULT;
+
+ IASTNode node = null;
+ if (obj instanceof TreeObject) {
+ node = ((TreeObject)obj).getNode();
+ }
+
+ if ( node instanceof IASTArrayModifier ) {
+ imageKey = DOMASTPluginImages.IMG_IASTArrayModifier;
+ } else if ( node instanceof IASTDeclaration ) {
+ imageKey = DOMASTPluginImages.IMG_IASTDeclaration;
+ } else if ( node instanceof IASTDeclarator ) {
+ imageKey = DOMASTPluginImages.IMG_IASTDeclarator;
+ } else if ( node instanceof IASTDeclSpecifier ) {
+ imageKey = DOMASTPluginImages.IMG_IASTDeclSpecifier;
+ } else if ( node instanceof IASTEnumerator ) {
+ imageKey = DOMASTPluginImages.IMG_IASTEnumerator;
+ } else if ( node instanceof IASTExpression ) {
+ imageKey = DOMASTPluginImages.IMG_IASTExpression;
+ } else if ( node instanceof IASTInitializer ) {
+ imageKey = DOMASTPluginImages.IMG_IASTInitializer;
+ } else if ( node instanceof IASTName ) {
+ imageKey = DOMASTPluginImages.IMG_IASTName;
+ } else if ( node instanceof IASTParameterDeclaration ) {
+ imageKey = DOMASTPluginImages.IMG_IASTParameterDeclaration;
+ } else if ( node instanceof IASTPointerOperator ) {
+ imageKey = DOMASTPluginImages.IMG_IASTPointerOperator;
+ } else if ( node instanceof IASTPreprocessorStatement ) {
+ imageKey = DOMASTPluginImages.IMG_IASTPreprocessorStatement;
+ } else if ( node instanceof IASTProblem ) {
+ imageKey = DOMASTPluginImages.IMG_IASTProblem;
+ } else if ( node instanceof IASTSimpleDeclaration ) {
+ imageKey = DOMASTPluginImages.IMG_IASTSimpleDeclaration;
+ } else if ( node instanceof IASTStatement ) {
+ imageKey = DOMASTPluginImages.IMG_IASTStatement;
+ } else if ( node instanceof IASTTranslationUnit ) {
+ imageKey = DOMASTPluginImages.IMG_IASTTranslationUnit;
+ } else if ( node instanceof IASTTypeId ) {
+ imageKey = DOMASTPluginImages.IMG_IASTTypeId;
+ } else if ( node instanceof ICASTDesignator ) {
+ imageKey = DOMASTPluginImages.IMG_ICASTDesignator;
+ } else if ( node instanceof ICPPASTConstructorChainInitializer ) {
+ imageKey = DOMASTPluginImages.IMG_ICPPASTConstructorChainInitializer;
+ } else if ( node instanceof ICPPASTTemplateParameter ) {
+ imageKey = DOMASTPluginImages.IMG_ICPPASTTemplateParameter;
+ }
+
+ return DOMASTPluginImages.get(imageKey);
+ }
+ }
+ class NameSorter extends ViewerSorter {
+ }
+
+ public DOMAST() {
+
+ }
+
+ /**
+ * This is a callback that will allow us
+ * to create the viewer and initialize it.
+ */
+ public void createPartControl(Composite parent) {
+
+ if (part == null) {
+ IWorkbenchPage[] pages = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getPages();
+
+ if (pages.length == 0) {
+ // TODO determine how to hide view if no pages found and part==null
+ }
+
+ outerLoop: for(int i=0; i0;
+ }
+
+ private TreeParent findParentOfNode(TreeObject[] trees, IASTNode node) {
+ for (int i=0; i