1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-13 03:05:39 +02:00

Bug 325623: Hide non-implementing leaves in quick type hierarchy.

This commit is contained in:
Markus Schorn 2010-09-28 09:15:23 +00:00
parent c72c78d35c
commit 62104189e0
4 changed files with 39 additions and 28 deletions

View file

@ -13,7 +13,6 @@ package org.eclipse.cdt.internal.ui.typehierarchy;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Iterator;
import java.util.List; import java.util.List;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
@ -71,10 +70,12 @@ class THHierarchyModel {
private Display fDisplay; private Display fDisplay;
private ITHModelPresenter fView; private ITHModelPresenter fView;
private WorkingSetFilterUI fFilter; private WorkingSetFilterUI fFilter;
private final boolean fHideNonImplementorLeaves;
public THHierarchyModel(ITHModelPresenter view, Display display) { public THHierarchyModel(ITHModelPresenter view, Display display, boolean hideNonImplementors) {
fDisplay= display; fDisplay= display;
fView= view; fView= view;
fHideNonImplementorLeaves= hideNonImplementors;
} }
public ICElement getInput() { public ICElement getInput() {
@ -201,8 +202,7 @@ class THHierarchyModel {
} }
} }
for (Iterator<THGraphNode> iterator = groots.iterator(); iterator.hasNext();) { for (THGraphNode gnode : groots) {
THGraphNode gnode = iterator.next();
THNode node = createNode(null, gnode, inputNode); THNode node = createNode(null, gnode, inputNode);
roots.add(node); roots.add(node);
stack.add(node); stack.add(node);
@ -216,8 +216,7 @@ class THHierarchyModel {
leafs.add(node); leafs.add(node);
} }
else { else {
for (Iterator<THGraphEdge> iterator = edges.iterator(); iterator.hasNext();) { for (THGraphEdge edge : edges) {
THGraphEdge edge = iterator.next();
THGraphNode gchildNode= fwd ? edge.getEndNode() : edge.getStartNode(); THGraphNode gchildNode= fwd ? edge.getEndNode() : edge.getStartNode();
THNode childNode= createNode(node, gchildNode, inputNode); THNode childNode= createNode(node, gchildNode, inputNode);
node.addChild(childNode); node.addChild(childNode);
@ -234,15 +233,22 @@ class THHierarchyModel {
} }
updateImplementors(); updateImplementors();
if (!fwd && fHideNonImplementorLeaves && fSelectedMember != null && fMemberSignatureToSelect != null)
removeNonImplementorLeaves(fRootNodes);
} }
private void removeFilteredLeafs(THNode[] rootNodes) { private void removeFilteredLeafs(THNode[] rootNodes) {
for (int i = 0; i < rootNodes.length; i++) { for (THNode node : rootNodes) {
THNode node = rootNodes[i];
node.removeFilteredLeafs(); node.removeFilteredLeafs();
} }
} }
private void removeNonImplementorLeaves(THNode[] rootNodes) {
for (THNode node : rootNodes) {
node.removeNonImplementorLeafs();
}
}
private THNode findSelection(THNode[] searchme) { private THNode findSelection(THNode[] searchme) {
THNode[] result= new THNode[2]; THNode[] result= new THNode[2];
findSelection(searchme, result); findSelection(searchme, result);
@ -252,9 +258,9 @@ class THHierarchyModel {
return result[1]; return result[1];
} }
private void findSelection(THNode[] seachme, THNode[] result) { private void findSelection(THNode[] searchme, THNode[] result) {
for (int i = 0; i < seachme.length; i++) { for (THNode element : searchme) {
findSelection(seachme[i], result); findSelection(element, result);
if (result[0] != null) { if (result[0] != null) {
break; break;
} }
@ -283,15 +289,13 @@ class THHierarchyModel {
if (gnode != null) { if (gnode != null) {
ICElement[] members= gnode.getMembers(fShowInheritedMembers); ICElement[] members= gnode.getMembers(fShowInheritedMembers);
if (members != null) { if (members != null) {
for (int i = 0; i < members.length; i++) { for (ICElement member : members) {
ICElement member= members[i];
if (member.equals(oldSelection)) { if (member.equals(oldSelection)) {
fSelectedMember= member; fSelectedMember= member;
return; return;
} }
} }
for (int i = 0; i < members.length; i++) { for (ICElement member : members) {
ICElement member= members[i];
if (fMemberSignatureToSelect.equals(TypeHierarchyUI.getLocalElementSignature(member))) { if (fMemberSignatureToSelect.equals(TypeHierarchyUI.getLocalElementSignature(member))) {
fSelectedMember= member; fSelectedMember= member;
return; return;
@ -383,8 +387,7 @@ class THHierarchyModel {
private void updateImplementors() { private void updateImplementors() {
if (fRootNodes != null) { if (fRootNodes != null) {
for (int i = 0; i < fRootNodes.length; i++) { for (THNode node : fRootNodes) {
THNode node = fRootNodes[i];
updateImplementors(node); updateImplementors(node);
} }
} }
@ -393,8 +396,7 @@ class THHierarchyModel {
private void updateImplementors(THNode node) { private void updateImplementors(THNode node) {
node.setIsImplementor(isImplementor(node.getElement())); node.setIsImplementor(isImplementor(node.getElement()));
THNode[] children= node.getChildren(); THNode[] children= node.getChildren();
for (int i = 0; i < children.length; i++) { for (THNode child : children) {
THNode child = children[i];
updateImplementors(child); updateImplementors(child);
} }
} }
@ -408,8 +410,7 @@ class THHierarchyModel {
if (gnode != null) { if (gnode != null) {
ICElement[] members= gnode.getMembers(false); ICElement[] members= gnode.getMembers(false);
if (members != null) { if (members != null) {
for (int i = 0; i < members.length; i++) { for (ICElement member : members) {
ICElement member = members[i];
if (member == fSelectedMember) { if (member == fSelectedMember) {
return true; return true;
} }

View file

@ -56,7 +56,7 @@ public class THInformationControl extends AbstractInformationControl implements
@Override @Override
protected TreeViewer createTreeViewer(Composite parent, int style) { protected TreeViewer createTreeViewer(Composite parent, int style) {
Display display= getShell().getDisplay(); Display display= getShell().getDisplay();
fModel= new THHierarchyModel(this, display); fModel= new THHierarchyModel(this, display, true);
fHierarchyLabelProvider= new THLabelProvider(display, fModel); fHierarchyLabelProvider= new THLabelProvider(display, fModel);
fHierarchyLabelProvider.setMarkImplementers(false); fHierarchyLabelProvider.setMarkImplementers(false);
fHierarchyTreeViewer = new TreeViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); 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(); THNode selection= fModel.getSelectionInHierarchy();
if (selection != null) { if (selection != null) {
fHierarchyTreeViewer.setSelection(new StructuredSelection(selection)); fHierarchyTreeViewer.setSelection(new StructuredSelection(selection));
fHierarchyTreeViewer.expandToLevel(selection, 1); fHierarchyTreeViewer.expandToLevel(selection, 2);
} }
break; break;
} }
@ -176,8 +176,8 @@ public class THInformationControl extends AbstractInformationControl implements
} }
private THNode findElement(TreeItem[] items) { private THNode findElement(TreeItem[] items) {
for (int i= 0; i < items.length; i++) { for (TreeItem item2 : items) {
Object item= items[i].getData(); Object item= item2.getData();
THNode element= null; THNode element= null;
if (item instanceof THNode) { if (item instanceof THNode) {
element= (THNode)item; element= (THNode)item;
@ -188,7 +188,7 @@ public class THInformationControl extends AbstractInformationControl implements
if (fStringMatcher.match(label)) if (fStringMatcher.match(label))
return element; return element;
} }
element= findElement(items[i].getItems()); element= findElement(item2.getItems());
if (element != null) if (element != null)
return element; return element;
} }

View file

@ -129,5 +129,15 @@ public class THNode implements IAdaptable {
} }
} }
} }
public void removeNonImplementorLeafs() {
for (Iterator<THNode> iterator = fChildren.iterator(); iterator.hasNext();) {
THNode child = iterator.next();
child.removeNonImplementorLeafs();
if (!child.isImplementor() && !child.hasChildren()) {
iterator.remove();
}
}
}
} }

View file

@ -525,7 +525,7 @@ public class THViewPart extends ViewPart implements ITHModelPresenter {
private Control createHierarchyControl(ViewForm parent) { private Control createHierarchyControl(ViewForm parent) {
Display display= getSite().getShell().getDisplay(); Display display= getSite().getShell().getDisplay();
fModel= new THHierarchyModel(this, display); fModel= new THHierarchyModel(this, display, false);
fHierarchyLabelProvider= new THLabelProvider(display, fModel); fHierarchyLabelProvider= new THLabelProvider(display, fModel);
fHierarchyTreeViewer = new TreeViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); fHierarchyTreeViewer = new TreeViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
fHierarchyTreeViewer.setContentProvider(new THContentProvider()); fHierarchyTreeViewer.setContentProvider(new THContentProvider());