diff --git a/core/org.eclipse.cdt.ui/plugin.xml b/core/org.eclipse.cdt.ui/plugin.xml
index da6bf1930f4..5bafd6009b7 100644
--- a/core/org.eclipse.cdt.ui/plugin.xml
+++ b/core/org.eclipse.cdt.ui/plugin.xml
@@ -1232,6 +1232,10 @@
searchResultClass="org.eclipse.cdt.internal.ui.search.CSearchResult"
id="org.eclipse.cdt.ui.CSearchResultPage">
+
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/CPluginResources.properties b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/CPluginResources.properties
index 2a34dbe3626..bf8a85d2788 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/CPluginResources.properties
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/CPluginResources.properties
@@ -322,3 +322,5 @@ Editorutility.closedproject.description = The project {0} containing that declar
# ------- Index View Text -----------
IndexView.rebuildIndex.name = Rebuild Index
IndexView.openDefinition.name = Open Definition
+IndexView.findReferences.name = Find References
+IndexView.findDeclarations.name = Find Declarations
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ExternalSearchEditor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ExternalSearchEditor.java
index 11b707a9895..07749df178e 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ExternalSearchEditor.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ExternalSearchEditor.java
@@ -17,10 +17,13 @@ import org.eclipse.jface.action.IMenuManager;
public class ExternalSearchEditor extends CEditor {
+ public static final String EDITOR_ID = "org.eclipse.cdt.ui.editor.ExternalSearchEditor";
+
public ExternalSearchEditor(){
super();
setDocumentProvider(CUIPlugin.getDefault().getExternalSearchDocumentProvider());
}
+
public void editorContextMenuAboutToShow(IMenuManager menu) {
super.editorContextMenuAboutToShow(menu);
IContributionItem[] contrItem = menu.getItems();
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/FindDeclarationsAction.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/FindDeclarationsAction.java
new file mode 100644
index 00000000000..44173d9be07
--- /dev/null
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/FindDeclarationsAction.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2006 QNX Software Systems and others.
+ * 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:
+ * QNX - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.internal.ui.indexview;
+
+import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
+import org.eclipse.cdt.internal.ui.search.PDOMSearchQuery;
+import org.eclipse.cdt.ui.CUIPlugin;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.search.ui.NewSearchUI;
+
+/**
+ * @author Doug Schaefer
+ *
+ */
+public class FindDeclarationsAction extends IndexAction {
+
+ public FindDeclarationsAction(TreeViewer viewer) {
+ super(viewer, CUIPlugin.getResourceString("IndexView.findDeclarations.name"));
+ }
+
+ private PDOMBinding getBinding() {
+ ISelection selection = viewer.getSelection();
+ if (!(selection instanceof IStructuredSelection))
+ return null;
+ Object[] objs = ((IStructuredSelection)selection).toArray();
+ return (objs.length == 1 && objs[0] instanceof PDOMBinding)
+ ? (PDOMBinding)objs[0] : null;
+ }
+
+ public void run() {
+ PDOMSearchQuery query = new PDOMSearchQuery(getBinding(),
+ PDOMSearchQuery.FIND_DECLARATIONS | PDOMSearchQuery.FIND_DEFINITIONS);
+
+ NewSearchUI.activateSearchResultView();
+
+ NewSearchUI.runQueryInBackground(query);
+ }
+
+ public boolean valid() {
+ return getBinding() != null;
+ }
+
+}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/FindReferencesAction.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/FindReferencesAction.java
new file mode 100644
index 00000000000..dc70b7f35ee
--- /dev/null
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/FindReferencesAction.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2006 QNX Software Systems and others.
+ * 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:
+ * QNX - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.internal.ui.indexview;
+
+import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
+import org.eclipse.cdt.internal.ui.search.PDOMSearchQuery;
+import org.eclipse.cdt.ui.CUIPlugin;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.search.ui.NewSearchUI;
+
+/**
+ * @author Doug Schaefer
+ *
+ */
+public class FindReferencesAction extends IndexAction {
+
+ public FindReferencesAction(TreeViewer viewer) {
+ super(viewer, CUIPlugin.getResourceString("IndexView.findReferences.name"));
+ }
+
+ private PDOMBinding getBinding() {
+ ISelection selection = viewer.getSelection();
+ if (!(selection instanceof IStructuredSelection))
+ return null;
+ Object[] objs = ((IStructuredSelection)selection).toArray();
+ return (objs.length == 1 && objs[0] instanceof PDOMBinding)
+ ? (PDOMBinding)objs[0] : null;
+ }
+
+ public void run() {
+ PDOMSearchQuery query = new PDOMSearchQuery(getBinding(), PDOMSearchQuery.FIND_REFERENCES);
+
+ NewSearchUI.activateSearchResultView();
+
+ NewSearchUI.runQueryInBackground(query);
+ }
+
+ public boolean valid() {
+ return getBinding() != null;
+ }
+
+}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/IndexAction.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/IndexAction.java
new file mode 100644
index 00000000000..4fc689ceab8
--- /dev/null
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/IndexAction.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2006 QNX Software Systems and others.
+ * 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:
+ * QNX - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.internal.ui.indexview;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.TreeViewer;
+
+/**
+ * @author Doug Schaefer
+ *
+ * Root class for Index View Actions. Add an check to make sure the
+ * action is valid with the current context.
+ */
+public abstract class IndexAction extends Action {
+
+ protected TreeViewer viewer;
+
+ protected IndexAction(TreeViewer viewer) {
+ super();
+ this.viewer = viewer;
+ }
+
+ protected IndexAction(TreeViewer viewer, String text) {
+ super(text);
+ this.viewer = viewer;
+ }
+
+ protected IndexAction(TreeViewer viewer, String text, ImageDescriptor image) {
+ super(text, image);
+ this.viewer = viewer;
+ }
+
+ protected IndexAction(TreeViewer viewer, String text, int style) {
+ super(text, style);
+ this.viewer = viewer;
+ }
+
+ public abstract boolean valid();
+}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/IndexView.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/IndexView.java
index cd6c6e030be..a96bd6df060 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/IndexView.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/IndexView.java
@@ -13,7 +13,6 @@ package org.eclipse.cdt.internal.ui.indexview;
import org.eclipse.cdt.core.dom.IPDOM;
import org.eclipse.cdt.core.dom.PDOM;
-import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.ICompositeType;
import org.eclipse.cdt.core.dom.ast.IFunction;
@@ -24,25 +23,17 @@ import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICModel;
import org.eclipse.cdt.core.model.ICProject;
-import org.eclipse.cdt.core.resources.FileStorage;
import org.eclipse.cdt.internal.core.pdom.PDOMDatabase;
-import org.eclipse.cdt.internal.core.pdom.PDOMUpdator;
import org.eclipse.cdt.internal.core.pdom.db.IBTreeVisitor;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMMember;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMMemberOwner;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
import org.eclipse.cdt.internal.core.pdom.dom.cpp.PDOMCPPNamespace;
-import org.eclipse.cdt.internal.ui.util.EditorUtility;
import org.eclipse.cdt.internal.ui.viewsupport.CElementImageProvider;
import org.eclipse.cdt.ui.CUIPlugin;
-import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
@@ -51,8 +42,6 @@ import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILazyTreeContentProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
@@ -62,13 +51,11 @@ import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.part.ViewPart;
-import org.eclipse.ui.texteditor.ITextEditor;
/**
* @author Doug Schaefer
@@ -80,6 +67,8 @@ public class IndexView extends ViewPart implements PDOMDatabase.IListener {
// private DrillDownAdapter drillDownAdapter;
private IndexAction rebuildAction;
private IndexAction openDefinitionAction;
+ private IndexAction findDeclarationsAction;
+ private IndexAction findReferencesAction;
private static class Counter implements IBTreeVisitor {
int count;
@@ -394,92 +383,11 @@ public class IndexView extends ViewPart implements PDOMDatabase.IListener {
getSite().registerContextMenu(menuMgr, viewer);
}
- private abstract static class IndexAction extends Action {
- public abstract boolean valid();
- }
-
private void makeActions() {
- rebuildAction = new IndexAction() {
- public void run() {
- ISelection selection = viewer.getSelection();
- if (!(selection instanceof IStructuredSelection))
- return;
-
- Object[] objs = ((IStructuredSelection)selection).toArray();
- for (int i = 0; i < objs.length; ++i) {
- if (!(objs[i] instanceof ICProject))
- continue;
-
- ICProject cproject = (ICProject)objs[i];
- try {
- PDOM.deletePDOM(cproject.getProject());
- PDOMUpdator job = new PDOMUpdator(cproject, null);
- job.schedule();
- } catch (CoreException e) {
- CUIPlugin.getDefault().log(e);
- }
- }
- }
- public boolean valid() {
- ISelection selection = viewer.getSelection();
- if (!(selection instanceof IStructuredSelection))
- return false;
- Object[] objs = ((IStructuredSelection)selection).toArray();
- for (int i = 0; i < objs.length; ++i)
- if (objs[i] instanceof ICProject)
- return true;
- return false;
- }
- };
- rebuildAction.setText(CUIPlugin.getResourceString("IndexView.rebuildIndex.name")); //$NON-NLS-1$
-
- openDefinitionAction = new IndexAction() {
- public void run() {
- ISelection selection = viewer.getSelection();
- if (!(selection instanceof IStructuredSelection))
- return;
-
- Object[] objs = ((IStructuredSelection)selection).toArray();
- for (int i = 0; i < objs.length; ++i) {
- if (!(objs[i] instanceof PDOMBinding))
- continue;
-
- try {
- PDOMBinding binding = (PDOMBinding)objs[i];
- PDOMName name = binding.getFirstDefinition();
- if (name == null)
- name = binding.getFirstDeclaration();
- if (name == null)
- continue;
-
- IASTFileLocation location = name.getFileLocation();
- IPath path = new Path(location.getFileName());
- Object input = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(path);
- if (input == null)
- input = new FileStorage(path);
-
- IEditorPart editor = EditorUtility.openInEditor(input);
- if (editor != null && editor instanceof ITextEditor) {
- ((ITextEditor)editor).selectAndReveal(location.getNodeOffset(), location.getNodeLength());
- return;
- }
- } catch (CoreException e) {
- CUIPlugin.getDefault().log(e);
- }
- }
- }
- public boolean valid() {
- ISelection selection = viewer.getSelection();
- if (!(selection instanceof IStructuredSelection))
- return false;
- Object[] objs = ((IStructuredSelection)selection).toArray();
- for (int i = 0; i < objs.length; ++i)
- if (objs[i] instanceof PDOMBinding)
- return true;
- return false;
- }
- };
- openDefinitionAction.setText(CUIPlugin.getResourceString("IndexView.openDefinition.name"));//$NON-NLS-1$
+ rebuildAction = new RebuildIndexAction(viewer);
+ openDefinitionAction = new OpenDefinitionAction(viewer);
+ findDeclarationsAction = new FindDeclarationsAction(viewer);
+ findReferencesAction = new FindReferencesAction(viewer);
}
private void hookContextMenu() {
@@ -498,8 +406,12 @@ public class IndexView extends ViewPart implements PDOMDatabase.IListener {
private void fillContextMenu(IMenuManager manager) {
if (rebuildAction.valid())
manager.add(rebuildAction);
- if (rebuildAction.valid())
+ if (openDefinitionAction.valid())
manager.add(openDefinitionAction);
+ if (findDeclarationsAction.valid())
+ manager.add(findDeclarationsAction);
+ if (findReferencesAction.valid())
+ manager.add(findReferencesAction);
//manager.add(new Separator());
//drillDownAdapter.addNavigationActions(manager);
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/OpenDefinitionAction.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/OpenDefinitionAction.java
new file mode 100644
index 00000000000..16d1d0c6c50
--- /dev/null
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/OpenDefinitionAction.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2006 QNX Software Systems and others.
+ * 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:
+ * QNX - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.internal.ui.indexview;
+
+import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
+import org.eclipse.cdt.core.resources.FileStorage;
+import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
+import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
+import org.eclipse.cdt.internal.ui.util.EditorUtility;
+import org.eclipse.cdt.ui.CUIPlugin;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+/**
+ * @author Doug Schaefer
+ *
+ */
+public class OpenDefinitionAction extends IndexAction {
+
+ public OpenDefinitionAction(TreeViewer viewer) {
+ super(viewer, CUIPlugin.getResourceString("IndexView.openDefinition.name"));//$NON-NLS-1$
+ }
+
+ public void run() {
+ ISelection selection = viewer.getSelection();
+ if (!(selection instanceof IStructuredSelection))
+ return;
+
+ Object[] objs = ((IStructuredSelection)selection).toArray();
+ for (int i = 0; i < objs.length; ++i) {
+ if (!(objs[i] instanceof PDOMBinding))
+ continue;
+
+ try {
+ PDOMBinding binding = (PDOMBinding)objs[i];
+ PDOMName name = binding.getFirstDefinition();
+ if (name == null)
+ name = binding.getFirstDeclaration();
+ if (name == null)
+ continue;
+
+ IASTFileLocation location = name.getFileLocation();
+ IPath path = new Path(location.getFileName());
+ Object input = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(path);
+ if (input == null)
+ input = new FileStorage(path);
+
+ IEditorPart editor = EditorUtility.openInEditor(input);
+ if (editor != null && editor instanceof ITextEditor) {
+ ((ITextEditor)editor).selectAndReveal(location.getNodeOffset(), location.getNodeLength());
+ return;
+ }
+ } catch (CoreException e) {
+ CUIPlugin.getDefault().log(e);
+ }
+ }
+ }
+
+ public boolean valid() {
+ ISelection selection = viewer.getSelection();
+ if (!(selection instanceof IStructuredSelection))
+ return false;
+ Object[] objs = ((IStructuredSelection)selection).toArray();
+ for (int i = 0; i < objs.length; ++i)
+ if (objs[i] instanceof PDOMBinding)
+ return true;
+ return false;
+ }
+
+}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/RebuildIndexAction.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/RebuildIndexAction.java
new file mode 100644
index 00000000000..b97f76eaee6
--- /dev/null
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/RebuildIndexAction.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2006 QNX Software Systems and others.
+ * 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:
+ * QNX - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.internal.ui.indexview;
+
+import org.eclipse.cdt.core.dom.PDOM;
+import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.cdt.internal.core.pdom.PDOMUpdator;
+import org.eclipse.cdt.ui.CUIPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+
+
+/**
+ * @author Doug Schaefer
+ *
+ */
+public class RebuildIndexAction extends IndexAction {
+
+ public RebuildIndexAction(TreeViewer viewer) {
+ super(viewer, CUIPlugin.getResourceString("IndexView.rebuildIndex.name")); //$NON-NLS-1$
+ }
+
+ public void run() {
+ ISelection selection = viewer.getSelection();
+ if (!(selection instanceof IStructuredSelection))
+ return;
+
+ Object[] objs = ((IStructuredSelection)selection).toArray();
+ for (int i = 0; i < objs.length; ++i) {
+ if (!(objs[i] instanceof ICProject))
+ continue;
+
+ ICProject cproject = (ICProject)objs[i];
+ try {
+ PDOM.deletePDOM(cproject.getProject());
+ PDOMUpdator job = new PDOMUpdator(cproject, null);
+ job.schedule();
+ } catch (CoreException e) {
+ CUIPlugin.getDefault().log(e);
+ }
+ }
+ }
+
+ public boolean valid() {
+ ISelection selection = viewer.getSelection();
+ if (!(selection instanceof IStructuredSelection))
+ return false;
+ Object[] objs = ((IStructuredSelection)selection).toArray();
+ for (int i = 0; i < objs.length; ++i)
+ if (objs[i] instanceof ICProject)
+ return true;
+ return false;
+ }
+
+}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchMessages.properties b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchMessages.properties
index 2900b66e80f..7982e3b45a8 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchMessages.properties
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchMessages.properties
@@ -140,4 +140,8 @@ CSearchPage.warning.indexersomeprojects=Index not enabled on some projects
# Add To Index Action
ActionDefinition.addToIndex.name= Add To Index
-ActionDefinition.addToIndex.description= Add file to index
\ No newline at end of file
+ActionDefinition.addToIndex.description= Add file to index
+
+PDOMSearch.query.refs.label = Find references to
+PDOMSearch.query.defs.label = Find definitions of
+PDOMSearch.query.decls.label = Find declarations of
\ No newline at end of file
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchLabelProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchLabelProvider.java
new file mode 100644
index 00000000000..8e89fbaab18
--- /dev/null
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchLabelProvider.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2006 QNX Software Systems and others.
+ * 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:
+ * QNX - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.internal.ui.search;
+
+import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
+import org.eclipse.cdt.internal.ui.CPluginImages;
+import org.eclipse.cdt.ui.CUIPlugin;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Doug Schaefer
+ *
+ */
+public class PDOMSearchLabelProvider extends LabelProvider {
+
+ public Image getImage(Object element) {
+ ImageDescriptor imageDescriptor = null;
+ if (element instanceof IProject) {
+ imageDescriptor = CPluginImages.DESC_OBJS_SEARCHHIERPROJECT;
+ } else if (element instanceof IFolder) {
+ imageDescriptor = CPluginImages.DESC_OBJS_SEARCHHIERFODLER;
+ } else if (element instanceof IFile) {
+ imageDescriptor = CPluginImages.DESC_OBJS_TUNIT;
+ } else if (element instanceof PDOMName) {
+ imageDescriptor = CPluginImages.DESC_OBJS_VARIABLE;
+ } else if (element instanceof String) {
+ // external path, likely a header file
+ imageDescriptor = CPluginImages.DESC_OBJS_TUNIT_HEADER;
+ }
+
+ if (imageDescriptor != null) {
+ return CUIPlugin.getImageDescriptorRegistry().get( imageDescriptor );
+ } else
+ return super.getImage(element);
+ }
+
+ public String getText(Object element) {
+ if (element instanceof IResource) {
+ return ((IResource)element).getName();
+ } else if (element instanceof PDOMName) {
+ PDOMName name = (PDOMName)element;
+ return new String(name.toCharArray())
+ + " (" + name.getFileName() + ")";
+ } else {
+ return super.getText(element);
+ }
+
+ }
+
+}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchMatch.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchMatch.java
new file mode 100644
index 00000000000..dbc7cb04de8
--- /dev/null
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchMatch.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2006 QNX Software Systems and others.
+ * 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:
+ * QNX - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.internal.ui.search;
+
+import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
+import org.eclipse.search.ui.text.Match;
+
+/**
+ * @author Doug Schaefer
+ *
+ */
+public class PDOMSearchMatch extends Match {
+
+ public PDOMSearchMatch(PDOMName name, int offset, int length) {
+ super(name, offset, length);
+ }
+
+ public String getFileName() {
+ return ((PDOMName)getElement()).getFileName();
+ }
+}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchQuery.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchQuery.java
new file mode 100644
index 00000000000..48555c3b07f
--- /dev/null
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchQuery.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2006 QNX Software Systems and others.
+ * 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:
+ * QNX - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.internal.ui.search;
+
+import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
+import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
+import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
+import org.eclipse.cdt.ui.CUIPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.search.ui.ISearchQuery;
+import org.eclipse.search.ui.ISearchResult;
+
+/**
+ * @author Doug Schaefer
+ *
+ * This is the search query to be used for searching the PDOM.
+ */
+public class PDOMSearchQuery implements ISearchQuery {
+
+ public static final int FIND_DECLARATIONS = 1;
+ public static final int FIND_DEFINITIONS = 2;
+ public static final int FIND_REFERENCES = 4;
+
+ private PDOMSearchResult result = new PDOMSearchResult(this);
+ private PDOMBinding binding;
+ private int flags;
+
+ public PDOMSearchQuery(PDOMBinding binding, int flags) {
+ this.binding = binding;
+ this.flags = flags;
+ }
+
+ public IStatus run(IProgressMonitor monitor) throws OperationCanceledException {
+ try {
+ if ((flags & FIND_DECLARATIONS) != 0) {
+ PDOMName name = binding.getFirstDeclaration();
+ while (name != null) {
+ IASTFileLocation loc = name.getFileLocation();
+ result.addMatch(new PDOMSearchMatch(name, loc.getNodeOffset(), loc.getNodeLength()));
+ name = name.getNextInBinding();
+ }
+ }
+ if ((flags & (FIND_DECLARATIONS)) != 0) {
+ // for decls we do defs too
+ PDOMName name = binding.getFirstDefinition();
+ while (name != null) {
+ IASTFileLocation loc = name.getFileLocation();
+ result.addMatch(new PDOMSearchMatch(name, loc.getNodeOffset(), loc.getNodeLength()));
+ name = name.getNextInBinding();
+ }
+ }
+ if ((flags & FIND_REFERENCES) != 0) {
+ PDOMName name = binding.getFirstReference();
+ while (name != null) {
+ IASTFileLocation loc = name.getFileLocation();
+ result.addMatch(new PDOMSearchMatch(name, loc.getNodeOffset(), loc.getNodeLength()));
+ name = name.getNextInBinding();
+ }
+ }
+ return Status.OK_STATUS;
+ } catch (CoreException e) {
+ return new Status(IStatus.ERROR, CUIPlugin.PLUGIN_ID, 0, e.getLocalizedMessage(), e);
+ }
+ }
+
+ public String getLabel() {
+ String type = null;
+ if ((flags & FIND_REFERENCES) != 0)
+ type = CSearchMessages.getString("PDOMSearch.query.refs.label"); //$NON-NLS-1$
+ else if ((flags & FIND_DECLARATIONS) != 0)
+ type = CSearchMessages.getString("PDOMSearch.query.decls.label"); //$NON-NLS-1$
+ else
+ type = CSearchMessages.getString("PDOMSearch.query.defs.label"); //$NON-NLS-1$
+
+ return type + " " + binding.getName();
+ }
+
+ public boolean canRerun() {
+ return true;
+ }
+
+ public boolean canRunInBackground() {
+ return true;
+ }
+
+ public ISearchResult getSearchResult() {
+ return result;
+ }
+
+}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchResult.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchResult.java
new file mode 100644
index 00000000000..69e6965ea3d
--- /dev/null
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchResult.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2006 QNX Software Systems and others.
+ * 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:
+ * QNX - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.internal.ui.search;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
+import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
+import org.eclipse.cdt.internal.ui.util.ExternalEditorInput;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.search.ui.ISearchQuery;
+import org.eclipse.search.ui.text.AbstractTextSearchResult;
+import org.eclipse.search.ui.text.IEditorMatchAdapter;
+import org.eclipse.search.ui.text.IFileMatchAdapter;
+import org.eclipse.search.ui.text.Match;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.part.FileEditorInput;
+
+/**
+ * @author Doug Schaefer
+ *
+ */
+public class PDOMSearchResult extends AbstractTextSearchResult implements IEditorMatchAdapter, IFileMatchAdapter {
+
+ private PDOMSearchQuery query;
+
+ public PDOMSearchResult(PDOMSearchQuery query) {
+ super();
+ this.query = query;
+ }
+
+ public IEditorMatchAdapter getEditorMatchAdapter() {
+ return this;
+ }
+
+ public IFileMatchAdapter getFileMatchAdapter() {
+ return this;
+ }
+
+ private String getFileName(IEditorPart editor) {
+ IEditorInput input = editor.getEditorInput();
+ if (input instanceof FileEditorInput) {
+ FileEditorInput fileInput = (FileEditorInput)input;
+ return fileInput.getFile().getLocation().toOSString();
+ } else if (input instanceof ExternalEditorInput) {
+ ExternalEditorInput extInput = (ExternalEditorInput)input;
+ return extInput.getStorage().getFullPath().toOSString();
+ } else {
+ return null;
+ }
+ }
+
+ public boolean isShownInEditor(Match match, IEditorPart editor) {
+ String filename = getFileName(editor);
+ if (filename != null && match instanceof PDOMSearchMatch) {
+ return filename.equals(((PDOMSearchMatch)match).getFileName());
+ } else
+ return false;
+ }
+
+ private Match[] computeContainedMatches(AbstractTextSearchResult result, String filename) {
+ List list = new ArrayList();
+ Object[] elements = result.getElements();
+ for (int i = 0; i < elements.length; ++i) {
+ Match[] matches = result.getMatches(elements[i]);
+ for (int j = 0; j < matches.length; ++j) {
+ if (matches[j] instanceof PDOMSearchMatch) {
+ String mfilename = ((PDOMSearchMatch)matches[j]).getFileName();
+ if (filename.equals(mfilename))
+ list.add(matches[j]);
+ }
+ }
+ }
+ return (Match[])list.toArray(new Match[list.size()]);
+ }
+
+ public Match[] computeContainedMatches(AbstractTextSearchResult result, IEditorPart editor) {
+ String filename = getFileName(editor);
+ if (filename != null) {
+ return computeContainedMatches(result, filename);
+ } else {
+ return new Match[0];
+ }
+ }
+
+ public Match[] computeContainedMatches(AbstractTextSearchResult result, IFile file) {
+ String filename = file.getLocation().toOSString();
+ return computeContainedMatches(result, filename);
+ }
+
+ public IFile getFile(Object element) {
+ if (element instanceof PDOMName) {
+ PDOMName name = (PDOMName)element;
+ IASTFileLocation loc = name.getFileLocation();
+ IPath path = new Path(loc.getFileName());
+ IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(path);
+ if (files.length > 0)
+ return files[0];
+ else
+ return null;
+ } else
+ return null;
+ }
+
+ public String getLabel() {
+ return query.getLabel();
+ }
+
+ public String getTooltip() {
+ return null;
+ }
+
+ public ImageDescriptor getImageDescriptor() {
+ return null;
+ }
+
+ public ISearchQuery getQuery() {
+ return query;
+ }
+
+}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchTreeContentProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchTreeContentProvider.java
new file mode 100644
index 00000000000..9b1fbca8750
--- /dev/null
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchTreeContentProvider.java
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ * Copyright (c) 2006 QNX Software Systems and others.
+ * 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:
+ * QNX - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.internal.ui.search;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
+import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Doug Schaefer
+ *
+ */
+public class PDOMSearchTreeContentProvider implements ITreeContentProvider {
+
+ private TreeViewer viewer;
+ private PDOMSearchResult result;
+ private HashMap tree;
+
+ public Object[] getChildren(Object parentElement) {
+ Set children = (Set)tree.get(parentElement);
+ if (children == null)
+ return new Object[0];
+ return children.toArray();
+ }
+
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ return tree.get(element) != null;
+ }
+
+ public Object[] getElements(Object inputElement) {
+ return getChildren(result);
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ this.viewer = (TreeViewer)viewer;
+ result = (PDOMSearchResult)newInput;
+ tree = new HashMap();
+ }
+
+ private void insertChild(Object parent, Object child) {
+ Set children = (Set)tree.get(parent);
+ if (children == null) {
+ children = new HashSet();
+ tree.put(parent, children);
+ }
+ children.add(child);
+ }
+
+ private void insertName(PDOMName name) {
+ IASTFileLocation loc = name.getFileLocation();
+ IPath path = new Path(loc.getFileName());
+ IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(path);
+ if (files.length > 0) {
+ for (int j = 0; j < files.length; ++j) {
+ insertChild(files[j], name);
+ insertResource(files[j]);
+ }
+ } else {
+ String pathName = path.toOSString();
+ insertChild(pathName, name);
+ insertChild(result, pathName);
+ }
+ }
+
+ private void insertResource(IResource resource) {
+ if (resource instanceof IProject) {
+ insertChild(result, resource);
+ } else {
+ IContainer parent = resource.getParent();
+ insertChild(parent, resource);
+ insertResource(parent);
+ }
+ }
+
+ public void elementsChanged(Object[] elements) {
+ if (elements == null || elements.length == 0)
+ return;
+
+ for (int i = 0; i < elements.length; ++i) {
+ PDOMName name = (PDOMName)elements[i];
+ insertName(name);
+ }
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ viewer.refresh();
+ };
+ });
+ }
+
+ public void clear() {
+ }
+}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchViewPage.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchViewPage.java
new file mode 100644
index 00000000000..33b6e76cad4
--- /dev/null
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchViewPage.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2006 QNX Software Systems and others.
+ * 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:
+ * QNX - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.internal.ui.search;
+
+import org.eclipse.cdt.core.resources.FileStorage;
+import org.eclipse.cdt.internal.ui.editor.ExternalSearchEditor;
+import org.eclipse.cdt.internal.ui.util.ExternalEditorInput;
+import org.eclipse.cdt.ui.CUIPlugin;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.search.ui.NewSearchUI;
+import org.eclipse.search.ui.text.AbstractTextSearchViewPage;
+import org.eclipse.search.ui.text.Match;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+/**
+ * @author Doug Schaefer
+ *
+ */
+public class PDOMSearchViewPage extends AbstractTextSearchViewPage {
+
+ private PDOMSearchTreeContentProvider contentProvider;
+
+ public PDOMSearchViewPage(int supportedLayouts) {
+ super(supportedLayouts);
+ }
+
+ public PDOMSearchViewPage() {
+ super();
+ }
+
+ protected void elementsChanged(Object[] objects) {
+ if (contentProvider != null)
+ contentProvider.elementsChanged(objects);
+ }
+
+ protected void clear() {
+ if (contentProvider != null)
+ contentProvider.clear();
+ }
+
+ protected void configureTreeViewer(TreeViewer viewer) {
+ contentProvider = new PDOMSearchTreeContentProvider();
+ viewer.setContentProvider(contentProvider);
+ viewer.setLabelProvider(new PDOMSearchLabelProvider());
+ }
+
+ protected void configureTableViewer(TableViewer viewer) {
+ }
+
+ protected void showMatch(Match match, int currentOffset, int currentLength, boolean activate) throws PartInitException {
+ if (!(match instanceof PDOMSearchMatch))
+ return;
+
+ IPath path = new Path(((PDOMSearchMatch)match).getFileName());
+ IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(path);
+ if (files.length > 0) {
+ IEditorPart editor = IDE.openEditor(CUIPlugin.getActivePage(), files[0]);
+ try {
+ IMarker marker = files[0].createMarker(NewSearchUI.SEARCH_MARKER);
+ marker.setAttribute(IMarker.CHAR_START, currentOffset);
+ marker.setAttribute(IMarker.CHAR_END, currentOffset + currentLength);
+ IDE.gotoMarker(editor, marker);
+ marker.delete();
+ } catch (CoreException e) {
+ CUIPlugin.getDefault().log(e);
+ }
+ } else {
+ // external file
+ IEditorInput input = new ExternalEditorInput(new FileStorage(path));
+ IEditorPart editor = CUIPlugin.getActivePage().openEditor(input, ExternalSearchEditor.EDITOR_ID);
+ if (editor instanceof ITextEditor) {
+ ITextEditor textEditor = (ITextEditor)editor;
+ textEditor.selectAndReveal(currentOffset, currentLength);
+ }
+ }
+ }
+
+}