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:
parent
df85b0a70c
commit
65af5a4620
13 changed files with 283 additions and 145 deletions
|
@ -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) {
|
||||
|
|
BIN
core/org.eclipse.cdt.ui/icons/ovr16/defines_co.gif
Normal file
BIN
core/org.eclipse.cdt.ui/icons/ovr16/defines_co.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 832 B |
|
@ -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$
|
||||
|
|
|
@ -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()]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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: <code>ABSTRACT</code>, <code>FINAL</code>,
|
||||
* <code>SYNCHRONIZED</code>, </code>STATIC<code>, </code>RUNNABLE<code>, </code>WARNING<code>,
|
||||
* </code>ERROR<code>, </code>OVERRIDDEN<code>, or any combination of those.
|
||||
* </code>STATIC<code>, </code>WARNING<code>,
|
||||
* </code>ERROR<code>, 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() {
|
||||
|
|
Loading…
Add table
Reference in a new issue