From 65af5a4620c6fb11baa3f357a2fd8e864ee0ed2d Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Thu, 25 Jan 2007 14:22:20 +0000 Subject: [PATCH] Type Hierarchy: mark selected member in hierarchy. --- .../typehierarchy/TypeHierarchyBaseTest.java | 2 +- .../icons/ovr16/defines_co.gif | Bin 0 -> 832 bytes .../cdt/internal/ui/CPluginImages.java | 1 + .../internal/ui/typehierarchy/THGraph.java | 14 +- .../ui/typehierarchy/THGraphNode.java | 8 +- .../ui/typehierarchy/THHierarchyModel.java | 129 +++++++++++++--- .../ui/typehierarchy/THLabelProvider.java | 7 +- ...ider.java => THMemberContentProvider.java} | 4 +- .../cdt/internal/ui/typehierarchy/THNode.java | 29 ++-- .../internal/ui/typehierarchy/THViewPart.java | 146 ++++++++++-------- .../ui/typehierarchy/TypeHierarchyUI.java | 19 +++ .../ui/viewsupport/CElementImageProvider.java | 14 +- .../cdt/ui/CElementImageDescriptor.java | 55 +++---- 13 files changed, 283 insertions(+), 145 deletions(-) create mode 100644 core/org.eclipse.cdt.ui/icons/ovr16/defines_co.gif rename core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/{THMethodContentProvider.java => THMemberContentProvider.java} (92%) diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/typehierarchy/TypeHierarchyBaseTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/typehierarchy/TypeHierarchyBaseTest.java index f971d887301..a5317a955b4 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/typehierarchy/TypeHierarchyBaseTest.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/typehierarchy/TypeHierarchyBaseTest.java @@ -122,7 +122,7 @@ public class TypeHierarchyBaseTest extends BaseUITestCase { runEventQueue(10); } assertNotNull(th); - return th.getMethodViewer(); + return th.getMemberViewer(); } protected TreeItem checkTreeNode(Tree tree, int i0, String label) { diff --git a/core/org.eclipse.cdt.ui/icons/ovr16/defines_co.gif b/core/org.eclipse.cdt.ui/icons/ovr16/defines_co.gif new file mode 100644 index 0000000000000000000000000000000000000000..53b995be2af8006d6de516bb0db4a076ba560b51 GIT binary patch literal 832 zcmW+#v5Hk$5WItmn#cwl2qLl@7;R{$5X5o$KnsD>Nem`21n(4Yn$ z^k4>9acYU_1#!UiQX-2q+2mwO+mcwK#TG}*(iu{*iY|6>im?%x%rb4ZIcAK7NX=@x z+0ALjYN$1=p@%)3A)tt9jmm361A*d-tCm>3AZ04OR7sXvn&3)VF|8`O)TJpU#4Mem zvTU_AR$`5fz^dg|x2Bb#V=P29@~B5M0xDKRT^n=tMp$5xD^_c?dQB8|!IiI-3UO!x z%19bpuIj1@lPi&B#kA~d*SK=22{B7&$X(qvUAgAO8XJLms;6cOaDtAp5P2`z1A`{l zYN)+2duYhinva;*Xl%tqR?dPe@0AL1XadSe8e46TjW*lrUD54s&#$ZV^AD%fY4SUt zW3G>!`IP$W=gqU@xPAPSm&g7mjyn&J2cI8&{q*epjqmsF|M}|8>&yTDc=Y(m+w;FK K-<_Qu|NRDAOu`QU literal 0 HcmV?d00001 diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/CPluginImages.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/CPluginImages.java index be0a525a956..aa65b8ac87d 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/CPluginImages.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/CPluginImages.java @@ -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_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_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_ERROR= create(T_OVR, "error_co.gif"); //$NON-NLS-1$ diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THGraph.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THGraph.java index 7e79d4ada39..e74cb00045b 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THGraph.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THGraph.java @@ -39,7 +39,7 @@ import org.eclipse.cdt.internal.core.model.ext.ICElementHandle; import org.eclipse.cdt.internal.ui.viewsupport.IndexUI; 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 HashSet fRootNodes= 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 { if (graphNode.getMembers(false) == null) { + ArrayList memberList= new ArrayList(); if (binding instanceof ICPPClassType) { ICPPClassType ct= (ICPPClassType) binding; - ArrayList memberList= new ArrayList(); IBinding[] members= ct.getDeclaredFields(); addMemberElements(index, members, memberList); members= ct.getDeclaredMethods(); addMemberElements(index, members, memberList); - graphNode.setMembers(memberList.toArray()); } else if (binding instanceof ICompositeType) { ICompositeType ct= (ICompositeType) binding; - ArrayList memberList= new ArrayList(); IBinding[] members= ct.getFields(); addMemberElements(index, members, memberList); - graphNode.setMembers(memberList.toArray()); } else if (binding instanceof IEnumeration) { IEnumeration ct= (IEnumeration) binding; - ArrayList memberList= new ArrayList(); IBinding[] members= ct.getEnumerators(); addMemberElements(index, members, memberList); - graphNode.setMembers(memberList.toArray()); + } + if (memberList.isEmpty()) { + graphNode.setMembers(NO_MEMBERS); } else { - graphNode.setMembers(NO_MEMBERS); + graphNode.setMembers((ICElement[]) memberList.toArray(new ICElement[memberList.size()])); } } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THGraphNode.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THGraphNode.java index 81f18ed6377..21d2dab9823 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THGraphNode.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THGraphNode.java @@ -24,7 +24,7 @@ class THGraphNode { private List fOutgoing= Collections.EMPTY_LIST; private List fIncoming= Collections.EMPTY_LIST; private ICElement fElement; - private Object[] fMembers= null; + private ICElement[] fMembers= null; THGraphNode(ICElement element) { fElement= element; @@ -63,17 +63,17 @@ class THGraphNode { return fIncoming; } - public void setMembers(Object[] array) { + public void setMembers(ICElement[] array) { fMembers= array; } - public Object[] getMembers(boolean addInherited) { + public ICElement[] getMembers(boolean addInherited) { if (!addInherited) { return fMembers; } ArrayList list= new ArrayList(); collectMembers(new HashSet(), list); - return list.toArray(); + return (ICElement[]) list.toArray(new ICElement[list.size()]); } private void collectMembers(HashSet visited, List list) { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THHierarchyModel.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THHierarchyModel.java index 4d528d29e38..7a2afc159c7 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THHierarchyModel.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THHierarchyModel.java @@ -58,9 +58,11 @@ class THHierarchyModel { private boolean fShowInheritedMembers; private THGraph fGraph; - private Object[] fRootNodes; - private THNode fHierarchySelection; - private ICElement fHierarchySelectionToRestore; + private THNode[] fRootNodes; + private THNode fSelectedTypeNode; + private ICElement fTypeToSelect; + private ICElement fSelectedMember; + private String fMemberSignatureToSelect; private Job fJob; private Display fDisplay; @@ -90,6 +92,8 @@ class THHierarchyModel { public void setShowInheritedMembers(boolean showInheritedMembers) { fShowInheritedMembers = showInheritedMembers; + computeSelectedMember(); + updateImplementors(); } public Object[] getHierarchyRootElements() { @@ -107,8 +111,8 @@ class THHierarchyModel { stopGraphComputation(); fInput= input; fRootNodes= null; - fHierarchySelection= null; - fHierarchySelectionToRestore= input; + fSelectedTypeNode= null; + fTypeToSelect= input; } synchronized public void computeGraph() { @@ -198,7 +202,7 @@ class THHierarchyModel { while(!stack.isEmpty()) { 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(); if (edges.isEmpty()) { leaves.add(node); @@ -213,25 +217,53 @@ class THHierarchyModel { } } } - fHierarchySelection= newSelection[0]; - if (fHierarchySelection == null) { - fHierarchySelection= newSelection[1]; + fSelectedTypeNode= newSelection[0]; + if (fSelectedTypeNode == null) { + fSelectedTypeNode= newSelection[1]; } - if (fHierarchySelection != null) { - fHierarchySelectionToRestore= fHierarchySelection.getRepresentedDeclaration(); + if (fSelectedTypeNode != null) { + fTypeToSelect= fSelectedTypeNode.getElement(); + computeSelectedMember(); } - fRootNodes= roots.toArray(); + + 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; + } + } + } + } } private THNode createNode(THNode[] newSelection, THNode parent, THGraphNode gnode) { ICElement element = gnode.getElement(); THNode node= new THNode(parent, element); if (newSelection[0] == null) { - if (node.equals(fHierarchySelection)) { + if (node.equals(fSelectedTypeNode)) { newSelection[0]= node; } else if (newSelection[1] == null) { - if (element.equals(fHierarchySelectionToRestore)) { + if (element.equals(fTypeToSelect)) { newSelection[1]= node; } } @@ -250,8 +282,8 @@ class THHierarchyModel { fView.setMessage(Messages.THHierarchyModel_errorComputingHierarchy); } else { - if (fHierarchySelectionToRestore == fInput) { - fHierarchySelectionToRestore= inputNode.getElement(); + if (fTypeToSelect == fInput) { + fTypeToSelect= inputNode.getElement(); } fInput= inputNode.getElement(); } @@ -275,19 +307,21 @@ class THHierarchyModel { } public THNode getSelectionInHierarchy() { - return fHierarchySelection; + return fSelectedTypeNode; } public void onHierarchySelectionChanged(THNode node) { - fHierarchySelection= node; + fSelectedTypeNode= node; if (node != null) { - fHierarchySelectionToRestore= node.getRepresentedDeclaration(); + fTypeToSelect= node.getElement(); } + computeSelectedMember(); + updateImplementors(); } public Object[] getMembers() { - if (fHierarchySelection != null) { - THGraphNode gnode= fGraph.getNode(fHierarchySelection.getRepresentedDeclaration()); + if (fSelectedTypeNode != null) { + THGraphNode gnode= fGraph.getNode(fSelectedTypeNode.getElement()); Object[] result= gnode.getMembers(fShowInheritedMembers); if (result != null) { return result; @@ -295,4 +329,57 @@ class THHierarchyModel { } 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; + } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THLabelProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THLabelProvider.java index 4b03be34a5d..951f9b83c22 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THLabelProvider.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THLabelProvider.java @@ -47,7 +47,7 @@ public class THLabelProvider extends LabelProvider implements IColorProvider { public Image getImage(Object element) { if (element instanceof THNode) { THNode node= (THNode) element; - ICElement decl= node.getRepresentedDeclaration(); + ICElement decl= node.getElement(); if (decl != null) { Image image= fCLabelProvider.getImage(decl); if (image != null) { @@ -64,7 +64,7 @@ public class THLabelProvider extends LabelProvider implements IColorProvider { public String getText(Object element) { if (element instanceof THNode) { THNode node= (THNode) element; - ICElement decl= node.getRepresentedDeclaration(); + ICElement decl= node.getElement(); if (decl != null) { String label= fCLabelProvider.getText(decl); return label; @@ -93,6 +93,9 @@ public class THLabelProvider extends LabelProvider implements IColorProvider { flags |= CElementImageDescriptor.REFERENCED_BY; } } + if (node.isImplementor()) { + flags |= CElementImageDescriptor.DEFINES; + } String key= image.toString()+String.valueOf(flags); Image result= (Image) fCachedImages.get(key); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THMethodContentProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THMemberContentProvider.java similarity index 92% rename from core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THMethodContentProvider.java rename to core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THMemberContentProvider.java index 1e598c3d1a2..8ec56d6daa0 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THMethodContentProvider.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THMemberContentProvider.java @@ -14,11 +14,11 @@ package org.eclipse.cdt.internal.ui.typehierarchy; import org.eclipse.jface.viewers.IStructuredContentProvider; 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 THHierarchyModel fModel; - public THMethodContentProvider() { + public THMemberContentProvider() { } final public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THNode.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THNode.java index fd48741dd98..d388923a8b1 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THNode.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THNode.java @@ -23,18 +23,19 @@ import org.eclipse.cdt.internal.ui.util.CoreUtility; public class THNode implements IAdaptable { private THNode fParent; - private ICElement fRepresentedDecl; + private ICElement fElement; private List fChildren= Collections.EMPTY_LIST; private int fHashCode; private boolean fIsFiltered; + private boolean fIsImplementor; /** * Creates a new node for the include browser */ public THNode(THNode parent, ICElement decl) { fParent= parent; - fRepresentedDecl= decl; + fElement= decl; fHashCode= computeHashCode(); } @@ -43,8 +44,8 @@ public class THNode implements IAdaptable { if (fParent != null) { hashCode= fParent.hashCode() * 31; } - if (fRepresentedDecl != null) { - hashCode+= fRepresentedDecl.hashCode(); + if (fElement != null) { + hashCode+= fElement.hashCode(); } return hashCode; } @@ -63,7 +64,7 @@ public class THNode implements IAdaptable { 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() { - return fRepresentedDecl; + public ICElement getElement() { + return fElement; } public Object getAdapter(Class adapter) { if (adapter.isAssignableFrom(ICElement.class)) { - return getRepresentedDeclaration(); + return getElement(); } return null; } @@ -112,8 +113,16 @@ public class THNode implements IAdaptable { return !fChildren.isEmpty(); } - public Object[] getChildren() { - return fChildren.toArray(); + public THNode[] getChildren() { + return (THNode[]) fChildren.toArray(new THNode[fChildren.size()]); + } + + public void setIsImplementor(boolean val) { + fIsImplementor= val; + } + + public boolean isImplementor() { + return fIsImplementor; } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THViewPart.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THViewPart.java index e8e6203bb41..18812077549 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THViewPart.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THViewPart.java @@ -112,9 +112,9 @@ public class THViewPart extends ViewPart { private static final int ORIENTATION_HORIZONTAL = 1; private static final int ORIENTATION_VERTICAL = 2; private static final int ORIENTATION_SINGLE = 3; - private static final int METHOD_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 METHOD_ICON_OPTIONS = CElementImageProvider.OVERLAY_ICONS; + private static final int MEMBER_LABEL_OPTIONS_SIMPLE = CElementLabels.M_PARAMETER_TYPES; + private static final int MEMBER_LABEL_OPTIONS_QUALIFIED = MEMBER_LABEL_OPTIONS_SIMPLE | CElementLabels.ALL_POST_QUALIFIED; + private static final int MEMBER_ICON_OPTIONS = CElementImageProvider.OVERLAY_ICONS; private IMemento fMemento; private boolean fShowsMessage= true; @@ -129,21 +129,21 @@ public class THViewPart extends ViewPart { private Text fInfoText; private SashForm fSplitter; private ViewForm fHierarchyViewForm; - private ViewForm fMethodViewForm; - private CLabel fMethodLabel; + private ViewForm fMemberViewForm; + private CLabel fMemberLabel; // viewers private THHierarchyModel fModel; private THLabelProvider fHierarchyLabelProvider; - private CUILabelProvider fMethodLabelProvider; - private TableViewer fMethodViewer; + private CUILabelProvider fMemberLabelProvider; + private TableViewer fMemberViewer; private TreeViewer fHierarchyTreeViewer; // filters, sorter // private WorkingSetFilterUI fWorkingSetFilterUI; // actions - private ToolBarManager fMethodToolbarManager; + private ToolBarManager fMemberToolbarManager; private Action fShowSuperTypeHierarchyAction; private Action fShowSubTypeHierarchyAction; private Action fShowTypeHierarchyAction; @@ -189,13 +189,13 @@ public class THViewPart extends ViewPart { if (input == null) { setMessage(Messages.THViewPart_instruction); fHierarchyTreeViewer.setInput(null); - fMethodViewer.setInput(null); + fMemberViewer.setInput(null); return; } fShowsMessage= false; fModel.setInput(input); fHierarchyTreeViewer.setInput(fModel); - fMethodViewer.setInput(fModel); + fMemberViewer.setInput(fModel); fPagebook.showPage(fSplitter); updateDescription(); updateHistory(input); @@ -222,7 +222,7 @@ public class THViewPart extends ViewPart { private void initSelectionProvider() { SelectionProviderMediator mediator= new SelectionProviderMediator(); mediator.addViewer(fHierarchyTreeViewer); - mediator.addViewer(fMethodViewer); + mediator.addViewer(fMemberViewer); getSite().setSelectionProvider(new AdaptingSelectionProvider(ICElement.class, mediator)); } @@ -294,7 +294,7 @@ public class THViewPart extends ViewPart { fHierarchyLabelProvider.setShowFiles(showFiles); fShowFilesInLabelsAction.setChecked(showFiles); - fMethodToolbarManager.update(true); + fMemberToolbarManager.update(true); } public void init(IViewSite site, IMemento memento) throws PartInitException { @@ -347,14 +347,14 @@ public class THViewPart extends ViewPart { onContextMenuAboutToShow(m, false); } }); - menu = manager.createContextMenu(fMethodViewer.getControl()); - fMethodViewer.getControl().setMenu(menu); - site.registerContextMenu(CUIPlugin.ID_TYPE_HIERARCHY + ".methods", manager, fMethodViewer); //$NON-NLS-1$ + menu = manager.createContextMenu(fMemberViewer.getControl()); + fMemberViewer.getControl().setMenu(menu); + site.registerContextMenu(CUIPlugin.ID_TYPE_HIERARCHY + ".members", manager, fMemberViewer); //$NON-NLS-1$ } protected void onContextMenuAboutToShow(IMenuManager menu, boolean hierarchyView) { CUIPlugin.createStandardGroups(menu); - StructuredViewer viewer= hierarchyView ? (StructuredViewer) fHierarchyTreeViewer : fMethodViewer; + StructuredViewer viewer= hierarchyView ? (StructuredViewer) fHierarchyTreeViewer : fMemberViewer; final ICElement elem= selectionToElement(viewer.getSelection()); if (elem != null) { menu.appendToGroup(IContextMenuConstants.GROUP_OPEN, fOpenElement); @@ -400,31 +400,31 @@ public class THViewPart extends ViewPart { Control hierarchyControl= createHierarchyControl(fHierarchyViewForm); fHierarchyViewForm.setContent(hierarchyControl); - fMethodViewForm= new ViewForm(fSplitter, SWT.NONE); - Control methodControl= createMethodControl(fMethodViewForm); - fMethodViewForm.setContent(methodControl); + fMemberViewForm= new ViewForm(fSplitter, SWT.NONE); + Control memberControl= createMemberControl(fMemberViewForm); + fMemberViewForm.setContent(memberControl); - fMethodLabel = new CLabel(fMethodViewForm, SWT.NONE); - fMethodLabel.setText(Messages.THViewPart_MethodPane_title); - fMethodViewForm.setTopLeft(fMethodLabel); + fMemberLabel = new CLabel(fMemberViewForm, SWT.NONE); + fMemberLabel.setText(Messages.THViewPart_MethodPane_title); + fMemberViewForm.setTopLeft(fMemberLabel); } - private Control createMethodControl(ViewForm parent) { - fMethodLabelProvider= new CUILabelProvider(METHOD_LABEL_OPTIONS_SIMPLE, METHOD_ICON_OPTIONS); - fMethodViewer = new TableViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); - fMethodViewer.setContentProvider(new THMethodContentProvider()); - fMethodViewer.setLabelProvider(fMethodLabelProvider); - fMethodViewer.addOpenListener(new IOpenListener() { + private Control createMemberControl(ViewForm parent) { + fMemberLabelProvider= new CUILabelProvider(MEMBER_LABEL_OPTIONS_SIMPLE, MEMBER_ICON_OPTIONS); + fMemberViewer = new TableViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); + fMemberViewer.setContentProvider(new THMemberContentProvider()); + fMemberViewer.setLabelProvider(fMemberLabelProvider); + fMemberViewer.addOpenListener(new IOpenListener() { public void open(OpenEvent event) { onOpenElement(event.getSelection()); } }); - fMethodViewer.addSelectionChangedListener(new ISelectionChangedListener() { + fMemberViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(final SelectionChangedEvent event) { - onMethodSelectionChanged(event); + onMemberSelectionChanged(event); } }); - fMethodViewer.setSorter(new ViewerSorter() { + fMemberViewer.setSorter(new ViewerSorter() { public int category(Object element) { if (element instanceof ICElement) { ICElement celem= (ICElement)element; @@ -446,14 +446,17 @@ public class THViewPart extends ViewPart { } }); - ToolBar methodToolBar= new ToolBar(parent, SWT.FLAT | SWT.WRAP); - parent.setTopCenter(methodToolBar); - fMethodToolbarManager= new ToolBarManager(methodToolBar); - return fMethodViewer.getControl(); + ToolBar memberToolBar= new ToolBar(parent, SWT.FLAT | SWT.WRAP); + parent.setTopCenter(memberToolBar); + fMemberToolbarManager= new ToolBarManager(memberToolBar); + return fMemberViewer.getControl(); } - protected void onMethodSelectionChanged(SelectionChangedEvent event) { + protected void onMemberSelectionChanged(SelectionChangedEvent event) { 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) { THNode node= selectionToNode(event.getSelection()); fModel.onHierarchySelectionChanged(node); - fMethodViewer.refresh(); - updateDescription(); + updateView(); } } @@ -636,10 +638,10 @@ public class THViewPart extends ViewPart { fFieldFilterAction= new Action(Messages.THViewPart_HideFields_label, IAction.AS_CHECK_BOX) { public void run() { if (isChecked()) { - fMethodViewer.addFilter(fFieldFilter); + fMemberViewer.addFilter(fFieldFilter); } 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) { public void run() { if (isChecked()) { - fMethodViewer.addFilter(fStaticFilter); + fMemberViewer.addFilter(fStaticFilter); } 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) { public void run() { if (isChecked()) { - fMethodViewer.addFilter(fNonPublicFilter); + fMemberViewer.addFilter(fNonPublicFilter); } else { - fMethodViewer.removeFilter(fNonPublicFilter); + fMemberViewer.removeFilter(fNonPublicFilter); } } }; @@ -743,12 +745,12 @@ public class THViewPart extends ViewPart { mm.add(new Separator()); mm.add(fShowFilesInLabelsAction); - // method toolbar - fMethodToolbarManager.add(fShowInheritedMembersAction); - fMethodToolbarManager.add(new Separator()); - fMethodToolbarManager.add(fFieldFilterAction); - fMethodToolbarManager.add(fStaticFilterAction); - fMethodToolbarManager.add(fNonPublicFilterAction); + // member toolbar + fMemberToolbarManager.add(fShowInheritedMembersAction); + fMemberToolbarManager.add(new Separator()); + fMemberToolbarManager.add(fFieldFilterAction); + fMemberToolbarManager.add(fStaticFilterAction); + fMemberToolbarManager.add(fNonPublicFilterAction); } protected void onOpenElement(ISelection selection) { @@ -817,14 +819,14 @@ public class THViewPart extends ViewPart { Image image= null; THNode node= fModel.getSelectionInHierarchy(); if (node != null) { - elem= node.getRepresentedDeclaration(); + elem= node.getElement(); if (elem != null) { label= CElementLabels.getElementLabel(elem, 0); image= fHierarchyLabelProvider.getImage(elem); } } - fMethodLabel.setText(label); - fMethodLabel.setImage(image); + fMemberLabel.setText(label); + fMemberLabel.setImage(image); } } setContentDescription(message); @@ -854,21 +856,33 @@ public class THViewPart extends ViewPart { protected void onShowInheritedMembers(boolean show) { if (fModel.isShowInheritedMembers() != show) { fModel.setShowInheritedMembers(show); - fMethodLabelProvider.setTextFlags(show ? - METHOD_LABEL_OPTIONS_QUALIFIED : METHOD_LABEL_OPTIONS_SIMPLE); - fMethodViewer.refresh(); + fMemberLabelProvider.setTextFlags(show ? + MEMBER_LABEL_OPTIONS_QUALIFIED : MEMBER_LABEL_OPTIONS_SIMPLE); + updateViewers(); } } - - private void updateView() { + + private void updateViewers() { if (!fShowsMessage) { fIgnoreSelectionChanges++; try { fHierarchyTreeViewer.refresh(); - fMethodViewer.refresh(); + fMemberViewer.refresh(); + setSelections(); + } + finally { + fIgnoreSelectionChanges--; + } + } + } + + private void updateView() { + if (!fShowsMessage) { + fIgnoreSelectionChanges++; + try { + updateViewers(); updateDescription(); updateActionEnablement(); - setSelections(); } finally { fIgnoreSelectionChanges--; @@ -884,6 +898,10 @@ public class THViewPart extends ViewPart { fHierarchyTreeViewer.setSelection(new StructuredSelection(node)); fHierarchyTreeViewer.expandToLevel(node, 1); } + ICElement elem= fModel.getSelectedMember(); + if (elem != null) { + fMemberViewer.setSelection(new StructuredSelection(elem)); + } } finally { fIgnoreSelectionChanges--; @@ -947,8 +965,8 @@ public class THViewPart extends ViewPart { return fHierarchyTreeViewer; } - public TableViewer getMethodViewer() { - return fMethodViewer; + public TableViewer getMemberViewer() { + return fMemberViewer; } private void restoreOrientation(int orientation) { @@ -998,10 +1016,10 @@ public class THViewPart extends ViewPart { orientation= getBestOrientation(); } if (orientation == ORIENTATION_SINGLE) { - fMethodViewForm.setVisible(false); + fMemberViewForm.setVisible(false); } else { if (fCurrentViewOrientation == ORIENTATION_SINGLE) { - fMethodViewForm.setVisible(true); + fMemberViewForm.setVisible(true); } boolean horizontal= orientation == ORIENTATION_HORIZONTAL; fSplitter.setOrientation(horizontal ? SWT.HORIZONTAL : SWT.VERTICAL); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/TypeHierarchyUI.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/TypeHierarchyUI.java index aa08e8b47fa..be07093a29b 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/TypeHierarchyUI.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/TypeHierarchyUI.java @@ -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.index.IIndex; 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.ICProject; +import org.eclipse.cdt.core.model.IFunctionDeclaration; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.model.IWorkingCopy; import org.eclipse.cdt.ui.CUIPlugin; @@ -218,4 +220,21 @@ public class TypeHierarchyUI { } 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; + } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/CElementImageProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/CElementImageProvider.java index 091e6253060..f8ff8f793dc 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/CElementImageProvider.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/CElementImageProvider.java @@ -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 * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -444,12 +444,12 @@ public class CElementImageProvider { if ((renderFlags & OVERLAY_WARNING) !=0) { flags |= CElementImageDescriptor.WARNING; } - if ((renderFlags & OVERLAY_OVERRIDE) !=0) { - flags |= CElementImageDescriptor.OVERRIDES; - } - if ((renderFlags & OVERLAY_IMPLEMENTS) !=0) { - flags |= CElementImageDescriptor.IMPLEMENTS; - } +// if ((renderFlags & OVERLAY_OVERRIDE) !=0) { +// flags |= CElementImageDescriptor.OVERRIDES; +// } +// if ((renderFlags & OVERLAY_IMPLEMENTS) !=0) { +// flags |= CElementImageDescriptor.IMPLEMENTS; +// } return flags; } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementImageDescriptor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementImageDescriptor.java index a50477072a0..714294d4a38 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementImageDescriptor.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementImageDescriptor.java @@ -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 * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -49,7 +49,9 @@ public class CElementImageDescriptor extends CompositeImageDescriptor { /** Flag to render the static adornment */ public final static int STATIC= 0x008; - /** Flag to render the runnable adornment */ + /** + * @deprecated flag never had an effect + */ public final static int RUNNABLE= 0x010; /** Flag to render the waring adornment */ @@ -58,10 +60,14 @@ public class CElementImageDescriptor extends CompositeImageDescriptor { /** Flag to render the error adornment */ public final static int ERROR= 0x040; - /** Flag to render the 'override' adornment */ + /** + * @deprecated flag never had an effect + */ public final static int OVERRIDES= 0x080; - /** Flag to render the 'implements' adornment */ + /** + * @deprecated flag never had an effect + */ public final static int IMPLEMENTS= 0x100; /** 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 */ 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 int fFlags; private Point fSize; @@ -103,8 +112,8 @@ public class CElementImageDescriptor extends CompositeImageDescriptor { /** * Sets the descriptors adornments. Valid values are: ABSTRACT, FINAL, - * SYNCHRONIZED, STATIC, RUNNABLE, WARNING, - * ERROR, OVERRIDDEN, or any combination of those. + * STATIC, WARNING, + * ERROR, or any combination of those. * * @param adornments the image descritpors adornments */ @@ -199,6 +208,10 @@ public class CElementImageDescriptor extends CompositeImageDescriptor { x-= data.width; drawImage(data, x, 0); } + if ((fFlags & DEFINES) != 0) { + data= CPluginImages.DESC_OVR_DEFINES.getImageData(); + drawImage(data, 0, 0); + } if ((fFlags & TEMPLATE) != 0) { data= CPluginImages.DESC_OVR_TEMPLATE.getImageData(); x-= data.width; @@ -235,26 +248,16 @@ public class CElementImageDescriptor extends CompositeImageDescriptor { x-= data.width; drawImage(data, x, size.y-data.height); } - /*if ((fFlags & SYNCHRONIZED) != 0) { - data= CPluginImages.DESC_OVR_SYNCH.getImageData(); - x-= data.width; - drawImage(data, x, size.y - data.height); - } - if ((fFlags & RUNNABLE) != 0) { - data= CPluginImages.DESC_OVR_RUN.getImageData(); - x-= data.width; - 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); - } */ +// 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() {