1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-01 06:05:24 +02:00

Call Hierarchy: added context menu

This commit is contained in:
Markus Schorn 2006-08-22 09:33:33 +00:00
parent 8cdf94585a
commit 5c2049ef4f
7 changed files with 226 additions and 50 deletions

View file

@ -26,6 +26,8 @@ public class CHMessages extends NLS {
public static String CHViewPart_HideMacros_tooltip;
public static String CHViewPart_NextReference_label;
public static String CHViewPart_NextReference_tooltip;
public static String CHViewPart_Open_label;
public static String CHViewPart_Open_tooltip;
public static String CHViewPart_OpenReference_label;
public static String CHViewPart_PreviousReference_label;
public static String CHViewPart_PreviousReference_tooltip;
@ -37,6 +39,8 @@ public class CHMessages extends NLS {
public static String CHViewPart_ShowCallers_tooltip;
public static String CHViewPart_ShowFiles_label;
public static String CHViewPart_ShowFiles_tooltip;
public static String CHViewPart_ShowReference_label;
public static String CHViewPart_ShowReference_tooltip;
public static String CHViewPart_Title_callees;
public static String CHViewPart_Title_callers;
public static String CHViewPart_WorkspaceScope;

View file

@ -3,6 +3,8 @@ CHViewPart_ShowCallers_label=Show Callers
CHViewPart_ShowCallers_tooltip=Show Callers
CHViewPart_ShowCallees_label=Show Callees
CHViewPart_ShowCallees_tooltip=Show Callees
CHViewPart_ShowReference_label=Show Reference
CHViewPart_ShowReference_tooltip=Show Reference
CHViewPart_FilterVariables_label=Filter Variables
CHViewPart_FilterVariables_tooltip=Hide Variables, Constents and Enumerators
CHViewPart_HideMacros_label=Hide Macros
@ -19,6 +21,8 @@ CHViewPart_Refresh_tooltip=Refresh View Content
CHViewPart_WorkspaceScope=workspace
CHViewPart_Title_callers=Callers of {0} - in {1}
CHViewPart_Title_callees=Calls made by {0} - in {1}
CHViewPart_Open_label=Open
CHViewPart_Open_tooltip=Open
CHViewPart_OpenReference_label=Open Reference
CHHistoryDropDownAction_ClearHistory_label=Clear History
CHHistoryListAction_HistoryDialog_title=Call Hierarchy History

View file

@ -15,6 +15,8 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.IMacro;
import org.eclipse.cdt.core.model.ITranslationUnit;
@ -23,7 +25,7 @@ import org.eclipse.cdt.core.model.IVariableDeclaration;
/**
* Represents a node in the include browser
*/
public class CHNode {
public class CHNode implements IAdaptable {
private CHNode fParent;
private ICElement fRepresentedDecl;
private ITranslationUnit fFileOfReferences;
@ -138,4 +140,11 @@ public class CHNode {
public ITranslationUnit getFileOfReferences() {
return fFileOfReferences;
}
public Object getAdapter(Class adapter) {
if (adapter.isAssignableFrom(ICElement.class)) {
return getRepresentedDeclaration();
}
return null;
}
}

View file

@ -33,7 +33,6 @@ import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.search.ui.IContextMenuConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTarget;
@ -59,11 +58,16 @@ 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.refactoring.actions.CRefactoringActionGroup;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.actions.OpenViewActionGroup;
import org.eclipse.cdt.internal.ui.CPluginImages;
import org.eclipse.cdt.internal.ui.IContextMenuConstants;
import org.eclipse.cdt.internal.ui.search.actions.SelectionSearchGroup;
import org.eclipse.cdt.internal.ui.util.CoreUtility;
import org.eclipse.cdt.internal.ui.util.Messages;
import org.eclipse.cdt.internal.ui.viewsupport.AdaptingSelectionProvider;
import org.eclipse.cdt.internal.ui.viewsupport.EditorOpener;
import org.eclipse.cdt.internal.ui.viewsupport.ExtendedTreeViewer;
import org.eclipse.cdt.internal.ui.viewsupport.TreeNavigator;
@ -114,6 +118,13 @@ public class CHViewPart extends ViewPart {
private Action fPreviousAction;
private Action fRefreshAction;
private Action fHistoryAction;
private Action fShowReference;
// action groups
private OpenViewActionGroup fOpenViewActionGroup;
private SelectionSearchGroup fSelectionSearchGroup;
private CRefactoringActionGroup fRefactoringActionGroup;
private Action fOpenElement;
public void setFocus() {
@ -161,16 +172,33 @@ public class CHViewPart extends ViewPart {
createInfoPage();
createViewerPage();
getSite().setSelectionProvider(new AdaptingSelectionProvider(ICElement.class, fTreeViewer));
initDragAndDrop();
createActions();
createContextMenu();
getSite().setSelectionProvider(fTreeViewer);
setMessage(CHMessages.CHViewPart_emptyPageMessage);
initializeActionStates();
}
public void dispose() {
if (fOpenViewActionGroup != null) {
fOpenViewActionGroup.dispose();
fOpenViewActionGroup= null;
}
if (fSelectionSearchGroup != null) {
fSelectionSearchGroup.dispose();
fSelectionSearchGroup= null;
}
if (fRefactoringActionGroup != null) {
fRefactoringActionGroup.dispose();
fRefactoringActionGroup= null;
}
super.dispose();
}
private void initializeActionStates() {
boolean referencedBy= true;
boolean filterVariables= false;
@ -218,7 +246,7 @@ public class CHViewPart extends ViewPart {
Menu menu = manager.createContextMenu(fTreeViewer.getControl());
fTreeViewer.getControl().setMenu(menu);
IWorkbenchPartSite site = getSite();
site.registerContextMenu(CUIPlugin.ID_CALL_HIERARCHY, manager, fTreeViewer);
site.registerContextMenu(CUIPlugin.ID_CALL_HIERARCHY, manager, fTreeViewer);
}
private void createViewerPage() {
@ -236,9 +264,7 @@ public class CHViewPart extends ViewPart {
fTreeViewer.setAutoExpandLevel(2);
fTreeViewer.addOpenListener(new IOpenListener() {
public void open(OpenEvent event) {
fNavigationDetail= 0;
fNavigationNode= selectionToNode(event.getSelection());
onShowReference();
onShowSelectedReference(event.getSelection());
}
});
}
@ -263,6 +289,11 @@ public class CHViewPart extends ViewPart {
}
private void createActions() {
// action gruops
fOpenViewActionGroup= new OpenViewActionGroup(this);
fSelectionSearchGroup= new SelectionSearchGroup(getSite());
fRefactoringActionGroup= new CRefactoringActionGroup(this);
WorkingSetFilterUI wsFilterUI= new WorkingSetFilterUI(this, fMemento, KEY_WORKING_SET_FILTER) {
protected void onWorkingSetChange() {
updateWorkingSetFilter(this);
@ -364,6 +395,19 @@ public class CHViewPart extends ViewPart {
}
};
fShowReference= new Action(CHMessages.CHViewPart_ShowReference_label) {
public void run() {
onShowSelectedReference(fTreeViewer.getSelection());
}
};
fShowReference.setToolTipText(CHMessages.CHViewPart_ShowReference_tooltip);
fOpenElement= new Action(CHMessages.CHViewPart_Open_label) {
public void run() {
onOpenElement(fTreeViewer.getSelection());
}
};
fOpenElement.setToolTipText(CHMessages.CHViewPart_Open_tooltip);
fShowFilesInLabelsAction= new Action(CHMessages.CHViewPart_ShowFiles_label, IAction.AS_CHECK_BOX) {
public void run() {
onShowFilesInLabels(isChecked());
@ -457,15 +501,44 @@ public class CHViewPart extends ViewPart {
}
}
}
else {
fNavigationNode= (CHNode) selectedItem.getData();
if (!forward && fNavigationNode != null) {
fNavigationDetail= Math.max(0, fNavigationNode.getReferenceCount()-1);
}
else {
fNavigationDetail= 0;
}
}
}
protected void onShowSelectedReference(ISelection selection) {
fNavigationDetail= 0;
fNavigationNode= selectionToNode(selection);
showReference();
}
protected void onOpenElement(ISelection selection) {
CHNode node= selectionToNode(selection);
if (node != null) {
ICElement elem= node.getRepresentedDeclaration();
if (elem != null) {
IWorkbenchPage page= getSite().getPage();
try {
EditorOpener.open(page, elem);
} catch (CModelException e) {
CUIPlugin.getDefault().log(e);
}
}
}
}
protected void onNextOrPrevious(boolean forward) {
setNextNode(forward);
if (fNavigationNode != null) {
StructuredSelection sel= new StructuredSelection(fNavigationNode);
fTreeViewer.setSelection(sel);
onShowReference();
showReference();
}
}
@ -564,42 +637,30 @@ public class CHViewPart extends ViewPart {
}
}
protected void onContextMenuAboutToShow(IMenuManager m) {
// final IStructuredSelection selection = (IStructuredSelection) fTreeViewer.getSelection();
// final CHNode node= IBConversions.selectionToNode(selection);
//
// if (node != null) {
// // open reference
// if (node.getParent() != null && node.getDirectiveFile() != null) {
// m.add(new Action(CHMessages.CHViewPart_OpenReference_label) {
// public void run() {
// onShowReference(selection);
// }
// });
// }
protected void onContextMenuAboutToShow(IMenuManager menu) {
CUIPlugin.createStandardGroups(menu);
CHNode node= selectionToNode(fTreeViewer.getSelection());
if (node != null) {
if (node.getReferenceCount() > 0) {
menu.appendToGroup(IContextMenuConstants.GROUP_OPEN, fShowReference);
}
menu.appendToGroup(IContextMenuConstants.GROUP_OPEN, fOpenElement);
}
// action groups
ISelection selection = getSite().getSelectionProvider().getSelection();
if (OpenViewActionGroup.canActionBeAdded(selection)){
fOpenViewActionGroup.fillContextMenu(menu);
}
// support for opening the function/method
// final ITranslationUnit tu= node.getRepresentedTranslationUnit();
// if (tu != null) {
// // open
// OpenFileAction ofa= new OpenFileAction(page);
// ofa.selectionChanged(selection);
// m.add(ofa);
//
// // open with
// // keep the menu shorter, no open with support
//// final IResource r= tu.getResource();
//// if (r != null) {
//// IMenuManager submenu= new MenuManager(IBMessages.IBViewPart_OpenWithMenu_label);
//// submenu.add(new OpenWithMenu(page, r));
//// m.add(submenu);
//// }
// }
// }
m.add(new Separator(IContextMenuConstants.GROUP_ADDITIONS));
if (SelectionSearchGroup.canActionBeAdded(selection)){
fSelectionSearchGroup.fillContextMenu(menu);
}
fRefactoringActionGroup.fillContextMenu(menu);
}
protected void onShowReference() {
private void showReference() {
if (fNavigationNode != null) {
ITranslationUnit file= fNavigationNode.getFileOfReferences();
if (file != null) {

View file

@ -8,6 +8,7 @@
* Contributors:
* IBM Corporation - initial API and implementation
* QNX Software System
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.editor;
@ -234,9 +235,7 @@ public class CContentOutlinePage extends Page implements IContentOutlinePage, IS
ISelection selection= getSelection();
if (OpenViewActionGroup.canActionBeAdded(selection)){
fOpenViewActionGroup.setContext(new ActionContext(selection));
fOpenViewActionGroup.fillContextMenu(menu);
fOpenViewActionGroup.setContext(null);
}
if (OpenIncludeAction.canActionBeAdded(selection)) {

View file

@ -0,0 +1,100 @@
/*******************************************************************************
* 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 java.util.ArrayList;
import java.util.Iterator;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
/**
* A selection provider that adapts the elements of structured selections
* to a requested type.
* @author markus.schorn@windriver.com
*/
public class AdaptingSelectionProvider implements ISelectionProvider, ISelectionChangedListener {
private Class fTargetType;
private ListenerList fListenerList;
private ISelectionProvider fProvider;
public AdaptingSelectionProvider(Class targetType, ISelectionProvider provider) {
fProvider= provider;
fTargetType= targetType;
fListenerList= new ListenerList();
}
private ISelection convertSelection(ISelection selection) {
if (selection != null) {
if (selection instanceof IStructuredSelection) {
IStructuredSelection ss= (IStructuredSelection) selection;
ArrayList adapted= new ArrayList();
for (Iterator iter = ss.iterator(); iter.hasNext(); ) {
Object elem= adaptElem(iter.next());
if (elem != null) {
adapted.add(elem);
}
}
return new StructuredSelection(adapted);
}
}
return selection;
}
private Object adaptElem(Object elem) {
if (fTargetType.isInstance(elem)) {
return elem;
}
if (elem instanceof IAdaptable) {
return ((IAdaptable) elem).getAdapter(fTargetType);
}
return null;
}
public void addSelectionChangedListener(ISelectionChangedListener listener) {
if (fListenerList.isEmpty()) {
fProvider.addSelectionChangedListener(this);
}
fListenerList.add(listener);
}
public ISelection getSelection() {
return convertSelection(fProvider.getSelection());
}
public void removeSelectionChangedListener(ISelectionChangedListener listener) {
fListenerList.remove(listener);
if (fListenerList.isEmpty()) {
fProvider.removeSelectionChangedListener(this);
}
}
public void setSelection(ISelection selection) {
throw new UnsupportedOperationException();
}
public void selectionChanged(SelectionChangedEvent event) {
SelectionChangedEvent event2= new SelectionChangedEvent(this, convertSelection(event.getSelection()));
Object[] listeners= fListenerList.getListeners();
for (int i = 0; i < listeners.length; i++) {
ISelectionChangedListener l= (ISelectionChangedListener) listeners[i];
l.selectionChanged(event2);
}
}
}

View file

@ -21,7 +21,6 @@ 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;
@ -195,11 +194,11 @@ public class OpenViewActionGroup extends ActionGroup {
}
private IStructuredSelection getStructuredSelection() {
ActionContext context= getContext();
if (context != null) {
ISelection selection= getContext().getSelection();
if (selection instanceof IStructuredSelection)
if (fSite != null) {
ISelection selection= fSite.getSelectionProvider().getSelection();
if (selection instanceof IStructuredSelection) {
return (IStructuredSelection)selection;
}
}
return null;
}