1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 14:42:11 +02:00

Call Hierarchy: Actions to open the call hierarchy, navigation of nodes.

This commit is contained in:
Markus Schorn 2006-08-21 15:22:50 +00:00
parent 1d508cd878
commit 95b8581183
20 changed files with 529 additions and 301 deletions

View file

@ -57,7 +57,7 @@ public class AsyncViewerTest extends TestCase {
super(disp);
}
public Object[] asyncronouslyComputeChildren(Object parentElement, IProgressMonitor monitor) {
protected Object[] asyncronouslyComputeChildren(Object parentElement, IProgressMonitor monitor) {
Node n= (Node) parentElement;
try {
Thread.sleep(n.fAsync);
@ -67,7 +67,7 @@ public class AsyncViewerTest extends TestCase {
return n.fChildren;
}
public Object[] syncronouslyComputeChildren(Object parentElement) {
protected Object[] syncronouslyComputeChildren(Object parentElement) {
Node n= (Node) parentElement;
if (n.fAsync != 0) {
return null;

View file

@ -71,6 +71,7 @@ Require-Bundle: org.eclipse.ui.ide,
org.eclipse.ui.navigator,
org.eclipse.core.expressions,
org.eclipse.ui.navigator.resources,
com.ibm.icu
com.ibm.icu,
org.eclipse.cdt.refactoring
Eclipse-LazyStart: true
Bundle-RequiredExecutionEnvironment: J2SE-1.4

View file

@ -104,6 +104,9 @@ ActionDefinition.finddecl.description= Find Declaration
ActionDefinition.findrefs.name= Find References
ActionDefinition.findrefs.description= Find References
ActionDefinition.openCallHierarchy.name= Open Call Hierarchy
ActionDefinition.openCallHierarchy.description= Open the call hierarchy for the selected element
ActionDefinition.addBlockComment.name= Add Block Comment
ActionDefinition.addBlockComment.description= Enclose the selection with a block comment
@ -352,3 +355,6 @@ Dummy.label = dummy
# Common Navigator
navigatorContent.name = CDT Elements
OpenCallHierarchy.label = Open Call Hierarchy
OpenCallHierarchy.tooltip = Open Call Hierarchy

View file

@ -880,6 +880,11 @@
contextId="org.eclipse.cdt.ui.cEditorScope"
commandId="org.eclipse.cdt.ui.edit.text.c.remove.block.comment"
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
<key
sequence="M1+M3+H"
contextId="org.eclipse.cdt.ui.cEditorScope"
commandId="org.eclipse.cdt.ui.edit.open.call.hierarchy"
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
<key
sequence="M1+F3"
contextId="org.eclipse.cdt.ui.cEditorScope"
@ -1024,6 +1029,11 @@
description="%ActionDefinition.findrefs.description"
name="%ActionDefinition.findrefs.name"
id="org.eclipse.cdt.ui.search.findrefs"/>
<command
categoryId="org.eclipse.ui.category.navigate"
description="%ActionDefinition.openCallHierarchy.description"
name="%ActionDefinition.openCallHierarchy.name"
id="org.eclipse.cdt.ui.edit.open.call.hierarchy"/>
<!--command
name="%ActionDefinition.openTypeHierarchy.name"
description="%ActionDefinition.openTypeHierarchy.description"
@ -1118,6 +1128,15 @@
menubarPath="navigate/open.ext2"
tooltip="%OpenTypeAction.tooltip">
</action>
<action
definitionId="org.eclipse.cdt.ui.edit.open.call.hierarchy"
id="org.eclipse.cdt.ui.actions.OpenCallHierarchy"
label="%OpenCallHierarchy.label"
menubarPath="navigate/open.ext"
retarget="true"
toolbarPath="org.eclipse.search.searchActionSet/Search"
tooltip="%OpenCallHierarchy.tooltip">
</action>
<!--action
definitionId="org.eclipse.cdt.ui.edit.text.c.open.type.hierarchy"
label="%OpenTypeHierarchyAction.label"
@ -1585,4 +1604,4 @@
viewerId="org.eclipse.ui.navigator.ProjectExplorer"/>
</extension>
</plugin>
</plugin>

View file

@ -6,19 +6,22 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Rational Software - Initial API and implementation
* IBM Rational Software - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.corext.util;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.cdt.core.model.ICContainer;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ISourceRoot;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.internal.ui.util.EditorUtility;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
public class CModelUtil {
/**
@ -98,4 +101,17 @@ public class CModelUtil {
}
return false;
}
/**
* Returns the translation unit the element belongs to or <code>null</code> if it does not.
*/
public static ITranslationUnit getTranslationUnit(ICElement elem) {
while (elem != null) {
if (elem instanceof ITranslationUnit) {
return (ITranslationUnit) elem;
}
elem= elem.getParent();
}
return null;
}
}

View file

@ -20,8 +20,11 @@ import java.util.Map;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.text.Region;
import org.eclipse.swt.widgets.Display;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.IPositionConverter;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.model.CModelException;
@ -34,6 +37,8 @@ import org.eclipse.cdt.core.model.ISourceReference;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.corext.util.CModelUtil;
import org.eclipse.cdt.internal.ui.missingapi.CIndexQueries;
import org.eclipse.cdt.internal.ui.missingapi.CIndexQueries.IPDOMReference;
import org.eclipse.cdt.internal.ui.viewsupport.AsyncTreeContentProvider;
@ -61,10 +66,11 @@ public class CHContentProvider extends AsyncTreeContentProvider {
return super.getParent(element);
}
public Object[] syncronouslyComputeChildren(Object parentElement) {
protected Object[] syncronouslyComputeChildren(Object parentElement) {
if (parentElement instanceof ICElement) {
ICElement element = (ICElement) parentElement;
return new Object[] { new CHNode(null, null, element, 0) };
ITranslationUnit tu= CModelUtil.getTranslationUnit(element);
return new Object[] { new CHNode(null, tu, 0, element) };
}
if (parentElement instanceof CHNode) {
CHNode node = (CHNode) parentElement;
@ -79,7 +85,7 @@ public class CHContentProvider extends AsyncTreeContentProvider {
return null;
}
public Object[] asyncronouslyComputeChildren(Object parentElement,
protected Object[] asyncronouslyComputeChildren(Object parentElement,
IProgressMonitor monitor) {
if (parentElement instanceof CHNode) {
CHNode node = (CHNode) parentElement;
@ -96,50 +102,41 @@ public class CHContentProvider extends AsyncTreeContentProvider {
return NO_CHILDREN;
}
private Object[] asyncronouslyComputeReferencedBy(CHNode parent, ICElement elem) {
try {
if (elem instanceof ISourceReference) {
ISourceReference sf= (ISourceReference) elem;
ISourceRange range = sf.getSourceRange();
ITranslationUnit tu = sf.getTranslationUnit();
if (tu != null) {
ILanguage language = tu.getLanguage();
IASTTranslationUnit ast = language.getASTTranslationUnit(tu, ILanguage.AST_SKIP_ALL_HEADERS | ILanguage.AST_USE_INDEX);
IASTName[] names = language.getSelectedNames(ast, range.getIdStartPos(), range.getIdLength());
if (names.length > 0) {
IASTName name= names[names.length-1];
IPDOMReference[] refs= CIndexQueries.getInstance().findReferences(tu, name, NPM);
HashMap refsPerElement= new HashMap();
for (int i = 0; i < refs.length; i++) {
IPDOMReference reference = refs[i];
ICElement caller= findCaller(reference);
if (caller != null) {
addToMap(caller, reference, refsPerElement);
}
}
ArrayList result= new ArrayList();
for (Iterator iter= refsPerElement.entrySet().iterator(); iter.hasNext(); ) {
Map.Entry entry= (Map.Entry) iter.next();
ICElement element= (ICElement) entry.getKey();
List references= (List) entry.getValue();
if (!references.isEmpty()) {
IPDOMReference firstRef= (IPDOMReference) references.get(0);
CHNode node= new CHNode(parent, new CHReferenceInfo(firstRef.getOffset()),
element, firstRef.getTimestamp());
Iterator iterator = references.iterator();
for (iterator.next(); iterator.hasNext(); ) {
IPDOMReference nextRef = (IPDOMReference) iterator.next();
node.addReference(new CHReferenceInfo(nextRef.getOffset()));
}
result.add(node);
}
}
return result.toArray();
}
private static IASTName toASTName(ICElement elem) throws CoreException {
if (elem instanceof ISourceReference) {
ISourceReference sf= (ISourceReference) elem;
ISourceRange range = sf.getSourceRange();
ITranslationUnit tu = sf.getTranslationUnit();
if (tu != null) {
ILanguage language = tu.getLanguage();
IASTTranslationUnit ast = language.getASTTranslationUnit(tu, ILanguage.AST_SKIP_ALL_HEADERS | ILanguage.AST_USE_INDEX);
IASTName[] names = language.getSelectedNames(ast, range.getIdStartPos(), range.getIdLength());
if (names.length > 0) {
return names[names.length-1];
}
}
} catch (CModelException e) {
CUIPlugin.getDefault().log(e);
}
return null;
}
private Object[] asyncronouslyComputeReferencedBy(CHNode parent, ICElement elem) {
try {
IASTName name = toASTName(elem);
if (name != null) {
IPDOMReference[] refs= CIndexQueries.getInstance().findReferences(name, NPM);
HashMap refsPerElement = sortPerElement(refs);
ArrayList result= new ArrayList();
for (Iterator iter= refsPerElement.entrySet().iterator(); iter.hasNext(); ) {
Map.Entry entry= (Map.Entry) iter.next();
ICElement element= (ICElement) entry.getKey();
List references= (List) entry.getValue();
if (!references.isEmpty()) {
CHNode node = createRefbyNode(parent, element, references);
result.add(node);
}
}
return result.toArray();
}
} catch (CoreException e) {
CUIPlugin.getDefault().log(e);
} catch (InterruptedException e) {
@ -147,13 +144,41 @@ public class CHContentProvider extends AsyncTreeContentProvider {
return NO_CHILDREN;
}
private CHNode createRefbyNode(CHNode parent, ICElement element, List references) {
IPDOMReference firstRef= (IPDOMReference) references.get(0);
ITranslationUnit tu= CModelUtil.getTranslationUnit(element);
CHNode node= new CHNode(parent, tu, firstRef.getTimestamp(), element);
for (Iterator iter = references.iterator(); iter.hasNext(); ) {
IPDOMReference nextRef = (IPDOMReference) iter.next();
node.addReference(new CHReferenceInfo(nextRef.getOffset(), nextRef.getLength()));
}
return node;
}
private HashMap sortPerElement(IPDOMReference[] refs) throws CoreException {
HashMap refsPerElement= new HashMap();
for (int i = 0; i < refs.length; i++) {
IPDOMReference reference = refs[i];
ICElement caller= findCaller(reference);
if (caller != null) {
addToMap(caller, reference, refsPerElement);
}
}
return refsPerElement;
}
private ICElement findCaller(IPDOMReference reference) throws CoreException {
ITranslationUnit tu= reference.getTranslationUnit();
return findCaller(tu, reference.getOffset());
long timestamp= reference.getTimestamp();
IPositionConverter pc= CCorePlugin.getPositionTrackerManager().findPositionConverter(tu.getPath(), timestamp);
int offset= reference.getOffset();
if (pc != null) {
offset= pc.historicToActual(new Region(offset, 0)).getOffset();
}
return findCaller(tu, offset);
}
private ICElement findCaller(ICElement element, int offset) throws CModelException {
// mstodo use position tracker
if (element == null || (element instanceof IFunctionDeclaration)) {
return element;
}

View file

@ -102,13 +102,6 @@ public class CHLabelProvider extends LabelProvider implements IColorProvider {
}
}
// if (node.getRepresentedTranslationUnit() == null) {
// flags |= CElementImageDescriptor.WARNING;
// }
if (flags == 0) {
return image;
}
String key= image.toString()+String.valueOf(flags);
Image result= (Image) fCachedImages.get(key);
if (result == null) {

View file

@ -15,8 +15,9 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.cdt.core.model.IMacro;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.IMacro;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IVariableDeclaration;
/**
@ -25,6 +26,7 @@ import org.eclipse.cdt.core.model.IVariableDeclaration;
public class CHNode {
private CHNode fParent;
private ICElement fRepresentedDecl;
private ITranslationUnit fFileOfReferences;
private List fReferences;
private int fHashCode;
@ -34,10 +36,11 @@ public class CHNode {
/**
* Creates a new node for the include browser
*/
public CHNode(CHNode parent, CHReferenceInfo reference, ICElement decl, long timestamp) {
public CHNode(CHNode parent, ITranslationUnit fileOfReferences, long timestamp, ICElement decl) {
assert decl != null;
fParent= parent;
fReferences= Collections.singletonList(reference);
fFileOfReferences= fileOfReferences;
fReferences= Collections.EMPTY_LIST;
fRepresentedDecl= decl;
fIsRecursive= computeIsRecursive(fParent, decl);
fHashCode= computeHashCode();
@ -121,9 +124,18 @@ public class CHNode {
}
public void addReference(CHReferenceInfo info) {
if (fReferences.size() == 1) {
switch (fReferences.size()) {
case 0:
fReferences= Collections.singletonList(info);
return;
case 1:
fReferences= new ArrayList(fReferences);
break;
}
fReferences.add(info);
}
public ITranslationUnit getFileOfReferences() {
return fFileOfReferences;
}
}

View file

@ -13,12 +13,18 @@ package org.eclipse.cdt.internal.ui.callhierarchy;
public class CHReferenceInfo {
private int fOffset;
private int fLength;
public CHReferenceInfo(int offset) {
public CHReferenceInfo(int offset, int length) {
fOffset= offset;
fLength= length;
}
public int getOffset() {
return fOffset;
}
public int getLength() {
return fLength;
}
}

View file

@ -13,6 +13,7 @@ package org.eclipse.cdt.internal.ui.callhierarchy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.action.Action;
@ -22,9 +23,11 @@ import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.text.Region;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.IOpenListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.OpenEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
@ -46,13 +49,14 @@ import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.part.PageBook;
import org.eclipse.ui.part.ShowInContext;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.ui.CUIPlugin;
@ -60,6 +64,7 @@ import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.ui.CPluginImages;
import org.eclipse.cdt.internal.ui.util.CoreUtility;
import org.eclipse.cdt.internal.ui.util.Messages;
import org.eclipse.cdt.internal.ui.viewsupport.EditorOpener;
import org.eclipse.cdt.internal.ui.viewsupport.ExtendedTreeViewer;
import org.eclipse.cdt.internal.ui.viewsupport.TreeNavigator;
import org.eclipse.cdt.internal.ui.viewsupport.WorkingSetFilterUI;
@ -76,7 +81,9 @@ public class CHViewPart extends ViewPart {
private IMemento fMemento;
private boolean fShowsMessage;
private CHNode fLastNavigationNode;
private CHNode fNavigationNode;
private int fNavigationDetail;
private ArrayList fHistoryEntries= new ArrayList(MAX_HISTORY_SIZE);
// widgets
@ -163,7 +170,7 @@ public class CHViewPart extends ViewPart {
initializeActionStates();
}
private void initializeActionStates() {
boolean referencedBy= true;
boolean filterVariables= false;
@ -228,8 +235,10 @@ public class CHViewPart extends ViewPart {
fTreeViewer.setLabelProvider(fLabelProvider);
fTreeViewer.setAutoExpandLevel(2);
fTreeViewer.addOpenListener(new IOpenListener() {
public void open(OpenEvent event) {
onShowReference(event.getSelection());
public void open(OpenEvent event) {
fNavigationDetail= 0;
fNavigationNode= selectionToNode(event.getSelection());
onShowReference();
}
});
}
@ -424,26 +433,39 @@ public class CHViewPart extends ViewPart {
mm.add(fFilterVariablesAction);
}
private CHNode getNextNode(boolean forward) {
private void setNextNode(boolean forward) {
TreeNavigator navigator= new TreeNavigator(fTreeViewer.getTree(), CHNode.class);
TreeItem selectedItem= navigator.getSelectedItemOrFirstOnLevel(1, forward);
if (selectedItem == null) {
return null;
fNavigationNode= null;
return;
}
if (selectedItem.getData().equals(fLastNavigationNode)) {
selectedItem= navigator.getNextSibbling(selectedItem, forward);
if (selectedItem.getData().equals(fNavigationNode)) {
if (forward && fNavigationDetail < fNavigationNode.getReferenceCount()-1) {
fNavigationDetail++;
}
else if (!forward && fNavigationDetail > 0) {
fNavigationDetail--;
}
else {
selectedItem= navigator.getNextSibbling(selectedItem, forward);
fNavigationNode= selectedItem == null ? null : (CHNode) selectedItem.getData();
if (fNavigationNode != null) {
fNavigationDetail= forward ? 0 : fNavigationNode.getReferenceCount()-1;
}
}
}
return selectedItem == null ? null : (CHNode) selectedItem.getData();
}
protected void onNextOrPrevious(boolean forward) {
CHNode nextItem= getNextNode(forward);
if (nextItem != null) {
StructuredSelection sel= new StructuredSelection(nextItem);
setNextNode(forward);
if (fNavigationNode != null) {
StructuredSelection sel= new StructuredSelection(fNavigationNode);
fTreeViewer.setSelection(sel);
onShowReference(sel);
onShowReference();
}
}
@ -577,77 +599,48 @@ public class CHViewPart extends ViewPart {
m.add(new Separator(IContextMenuConstants.GROUP_ADDITIONS));
}
protected void onShowReference(ISelection selection) {
// CHNode node= IBConversions.selectionToNode(selection);
// if (node != null) {
// IWorkbenchPage page= getSite().getPage();
// IBFile ibf= node.getDirectiveFile();
// long timestamp= node.getTimestamp();
// if (ibf != null) {
// IEditorPart editor= null;
// IPath filebufferKey= null;
// IFile f= ibf.getResource();
// if (f != null) {
// if (timestamp == 0) {
// timestamp= f.getLocalTimeStamp();
// }
// fLastNavigationNode= node;
// try {
// editor= IDE.openEditor(page, f, false);
// filebufferKey= f.getFullPath();
// } catch (PartInitException e) {
// CUIPlugin.getDefault().log(e);
// }
// }
// else {
// IPath location= ibf.getLocation();
// if (location != null) {
// if (timestamp == 0) {
// timestamp= location.toFile().lastModified();
// }
// fLastNavigationNode= node;
// ExternalEditorInput ei= new ExternalEditorInput(new FileStorage(null, location));
// try {
// IEditorDescriptor descriptor = IDE.getEditorDescriptor(location.lastSegment());
// editor= IDE.openEditor(page, ei, descriptor.getId(), false);
// filebufferKey= location;
// } catch (PartInitException e) {
// CUIPlugin.getDefault().log(e);
// }
// }
// }
// if (editor instanceof ITextEditor) {
// ITextEditor te= (ITextEditor) editor;
// Position pos= new Position(node.getDirectiveCharacterOffset(),
// node.getDirectiveName().length() + 2);
// if (filebufferKey != null) {
// IPositionConverter pc= CCorePlugin.getPositionTrackerManager().findPositionConverter(filebufferKey, timestamp);
// if (pc != null) {
// pos= pc.historicToActual(pos);
// }
// }
//
// te.selectAndReveal(pos.getOffset(), pos.getLength());
// }
// }
// else {
// ITranslationUnit tu= IBConversions.selectionToTU(selection);
// if (tu != null) {
// IResource r= tu.getResource();
// if (r != null) {
// OpenFileAction ofa= new OpenFileAction(page);
// ofa.selectionChanged((IStructuredSelection) selection);
// ofa.run();
// }
// }
// }
// }
}
protected void onShowReference() {
if (fNavigationNode != null) {
ITranslationUnit file= fNavigationNode.getFileOfReferences();
if (file != null) {
IWorkbenchPage page= getSite().getPage();
if (fNavigationNode.getReferenceCount() > 0) {
long timestamp= fNavigationNode.getTimestamp();
if (fNavigationDetail < 0) {
fNavigationDetail= 0;
}
else if (fNavigationDetail >= fNavigationNode.getReferenceCount()-1) {
fNavigationDetail= fNavigationNode.getReferenceCount()-1;
}
public ShowInContext getShowInContext() {
return new ShowInContext(null, fTreeViewer.getSelection());
CHReferenceInfo ref= fNavigationNode.getReference(fNavigationDetail);
Region region= new Region(ref.getOffset(), ref.getLength());
EditorOpener.open(page, file, region, timestamp);
}
else {
try {
EditorOpener.open(page, fNavigationNode.getRepresentedDeclaration());
} catch (CModelException e) {
CUIPlugin.getDefault().log(e);
}
}
}
}
}
private CHNode selectionToNode(ISelection selection) {
if (selection instanceof IStructuredSelection) {
IStructuredSelection ss= (IStructuredSelection) selection;
for (Iterator iter = ss.iterator(); iter.hasNext(); ) {
Object cand= iter.next();
if (cand instanceof CHNode) {
return (CHNode) cand;
}
}
}
return null;
}
public Control getPageBook() {
return fPagebook;
}

View file

@ -7,16 +7,10 @@
*
* Contributors:
* IBM Corporation - initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.cview;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.internal.ui.IContextMenuConstants;
import org.eclipse.cdt.internal.ui.actions.SelectionConverter;
import org.eclipse.cdt.internal.ui.editor.OpenIncludeAction;
import org.eclipse.cdt.internal.ui.search.actions.SelectionSearchGroup;
import org.eclipse.cdt.ui.actions.CustomFiltersActionGroup;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
@ -33,19 +27,27 @@ import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.actions.ActionContext;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.actions.AddBookmarkAction;
import org.eclipse.ui.actions.AddTaskAction;
import org.eclipse.ui.actions.ExportResourcesAction;
import org.eclipse.ui.actions.ImportResourcesAction;
import org.eclipse.ui.actions.NewWizardMenu;
import org.eclipse.ui.actions.WorkingSetFilterActionGroup;
import org.eclipse.ui.dialogs.PropertyDialogAction;
import org.eclipse.ui.ide.IDEActionFactory;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.refactoring.actions.CRefactoringActionGroup;
import org.eclipse.cdt.ui.actions.CustomFiltersActionGroup;
import org.eclipse.cdt.ui.actions.OpenViewActionGroup;
import org.eclipse.cdt.internal.ui.IContextMenuConstants;
import org.eclipse.cdt.internal.ui.actions.SelectionConverter;
import org.eclipse.cdt.internal.ui.editor.OpenIncludeAction;
import org.eclipse.cdt.internal.ui.search.actions.SelectionSearchGroup;
/**
* The main action group for the cview. This contains a few actions and several
* subgroups.
@ -55,7 +57,6 @@ public class MainActionGroup extends CViewActionGroup {
// Actions for Menu context.
AddBookmarkAction addBookmarkAction;
AddTaskAction addTaskAction;
PropertyDialogAction propertyDialogAction;
ImportResourcesAction importAction;
ExportResourcesAction exportAction;
@ -78,6 +79,9 @@ public class MainActionGroup extends CViewActionGroup {
SelectionSearchGroup selectionSearchGroup;
OpenViewActionGroup openViewActionGroup;
CRefactoringActionGroup crefactoringActionGroup;
private NewWizardMenu newWizardMenu;
public MainActionGroup(CView cview) {
@ -145,7 +149,6 @@ public class MainActionGroup extends CViewActionGroup {
addBookmarkAction = new AddBookmarkAction(shell);
addTaskAction = new AddTaskAction(shell);
propertyDialogAction = new PropertyDialogAction(shellProvider, viewer);
// Importing/exporting.
importAction = new ImportResourcesAction(getCView().getSite().getWorkbenchWindow());
@ -159,6 +162,8 @@ public class MainActionGroup extends CViewActionGroup {
// toggleLinkingAction.setHoverImageDescriptor(getImageDescriptor("clcl16/synced.gif"));//$NON-NLS-1$
selectionSearchGroup = new SelectionSearchGroup(getCView().getSite());
openViewActionGroup= new OpenViewActionGroup(getCView());
crefactoringActionGroup= new CRefactoringActionGroup(getCView());
}
/**
@ -180,34 +185,36 @@ public class MainActionGroup extends CViewActionGroup {
//Can be added once support for manually adding external files to index is established
/*menu.add(new Separator());
menu.add(addToIndexAction);*/
menu.add(new Separator(org.eclipse.search.ui.IContextMenuConstants.GROUP_SEARCH));
menu.add(new Separator(IContextMenuConstants.GROUP_SEARCH));
addSearchMenu(menu, celements);
menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS + "-end")); //$NON-NLS-1$
menu.add(new Separator(IContextMenuConstants.GROUP_ADDITIONS));
menu.add(new Separator(IContextMenuConstants.GROUP_ADDITIONS + "-end")); //$NON-NLS-1$
menu.add(new Separator());
return;
}
menu.add(new Separator());
menu.add(new Separator(IContextMenuConstants.GROUP_GOTO));
gotoGroup.fillContextMenu(menu);
menu.add(new Separator());
menu.add(new Separator(IContextMenuConstants.GROUP_OPEN));
openFileGroup.fillContextMenu(menu);
menu.add(new Separator());
menu.add(new Separator(IContextMenuConstants.GROUP_BUILD));
buildGroup.fillContextMenu(menu);
menu.add(new Separator());
menu.add(new Separator(IContextMenuConstants.GROUP_REORGANIZE));
refactorGroup.fillContextMenu(menu);
menu.add(new Separator());
menu.add(new Separator("group.private1")); //$NON-NLS-1$
importAction.selectionChanged(resources);
menu.add(importAction);
exportAction.selectionChanged(resources);
menu.add(exportAction);
menu.add(new Separator());
menu.add(new Separator("group.private2")); //$NON-NLS-1$
openProjectGroup.fillContextMenu(menu);
addBookMarkMenu(menu, resources);
menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS + "-end")); //$NON-NLS-1$
addPropertyMenu(menu, resources);
menu.add(new Separator(IContextMenuConstants.GROUP_ADDITIONS));
menu.add(new Separator(IContextMenuConstants.GROUP_ADDITIONS + "-end")); //$NON-NLS-1$
menu.add(new Separator(IContextMenuConstants.GROUP_PROPERTIES));
openViewActionGroup.fillContextMenu(menu);
crefactoringActionGroup.fillContextMenu(menu);
}
/**
* Extends the superclass implementation to set the context in the
@ -220,6 +227,8 @@ public class MainActionGroup extends CViewActionGroup {
openProjectGroup.setContext(context);
refactorGroup.setContext(context);
buildGroup.setContext(context);
openViewActionGroup.setContext(context);
crefactoringActionGroup.setContext(context);
//sortAndFilterGroup.setContext(context);
//workspaceGroup.setContext(context);
}
@ -242,13 +251,6 @@ public class MainActionGroup extends CViewActionGroup {
}
}
void addPropertyMenu(IMenuManager menu, IStructuredSelection selection) {
propertyDialogAction.selectionChanged(selection);
if (propertyDialogAction.isApplicableForSelection()) {
menu.add(propertyDialogAction);
}
}
void addSearchMenu(IMenuManager menu, IStructuredSelection selection) {
IAdaptable element = (IAdaptable) selection.getFirstElement();
@ -279,7 +281,6 @@ public class MainActionGroup extends CViewActionGroup {
public void updateActionBars() {
IStructuredSelection selection = (IStructuredSelection) getContext().getSelection();
propertyDialogAction.setEnabled(selection.size() == 1);
//sortByTypeAction.selectionChanged(selection);
//sortByNameAction.selectionChanged(selection);
addBookmarkAction.selectionChanged(selection);
@ -292,12 +293,14 @@ public class MainActionGroup extends CViewActionGroup {
refactorGroup.updateActionBars();
workingSetGroup.updateActionBars();
fCustomFiltersActionGroup.updateActionBars();
openViewActionGroup.updateActionBars();
crefactoringActionGroup.updateActionBars();
}
public void fillActionBars(IActionBars actionBars) {
actionBars.setGlobalActionHandler(IDEActionFactory.BOOKMARK.getId(), addBookmarkAction);
actionBars.setGlobalActionHandler(IDEActionFactory.ADD_TASK.getId(), addTaskAction);
actionBars.setGlobalActionHandler(ActionFactory.PROPERTIES.getId(), propertyDialogAction);
workingSetGroup.fillActionBars(actionBars);
fCustomFiltersActionGroup.fillActionBars(actionBars);
@ -307,6 +310,9 @@ public class MainActionGroup extends CViewActionGroup {
openProjectGroup.fillActionBars(actionBars);
buildGroup.fillActionBars(actionBars);
openViewActionGroup.fillActionBars(actionBars);
crefactoringActionGroup.fillActionBars(actionBars);
IToolBarManager toolBar = actionBars.getToolBarManager();
toolBar.add(new Separator());
toolBar.add(collapseAllAction);
@ -343,6 +349,8 @@ public class MainActionGroup extends CViewActionGroup {
gotoGroup.dispose();
buildGroup.dispose();
newWizardMenu.dispose();
openViewActionGroup.dispose();
crefactoringActionGroup.dispose();
super.dispose();
}

View file

@ -14,30 +14,32 @@ package org.eclipse.cdt.internal.ui.editor;
import java.util.ArrayList;
import java.util.Iterator;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.internal.ui.CPluginImages;
import org.eclipse.cdt.internal.ui.ICHelpContextIds;
import org.eclipse.cdt.internal.ui.actions.AbstractToggleLinkingAction;
import org.eclipse.cdt.internal.ui.actions.ActionMessages;
import org.eclipse.cdt.internal.ui.cview.SelectionTransferDragAdapter;
import org.eclipse.cdt.internal.ui.cview.SelectionTransferDropAdapter;
import org.eclipse.cdt.internal.ui.dnd.*;
import org.eclipse.cdt.internal.ui.search.actions.SelectionSearchGroup;
import org.eclipse.cdt.internal.ui.util.ProblemTreeViewer;
import org.eclipse.cdt.internal.ui.viewsupport.DecoratingCLabelProvider;
import org.eclipse.cdt.internal.ui.viewsupport.StandardCElementLabelProvider;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.PreferenceConstants;
import org.eclipse.cdt.ui.actions.*;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.jface.action.*;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.*;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionContext;
import org.eclipse.ui.actions.ActionGroup;
import org.eclipse.ui.part.IPageSite;
@ -46,6 +48,31 @@ import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
import org.eclipse.ui.views.navigator.LocalSelectionTransfer;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.refactoring.actions.CRefactoringActionGroup;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.PreferenceConstants;
import org.eclipse.cdt.ui.actions.CustomFiltersActionGroup;
import org.eclipse.cdt.ui.actions.MemberFilterActionGroup;
import org.eclipse.cdt.ui.actions.OpenViewActionGroup;
import org.eclipse.cdt.internal.ui.CPluginImages;
import org.eclipse.cdt.internal.ui.ICHelpContextIds;
import org.eclipse.cdt.internal.ui.IContextMenuConstants;
import org.eclipse.cdt.internal.ui.actions.AbstractToggleLinkingAction;
import org.eclipse.cdt.internal.ui.actions.ActionMessages;
import org.eclipse.cdt.internal.ui.cview.SelectionTransferDragAdapter;
import org.eclipse.cdt.internal.ui.cview.SelectionTransferDropAdapter;
import org.eclipse.cdt.internal.ui.dnd.CDTViewerDragAdapter;
import org.eclipse.cdt.internal.ui.dnd.DelegatingDropAdapter;
import org.eclipse.cdt.internal.ui.dnd.TransferDragSourceListener;
import org.eclipse.cdt.internal.ui.dnd.TransferDropTargetListener;
import org.eclipse.cdt.internal.ui.search.actions.SelectionSearchGroup;
import org.eclipse.cdt.internal.ui.util.ProblemTreeViewer;
import org.eclipse.cdt.internal.ui.viewsupport.DecoratingCLabelProvider;
import org.eclipse.cdt.internal.ui.viewsupport.StandardCElementLabelProvider;
public class CContentOutlinePage extends Page implements IContentOutlinePage, ISelectionChangedListener {
private CEditor fEditor;
private ITranslationUnit fInput;
@ -62,6 +89,8 @@ public class CContentOutlinePage extends Page implements IContentOutlinePage, IS
private ActionGroup fSelectionSearchGroup;
private ActionGroup fOpenViewActionGroup;
private ActionGroup fRefactoringActionGroup;
/**
* Custom filter action group.
* @since 3.0
@ -203,24 +232,23 @@ public class CContentOutlinePage extends Page implements IContentOutlinePage, IS
protected void contextMenuAboutToShow(IMenuManager menu) {
CUIPlugin.createStandardGroups(menu);
if (OpenViewActionGroup.canActionBeAdded(getSelection())){
fOpenViewActionGroup.setContext(new ActionContext(getSite().getSelectionProvider().getSelection()));
ISelection selection= getSelection();
if (OpenViewActionGroup.canActionBeAdded(selection)){
fOpenViewActionGroup.setContext(new ActionContext(selection));
fOpenViewActionGroup.fillContextMenu(menu);
fOpenViewActionGroup.setContext(null);
menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
if (OpenIncludeAction.canActionBeAdded(getSelection())) {
menu.add(fOpenIncludeAction);
if (OpenIncludeAction.canActionBeAdded(selection)) {
menu.appendToGroup(IContextMenuConstants.GROUP_OPEN, fOpenIncludeAction);
}
menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS+"-end"));//$NON-NLS-1$
if (SelectionSearchGroup.canActionBeAdded(getSelection())){
if (SelectionSearchGroup.canActionBeAdded(selection)){
fSelectionSearchGroup.fillContextMenu(menu);
menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
fRefactoringActionGroup.fillContextMenu(menu);
}
protected CContentOutlinerProvider createContentProvider(TreeViewer viewer) {
@ -279,6 +307,7 @@ public class CContentOutlinePage extends Page implements IContentOutlinePage, IS
fSelectionSearchGroup = new SelectionSearchGroup(this);
fOpenViewActionGroup = new OpenViewActionGroup(this);
fRefactoringActionGroup= new CRefactoringActionGroup(this);
// Custom filter group
fCustomFiltersActionGroup= new CustomFiltersActionGroup("org.eclipse.cdt.ui.COutlinePage", getTreeViewer()); //$NON-NLS-1$
@ -308,7 +337,12 @@ public class CContentOutlinePage extends Page implements IContentOutlinePage, IS
fOpenViewActionGroup.dispose();
fOpenViewActionGroup= null;
}
if (fRefactoringActionGroup != null) {
fRefactoringActionGroup.dispose();
fRefactoringActionGroup= null;
}
if (fSelectionSearchGroup != null) {
fSelectionSearchGroup.dispose();
fSelectionSearchGroup= null;
@ -342,8 +376,9 @@ public class CContentOutlinePage extends Page implements IContentOutlinePage, IS
fMemberFilterActionGroup= new MemberFilterActionGroup(fTreeViewer, "COutlineViewer"); //$NON-NLS-1$
fMemberFilterActionGroup.fillActionBars(actionBars);
fCustomFiltersActionGroup.fillActionBars(actionBars);
fOpenViewActionGroup.fillActionBars(actionBars);
fRefactoringActionGroup.fillActionBars(actionBars);
IMenuManager menu= actionBars.getMenuManager();
menu.add(new Separator("EndFilterGroup")); //$NON-NLS-1$
@ -375,6 +410,8 @@ public class CContentOutlinePage extends Page implements IContentOutlinePage, IS
for (int i = 0; i < listeners.length; ++i) {
((ISelectionChangedListener) listeners[i]).selectionChanged(event);
}
fRefactoringActionGroup.setContext(new ActionContext(selection));
fRefactoringActionGroup.updateActionBars();
}
/* (non-Javadoc)

View file

@ -124,6 +124,7 @@ import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ISourceRange;
import org.eclipse.cdt.core.model.ISourceReference;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.refactoring.actions.CRefactoringActionGroup;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.IWorkingCopyManager;
import org.eclipse.cdt.ui.PreferenceConstants;
@ -502,6 +503,8 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IS
/** Search actions **/
private ActionGroup fSelectionSearchGroup;
private ActionGroup fTextSearchGroup;
private CRefactoringActionGroup fRefactoringActionGroup;
/** Action which shows selected element in CView. */
private ShowInCViewAction fShowInCViewAction;
@ -953,6 +956,11 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IS
fTextSearchGroup = null;
}
if (fRefactoringActionGroup != null) {
fRefactoringActionGroup.dispose();
fRefactoringActionGroup = null;
}
if (fEditorSelectionChangedListener != null) {
fEditorSelectionChangedListener.uninstall(getSelectionProvider());
fEditorSelectionChangedListener= null;
@ -1091,6 +1099,7 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IS
//Assorted action groupings
fSelectionSearchGroup = new SelectionSearchGroup(this);
fTextSearchGroup= new TextSearchGroup(this);
fRefactoringActionGroup= new CRefactoringActionGroup(this);
}
/**
@ -1123,6 +1132,7 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IS
fSelectionSearchGroup.fillContextMenu(menu);
fTextSearchGroup.fillContextMenu(menu);
fRefactoringActionGroup.fillContextMenu(menu);
}
/**

View file

@ -46,7 +46,7 @@ public class IBContentProvider extends AsyncTreeContentProvider {
return super.getParent(element);
}
public Object[] syncronouslyComputeChildren(Object parentElement) {
protected Object[] syncronouslyComputeChildren(Object parentElement) {
if (parentElement instanceof ITranslationUnit) {
ITranslationUnit tu = (ITranslationUnit) parentElement;
return new Object[] { new IBNode(null, new IBFile(tu), null, null, 0, 0) };
@ -61,7 +61,7 @@ public class IBContentProvider extends AsyncTreeContentProvider {
return null;
}
public Object[] asyncronouslyComputeChildren(Object parentElement,
protected Object[] asyncronouslyComputeChildren(Object parentElement,
IProgressMonitor monitor) {
if (parentElement instanceof IBNode) {
IBNode node = (IBNode) parentElement;

View file

@ -51,8 +51,6 @@ import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.IViewSite;
@ -62,7 +60,6 @@ import org.eclipse.ui.PartInitException;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.actions.ContributionItemFactory;
import org.eclipse.ui.actions.OpenFileAction;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.part.IShowInSource;
import org.eclipse.ui.part.IShowInTarget;
import org.eclipse.ui.part.IShowInTargetList;
@ -70,21 +67,17 @@ import org.eclipse.ui.part.PageBook;
import org.eclipse.ui.part.ResourceTransfer;
import org.eclipse.ui.part.ShowInContext;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.IPositionConverter;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.resources.FileStorage;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.ui.CPluginImages;
import org.eclipse.cdt.internal.ui.util.ExternalEditorInput;
import org.eclipse.cdt.internal.ui.util.Messages;
import org.eclipse.cdt.internal.ui.viewsupport.EditorOpener;
import org.eclipse.cdt.internal.ui.viewsupport.ExtendedTreeViewer;
import org.eclipse.cdt.internal.ui.viewsupport.TreeNavigator;
import org.eclipse.cdt.internal.ui.viewsupport.WorkingSetFilterUI;
@ -661,55 +654,24 @@ public class IBViewPart extends ViewPart
protected void onShowInclude(ISelection selection) {
IBNode node= IBConversions.selectionToNode(selection);
if (node != null) {
fLastNavigationNode= node;
IWorkbenchPage page= getSite().getPage();
IBFile ibf= node.getDirectiveFile();
long timestamp= node.getTimestamp();
IBFile ibf= node.getDirectiveFile();
if (ibf != null) {
IEditorPart editor= null;
IPath filebufferKey= null;
IRegion region= new Region(node.getDirectiveCharacterOffset(), node.getDirectiveName().length() + 2);
long timestamp= node.getTimestamp();
IFile f= ibf.getResource();
if (f != null) {
if (timestamp == 0) {
timestamp= f.getLocalTimeStamp();
}
fLastNavigationNode= node;
try {
editor= IDE.openEditor(page, f, false);
filebufferKey= f.getFullPath();
} catch (PartInitException e) {
CUIPlugin.getDefault().log(e);
}
EditorOpener.open(page, f, region, timestamp);
}
else {
IPath location= ibf.getLocation();
if (location != null) {
if (timestamp == 0) {
timestamp= location.toFile().lastModified();
}
fLastNavigationNode= node;
ExternalEditorInput ei= new ExternalEditorInput(new FileStorage(null, location));
try {
IEditorDescriptor descriptor = IDE.getEditorDescriptor(location.lastSegment());
editor= IDE.openEditor(page, ei, descriptor.getId(), false);
filebufferKey= location;
} catch (PartInitException e) {
CUIPlugin.getDefault().log(e);
}
EditorOpener.openExternalFile(page, location, region, timestamp);
}
}
if (editor instanceof ITextEditor) {
ITextEditor te= (ITextEditor) editor;
IRegion pos= new Region(node.getDirectiveCharacterOffset(),
node.getDirectiveName().length() + 2);
if (filebufferKey != null) {
IPositionConverter pc= CCorePlugin.getPositionTrackerManager().findPositionConverter(filebufferKey, timestamp);
if (pc != null) {
pos= pc.historicToActual(pos);
}
}
te.selectAndReveal(pos.getOffset(), pos.getLength());
}
}
else {
ITranslationUnit tu= IBConversions.selectionToTU(selection);

View file

@ -84,6 +84,9 @@ public class CIndexQueries {
public long getTimestamp() {
return 0;
}
public int getLength() {
return fName.getFileLocation().getNodeLength();
}
}
private static final IPDOMInclude[] EMPTY_INCLUDES = new IPDOMInclude[0];
@ -118,7 +121,7 @@ public class CIndexQueries {
ICProject cproject= tu.getCProject();
if (cproject != null) {
projects.remove(cproject);
projects.addFirst(cproject);
projects.addLast(cproject);
}
for (Iterator iter = projects.iterator(); iter.hasNext();) {
@ -181,38 +184,36 @@ public class CIndexQueries {
return EMPTY_INCLUDES;
}
public IPDOMReference[] findReferences(ITranslationUnit tu, IASTName name, IProgressMonitor pm) throws CoreException, InterruptedException {
public IPDOMReference[] findReferences(IASTName name, IProgressMonitor pm) throws CoreException, InterruptedException {
ArrayList result= new ArrayList();
LinkedList projects= new LinkedList(Arrays.asList(CoreModel.getDefault().getCModel().getCProjects()));
ICProject cproject= tu.getCProject();
if (cproject != null) {
projects.remove(cproject);
projects.addFirst(cproject);
}
// resolve the binding.
name.resolveBinding();
for (Iterator iter = projects.iterator(); iter.hasNext();) {
cproject = (ICProject) iter.next();
PDOM pdom= (PDOM) CCorePlugin.getPDOMManager().getPDOM(cproject);
if (pdom != null) {
pdom.acquireReadLock();
try {
IBinding binding= pdom.resolveBinding(name);
if (binding != null) {
IASTName[] names= pdom.getReferences(binding);
for (int i = 0; i < names.length; i++) {
IASTName rname = names[i];
if (tu != null) {
result.add(new IPDOMReference(cproject, rname));
}
}
}
}
finally {
pdom.releaseReadLock();
}
}
findReferences(name, (ICProject) iter.next(), result);
}
return (IPDOMReference[]) result.toArray(new IPDOMReference[result.size()]);
}
private void findReferences(IASTName name, ICProject project, Collection result) throws InterruptedException, CoreException {
PDOM pdom= (PDOM) CCorePlugin.getPDOMManager().getPDOM(project);
if (pdom != null) {
pdom.acquireReadLock();
try {
IBinding binding= pdom.resolveBinding(name);
if (binding != null) {
IASTName[] names= pdom.getReferences(binding);
for (int i = 0; i < names.length; i++) {
IASTName rname = names[i];
result.add(new IPDOMReference(project, rname));
}
}
}
finally {
pdom.releaseReadLock();
}
}
}
}

View file

@ -80,7 +80,7 @@ public abstract class AsyncTreeContentProvider implements ITreeContentProvider {
* @param parentElement the parent element
* @return an array of child elements, or <code>null</code>
*/
public Object[] syncronouslyComputeChildren(Object parentElement) {
protected Object[] syncronouslyComputeChildren(Object parentElement) {
return null;
}
@ -96,7 +96,7 @@ public abstract class AsyncTreeContentProvider implements ITreeContentProvider {
* @param monitor the monitor that can be checked for a cancel event.
* @return an array of child elements.
*/
public Object[] asyncronouslyComputeChildren(Object parentElement, IProgressMonitor monitor) {
protected Object[] asyncronouslyComputeChildren(Object parentElement, IProgressMonitor monitor) {
return NO_CHILDREN;
}

View file

@ -0,0 +1,123 @@
/*******************************************************************************
* Copyright (c) 2006 Wind River Systems, Inc. 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:
* Markus Schorn - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.ui.viewsupport;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.Region;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.IPositionConverter;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ISourceRange;
import org.eclipse.cdt.core.model.ISourceReference;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.resources.FileStorage;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.ui.util.ExternalEditorInput;
/**
* An utility to open editors for references or elements.
* @author markus.schorn@windriver.com
*/
public class EditorOpener {
/**
* Opens the editor selecting the given region.
*/
public static void open(IWorkbenchPage page, IFile file, IRegion region, long timestamp) {
IEditorPart editor= null;
if (timestamp == 0) {
timestamp= file.getLocalTimeStamp();
}
try {
editor= IDE.openEditor(page, file, false);
} catch (PartInitException e) {
CUIPlugin.getDefault().log(e);
}
selectRegion(file.getFullPath(), region, timestamp, editor);
}
private static void selectRegion(IPath filebufferKey, IRegion region, long timestamp, IEditorPart editor) {
if (editor instanceof ITextEditor) {
ITextEditor te= (ITextEditor) editor;
IPositionConverter pc= CCorePlugin.getPositionTrackerManager().findPositionConverter(filebufferKey, timestamp);
if (pc != null) {
region= pc.historicToActual(region);
}
te.selectAndReveal(region.getOffset(), region.getLength());
}
}
/**
* Opens the editor for an external location, selecting the given region.
*/
public static void openExternalFile(IWorkbenchPage page, IPath location, IRegion region, long timestamp) {
IEditorPart editor= null;
if (timestamp == 0) {
timestamp= location.toFile().lastModified();
}
ExternalEditorInput ei= new ExternalEditorInput(new FileStorage(null, location));
try {
IEditorDescriptor descriptor = IDE.getEditorDescriptor(location.lastSegment());
editor= IDE.openEditor(page, ei, descriptor.getId(), false);
} catch (PartInitException e) {
CUIPlugin.getDefault().log(e);
}
selectRegion(location, region, timestamp, editor);
}
/**
* Opens the editor for an ICElement, selecting the id.
* @throws CModelException
*/
public static void open(IWorkbenchPage page, ICElement element) throws CModelException {
if (element instanceof ISourceReference) {
ISourceReference sr= (ISourceReference) element;
ITranslationUnit tu= sr.getTranslationUnit();
ISourceRange range= sr.getSourceRange();
long timestamp= 0; // last modified of file.
if (tu.isWorkingCopy()) {
timestamp= -1;
}
open(page, tu, new Region(range.getIdStartPos(), range.getIdLength()), timestamp);
}
}
/**
* Opens the editor for an ICElement, selecting the given region.
*/
public static void open(IWorkbenchPage page, ITranslationUnit tu, Region region, long timestamp) {
if (tu != null) {
IResource r= tu.getResource();
if (r instanceof IFile) {
EditorOpener.open(page, (IFile) r, region, timestamp);
}
else {
IPath location= tu.getPath();
if (location != null) {
EditorOpener.openExternalFile(page, location, region, timestamp);
}
}
}
}
}

View file

@ -91,11 +91,22 @@ public class TreeNavigator {
*/
public TreeItem getNextSibbling(TreeItem current, boolean forward) {
TreeItem parentItem= current.getParentItem();
int itemCount = parentItem.getItemCount();
if (parentItem != null && itemCount > 1) {
int index= parentItem.indexOf(current);
index = (index + (forward ? 1 : itemCount-1)) % itemCount;
return parentItem.getItem(index);
if (parentItem == null) {
Tree tree= current.getParent();
int itemCount = tree.getItemCount();
if (itemCount > 0) {
int index= tree.indexOf(current);
index = (index + (forward ? 1 : itemCount-1)) % itemCount;
return tree.getItem(index);
}
}
else {
int itemCount = parentItem.getItemCount();
if (itemCount > 0) {
int index= parentItem.indexOf(current);
index = (index + (forward ? 1 : itemCount-1)) % itemCount;
return parentItem.getItem(index);
}
}
return null;
}

View file

@ -21,6 +21,7 @@ import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchSite;
import org.eclipse.ui.actions.ActionContext;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.actions.ActionGroup;
import org.eclipse.ui.dialogs.PropertyDialogAction;
@ -181,6 +182,7 @@ public class OpenViewActionGroup extends ActionGroup {
// provider.removeSelectionChangedListener(fOpenExternalJavadoc);
// provider.removeSelectionChangedListener(fOpenTypeHierarchy);
provider.removeSelectionChangedListener(fOpenCallHierarchy);
fOpenPropertiesDialog.dispose();
super.dispose();
}
@ -188,14 +190,17 @@ public class OpenViewActionGroup extends ActionGroup {
// actionBars.setGlobalActionHandler(JdtActionConstants.OPEN_SUPER_IMPLEMENTATION, fOpenSuperImplementation);
// actionBars.setGlobalActionHandler(JdtActionConstants.OPEN_EXTERNAL_JAVA_DOC, fOpenExternalJavadoc);
// actionBars.setGlobalActionHandler(CdtActionConstants.OPEN_TYPE_HIERARCHY, fOpenTypeHierarchy);
// actionBars.setGlobalActionHandler(JdtActionConstants.OPEN_CALL_HIERARCHY, fOpenCallHierarchy);
actionBars.setGlobalActionHandler(CdtActionConstants.OPEN_CALL_HIERARCHY, fOpenCallHierarchy);
actionBars.setGlobalActionHandler(ActionFactory.PROPERTIES.getId(), fOpenPropertiesDialog);
}
private IStructuredSelection getStructuredSelection() {
ISelection selection= getContext().getSelection();
if (selection instanceof IStructuredSelection)
return (IStructuredSelection)selection;
ActionContext context= getContext();
if (context != null) {
ISelection selection= getContext().getSelection();
if (selection instanceof IStructuredSelection)
return (IStructuredSelection)selection;
}
return null;
}