1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-13 19:25:38 +02:00

Type Hierarchy: mark selected member in hierarchy.

This commit is contained in:
Markus Schorn 2007-01-25 14:22:20 +00:00
parent df85b0a70c
commit 65af5a4620
13 changed files with 283 additions and 145 deletions

View file

@ -122,7 +122,7 @@ public class TypeHierarchyBaseTest extends BaseUITestCase {
runEventQueue(10); runEventQueue(10);
} }
assertNotNull(th); assertNotNull(th);
return th.getMethodViewer(); return th.getMemberViewer();
} }
protected TreeItem checkTreeNode(Tree tree, int i0, String label) { protected TreeItem checkTreeNode(Tree tree, int i0, String label) {

Binary file not shown.

After

Width:  |  Height:  |  Size: 832 B

View file

@ -232,6 +232,7 @@ public class CPluginImages {
public static final ImageDescriptor DESC_OVR_REC_RELATESTO= create(T_OVR, "rec_relatesto_co.gif"); //$NON-NLS-1$ public static final ImageDescriptor DESC_OVR_REC_RELATESTO= create(T_OVR, "rec_relatesto_co.gif"); //$NON-NLS-1$
public static final ImageDescriptor DESC_OVR_REC_REFERENCEDBY= create(T_OVR, "rec_referencedby_co.gif"); //$NON-NLS-1$ public static final ImageDescriptor DESC_OVR_REC_REFERENCEDBY= create(T_OVR, "rec_referencedby_co.gif"); //$NON-NLS-1$
public static final ImageDescriptor DESC_OVR_SYSTEM_INCLUDE= create(T_OVR, "systeminclude_co.gif"); //$NON-NLS-1$ public static final ImageDescriptor DESC_OVR_SYSTEM_INCLUDE= create(T_OVR, "systeminclude_co.gif"); //$NON-NLS-1$
public static final ImageDescriptor DESC_OVR_DEFINES= create(T_OVR, "defines_co.gif"); //$NON-NLS-1$
public static final ImageDescriptor DESC_OVR_WARNING= create(T_OVR, "warning_co.gif"); //$NON-NLS-1$ public static final ImageDescriptor DESC_OVR_WARNING= create(T_OVR, "warning_co.gif"); //$NON-NLS-1$
public static final ImageDescriptor DESC_OVR_ERROR= create(T_OVR, "error_co.gif"); //$NON-NLS-1$ public static final ImageDescriptor DESC_OVR_ERROR= create(T_OVR, "error_co.gif"); //$NON-NLS-1$

View file

@ -39,7 +39,7 @@ import org.eclipse.cdt.internal.core.model.ext.ICElementHandle;
import org.eclipse.cdt.internal.ui.viewsupport.IndexUI; import org.eclipse.cdt.internal.ui.viewsupport.IndexUI;
class THGraph { class THGraph {
private static final Object[] NO_MEMBERS = new Object[0]; private static final ICElement[] NO_MEMBERS = new ICElement[0];
private THGraphNode fInputNode= null; private THGraphNode fInputNode= null;
private HashSet fRootNodes= new HashSet(); private HashSet fRootNodes= new HashSet();
private HashSet fLeaveNodes= new HashSet(); private HashSet fLeaveNodes= new HashSet();
@ -252,31 +252,29 @@ class THGraph {
private void addMembers(IIndex index, THGraphNode graphNode, IBinding binding) throws DOMException, CoreException { private void addMembers(IIndex index, THGraphNode graphNode, IBinding binding) throws DOMException, CoreException {
if (graphNode.getMembers(false) == null) { if (graphNode.getMembers(false) == null) {
ArrayList memberList= new ArrayList();
if (binding instanceof ICPPClassType) { if (binding instanceof ICPPClassType) {
ICPPClassType ct= (ICPPClassType) binding; ICPPClassType ct= (ICPPClassType) binding;
ArrayList memberList= new ArrayList();
IBinding[] members= ct.getDeclaredFields(); IBinding[] members= ct.getDeclaredFields();
addMemberElements(index, members, memberList); addMemberElements(index, members, memberList);
members= ct.getDeclaredMethods(); members= ct.getDeclaredMethods();
addMemberElements(index, members, memberList); addMemberElements(index, members, memberList);
graphNode.setMembers(memberList.toArray());
} }
else if (binding instanceof ICompositeType) { else if (binding instanceof ICompositeType) {
ICompositeType ct= (ICompositeType) binding; ICompositeType ct= (ICompositeType) binding;
ArrayList memberList= new ArrayList();
IBinding[] members= ct.getFields(); IBinding[] members= ct.getFields();
addMemberElements(index, members, memberList); addMemberElements(index, members, memberList);
graphNode.setMembers(memberList.toArray());
} }
else if (binding instanceof IEnumeration) { else if (binding instanceof IEnumeration) {
IEnumeration ct= (IEnumeration) binding; IEnumeration ct= (IEnumeration) binding;
ArrayList memberList= new ArrayList();
IBinding[] members= ct.getEnumerators(); IBinding[] members= ct.getEnumerators();
addMemberElements(index, members, memberList); addMemberElements(index, members, memberList);
graphNode.setMembers(memberList.toArray()); }
if (memberList.isEmpty()) {
graphNode.setMembers(NO_MEMBERS);
} }
else { else {
graphNode.setMembers(NO_MEMBERS); graphNode.setMembers((ICElement[]) memberList.toArray(new ICElement[memberList.size()]));
} }
} }
} }

View file

@ -24,7 +24,7 @@ class THGraphNode {
private List fOutgoing= Collections.EMPTY_LIST; private List fOutgoing= Collections.EMPTY_LIST;
private List fIncoming= Collections.EMPTY_LIST; private List fIncoming= Collections.EMPTY_LIST;
private ICElement fElement; private ICElement fElement;
private Object[] fMembers= null; private ICElement[] fMembers= null;
THGraphNode(ICElement element) { THGraphNode(ICElement element) {
fElement= element; fElement= element;
@ -63,17 +63,17 @@ class THGraphNode {
return fIncoming; return fIncoming;
} }
public void setMembers(Object[] array) { public void setMembers(ICElement[] array) {
fMembers= array; fMembers= array;
} }
public Object[] getMembers(boolean addInherited) { public ICElement[] getMembers(boolean addInherited) {
if (!addInherited) { if (!addInherited) {
return fMembers; return fMembers;
} }
ArrayList list= new ArrayList(); ArrayList list= new ArrayList();
collectMembers(new HashSet(), list); collectMembers(new HashSet(), list);
return list.toArray(); return (ICElement[]) list.toArray(new ICElement[list.size()]);
} }
private void collectMembers(HashSet visited, List list) { private void collectMembers(HashSet visited, List list) {

View file

@ -58,9 +58,11 @@ class THHierarchyModel {
private boolean fShowInheritedMembers; private boolean fShowInheritedMembers;
private THGraph fGraph; private THGraph fGraph;
private Object[] fRootNodes; private THNode[] fRootNodes;
private THNode fHierarchySelection; private THNode fSelectedTypeNode;
private ICElement fHierarchySelectionToRestore; private ICElement fTypeToSelect;
private ICElement fSelectedMember;
private String fMemberSignatureToSelect;
private Job fJob; private Job fJob;
private Display fDisplay; private Display fDisplay;
@ -90,6 +92,8 @@ class THHierarchyModel {
public void setShowInheritedMembers(boolean showInheritedMembers) { public void setShowInheritedMembers(boolean showInheritedMembers) {
fShowInheritedMembers = showInheritedMembers; fShowInheritedMembers = showInheritedMembers;
computeSelectedMember();
updateImplementors();
} }
public Object[] getHierarchyRootElements() { public Object[] getHierarchyRootElements() {
@ -107,8 +111,8 @@ class THHierarchyModel {
stopGraphComputation(); stopGraphComputation();
fInput= input; fInput= input;
fRootNodes= null; fRootNodes= null;
fHierarchySelection= null; fSelectedTypeNode= null;
fHierarchySelectionToRestore= input; fTypeToSelect= input;
} }
synchronized public void computeGraph() { synchronized public void computeGraph() {
@ -198,7 +202,7 @@ class THHierarchyModel {
while(!stack.isEmpty()) { while(!stack.isEmpty()) {
THNode node= (THNode) stack.remove(stack.size()-1); THNode node= (THNode) stack.remove(stack.size()-1);
THGraphNode gnode= fGraph.getNode(node.getRepresentedDeclaration()); THGraphNode gnode= fGraph.getNode(node.getElement());
List edges= fwd ? gnode.getOutgoing() : gnode.getIncoming(); List edges= fwd ? gnode.getOutgoing() : gnode.getIncoming();
if (edges.isEmpty()) { if (edges.isEmpty()) {
leaves.add(node); leaves.add(node);
@ -213,25 +217,53 @@ class THHierarchyModel {
} }
} }
} }
fHierarchySelection= newSelection[0]; fSelectedTypeNode= newSelection[0];
if (fHierarchySelection == null) { if (fSelectedTypeNode == null) {
fHierarchySelection= newSelection[1]; fSelectedTypeNode= newSelection[1];
} }
if (fHierarchySelection != null) { if (fSelectedTypeNode != null) {
fHierarchySelectionToRestore= fHierarchySelection.getRepresentedDeclaration(); fTypeToSelect= fSelectedTypeNode.getElement();
computeSelectedMember();
}
fRootNodes= (THNode[]) roots.toArray(new THNode[roots.size()]);
updateImplementors();
}
private void computeSelectedMember() {
ICElement oldSelection= fSelectedMember;
fSelectedMember= null;
if (fSelectedTypeNode != null && fMemberSignatureToSelect != null) {
THGraphNode gnode= fGraph.getNode(fSelectedTypeNode.getElement());
if (gnode != null) {
ICElement[] members= gnode.getMembers(fShowInheritedMembers);
for (int i = 0; i < members.length; i++) {
ICElement member= members[i];
if (member.equals(oldSelection)) {
fSelectedMember= member;
return;
}
}
for (int i = 0; i < members.length; i++) {
ICElement member= members[i];
if (fMemberSignatureToSelect.equals(TypeHierarchyUI.getLocalElementSignature(member))) {
fSelectedMember= member;
return;
}
}
}
} }
fRootNodes= roots.toArray();
} }
private THNode createNode(THNode[] newSelection, THNode parent, THGraphNode gnode) { private THNode createNode(THNode[] newSelection, THNode parent, THGraphNode gnode) {
ICElement element = gnode.getElement(); ICElement element = gnode.getElement();
THNode node= new THNode(parent, element); THNode node= new THNode(parent, element);
if (newSelection[0] == null) { if (newSelection[0] == null) {
if (node.equals(fHierarchySelection)) { if (node.equals(fSelectedTypeNode)) {
newSelection[0]= node; newSelection[0]= node;
} }
else if (newSelection[1] == null) { else if (newSelection[1] == null) {
if (element.equals(fHierarchySelectionToRestore)) { if (element.equals(fTypeToSelect)) {
newSelection[1]= node; newSelection[1]= node;
} }
} }
@ -250,8 +282,8 @@ class THHierarchyModel {
fView.setMessage(Messages.THHierarchyModel_errorComputingHierarchy); fView.setMessage(Messages.THHierarchyModel_errorComputingHierarchy);
} }
else { else {
if (fHierarchySelectionToRestore == fInput) { if (fTypeToSelect == fInput) {
fHierarchySelectionToRestore= inputNode.getElement(); fTypeToSelect= inputNode.getElement();
} }
fInput= inputNode.getElement(); fInput= inputNode.getElement();
} }
@ -275,19 +307,21 @@ class THHierarchyModel {
} }
public THNode getSelectionInHierarchy() { public THNode getSelectionInHierarchy() {
return fHierarchySelection; return fSelectedTypeNode;
} }
public void onHierarchySelectionChanged(THNode node) { public void onHierarchySelectionChanged(THNode node) {
fHierarchySelection= node; fSelectedTypeNode= node;
if (node != null) { if (node != null) {
fHierarchySelectionToRestore= node.getRepresentedDeclaration(); fTypeToSelect= node.getElement();
} }
computeSelectedMember();
updateImplementors();
} }
public Object[] getMembers() { public Object[] getMembers() {
if (fHierarchySelection != null) { if (fSelectedTypeNode != null) {
THGraphNode gnode= fGraph.getNode(fHierarchySelection.getRepresentedDeclaration()); THGraphNode gnode= fGraph.getNode(fSelectedTypeNode.getElement());
Object[] result= gnode.getMembers(fShowInheritedMembers); Object[] result= gnode.getMembers(fShowInheritedMembers);
if (result != null) { if (result != null) {
return result; return result;
@ -295,4 +329,57 @@ class THHierarchyModel {
} }
return NO_CHILDREN; return NO_CHILDREN;
} }
public void onMemberSelectionChanged(ICElement elem) {
fSelectedMember= elem;
if (fSelectedMember != null) {
fMemberSignatureToSelect= TypeHierarchyUI.getLocalElementSignature(fSelectedMember);
}
updateImplementors();
}
private void updateImplementors() {
if (fRootNodes != null) {
for (int i = 0; i < fRootNodes.length; i++) {
THNode node = fRootNodes[i];
updateImplementors(node);
}
}
}
private void updateImplementors(THNode node) {
node.setIsImplementor(isImplementor(node.getElement()));
THNode[] children= node.getChildren();
for (int i = 0; i < children.length; i++) {
THNode child = children[i];
updateImplementors(child);
}
}
private boolean isImplementor(ICElement element) {
if (element == null || fSelectedMember == null) {
return false;
}
THGraphNode gnode= fGraph.getNode(element);
if (gnode != null) {
ICElement[] members= gnode.getMembers(false);
if (members != null) {
for (int i = 0; i < members.length; i++) {
ICElement member = members[i];
if (member == fSelectedMember) {
return true;
}
if (fMemberSignatureToSelect != null &&
fMemberSignatureToSelect.equals(TypeHierarchyUI.getLocalElementSignature(member))) {
return true;
}
}
}
}
return false;
}
public ICElement getSelectedMember() {
return fSelectedMember;
}
} }

View file

@ -47,7 +47,7 @@ public class THLabelProvider extends LabelProvider implements IColorProvider {
public Image getImage(Object element) { public Image getImage(Object element) {
if (element instanceof THNode) { if (element instanceof THNode) {
THNode node= (THNode) element; THNode node= (THNode) element;
ICElement decl= node.getRepresentedDeclaration(); ICElement decl= node.getElement();
if (decl != null) { if (decl != null) {
Image image= fCLabelProvider.getImage(decl); Image image= fCLabelProvider.getImage(decl);
if (image != null) { if (image != null) {
@ -64,7 +64,7 @@ public class THLabelProvider extends LabelProvider implements IColorProvider {
public String getText(Object element) { public String getText(Object element) {
if (element instanceof THNode) { if (element instanceof THNode) {
THNode node= (THNode) element; THNode node= (THNode) element;
ICElement decl= node.getRepresentedDeclaration(); ICElement decl= node.getElement();
if (decl != null) { if (decl != null) {
String label= fCLabelProvider.getText(decl); String label= fCLabelProvider.getText(decl);
return label; return label;
@ -93,6 +93,9 @@ public class THLabelProvider extends LabelProvider implements IColorProvider {
flags |= CElementImageDescriptor.REFERENCED_BY; flags |= CElementImageDescriptor.REFERENCED_BY;
} }
} }
if (node.isImplementor()) {
flags |= CElementImageDescriptor.DEFINES;
}
String key= image.toString()+String.valueOf(flags); String key= image.toString()+String.valueOf(flags);
Image result= (Image) fCachedImages.get(key); Image result= (Image) fCachedImages.get(key);

View file

@ -14,11 +14,11 @@ package org.eclipse.cdt.internal.ui.typehierarchy;
import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.Viewer;
public class THMethodContentProvider implements IStructuredContentProvider { public class THMemberContentProvider implements IStructuredContentProvider {
private static final Object[] NO_CHILDREN= new Object[0]; private static final Object[] NO_CHILDREN= new Object[0];
private THHierarchyModel fModel; private THHierarchyModel fModel;
public THMethodContentProvider() { public THMemberContentProvider() {
} }
final public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { final public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {

View file

@ -23,18 +23,19 @@ import org.eclipse.cdt.internal.ui.util.CoreUtility;
public class THNode implements IAdaptable { public class THNode implements IAdaptable {
private THNode fParent; private THNode fParent;
private ICElement fRepresentedDecl; private ICElement fElement;
private List fChildren= Collections.EMPTY_LIST; private List fChildren= Collections.EMPTY_LIST;
private int fHashCode; private int fHashCode;
private boolean fIsFiltered; private boolean fIsFiltered;
private boolean fIsImplementor;
/** /**
* Creates a new node for the include browser * Creates a new node for the include browser
*/ */
public THNode(THNode parent, ICElement decl) { public THNode(THNode parent, ICElement decl) {
fParent= parent; fParent= parent;
fRepresentedDecl= decl; fElement= decl;
fHashCode= computeHashCode(); fHashCode= computeHashCode();
} }
@ -43,8 +44,8 @@ public class THNode implements IAdaptable {
if (fParent != null) { if (fParent != null) {
hashCode= fParent.hashCode() * 31; hashCode= fParent.hashCode() * 31;
} }
if (fRepresentedDecl != null) { if (fElement != null) {
hashCode+= fRepresentedDecl.hashCode(); hashCode+= fElement.hashCode();
} }
return hashCode; return hashCode;
} }
@ -63,7 +64,7 @@ public class THNode implements IAdaptable {
return false; return false;
} }
return CoreUtility.safeEquals(fRepresentedDecl, rhs.fRepresentedDecl); return CoreUtility.safeEquals(fElement, rhs.fElement);
} }
/** /**
@ -74,13 +75,13 @@ public class THNode implements IAdaptable {
} }
public ICElement getRepresentedDeclaration() { public ICElement getElement() {
return fRepresentedDecl; return fElement;
} }
public Object getAdapter(Class adapter) { public Object getAdapter(Class adapter) {
if (adapter.isAssignableFrom(ICElement.class)) { if (adapter.isAssignableFrom(ICElement.class)) {
return getRepresentedDeclaration(); return getElement();
} }
return null; return null;
} }
@ -112,8 +113,16 @@ public class THNode implements IAdaptable {
return !fChildren.isEmpty(); return !fChildren.isEmpty();
} }
public Object[] getChildren() { public THNode[] getChildren() {
return fChildren.toArray(); return (THNode[]) fChildren.toArray(new THNode[fChildren.size()]);
}
public void setIsImplementor(boolean val) {
fIsImplementor= val;
}
public boolean isImplementor() {
return fIsImplementor;
} }
} }

View file

@ -112,9 +112,9 @@ public class THViewPart extends ViewPart {
private static final int ORIENTATION_HORIZONTAL = 1; private static final int ORIENTATION_HORIZONTAL = 1;
private static final int ORIENTATION_VERTICAL = 2; private static final int ORIENTATION_VERTICAL = 2;
private static final int ORIENTATION_SINGLE = 3; private static final int ORIENTATION_SINGLE = 3;
private static final int METHOD_LABEL_OPTIONS_SIMPLE = CElementLabels.M_PARAMETER_TYPES; private static final int MEMBER_LABEL_OPTIONS_SIMPLE = CElementLabels.M_PARAMETER_TYPES;
private static final int METHOD_LABEL_OPTIONS_QUALIFIED = METHOD_LABEL_OPTIONS_SIMPLE | CElementLabels.ALL_POST_QUALIFIED; private static final int MEMBER_LABEL_OPTIONS_QUALIFIED = MEMBER_LABEL_OPTIONS_SIMPLE | CElementLabels.ALL_POST_QUALIFIED;
private static final int METHOD_ICON_OPTIONS = CElementImageProvider.OVERLAY_ICONS; private static final int MEMBER_ICON_OPTIONS = CElementImageProvider.OVERLAY_ICONS;
private IMemento fMemento; private IMemento fMemento;
private boolean fShowsMessage= true; private boolean fShowsMessage= true;
@ -129,21 +129,21 @@ public class THViewPart extends ViewPart {
private Text fInfoText; private Text fInfoText;
private SashForm fSplitter; private SashForm fSplitter;
private ViewForm fHierarchyViewForm; private ViewForm fHierarchyViewForm;
private ViewForm fMethodViewForm; private ViewForm fMemberViewForm;
private CLabel fMethodLabel; private CLabel fMemberLabel;
// viewers // viewers
private THHierarchyModel fModel; private THHierarchyModel fModel;
private THLabelProvider fHierarchyLabelProvider; private THLabelProvider fHierarchyLabelProvider;
private CUILabelProvider fMethodLabelProvider; private CUILabelProvider fMemberLabelProvider;
private TableViewer fMethodViewer; private TableViewer fMemberViewer;
private TreeViewer fHierarchyTreeViewer; private TreeViewer fHierarchyTreeViewer;
// filters, sorter // filters, sorter
// private WorkingSetFilterUI fWorkingSetFilterUI; // private WorkingSetFilterUI fWorkingSetFilterUI;
// actions // actions
private ToolBarManager fMethodToolbarManager; private ToolBarManager fMemberToolbarManager;
private Action fShowSuperTypeHierarchyAction; private Action fShowSuperTypeHierarchyAction;
private Action fShowSubTypeHierarchyAction; private Action fShowSubTypeHierarchyAction;
private Action fShowTypeHierarchyAction; private Action fShowTypeHierarchyAction;
@ -189,13 +189,13 @@ public class THViewPart extends ViewPart {
if (input == null) { if (input == null) {
setMessage(Messages.THViewPart_instruction); setMessage(Messages.THViewPart_instruction);
fHierarchyTreeViewer.setInput(null); fHierarchyTreeViewer.setInput(null);
fMethodViewer.setInput(null); fMemberViewer.setInput(null);
return; return;
} }
fShowsMessage= false; fShowsMessage= false;
fModel.setInput(input); fModel.setInput(input);
fHierarchyTreeViewer.setInput(fModel); fHierarchyTreeViewer.setInput(fModel);
fMethodViewer.setInput(fModel); fMemberViewer.setInput(fModel);
fPagebook.showPage(fSplitter); fPagebook.showPage(fSplitter);
updateDescription(); updateDescription();
updateHistory(input); updateHistory(input);
@ -222,7 +222,7 @@ public class THViewPart extends ViewPart {
private void initSelectionProvider() { private void initSelectionProvider() {
SelectionProviderMediator mediator= new SelectionProviderMediator(); SelectionProviderMediator mediator= new SelectionProviderMediator();
mediator.addViewer(fHierarchyTreeViewer); mediator.addViewer(fHierarchyTreeViewer);
mediator.addViewer(fMethodViewer); mediator.addViewer(fMemberViewer);
getSite().setSelectionProvider(new AdaptingSelectionProvider(ICElement.class, mediator)); getSite().setSelectionProvider(new AdaptingSelectionProvider(ICElement.class, mediator));
} }
@ -294,7 +294,7 @@ public class THViewPart extends ViewPart {
fHierarchyLabelProvider.setShowFiles(showFiles); fHierarchyLabelProvider.setShowFiles(showFiles);
fShowFilesInLabelsAction.setChecked(showFiles); fShowFilesInLabelsAction.setChecked(showFiles);
fMethodToolbarManager.update(true); fMemberToolbarManager.update(true);
} }
public void init(IViewSite site, IMemento memento) throws PartInitException { public void init(IViewSite site, IMemento memento) throws PartInitException {
@ -347,14 +347,14 @@ public class THViewPart extends ViewPart {
onContextMenuAboutToShow(m, false); onContextMenuAboutToShow(m, false);
} }
}); });
menu = manager.createContextMenu(fMethodViewer.getControl()); menu = manager.createContextMenu(fMemberViewer.getControl());
fMethodViewer.getControl().setMenu(menu); fMemberViewer.getControl().setMenu(menu);
site.registerContextMenu(CUIPlugin.ID_TYPE_HIERARCHY + ".methods", manager, fMethodViewer); //$NON-NLS-1$ site.registerContextMenu(CUIPlugin.ID_TYPE_HIERARCHY + ".members", manager, fMemberViewer); //$NON-NLS-1$
} }
protected void onContextMenuAboutToShow(IMenuManager menu, boolean hierarchyView) { protected void onContextMenuAboutToShow(IMenuManager menu, boolean hierarchyView) {
CUIPlugin.createStandardGroups(menu); CUIPlugin.createStandardGroups(menu);
StructuredViewer viewer= hierarchyView ? (StructuredViewer) fHierarchyTreeViewer : fMethodViewer; StructuredViewer viewer= hierarchyView ? (StructuredViewer) fHierarchyTreeViewer : fMemberViewer;
final ICElement elem= selectionToElement(viewer.getSelection()); final ICElement elem= selectionToElement(viewer.getSelection());
if (elem != null) { if (elem != null) {
menu.appendToGroup(IContextMenuConstants.GROUP_OPEN, fOpenElement); menu.appendToGroup(IContextMenuConstants.GROUP_OPEN, fOpenElement);
@ -400,31 +400,31 @@ public class THViewPart extends ViewPart {
Control hierarchyControl= createHierarchyControl(fHierarchyViewForm); Control hierarchyControl= createHierarchyControl(fHierarchyViewForm);
fHierarchyViewForm.setContent(hierarchyControl); fHierarchyViewForm.setContent(hierarchyControl);
fMethodViewForm= new ViewForm(fSplitter, SWT.NONE); fMemberViewForm= new ViewForm(fSplitter, SWT.NONE);
Control methodControl= createMethodControl(fMethodViewForm); Control memberControl= createMemberControl(fMemberViewForm);
fMethodViewForm.setContent(methodControl); fMemberViewForm.setContent(memberControl);
fMethodLabel = new CLabel(fMethodViewForm, SWT.NONE); fMemberLabel = new CLabel(fMemberViewForm, SWT.NONE);
fMethodLabel.setText(Messages.THViewPart_MethodPane_title); fMemberLabel.setText(Messages.THViewPart_MethodPane_title);
fMethodViewForm.setTopLeft(fMethodLabel); fMemberViewForm.setTopLeft(fMemberLabel);
} }
private Control createMethodControl(ViewForm parent) { private Control createMemberControl(ViewForm parent) {
fMethodLabelProvider= new CUILabelProvider(METHOD_LABEL_OPTIONS_SIMPLE, METHOD_ICON_OPTIONS); fMemberLabelProvider= new CUILabelProvider(MEMBER_LABEL_OPTIONS_SIMPLE, MEMBER_ICON_OPTIONS);
fMethodViewer = new TableViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); fMemberViewer = new TableViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
fMethodViewer.setContentProvider(new THMethodContentProvider()); fMemberViewer.setContentProvider(new THMemberContentProvider());
fMethodViewer.setLabelProvider(fMethodLabelProvider); fMemberViewer.setLabelProvider(fMemberLabelProvider);
fMethodViewer.addOpenListener(new IOpenListener() { fMemberViewer.addOpenListener(new IOpenListener() {
public void open(OpenEvent event) { public void open(OpenEvent event) {
onOpenElement(event.getSelection()); onOpenElement(event.getSelection());
} }
}); });
fMethodViewer.addSelectionChangedListener(new ISelectionChangedListener() { fMemberViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(final SelectionChangedEvent event) { public void selectionChanged(final SelectionChangedEvent event) {
onMethodSelectionChanged(event); onMemberSelectionChanged(event);
} }
}); });
fMethodViewer.setSorter(new ViewerSorter() { fMemberViewer.setSorter(new ViewerSorter() {
public int category(Object element) { public int category(Object element) {
if (element instanceof ICElement) { if (element instanceof ICElement) {
ICElement celem= (ICElement)element; ICElement celem= (ICElement)element;
@ -446,14 +446,17 @@ public class THViewPart extends ViewPart {
} }
}); });
ToolBar methodToolBar= new ToolBar(parent, SWT.FLAT | SWT.WRAP); ToolBar memberToolBar= new ToolBar(parent, SWT.FLAT | SWT.WRAP);
parent.setTopCenter(methodToolBar); parent.setTopCenter(memberToolBar);
fMethodToolbarManager= new ToolBarManager(methodToolBar); fMemberToolbarManager= new ToolBarManager(memberToolBar);
return fMethodViewer.getControl(); return fMemberViewer.getControl();
} }
protected void onMethodSelectionChanged(SelectionChangedEvent event) { protected void onMemberSelectionChanged(SelectionChangedEvent event) {
if (fIgnoreSelectionChanges == 0) { if (fIgnoreSelectionChanges == 0) {
ICElement elem= selectionToElement(event.getSelection());
fModel.onMemberSelectionChanged(elem);
fHierarchyTreeViewer.refresh();
} }
} }
@ -485,8 +488,7 @@ public class THViewPart extends ViewPart {
if (fIgnoreSelectionChanges == 0) { if (fIgnoreSelectionChanges == 0) {
THNode node= selectionToNode(event.getSelection()); THNode node= selectionToNode(event.getSelection());
fModel.onHierarchySelectionChanged(node); fModel.onHierarchySelectionChanged(node);
fMethodViewer.refresh(); updateView();
updateDescription();
} }
} }
@ -636,10 +638,10 @@ public class THViewPart extends ViewPart {
fFieldFilterAction= new Action(Messages.THViewPart_HideFields_label, IAction.AS_CHECK_BOX) { fFieldFilterAction= new Action(Messages.THViewPart_HideFields_label, IAction.AS_CHECK_BOX) {
public void run() { public void run() {
if (isChecked()) { if (isChecked()) {
fMethodViewer.addFilter(fFieldFilter); fMemberViewer.addFilter(fFieldFilter);
} }
else { else {
fMethodViewer.removeFilter(fFieldFilter); fMemberViewer.removeFilter(fFieldFilter);
} }
} }
}; };
@ -649,10 +651,10 @@ public class THViewPart extends ViewPart {
fStaticFilterAction= new Action(Messages.THViewPart_HideStatic_label, IAction.AS_CHECK_BOX) { fStaticFilterAction= new Action(Messages.THViewPart_HideStatic_label, IAction.AS_CHECK_BOX) {
public void run() { public void run() {
if (isChecked()) { if (isChecked()) {
fMethodViewer.addFilter(fStaticFilter); fMemberViewer.addFilter(fStaticFilter);
} }
else { else {
fMethodViewer.removeFilter(fStaticFilter); fMemberViewer.removeFilter(fStaticFilter);
} }
} }
}; };
@ -662,10 +664,10 @@ public class THViewPart extends ViewPart {
fNonPublicFilterAction= new Action(Messages.THViewPart_HideNonPublic_label, IAction.AS_CHECK_BOX) { fNonPublicFilterAction= new Action(Messages.THViewPart_HideNonPublic_label, IAction.AS_CHECK_BOX) {
public void run() { public void run() {
if (isChecked()) { if (isChecked()) {
fMethodViewer.addFilter(fNonPublicFilter); fMemberViewer.addFilter(fNonPublicFilter);
} }
else { else {
fMethodViewer.removeFilter(fNonPublicFilter); fMemberViewer.removeFilter(fNonPublicFilter);
} }
} }
}; };
@ -743,12 +745,12 @@ public class THViewPart extends ViewPart {
mm.add(new Separator()); mm.add(new Separator());
mm.add(fShowFilesInLabelsAction); mm.add(fShowFilesInLabelsAction);
// method toolbar // member toolbar
fMethodToolbarManager.add(fShowInheritedMembersAction); fMemberToolbarManager.add(fShowInheritedMembersAction);
fMethodToolbarManager.add(new Separator()); fMemberToolbarManager.add(new Separator());
fMethodToolbarManager.add(fFieldFilterAction); fMemberToolbarManager.add(fFieldFilterAction);
fMethodToolbarManager.add(fStaticFilterAction); fMemberToolbarManager.add(fStaticFilterAction);
fMethodToolbarManager.add(fNonPublicFilterAction); fMemberToolbarManager.add(fNonPublicFilterAction);
} }
protected void onOpenElement(ISelection selection) { protected void onOpenElement(ISelection selection) {
@ -817,14 +819,14 @@ public class THViewPart extends ViewPart {
Image image= null; Image image= null;
THNode node= fModel.getSelectionInHierarchy(); THNode node= fModel.getSelectionInHierarchy();
if (node != null) { if (node != null) {
elem= node.getRepresentedDeclaration(); elem= node.getElement();
if (elem != null) { if (elem != null) {
label= CElementLabels.getElementLabel(elem, 0); label= CElementLabels.getElementLabel(elem, 0);
image= fHierarchyLabelProvider.getImage(elem); image= fHierarchyLabelProvider.getImage(elem);
} }
} }
fMethodLabel.setText(label); fMemberLabel.setText(label);
fMethodLabel.setImage(image); fMemberLabel.setImage(image);
} }
} }
setContentDescription(message); setContentDescription(message);
@ -854,21 +856,33 @@ public class THViewPart extends ViewPart {
protected void onShowInheritedMembers(boolean show) { protected void onShowInheritedMembers(boolean show) {
if (fModel.isShowInheritedMembers() != show) { if (fModel.isShowInheritedMembers() != show) {
fModel.setShowInheritedMembers(show); fModel.setShowInheritedMembers(show);
fMethodLabelProvider.setTextFlags(show ? fMemberLabelProvider.setTextFlags(show ?
METHOD_LABEL_OPTIONS_QUALIFIED : METHOD_LABEL_OPTIONS_SIMPLE); MEMBER_LABEL_OPTIONS_QUALIFIED : MEMBER_LABEL_OPTIONS_SIMPLE);
fMethodViewer.refresh(); updateViewers();
} }
} }
private void updateViewers() {
if (!fShowsMessage) {
fIgnoreSelectionChanges++;
try {
fHierarchyTreeViewer.refresh();
fMemberViewer.refresh();
setSelections();
}
finally {
fIgnoreSelectionChanges--;
}
}
}
private void updateView() { private void updateView() {
if (!fShowsMessage) { if (!fShowsMessage) {
fIgnoreSelectionChanges++; fIgnoreSelectionChanges++;
try { try {
fHierarchyTreeViewer.refresh(); updateViewers();
fMethodViewer.refresh();
updateDescription(); updateDescription();
updateActionEnablement(); updateActionEnablement();
setSelections();
} }
finally { finally {
fIgnoreSelectionChanges--; fIgnoreSelectionChanges--;
@ -884,6 +898,10 @@ public class THViewPart extends ViewPart {
fHierarchyTreeViewer.setSelection(new StructuredSelection(node)); fHierarchyTreeViewer.setSelection(new StructuredSelection(node));
fHierarchyTreeViewer.expandToLevel(node, 1); fHierarchyTreeViewer.expandToLevel(node, 1);
} }
ICElement elem= fModel.getSelectedMember();
if (elem != null) {
fMemberViewer.setSelection(new StructuredSelection(elem));
}
} }
finally { finally {
fIgnoreSelectionChanges--; fIgnoreSelectionChanges--;
@ -947,8 +965,8 @@ public class THViewPart extends ViewPart {
return fHierarchyTreeViewer; return fHierarchyTreeViewer;
} }
public TableViewer getMethodViewer() { public TableViewer getMemberViewer() {
return fMethodViewer; return fMemberViewer;
} }
private void restoreOrientation(int orientation) { private void restoreOrientation(int orientation) {
@ -998,10 +1016,10 @@ public class THViewPart extends ViewPart {
orientation= getBestOrientation(); orientation= getBestOrientation();
} }
if (orientation == ORIENTATION_SINGLE) { if (orientation == ORIENTATION_SINGLE) {
fMethodViewForm.setVisible(false); fMemberViewForm.setVisible(false);
} else { } else {
if (fCurrentViewOrientation == ORIENTATION_SINGLE) { if (fCurrentViewOrientation == ORIENTATION_SINGLE) {
fMethodViewForm.setVisible(true); fMemberViewForm.setVisible(true);
} }
boolean horizontal= orientation == ORIENTATION_HORIZONTAL; boolean horizontal= orientation == ORIENTATION_HORIZONTAL;
fSplitter.setOrientation(horizontal ? SWT.HORIZONTAL : SWT.VERTICAL); fSplitter.setOrientation(horizontal ? SWT.HORIZONTAL : SWT.VERTICAL);

View file

@ -32,8 +32,10 @@ import org.eclipse.cdt.core.dom.ast.IEnumeration;
import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexManager; import org.eclipse.cdt.core.index.IIndexManager;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.IFunctionDeclaration;
import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IWorkingCopy; import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.CUIPlugin;
@ -218,4 +220,21 @@ public class TypeHierarchyUI {
} }
return false; return false;
} }
static String getLocalElementSignature(ICElement element) {
if (element != null) {
try {
switch (element.getElementType()) {
case ICElement.C_METHOD:
case ICElement.C_METHOD_DECLARATION:
return ((IFunctionDeclaration) element).getSignature();
case ICElement.C_FIELD:
return element.getElementName();
}
} catch (CModelException e) {
CUIPlugin.getDefault().log(e);
}
}
return null;
}
} }

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2005, 2006 IBM Corporation and others. * Copyright (c) 2005, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -444,12 +444,12 @@ public class CElementImageProvider {
if ((renderFlags & OVERLAY_WARNING) !=0) { if ((renderFlags & OVERLAY_WARNING) !=0) {
flags |= CElementImageDescriptor.WARNING; flags |= CElementImageDescriptor.WARNING;
} }
if ((renderFlags & OVERLAY_OVERRIDE) !=0) { // if ((renderFlags & OVERLAY_OVERRIDE) !=0) {
flags |= CElementImageDescriptor.OVERRIDES; // flags |= CElementImageDescriptor.OVERRIDES;
} // }
if ((renderFlags & OVERLAY_IMPLEMENTS) !=0) { // if ((renderFlags & OVERLAY_IMPLEMENTS) !=0) {
flags |= CElementImageDescriptor.IMPLEMENTS; // flags |= CElementImageDescriptor.IMPLEMENTS;
} // }
return flags; return flags;
} }

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2000, 2006 IBM Corporation and others. * Copyright (c) 2000, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -49,7 +49,9 @@ public class CElementImageDescriptor extends CompositeImageDescriptor {
/** Flag to render the static adornment */ /** Flag to render the static adornment */
public final static int STATIC= 0x008; public final static int STATIC= 0x008;
/** Flag to render the runnable adornment */ /**
* @deprecated flag never had an effect
*/
public final static int RUNNABLE= 0x010; public final static int RUNNABLE= 0x010;
/** Flag to render the waring adornment */ /** Flag to render the waring adornment */
@ -58,10 +60,14 @@ public class CElementImageDescriptor extends CompositeImageDescriptor {
/** Flag to render the error adornment */ /** Flag to render the error adornment */
public final static int ERROR= 0x040; public final static int ERROR= 0x040;
/** Flag to render the 'override' adornment */ /**
* @deprecated flag never had an effect
*/
public final static int OVERRIDES= 0x080; public final static int OVERRIDES= 0x080;
/** Flag to render the 'implements' adornment */ /**
* @deprecated flag never had an effect
*/
public final static int IMPLEMENTS= 0x100; public final static int IMPLEMENTS= 0x100;
/** Flag to render the 'relates to' adornment (for trees, an arrow down) */ /** Flag to render the 'relates to' adornment (for trees, an arrow down) */
@ -79,6 +85,9 @@ public class CElementImageDescriptor extends CompositeImageDescriptor {
/** Flag to render the 'system include' adornment */ /** Flag to render the 'system include' adornment */
public final static int SYSTEM_INCLUDE= 0x2000; public final static int SYSTEM_INCLUDE= 0x2000;
/** Flag to render the 'defines' adornment in the type hierarchy*/
public final static int DEFINES= 0x4000;
private ImageDescriptor fBaseImage; private ImageDescriptor fBaseImage;
private int fFlags; private int fFlags;
private Point fSize; private Point fSize;
@ -103,8 +112,8 @@ public class CElementImageDescriptor extends CompositeImageDescriptor {
/** /**
* Sets the descriptors adornments. Valid values are: <code>ABSTRACT</code>, <code>FINAL</code>, * Sets the descriptors adornments. Valid values are: <code>ABSTRACT</code>, <code>FINAL</code>,
* <code>SYNCHRONIZED</code>, </code>STATIC<code>, </code>RUNNABLE<code>, </code>WARNING<code>, * </code>STATIC<code>, </code>WARNING<code>,
* </code>ERROR<code>, </code>OVERRIDDEN<code>, or any combination of those. * </code>ERROR<code>, or any combination of those.
* *
* @param adornments the image descritpors adornments * @param adornments the image descritpors adornments
*/ */
@ -199,6 +208,10 @@ public class CElementImageDescriptor extends CompositeImageDescriptor {
x-= data.width; x-= data.width;
drawImage(data, x, 0); drawImage(data, x, 0);
} }
if ((fFlags & DEFINES) != 0) {
data= CPluginImages.DESC_OVR_DEFINES.getImageData();
drawImage(data, 0, 0);
}
if ((fFlags & TEMPLATE) != 0) { if ((fFlags & TEMPLATE) != 0) {
data= CPluginImages.DESC_OVR_TEMPLATE.getImageData(); data= CPluginImages.DESC_OVR_TEMPLATE.getImageData();
x-= data.width; x-= data.width;
@ -235,26 +248,16 @@ public class CElementImageDescriptor extends CompositeImageDescriptor {
x-= data.width; x-= data.width;
drawImage(data, x, size.y-data.height); drawImage(data, x, size.y-data.height);
} }
/*if ((fFlags & SYNCHRONIZED) != 0) { // if ((fFlags & OVERRIDES) != 0) {
data= CPluginImages.DESC_OVR_SYNCH.getImageData(); // data= CPluginImages.DESC_OVR_OVERRIDES.getImageData();
x-= data.width; // x-= data.width;
drawImage(data, x, size.y - data.height); // drawImage(data, x, size.y - data.height);
} // }
if ((fFlags & RUNNABLE) != 0) { // if ((fFlags & IMPLEMENTS) != 0) {
data= CPluginImages.DESC_OVR_RUN.getImageData(); // data= CPluginImages.DESC_OVR_IMPLEMENTS.getImageData();
x-= data.width; // x-= data.width;
drawImage(data, x, size.y - data.height); // drawImage(data, x, size.y - data.height);
} // }
if ((fFlags & OVERRIDES) != 0) {
data= CPluginImages.DESC_OVR_OVERRIDES.getImageData();
x-= data.width;
drawImage(data, x, size.y - data.height);
}
if ((fFlags & IMPLEMENTS) != 0) {
data= CPluginImages.DESC_OVR_IMPLEMENTS.getImageData();
x-= data.width;
drawImage(data, x, size.y - data.height);
} */
} }
private void drawBottomLeft() { private void drawBottomLeft() {