[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[cdt-patch] DOM Parser test utilities
|
Here's the patch for the DOM Parser
test utilities.
Devin Steffler
IBM's Eclipse CDT
Ottawa (Palladium), Ontario, Canada
Attachment:
icons.zip
Description: Zip archive
Index: plugin.xml
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.ui.tests/plugin.xml,v
retrieving revision 1.25
diff -u -r1.25 plugin.xml
--- plugin.xml 22 Dec 2004 19:49:04 -0000 1.25
+++ plugin.xml 26 Jan 2005 16:29:41 -0000
@@ -17,6 +17,9 @@
<import plugin="org.eclipse.cdt.ui"/>
<import plugin="org.eclipse.swt"/>
<import plugin="org.eclipse.ui"/>
+ <import plugin="org.eclipse.ui.editors"/>
+ <import plugin="org.eclipse.ui.views"/>
+ <import plugin="org.eclipse.ui.workbench.texteditor"/>
<import plugin="org.junit"/>
<import plugin="org.eclipse.cdt.core"/>
<import plugin="org.eclipse.cdt.core.tests"/>
@@ -36,6 +39,48 @@
class="org.eclipse.cdt.ui.tests.chelp.CHelpTestInfoProvider"
id="org.eclipse.cdt.ui.tests.chelp.extension.3"/>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.views">
+ <view
+ allowMultiple="false"
+ class="org.eclipse.cdt.ui.tests.DOMAST.DOMAST"
+ icon="icons/sample.gif"
+ category="org.eclipse.cdt.ui.views"
+ name="DOM AST"
+ id="org.eclipse.cdt.ui.tests.DOMAST.DOMAST">
+ </view>
+ </extension>
+ <extension
+ point="org.eclipse.ui.perspectiveExtensions">
+ <perspectiveExtension
+ targetID="org.eclipse.ui.resourcePerspective">
+ <view
+ ratio="0.5"
+ relative="org.eclipse.ui.views.TaskList"
+ relationship="right"
+ id="org.eclipse.cdt.ui.tests.DOMAST.DOMAST">
+ </view>
+ </perspectiveExtension>
+ </extension>
+ <extension
+ point="org.eclipse.ui.popupMenus">
+ <viewerContribution
+ targetID="org.eclipse.cdt.ui.CView"
+ id="org.eclipse.cdt.ui.CView">
+ <action
+ label="Show in DOM AST"
+ class="org.eclipse.cdt.ui.tests.DOMAST.OpenDOMViewAction"
+ menubarPath="additions"
+ id="org.eclipse.cdt.ui.tests.DOMAST.OpenDOMViewAction"/>
+ <visibility>
+ <or>
+ <objectState name="extension" value="cpp"/>
+ <objectState name="extension" value="c"/>
+ </or>
+ </visibility>
+ </viewerContribution>
</extension>
Index: src/org/eclipse/cdt/ui/tests/DOMAST/CPPPopulateASTViewAction.java
===================================================================
RCS file: src/org/eclipse/cdt/ui/tests/DOMAST/CPPPopulateASTViewAction.java
diff -N src/org/eclipse/cdt/ui/tests/DOMAST/CPPPopulateASTViewAction.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/org/eclipse/cdt/ui/tests/DOMAST/CPPPopulateASTViewAction.java 1 Jan 1970 00:00:00 -0000
@@ -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;
+ }
+}
Index: src/org/eclipse/cdt/ui/tests/DOMAST/CPopulateASTViewAction.java
===================================================================
RCS file: src/org/eclipse/cdt/ui/tests/DOMAST/CPopulateASTViewAction.java
diff -N src/org/eclipse/cdt/ui/tests/DOMAST/CPopulateASTViewAction.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/org/eclipse/cdt/ui/tests/DOMAST/CPopulateASTViewAction.java 1 Jan 1970 00:00:00 -0000
@@ -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;
+ }
+
+}
Index: src/org/eclipse/cdt/ui/tests/DOMAST/DOMAST.java
===================================================================
RCS file: src/org/eclipse/cdt/ui/tests/DOMAST/DOMAST.java
diff -N src/org/eclipse/cdt/ui/tests/DOMAST/DOMAST.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/org/eclipse/cdt/ui/tests/DOMAST/DOMAST.java 1 Jan 1970 00:00:00 -0000
@@ -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.
+ * <p>
+ * 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.
+ * <p>
+ */
+
+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; i<pages.length; i++) {
+ IEditorReference[] editorRefs = pages[i].getEditorReferences();
+ for (int j=0; j<editorRefs.length; j++) {
+ part = editorRefs[j].getEditor(false);
+ if (part instanceof CEditor) {
+ // TODO set the language properly if implement the above TODO
+ lang = ParserLanguage.CPP;
+ break outerLoop;
+ }
+ }
+ }
+
+ if (PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage() != null &&
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor() != null)
+ part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
+ }
+
+ viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+ drillDownAdapter = new DrillDownAdapter(viewer);
+
+ if (part instanceof CEditor)
+ viewer.setContentProvider( new ViewContentProvider(((CEditor)part).getInputFile()) );
+ else
+ viewer.setContentProvider(new ViewContentProvider(file));
+
+ viewer.setLabelProvider(new ViewLabelProvider());
+ viewer.setInput(getViewSite());
+ makeActions();
+ hookContextMenu();
+ hookSingleClickAction();
+ contributeToActionBars();
+ }
+
+ public void setContentProvider(ViewContentProvider vcp) {
+ viewer.setContentProvider(vcp);
+ }
+
+ private void hookContextMenu() {
+ MenuManager menuMgr = new MenuManager(POPUPMENU);
+ menuMgr.setRemoveAllWhenShown(true);
+ menuMgr.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ DOMAST.this.fillContextMenu(manager);
+ IContributionItem[] items = manager.getItems();
+ for (int i=0; i<items.length; i++) {
+ // TODO Devin put in the check here if IASTName or not... if it isn't, and item is open declaration (make constant) then hide it
+ if (items[i] instanceof ActionContributionItem &&
+ (((ActionContributionItem)items[i]).getAction().getText().equals(OPEN_REFERENCES) ||
+ ((ActionContributionItem)items[i]).getAction().getText().equals(OPEN_DEFINITIONS) )) {
+ if (viewer.getSelection() instanceof StructuredSelection &&
+ ((StructuredSelection)viewer.getSelection()).getFirstElement() instanceof TreeObject &&
+ ((TreeObject)((StructuredSelection)viewer.getSelection()).getFirstElement()).getNode() instanceof IASTName) {
+ items[i].setVisible(true);
+ } else {
+ items[i].setVisible(false);
+ }
+ }
+ }
+ }
+ });
+ Menu menu = menuMgr.createContextMenu(viewer.getControl());
+ viewer.getControl().setMenu(menu);
+ getSite().registerContextMenu(menuMgr, viewer);
+ }
+
+ private void contributeToActionBars() {
+ IActionBars bars = getViewSite().getActionBars();
+ fillLocalPullDown(bars.getMenuManager());
+ fillLocalToolBar(bars.getToolBarManager());
+ }
+
+ private void fillLocalPullDown(IMenuManager manager) {
+// manager.add(action1); // TODO determine the groups/filters to use
+// manager.add(new Separator());
+// manager.add(action2);
+ }
+
+ private void fillContextMenu(IMenuManager manager) {
+ manager.add(action1);
+ manager.add(action2);
+ manager.add(new Separator());
+ drillDownAdapter.addNavigationActions(manager);
+ // Other plug-ins can contribute there actions here
+ manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ }
+
+ private void fillLocalToolBar(IToolBarManager manager) {
+// manager.add(action1); // TODO determine the groups/filters to use
+// manager.add(action2);
+// manager.add(new Separator());
+// drillDownAdapter.addNavigationActions(manager);
+ }
+
+ private void makeActions() {
+ action1 = new Action() {
+ public void run() {
+ showMessage("Action 1 executed"); // TODO Devin open declarations action ... john probably wants all of them highlighted... wouldn't I have to use annotations then???
+ }
+ };
+ action1.setText(OPEN_REFERENCES);
+ action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
+ getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
+
+ action2 = new Action() {
+ public void run() {
+ showMessage("Action 2 executed"); // TODO Devin open definitions action ... use annotations to highlight definitions?
+ }
+ };
+ action2.setText(OPEN_DEFINITIONS);
+ action2.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
+ getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
+
+ singleClickAction = new ASTHighlighterAction(part);
+ }
+
+ private class ASTHighlighterAction extends Action {
+ IEditorPart aPart = null;
+
+ public ASTHighlighterAction(IEditorPart part) {
+ this.aPart = part;
+ }
+
+ public void setPart(IEditorPart part) {
+ this.aPart = part;
+ }
+
+ public void run() {
+ ISelection selection = viewer.getSelection();
+ Object obj = ((IStructuredSelection)selection).getFirstElement();
+ if (aPart instanceof CEditor && obj instanceof TreeObject) {
+ ((CEditor)aPart).selectAndReveal(((TreeObject)obj).getOffset(), ((TreeObject)obj).getLength());
+ }
+ }
+ }
+
+ // TODO need to create a new action with the following for annotations (get declarations/references)
+// ISelection selection = viewer.getSelection();
+// Object obj = ((IStructuredSelection)selection).getFirstElement();
+//
+// if (aPart instanceof CEditor) {
+// IAnnotationModel aModel = ((CEditor)aPart).getDocumentProvider().getAnnotationModel(aPart.getEditorInput());
+// if ( aModel != null && obj instanceof TreeObject && !(((TreeObject)obj).getNode() instanceof IASTTranslationUnit) ) {
+// Iterator itr = aModel.getAnnotationIterator();
+// while (itr.hasNext()) {
+// aModel.removeAnnotation((Annotation)itr.next());
+// }
+//
+// ASTViewAnnotation annotation = new ASTViewAnnotation();
+// annotation.setType(CMarkerAnnotation.WARNING_ANNOTATION_TYPE);
+// aModel.addAnnotation(annotation, new Position(((TreeObject)obj).getOffset(), ((TreeObject)obj).getLength()));
+// }
+// }
+
+
+ // TODO implement annotation for things like open declarations/references
+// private class ASTViewAnnotation extends Annotation implements IAnnotationPresentation {
+//
+// /* (non-Javadoc)
+// * @see org.eclipse.jface.text.source.IAnnotationPresentation#getLayer()
+// */
+// public int getLayer() {
+// return IAnnotationAccessExtension.DEFAULT_LAYER;
+// }
+//
+// /* (non-Javadoc)
+// * @see org.eclipse.jface.text.source.IAnnotationPresentation#paint(org.eclipse.swt.graphics.GC, org.eclipse.swt.widgets.Canvas, org.eclipse.swt.graphics.Rectangle)
+// */
+// public void paint(GC gc, Canvas canvas, Rectangle r) {
+// // TODO implement this annotation image for
+// ImageUtilities.drawImage(ASTViewPluginImages.get(ASTViewPluginImages.IMG_TO_DRAW), gc, canvas, r, SWT.CENTER, SWT.TOP);
+// }
+// }
+
+ private void hookSingleClickAction() {
+ viewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ // TODO Auto-generated method stub
+ singleClickAction.run();
+ }
+ });
+ }
+ private void showMessage(String message) {
+ MessageDialog.openInformation(
+ viewer.getControl().getShell(),
+ VIEW_NAME,
+ message);
+ }
+
+ /**
+ * Passing the focus request to the viewer's control.
+ */
+ public void setFocus() {
+ viewer.getControl().setFocus();
+ }
+
+ public void setFile(IFile file) {
+ this.file = file;
+ viewer.setContentProvider(new ViewContentProvider(file));
+ }
+
+ public void setPart(IEditorPart part) {
+ this.part = part;
+
+ if (singleClickAction instanceof ASTHighlighterAction)
+ ((ASTHighlighterAction)singleClickAction).setPart(part);
+ }
+
+ public void setLang(ParserLanguage lang) {
+ this.lang = lang;
+ }
+
+}
Index: src/org/eclipse/cdt/ui/tests/DOMAST/DOMASTPluginImages.java
===================================================================
RCS file: src/org/eclipse/cdt/ui/tests/DOMAST/DOMASTPluginImages.java
diff -N src/org/eclipse/cdt/ui/tests/DOMAST/DOMASTPluginImages.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/org/eclipse/cdt/ui/tests/DOMAST/DOMASTPluginImages.java 1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,122 @@
+/**********************************************************************
+ * 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.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.cdt.testplugin.CTestPlugin;
+import org.eclipse.cdt.ui.CUIPlugin;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author dsteffle
+ */
+public class DOMASTPluginImages {
+ private static ImageRegistry imageRegistry = new ImageRegistry(CUIPlugin.getStandardDisplay());
+
+ /**
+ * Returns the standard display to be used. The method first checks, if
+ * the thread calling this method has an associated display. If so, this
+ * display is returned. Otherwise the method returns the default display.
+ */
+ public static Display getStandardDisplay() {
+ Display display= Display.getCurrent();
+ if (display == null) {
+ display= Display.getDefault();
+ }
+ return display;
+ }
+
+ // Subdirectory (under the package containing this class) where 16 color images are
+ private static URL fgIconBaseURL;
+
+ static {
+ try {
+ fgIconBaseURL= new URL(CTestPlugin.getDefault().getBundle().getEntry("/"), "icons/" ); //$NON-NLS-1$ //$NON-NLS-2$
+ } catch (MalformedURLException e) {}
+ }
+ public static final String PLUGIN_ID = "org.eclipse.cdt.testplugin.CTestPlugin"; //$NON-NLS-1$
+ private static final String NAME_PREFIX= PLUGIN_ID + '.';
+ private static final int NAME_PREFIX_LENGTH= NAME_PREFIX.length();
+ public static final String ICON_PREFIX= "used/"; //$NON-NLS-1$
+
+ public static final String IMG_IASTArrayModifier= NAME_PREFIX + "showasarray_co.gif"; //$NON-NLS-1$
+ public static final String IMG_IASTDeclaration= NAME_PREFIX + "cdeclaration_obj.gif"; //$NON-NLS-1$
+ public static final String IMG_IASTDeclarator= NAME_PREFIX + "variable_obj.gif"; //$NON-NLS-1$
+ public static final String IMG_IASTDeclSpecifier= NAME_PREFIX + "var_simple.gif"; //$NON-NLS-1$
+ public static final String IMG_IASTEnumerator= NAME_PREFIX + "enumerator_obj.gif"; //$NON-NLS-1$
+ public static final String IMG_IASTExpression= NAME_PREFIX + "expression_obj.gif"; //$NON-NLS-1$
+ public static final String IMG_IASTInitializer= NAME_PREFIX + "variable_local_obj.gif"; //$NON-NLS-1$
+ public static final String IMG_IASTName= NAME_PREFIX + "tnames_co.gif"; //$NON-NLS-1$
+ public static final String IMG_IASTParameterDeclaration= NAME_PREFIX + "var_declaration_obj.gif"; //$NON-NLS-1$
+ public static final String IMG_IASTPointerOperator= NAME_PREFIX + "var_pointer.gif"; //$NON-NLS-1$
+ public static final String IMG_IASTPreprocessorStatement= NAME_PREFIX + "define_obj.gif"; //$NON-NLS-1$
+ public static final String IMG_IASTProblem= NAME_PREFIX + "warning_obj.gif"; //$NON-NLS-1$
+ public static final String IMG_IASTSimpleDeclaration= NAME_PREFIX + "method_public_obj.gif"; //$NON-NLS-1$
+ public static final String IMG_IASTStatement= NAME_PREFIX + "statement_obj.gif"; //$NON-NLS-1$
+ public static final String IMG_IASTTranslationUnit= NAME_PREFIX + "source_attach_attrib.gif"; //$NON-NLS-1$
+ public static final String IMG_IASTTypeId= NAME_PREFIX + "types.gif"; //$NON-NLS-1$
+ public static final String IMG_ICASTDesignator= NAME_PREFIX + "watch_globals.gif"; //$NON-NLS-1$
+ public static final String IMG_ICPPASTConstructorChainInitializer = NAME_PREFIX + "jump_co.gif"; //$NON-NLS-1$
+ public static final String IMG_ICPPASTTemplateParameter = NAME_PREFIX + "disassembly.gif"; //$NON-NLS-1$
+ public static final String IMG_DEFAULT = NAME_PREFIX + "brkpd_obj.gif"; //$NON-NLS-1$
+
+ public static final ImageDescriptor DESC_IASTArrayModifier= createManaged(ICON_PREFIX, IMG_IASTArrayModifier);
+ public static final ImageDescriptor DESC_IASTDeclaration= createManaged(ICON_PREFIX, IMG_IASTDeclaration);
+ public static final ImageDescriptor DESC_IASTDeclarator= createManaged(ICON_PREFIX, IMG_IASTDeclarator);
+ public static final ImageDescriptor DESC_IASTDeclSpecifier= createManaged(ICON_PREFIX, IMG_IASTDeclSpecifier);
+ public static final ImageDescriptor DESC_IASTEnumerator= createManaged(ICON_PREFIX, IMG_IASTEnumerator);
+ public static final ImageDescriptor DESC_IASTExpression= createManaged(ICON_PREFIX, IMG_IASTExpression);
+ public static final ImageDescriptor DESC_IASTInitializer= createManaged(ICON_PREFIX, IMG_IASTInitializer);
+ public static final ImageDescriptor DESC_IASTName= createManaged(ICON_PREFIX, IMG_IASTName);
+ public static final ImageDescriptor DESC_IASTParameterDeclaration= createManaged(ICON_PREFIX, IMG_IASTParameterDeclaration);
+ public static final ImageDescriptor DESC_IASTPointerOperator= createManaged(ICON_PREFIX, IMG_IASTPointerOperator);
+ public static final ImageDescriptor DESC_IASTPreprocessorStatement= createManaged(ICON_PREFIX, IMG_IASTPreprocessorStatement);
+ public static final ImageDescriptor DESC_IASTProblem= createManaged(ICON_PREFIX, IMG_IASTProblem);
+ public static final ImageDescriptor DESC_IASTSimpleDeclaration= createManaged(ICON_PREFIX, IMG_IASTSimpleDeclaration);
+ public static final ImageDescriptor DESC_IASTStatement= createManaged(ICON_PREFIX, IMG_IASTStatement);
+ public static final ImageDescriptor DESC_IASTTranslationUnit= createManaged(ICON_PREFIX, IMG_IASTTranslationUnit);
+ public static final ImageDescriptor DESC_IASTTypeId= createManaged(ICON_PREFIX, IMG_IASTTypeId);
+ public static final ImageDescriptor DESC_ICASTDesignator= createManaged(ICON_PREFIX, IMG_ICASTDesignator);
+ public static final ImageDescriptor DESC_ICPPASTConstructorChainInitializer= createManaged(ICON_PREFIX, IMG_ICPPASTConstructorChainInitializer);
+ public static final ImageDescriptor DESC_ICPPASTTemplateParameter= createManaged(ICON_PREFIX, IMG_ICPPASTTemplateParameter);
+ public static final ImageDescriptor DESC_DEFAULT= createManaged(ICON_PREFIX, IMG_DEFAULT);
+
+ private static ImageDescriptor createManaged(String prefix, String name) {
+ return createManaged(imageRegistry, prefix, name);
+ }
+
+ private static ImageDescriptor createManaged(ImageRegistry registry, String prefix, String name) {
+ ImageDescriptor result= ImageDescriptor.createFromURL(makeIconFileURL(prefix, name.substring(NAME_PREFIX_LENGTH)));
+ registry.put(name, result);
+ return result;
+ }
+
+ private static URL makeIconFileURL(String prefix, String name) {
+ StringBuffer buffer= new StringBuffer(prefix);
+ buffer.append(name);
+ try {
+ return new URL(fgIconBaseURL, buffer.toString());
+ } catch (MalformedURLException e) {
+ CUIPlugin.getDefault().log(e);
+ return null;
+ }
+ }
+
+ public static Image get(String key) {
+ return imageRegistry.get(key);
+ }
+
+}
Index: src/org/eclipse/cdt/ui/tests/DOMAST/IPopulateDOMASTAction.java
===================================================================
RCS file: src/org/eclipse/cdt/ui/tests/DOMAST/IPopulateDOMASTAction.java
diff -N src/org/eclipse/cdt/ui/tests/DOMAST/IPopulateDOMASTAction.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/org/eclipse/cdt/ui/tests/DOMAST/IPopulateDOMASTAction.java 1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,18 @@
+/**********************************************************************
+ * 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;
+
+/**
+ * @author dsteffle
+ */
+public interface IPopulateDOMASTAction {
+ public TreeParent getTree();
+}
Index: src/org/eclipse/cdt/ui/tests/DOMAST/OpenDOMViewAction.java
===================================================================
RCS file: src/org/eclipse/cdt/ui/tests/DOMAST/OpenDOMViewAction.java
diff -N src/org/eclipse/cdt/ui/tests/DOMAST/OpenDOMViewAction.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/org/eclipse/cdt/ui/tests/DOMAST/OpenDOMViewAction.java 1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,120 @@
+/**********************************************************************
+ * 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.model.CModelException;
+import org.eclipse.cdt.core.model.ICElement;
+import org.eclipse.cdt.core.model.ISourceReference;
+import org.eclipse.cdt.core.model.ITranslationUnit;
+import org.eclipse.cdt.core.parser.ParserLanguage;
+import org.eclipse.cdt.internal.core.model.TranslationUnit;
+import org.eclipse.cdt.internal.ui.util.EditorUtility;
+import org.eclipse.cdt.ui.tests.DOMAST.DOMAST;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IEditorActionDelegate;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PartInitException;
+
+/**
+ * @author dsteffle
+ */
+public class OpenDOMViewAction implements IViewActionDelegate, IEditorActionDelegate, IObjectActionDelegate {
+
+ private static final String VIEW_ID = "org.eclipse.cdt.ui.tests.DOMAST.DOMAST"; //$NON-NLS-1$
+ IViewPart viewPart = null;
+ ISelection selection = null;
+ IFile file = null;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
+ */
+ public void init(IViewPart view) {
+ this.viewPart = view;
+
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+ */
+ public void run(IAction action) {
+ // TODO Auto-generated method stub
+
+ Object obj = ((IStructuredSelection)selection).getFirstElement();
+ ITranslationUnit tu = null;
+ IEditorPart part = null;
+ if (obj instanceof ISourceReference) {
+ tu = ((ISourceReference) obj).getTranslationUnit();
+ if (tu != null) {
+ if (viewPart != null) {
+ if (obj instanceof ICElement) {
+ try {
+ part = EditorUtility.openInEditor(obj);
+ } catch (CModelException cme) {
+ } catch (PartInitException pie) {}
+
+ }
+ }
+ }
+ }
+
+ IViewPart tempView = null;
+
+ try {
+ tempView = viewPart.getSite().getPage().showView(VIEW_ID);
+ } catch (PartInitException pie) {}
+
+ if (tempView != null) {
+ if (tempView instanceof DOMAST) {
+ ((DOMAST)tempView).setFile(file);
+ ((DOMAST)tempView).setPart(part);
+ if (tu != null) {
+ ((DOMAST)tempView).setLang(tu.isCXXLanguage() ? ParserLanguage.CPP : ParserLanguage.C);
+ }
+ ((DOMAST)tempView).setContentProvider(((DOMAST)tempView).new ViewContentProvider(file));
+ }
+ }
+
+ viewPart.getSite().getPage().activate(tempView);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
+ */
+ public void selectionChanged(IAction action, ISelection selection) {
+ if (selection instanceof IStructuredSelection &&
+ ((IStructuredSelection)selection).getFirstElement() instanceof TranslationUnit &&
+ ((TranslationUnit)((IStructuredSelection)selection).getFirstElement()).getResource() instanceof IFile) {
+ this.file = (IFile)((TranslationUnit)((IStructuredSelection)selection).getFirstElement()).getResource();
+ }
+ this.selection = selection;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorActionDelegate#setActiveEditor(org.eclipse.jface.action.IAction, org.eclipse.ui.IEditorPart)
+ */
+ public void setActiveEditor(IAction action, IEditorPart targetEditor) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
+ */
+ public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+ }
+
+}
Index: src/org/eclipse/cdt/ui/tests/DOMAST/TreeObject.java
===================================================================
RCS file: src/org/eclipse/cdt/ui/tests/DOMAST/TreeObject.java
diff -N src/org/eclipse/cdt/ui/tests/DOMAST/TreeObject.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/org/eclipse/cdt/ui/tests/DOMAST/TreeObject.java 1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,96 @@
+/**********************************************************************
+ * 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.IASTName;
+import org.eclipse.cdt.core.dom.ast.IASTNode;
+import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
+import org.eclipse.core.runtime.IAdaptable;
+
+/**
+ * @author dsteffle
+ */
+public class TreeObject implements IAdaptable {
+ private static final String IGCCAST_PREFIX = "IGCCAST"; //$NON-NLS-1$
+ private static final String IGNUAST_PREFIX = "IGNUAST"; //$NON-NLS-1$
+ private static final String IGPPAST_PREFIX = "IGPPAST"; //$NON-NLS-1$
+ private static final String ICPPAST_PREFIX = "ICPPAST"; //$NON-NLS-1$
+ private static final String ICAST_PREFIX = "ICAST"; //$NON-NLS-1$
+ private static final String IAST_PREFIX = "IAST"; //$NON-NLS-1$
+ private static final String START_OF_LIST = ": "; //$NON-NLS-1$
+ private static final String LIST_SEPARATOR = ", "; //$NON-NLS-1$
+ private static final String FILENAME_SEPARATOR = "."; //$NON-NLS-1$
+ private IASTNode node = null;
+ private TreeParent parent;
+
+ public TreeObject(IASTNode node) {
+ this.node = node;
+ }
+ public IASTNode getNode() {
+ return node;
+ }
+ public void setParent(TreeParent parent) {
+ this.parent = parent;
+ }
+ public TreeParent getParent() {
+ return parent;
+ }
+
+ private boolean hasProperPrefix(String string) {
+ if (string.startsWith(IAST_PREFIX) ||
+ string.startsWith(ICAST_PREFIX) ||
+ string.startsWith(ICPPAST_PREFIX) ||
+ string.startsWith(IGPPAST_PREFIX) ||
+ string.startsWith(IGNUAST_PREFIX) ||
+ string.startsWith(IGCCAST_PREFIX))
+ return true;
+
+ return false;
+ }
+
+ public String toString() {
+ StringBuffer buffer = new StringBuffer();
+
+ Class[] classes = node.getClass().getInterfaces();
+ for(int i=0; i<classes.length; i++) {
+ String interfaceName = classes[i].getName().substring(classes[i].getName().lastIndexOf(FILENAME_SEPARATOR) + 1);
+ if (hasProperPrefix(interfaceName)) {
+ buffer.append(interfaceName);
+ if (i+1 < classes.length && hasProperPrefix(classes[i+1].getName().substring(classes[i+1].getName().lastIndexOf(FILENAME_SEPARATOR) + 1)))
+ buffer.append(LIST_SEPARATOR);
+ }
+ }
+
+ if ( node instanceof IASTName ) {
+ buffer.append(START_OF_LIST);
+ buffer.append(node);
+ }
+
+ return buffer.toString();
+ }
+ public Object getAdapter(Class key) {
+ return null;
+ }
+
+ public int getOffset() {
+ if (node instanceof ASTNode)
+ return ((ASTNode)node).getOffset();
+
+ return 0;
+ }
+
+ public int getLength() {
+ if (node instanceof ASTNode)
+ return ((ASTNode)node).getLength();
+
+ return 0;
+ }
+}
Index: src/org/eclipse/cdt/ui/tests/DOMAST/TreeParent.java
===================================================================
RCS file: src/org/eclipse/cdt/ui/tests/DOMAST/TreeParent.java
diff -N src/org/eclipse/cdt/ui/tests/DOMAST/TreeParent.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/org/eclipse/cdt/ui/tests/DOMAST/TreeParent.java 1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,79 @@
+/**********************************************************************
+ * 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.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.cdt.core.dom.ast.IASTNode;
+
+/**
+ * @author dsteffle
+ */
+public class TreeParent extends TreeObject {
+ private ArrayList children; // TODO might want to use a HashTable/HashMap or wrap one so finding the parent node is faster
+
+ public TreeParent(IASTNode node) {
+ super(node);
+ children = new ArrayList();
+ }
+ public void addChild(TreeObject child) {
+ children.add(child);
+ child.setParent(this);
+ }
+ public void removeChild(TreeObject child) {
+ children.remove(child);
+ child.setParent(null);
+ }
+ public TreeObject [] getChildren() {
+ return (TreeObject [])children.toArray(new TreeObject[children.size()]);
+ }
+ public boolean hasChildren() {
+ return children.size()>0;
+ }
+
+ private TreeParent findParentOfNode(TreeObject[] trees, IASTNode node) {
+ for (int i=0; i<trees.length; i++) {
+
+ if (trees[i] != null && trees[i] instanceof TreeParent) {
+ if ( ((TreeParent)trees[i]).getNode() == node.getParent() ) {
+ return (TreeParent)trees[i];
+ } else if ( ((TreeParent)trees[i]).hasChildren() ){
+ TreeParent tree = findParentOfNode( ((TreeParent)trees[i]).getChildren(), node );
+ if (tree != null) return tree;
+ }
+ }
+ }
+
+ return null; // nothing found
+ }
+
+ public TreeParent findParentOfNode(IASTNode node) {
+ if (node == null || node.getParent() == null) return null;
+
+ Iterator itr = children.iterator();
+ while (itr.hasNext()) {
+ Object o = itr.next();
+ if (o != null && o instanceof TreeParent) {
+ if ( ((TreeParent)o).getNode() == node.getParent() ) {
+ return (TreeParent)o;
+ } else if ( ((TreeParent)o).hasChildren() ){
+ TreeParent tree = findParentOfNode( ((TreeParent)o).getChildren(), node );
+ if (tree != null) return tree;
+ }
+ }
+ }
+
+ return null; // nothing found
+ }
+
+
+}