From 62104189e03fe0351f32aacdef34af16c0f924fc Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Tue, 28 Sep 2010 09:15:23 +0000 Subject: [PATCH] Bug 325623: Hide non-implementing leaves in quick type hierarchy. --- .../ui/typehierarchy/THHierarchyModel.java | 45 ++++++++++--------- .../typehierarchy/THInformationControl.java | 10 ++--- .../cdt/internal/ui/typehierarchy/THNode.java | 10 +++++ .../internal/ui/typehierarchy/THViewPart.java | 2 +- 4 files changed, 39 insertions(+), 28 deletions(-) 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 bb656d97199..5efc791e2ff 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 @@ -13,7 +13,6 @@ package org.eclipse.cdt.internal.ui.typehierarchy; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.CoreException; @@ -71,10 +70,12 @@ class THHierarchyModel { private Display fDisplay; private ITHModelPresenter fView; private WorkingSetFilterUI fFilter; + private final boolean fHideNonImplementorLeaves; - public THHierarchyModel(ITHModelPresenter view, Display display) { + public THHierarchyModel(ITHModelPresenter view, Display display, boolean hideNonImplementors) { fDisplay= display; fView= view; + fHideNonImplementorLeaves= hideNonImplementors; } public ICElement getInput() { @@ -121,7 +122,7 @@ class THHierarchyModel { fSelectedTypeNode= null; fTypeToSelect= input; } - + synchronized public void computeGraph() { if (fJob != null) { fJob.cancel(); @@ -201,8 +202,7 @@ class THHierarchyModel { } } - for (Iterator iterator = groots.iterator(); iterator.hasNext();) { - THGraphNode gnode = iterator.next(); + for (THGraphNode gnode : groots) { THNode node = createNode(null, gnode, inputNode); roots.add(node); stack.add(node); @@ -216,8 +216,7 @@ class THHierarchyModel { leafs.add(node); } else { - for (Iterator iterator = edges.iterator(); iterator.hasNext();) { - THGraphEdge edge = iterator.next(); + for (THGraphEdge edge : edges) { THGraphNode gchildNode= fwd ? edge.getEndNode() : edge.getStartNode(); THNode childNode= createNode(node, gchildNode, inputNode); node.addChild(childNode); @@ -234,15 +233,22 @@ class THHierarchyModel { } updateImplementors(); + if (!fwd && fHideNonImplementorLeaves && fSelectedMember != null && fMemberSignatureToSelect != null) + removeNonImplementorLeaves(fRootNodes); } private void removeFilteredLeafs(THNode[] rootNodes) { - for (int i = 0; i < rootNodes.length; i++) { - THNode node = rootNodes[i]; + for (THNode node : rootNodes) { node.removeFilteredLeafs(); } } + private void removeNonImplementorLeaves(THNode[] rootNodes) { + for (THNode node : rootNodes) { + node.removeNonImplementorLeafs(); + } + } + private THNode findSelection(THNode[] searchme) { THNode[] result= new THNode[2]; findSelection(searchme, result); @@ -252,9 +258,9 @@ class THHierarchyModel { return result[1]; } - private void findSelection(THNode[] seachme, THNode[] result) { - for (int i = 0; i < seachme.length; i++) { - findSelection(seachme[i], result); + private void findSelection(THNode[] searchme, THNode[] result) { + for (THNode element : searchme) { + findSelection(element, result); if (result[0] != null) { break; } @@ -283,15 +289,13 @@ class THHierarchyModel { if (gnode != null) { ICElement[] members= gnode.getMembers(fShowInheritedMembers); if (members != null) { - for (int i = 0; i < members.length; i++) { - ICElement member= members[i]; + for (ICElement member : members) { if (member.equals(oldSelection)) { fSelectedMember= member; return; } } - for (int i = 0; i < members.length; i++) { - ICElement member= members[i]; + for (ICElement member : members) { if (fMemberSignatureToSelect.equals(TypeHierarchyUI.getLocalElementSignature(member))) { fSelectedMember= member; return; @@ -383,8 +387,7 @@ class THHierarchyModel { private void updateImplementors() { if (fRootNodes != null) { - for (int i = 0; i < fRootNodes.length; i++) { - THNode node = fRootNodes[i]; + for (THNode node : fRootNodes) { updateImplementors(node); } } @@ -393,8 +396,7 @@ class THHierarchyModel { 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]; + for (THNode child : children) { updateImplementors(child); } } @@ -408,8 +410,7 @@ class THHierarchyModel { if (gnode != null) { ICElement[] members= gnode.getMembers(false); if (members != null) { - for (int i = 0; i < members.length; i++) { - ICElement member = members[i]; + for (ICElement member : members) { if (member == fSelectedMember) { return true; } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THInformationControl.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THInformationControl.java index eb69ccd4cb9..71a98501364 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THInformationControl.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THInformationControl.java @@ -56,7 +56,7 @@ public class THInformationControl extends AbstractInformationControl implements @Override protected TreeViewer createTreeViewer(Composite parent, int style) { Display display= getShell().getDisplay(); - fModel= new THHierarchyModel(this, display); + fModel= new THHierarchyModel(this, display, true); fHierarchyLabelProvider= new THLabelProvider(display, fModel); fHierarchyLabelProvider.setMarkImplementers(false); fHierarchyTreeViewer = new TreeViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); @@ -151,7 +151,7 @@ public class THInformationControl extends AbstractInformationControl implements THNode selection= fModel.getSelectionInHierarchy(); if (selection != null) { fHierarchyTreeViewer.setSelection(new StructuredSelection(selection)); - fHierarchyTreeViewer.expandToLevel(selection, 1); + fHierarchyTreeViewer.expandToLevel(selection, 2); } break; } @@ -176,8 +176,8 @@ public class THInformationControl extends AbstractInformationControl implements } private THNode findElement(TreeItem[] items) { - for (int i= 0; i < items.length; i++) { - Object item= items[i].getData(); + for (TreeItem item2 : items) { + Object item= item2.getData(); THNode element= null; if (item instanceof THNode) { element= (THNode)item; @@ -188,7 +188,7 @@ public class THInformationControl extends AbstractInformationControl implements if (fStringMatcher.match(label)) return element; } - element= findElement(items[i].getItems()); + element= findElement(item2.getItems()); if (element != null) return element; } 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 3d5bae18aa3..9b22c8a89df 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 @@ -129,5 +129,15 @@ public class THNode implements IAdaptable { } } } + + public void removeNonImplementorLeafs() { + for (Iterator iterator = fChildren.iterator(); iterator.hasNext();) { + THNode child = iterator.next(); + child.removeNonImplementorLeafs(); + if (!child.isImplementor() && !child.hasChildren()) { + iterator.remove(); + } + } + } } 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 8588a0a862d..b7e779eb0c1 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 @@ -525,7 +525,7 @@ public class THViewPart extends ViewPart implements ITHModelPresenter { private Control createHierarchyControl(ViewForm parent) { Display display= getSite().getShell().getDisplay(); - fModel= new THHierarchyModel(this, display); + fModel= new THHierarchyModel(this, display, false); fHierarchyLabelProvider= new THLabelProvider(display, fModel); fHierarchyTreeViewer = new TreeViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); fHierarchyTreeViewer.setContentProvider(new THContentProvider());