From 711acc865113b2df256996d81f97b7ca3328e9f6 Mon Sep 17 00:00:00 2001 From: Doug Schaefer Date: Fri, 10 Feb 2006 04:11:00 +0000 Subject: [PATCH] PDOM - start of new search actions off of the Index View. --- core/org.eclipse.cdt.ui/plugin.xml | 4 + .../internal/ui/CPluginResources.properties | 2 + .../ui/editor/ExternalSearchEditor.java | 3 + .../ui/indexview/FindDeclarationsAction.java | 54 +++++++ .../ui/indexview/FindReferencesAction.java | 53 +++++++ .../internal/ui/indexview/IndexAction.java | 49 +++++++ .../cdt/internal/ui/indexview/IndexView.java | 110 ++------------ .../ui/indexview/OpenDefinitionAction.java | 86 +++++++++++ .../ui/indexview/RebuildIndexAction.java | 66 +++++++++ .../ui/search/CSearchMessages.properties | 6 +- .../ui/search/PDOMSearchLabelProvider.java | 65 +++++++++ .../internal/ui/search/PDOMSearchMatch.java | 30 ++++ .../internal/ui/search/PDOMSearchQuery.java | 103 +++++++++++++ .../internal/ui/search/PDOMSearchResult.java | 136 ++++++++++++++++++ .../search/PDOMSearchTreeContentProvider.java | 122 ++++++++++++++++ .../ui/search/PDOMSearchViewPage.java | 98 +++++++++++++ 16 files changed, 887 insertions(+), 100 deletions(-) create mode 100644 core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/FindDeclarationsAction.java create mode 100644 core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/FindReferencesAction.java create mode 100644 core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/IndexAction.java create mode 100644 core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/OpenDefinitionAction.java create mode 100644 core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/RebuildIndexAction.java create mode 100644 core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchLabelProvider.java create mode 100644 core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchMatch.java create mode 100644 core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchQuery.java create mode 100644 core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchResult.java create mode 100644 core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchTreeContentProvider.java create mode 100644 core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchViewPage.java 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); + } + } + } + +}