diff --git a/core/org.eclipse.cdt.ui/plugin.properties b/core/org.eclipse.cdt.ui/plugin.properties
index 2f468d06c39..61f63932855 100644
--- a/core/org.eclipse.cdt.ui/plugin.properties
+++ b/core/org.eclipse.cdt.ui/plugin.properties
@@ -191,6 +191,9 @@ ActionDefinition.addInclude.description= Create include statement on selection
ActionDefinition.showOutline.name= Show outline
ActionDefinition.showOutline.description= Shows outline
+ActionDefinition.showQuickTypeHierarchy.name= Quick Type Hierarchy
+ActionDefinition.showQuickTypeHierarchy.description= Shows quick type hierarchy
+
CElementWorkingSetPage.name = C/C++
CEditorFontDefinition.description = The C/C++ editor text font is used by C/C++ editors.
diff --git a/core/org.eclipse.cdt.ui/plugin.xml b/core/org.eclipse.cdt.ui/plugin.xml
index 28ee3dc819d..1d1590a7345 100644
--- a/core/org.eclipse.cdt.ui/plugin.xml
+++ b/core/org.eclipse.cdt.ui/plugin.xml
@@ -992,6 +992,11 @@
contextId="org.eclipse.cdt.ui.cEditorScope"
commandId="org.eclipse.cdt.ui.edit.open.outline"
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
+
+
+
0) {
- display.asyncExec(new Runnable() {
- public void run() {
- openInViewPart(editor.getSite().getWorkbenchWindow(), elems);
- }});
+ ICElement inputCElement = CUIPlugin.getDefault().getWorkingCopyManager().getWorkingCopy(editor.getEditorInput());
+ if (inputCElement != null) {
+ final ICProject project= inputCElement.getCProject();
+ final IEditorInput editorInput = editor.getEditorInput();
+ final Display display= Display.getCurrent();
+
+ Job job= new Job(CHMessages.CallHierarchyUI_label) {
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ final ICElement[] elems= findDefinitions(project, editorInput, sel);
+ if (elems != null && elems.length > 0) {
+ display.asyncExec(new Runnable() {
+ public void run() {
+ openInViewPart(editor.getSite().getWorkbenchWindow(), elems);
+ }});
+ }
+ return Status.OK_STATUS;
+ }
+ catch (CoreException e) {
+ return e.getStatus();
}
- return Status.OK_STATUS;
- }
- catch (CoreException e) {
- return e.getStatus();
}
- }
- };
- job.setUser(true);
- job.schedule();
+ };
+ job.setUser(true);
+ job.schedule();
+ }
}
}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/OpenCallHierarchyAction.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/OpenCallHierarchyAction.java
index 8d3e63ea2e3..aae048b5145 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/OpenCallHierarchyAction.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/OpenCallHierarchyAction.java
@@ -15,20 +15,20 @@ import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IWorkbenchSite;
+import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.IEnumeration;
import org.eclipse.cdt.core.model.IEnumerator;
import org.eclipse.cdt.core.model.IFunctionDeclaration;
import org.eclipse.cdt.core.model.IVariableDeclaration;
+import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.actions.SelectionDispatchAction;
-import org.eclipse.cdt.internal.ui.editor.CEditor;
-
public class OpenCallHierarchyAction extends SelectionDispatchAction {
- private CEditor fEditor;
+ private ITextEditor fEditor;
public OpenCallHierarchyAction(IWorkbenchSite site) {
super(site);
@@ -36,10 +36,10 @@ public class OpenCallHierarchyAction extends SelectionDispatchAction {
setToolTipText(CHMessages.OpenCallHierarchyAction_tooltip);
}
- public OpenCallHierarchyAction(CEditor editor) {
+ public OpenCallHierarchyAction(ITextEditor editor) {
this(editor.getSite());
fEditor= editor;
- setEnabled(fEditor != null && fEditor.getInputCElement() != null);
+ setEnabled(fEditor != null && CUIPlugin.getDefault().getWorkingCopyManager().getWorkingCopy(editor.getEditorInput()) != null);
}
public void run(ITextSelection sel) {
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java
index a939ea0085b..e59b872e0fa 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java
@@ -2293,7 +2293,11 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IR
action = new TextOperationAction(CEditorMessages.getResourceBundle(), "OpenOutline.", this, CSourceViewer.SHOW_OUTLINE, true); //$NON-NLS-1$
action.setActionDefinitionId(ICEditorActionDefinitionIds.OPEN_OUTLINE);
setAction("OpenOutline", action); //$NON-NLS-1$*/
-
+
+ action = new TextOperationAction(CEditorMessages.getResourceBundle(), "OpenHierarchy.", this, CSourceViewer.SHOW_HIERARCHY, true); //$NON-NLS-1$
+ action.setActionDefinitionId(ICEditorActionDefinitionIds.OPEN_QUICK_TYPE_HIERARCHY);
+ setAction("OpenHierarchy", action); //$NON-NLS-1$*/
+
action = new GoToNextPreviousMemberAction(CEditorMessages.getResourceBundle(), "GotoNextMember.", this, true); //$NON-NLS-1$
action.setActionDefinitionId(ICEditorActionDefinitionIds.GOTO_NEXT_MEMBER);
setAction(GoToNextPreviousMemberAction.PREVIOUS_MEMBER, action);
@@ -2340,6 +2344,7 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IR
addAction(menu, IContextMenuConstants.GROUP_OPEN, "OpenCallHierarchy"); //$NON-NLS-1$
addAction(menu, IContextMenuConstants.GROUP_OPEN, "OpenOutline"); //$NON-NLS-1$
+ addAction(menu, IContextMenuConstants.GROUP_OPEN, "OpenHierarchy"); //$NON-NLS-1$
}
ActionContext context= new ActionContext(getSelectionProvider().getSelection());
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditorMessages.properties b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditorMessages.properties
index f07fd8dc952..6b9f44140c8 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditorMessages.properties
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditorMessages.properties
@@ -41,6 +41,10 @@ OpenOutline.label= Quick Out&line
OpenOutline.tooltip= Shows the Quick Outline of Editor Input
OpenOutline.description= Shows the quick outline for the editor input
+OpenHierarchy.label= Quick Type Hierarchy
+OpenHierarchy.tooltip= Shows the Quick Type Hierarchy of Editor Input
+OpenHierarchy.description= Shows the quick type hierarchy for the editor input
+
TogglePresentation.label=Show Source of Selected Element Only
TogglePresentation.tooltip=Show Source of Selected Element Only
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CSourceViewer.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CSourceViewer.java
index 19387b0a53e..0ac1b3859d3 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CSourceViewer.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CSourceViewer.java
@@ -52,9 +52,12 @@ public class CSourceViewer extends ProjectionViewer implements IPropertyChangeLi
/** Show outline operation id. */
public static final int SHOW_OUTLINE = 101;
+ public static final int SHOW_HIERARCHY = 102;
/** Presents outline. */
private IInformationPresenter fOutlinePresenter;
+ /** Presents type hierarchy. */
+ private IInformationPresenter fHierarchyPresenter;
private List fTextConverters;
private boolean fIgnoreTextConverters= false;
@@ -147,6 +150,9 @@ public class CSourceViewer extends ProjectionViewer implements IPropertyChangeLi
fOutlinePresenter= cConfiguration.getOutlinePresenter(this);
if (fOutlinePresenter != null)
fOutlinePresenter.install(this);
+ fHierarchyPresenter= cConfiguration.getHierarchyPresenter(this);
+ if (fHierarchyPresenter != null)
+ fHierarchyPresenter.install(this);
}
if (fPreferenceStore != null) {
fPreferenceStore.addPropertyChangeListener(this);
@@ -241,6 +247,10 @@ public class CSourceViewer extends ProjectionViewer implements IPropertyChangeLi
if (fOutlinePresenter != null) {
fOutlinePresenter.uninstall();
fOutlinePresenter= null;
+ }
+ if (fHierarchyPresenter != null) {
+ fHierarchyPresenter.uninstall();
+ fHierarchyPresenter= null;
}
if (fForegroundColor != null) {
fForegroundColor.dispose();
@@ -308,6 +318,9 @@ public class CSourceViewer extends ProjectionViewer implements IPropertyChangeLi
case SHOW_OUTLINE:
fOutlinePresenter.showInformation();
return;
+ case SHOW_HIERARCHY:
+ fHierarchyPresenter.showInformation();
+ return;
case UNDO:
fIgnoreTextConverters= true;
super.doOperation(operation);
@@ -329,6 +342,9 @@ public class CSourceViewer extends ProjectionViewer implements IPropertyChangeLi
if (operation == SHOW_OUTLINE) {
return fOutlinePresenter != null;
}
+ else if (operation == SHOW_HIERARCHY) {
+ return fHierarchyPresenter != null;
+ }
return super.canDoOperation(operation);
}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ICEditorActionDefinitionIds.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ICEditorActionDefinitionIds.java
index 4c91af299e9..eb3342a1ef8 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ICEditorActionDefinitionIds.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ICEditorActionDefinitionIds.java
@@ -127,6 +127,12 @@ public interface ICEditorActionDefinitionIds extends ITextEditorActionDefinition
*/
public static final String OPEN_TYPE_HIERARCHY= "org.eclipse.cdt.ui.edit.open.type.hierarchy"; //$NON-NLS-1$
+ /**
+ * Action definition ID of the navigate -> open type hierarchy action
+ * (value "org.eclipse.cdt.ui.edit.text.c.open.quick.type.hierarchy"
).
+ */
+ public static final String OPEN_QUICK_TYPE_HIERARCHY= "org.eclipse.cdt.ui.edit.open.quick.type.hierarchy"; //$NON-NLS-1$
+
/**
* Action definition ID of the navigate -> open action
* (value "org.eclipse.cdt.ui.edit.text.c.open.editor"
).
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java
index 9017b18fb24..3860ce5218a 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java
@@ -83,6 +83,8 @@ import org.eclipse.cdt.internal.ui.text.c.hover.CEditorTextHoverDescriptor;
import org.eclipse.cdt.internal.ui.text.c.hover.CEditorTextHoverProxy;
import org.eclipse.cdt.internal.ui.text.contentassist.CContentAssistProcessor;
import org.eclipse.cdt.internal.ui.text.contentassist.ContentAssistPreference;
+import org.eclipse.cdt.internal.ui.typehierarchy.THInformationControl;
+import org.eclipse.cdt.internal.ui.typehierarchy.THInformationProvider;
import org.eclipse.cdt.internal.ui.util.ExternalEditorInput;
@@ -258,6 +260,26 @@ public class CSourceViewerConfiguration extends TextSourceViewerConfiguration {
return presenter;
}
+ /**
+ * Creates outline presenter.
+ * @return Presenter with outline view.
+ */
+ public IInformationPresenter getHierarchyPresenter(ISourceViewer sourceViewer) {
+ final IInformationControlCreator hierarchyControlCreator = getHierarchyControlCreator();
+ final InformationPresenter presenter = new InformationPresenter(hierarchyControlCreator);
+ presenter.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
+ presenter.setAnchor(AbstractInformationControlManager.ANCHOR_GLOBAL);
+ final IInformationProvider provider = new THInformationProvider(getEditor());
+ presenter.setInformationProvider(provider, IDocument.DEFAULT_CONTENT_TYPE);
+ presenter.setInformationProvider(provider, ICPartitions.C_MULTI_LINE_COMMENT);
+ presenter.setInformationProvider(provider, ICPartitions.C_SINGLE_LINE_COMMENT);
+ presenter.setInformationProvider(provider, ICPartitions.C_STRING);
+ presenter.setInformationProvider(provider, ICPartitions.C_CHARACTER);
+ presenter.setInformationProvider(provider, ICPartitions.C_PREPROCESSOR);
+ presenter.setSizeConstraints(50, 20, true, false);
+ return presenter;
+ }
+
/**
* Initializes the scanners.
*/
@@ -732,7 +754,25 @@ public class CSourceViewerConfiguration extends TextSourceViewerConfiguration {
};
return conrolCreator;
}
-
+
+ /**
+ * Creates control for outline presentation in editor.
+ * @return Control.
+ */
+ private IInformationControlCreator getHierarchyControlCreator() {
+ final IInformationControlCreator conrolCreator = new IInformationControlCreator() {
+ /**
+ * @see org.eclipse.jface.text.IInformationControlCreator#createInformationControl(org.eclipse.swt.widgets.Shell)
+ */
+ public IInformationControl createInformationControl(Shell parent) {
+ int shellStyle= SWT.RESIZE;
+ int treeStyle= SWT.V_SCROLL | SWT.H_SCROLL;
+ return new THInformationControl(parent, shellStyle, treeStyle);
+ }
+ };
+ return conrolCreator;
+ }
+
protected ILanguage getLanguage() {
if (fTextEditor == null) {
return null;
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/ITHModelPresenter.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/ITHModelPresenter.java
new file mode 100644
index 00000000000..8cb816b197f
--- /dev/null
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/ITHModelPresenter.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2007 Wind River Systems, Inc. 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Markus Schorn - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.internal.ui.typehierarchy;
+
+import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
+
+public interface ITHModelPresenter {
+
+ void setMessage(String msg);
+
+ void onEvent(int event);
+
+ IWorkbenchSiteProgressService getProgressService();
+}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/Messages.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/Messages.java
index 3c6b7b22e67..c01fab1bf71 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/Messages.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/Messages.java
@@ -26,6 +26,8 @@ public class Messages extends NLS {
public static String THHistoryListAction_HistoryList_title;
public static String THHistoryListAction_label;
public static String THHistoryListAction_Remove;
+ public static String THInformationControl_regularTitle;
+ public static String THInformationControl_showDefiningTypesTitle;
public static String THViewPart_AutomaticOrientation;
public static String THViewPart_Cancel;
public static String THViewPart_Cancel_tooltip;
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/OpenTypeHierarchyAction.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/OpenTypeHierarchyAction.java
index 8b431124886..4aead521eeb 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/OpenTypeHierarchyAction.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/OpenTypeHierarchyAction.java
@@ -15,16 +15,17 @@ import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IWorkbenchSite;
+import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.cdt.core.model.ICElement;
+import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.actions.SelectionDispatchAction;
-import org.eclipse.cdt.internal.ui.editor.CEditor;
public class OpenTypeHierarchyAction extends SelectionDispatchAction {
- private CEditor fEditor;
+ private ITextEditor fEditor;
public OpenTypeHierarchyAction(IWorkbenchSite site) {
super(site);
@@ -32,10 +33,10 @@ public class OpenTypeHierarchyAction extends SelectionDispatchAction {
setToolTipText(Messages.OpenTypeHierarchyAction_tooltip);
}
- public OpenTypeHierarchyAction(CEditor editor) {
+ public OpenTypeHierarchyAction(ITextEditor editor) {
this(editor.getSite());
fEditor= editor;
- setEnabled(fEditor != null && fEditor.getInputCElement() != null);
+ setEnabled(fEditor != null && CUIPlugin.getDefault().getWorkingCopyManager().getWorkingCopy(editor.getEditorInput()) != null);
}
public void run(ITextSelection sel) {
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 493a8154ed8..197ded42403 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
@@ -70,7 +70,7 @@ class THGraph {
}
private THGraphEdge addEdge(THGraphNode from, THGraphNode to) {
- if (createsLoop(from, to)) {
+ if (createsLoopOrIsDuplicate(from, to)) {
return null;
}
THGraphEdge edge= new THGraphEdge(from, to);
@@ -81,7 +81,7 @@ class THGraph {
return edge;
}
- private boolean createsLoop(THGraphNode from, THGraphNode to) {
+ private boolean createsLoopOrIsDuplicate(THGraphNode from, THGraphNode to) {
if (from == to) {
return true;
}
@@ -107,6 +107,14 @@ class THGraph {
}
}
}
+ // check if edge is already there.
+ List out= from.getOutgoing();
+ for (Iterator iterator = out.iterator(); iterator.hasNext();) {
+ THGraphEdge edge = (THGraphEdge) iterator.next();
+ if (edge.getEndNode() == to) {
+ return true;
+ }
+ }
return false;
}
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 2d61d0ad2eb..8392f9ee388 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
@@ -68,10 +68,10 @@ class THHierarchyModel {
private Job fJob;
private Display fDisplay;
- private THViewPart fView;
+ private ITHModelPresenter fView;
private WorkingSetFilterUI fFilter;
- public THHierarchyModel(THViewPart view, Display display) {
+ public THHierarchyModel(ITHModelPresenter view, Display display) {
fDisplay= display;
fView= view;
}
@@ -127,7 +127,7 @@ class THHierarchyModel {
}
fJob= new BackgroundJob();
fJob.setRule(RULE);
- IWorkbenchSiteProgressService ps= (IWorkbenchSiteProgressService) fView.getSite().getAdapter(IWorkbenchSiteProgressService.class);
+ IWorkbenchSiteProgressService ps= fView.getProgressService();
if (ps != null) {
ps.schedule(fJob, 0L, true);
}
@@ -395,8 +395,7 @@ class THHierarchyModel {
private boolean isImplementor(ICElement element) {
if (element == null
- || fSelectedMember == null || fMemberSignatureToSelect == null
- || fGraph.isTrivial()) {
+ || fSelectedMember == null || fMemberSignatureToSelect == null) {
return false;
}
THGraphNode gnode= fGraph.getNode(element);
@@ -420,4 +419,11 @@ class THHierarchyModel {
public ICElement getSelectedMember() {
return fSelectedMember;
}
+
+ public boolean hasTrivialHierarchy() {
+ if (fRootNodes == null || fRootNodes.length == 0) {
+ return true;
+ }
+ return fRootNodes.length == 1 && !fRootNodes[0].hasChildren();
+ }
}
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
new file mode 100644
index 00000000000..7a18642e22b
--- /dev/null
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THInformationControl.java
@@ -0,0 +1,183 @@
+/*******************************************************************************
+ * Copyright (c) 2007 Wind River Systems, Inc. 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Markus Schorn - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.internal.ui.typehierarchy;
+
+import java.util.Iterator;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
+
+import com.ibm.icu.text.MessageFormat;
+
+import org.eclipse.cdt.core.model.CModelException;
+import org.eclipse.cdt.core.model.ICElement;
+import org.eclipse.cdt.ui.CUIPlugin;
+
+import org.eclipse.cdt.internal.ui.editor.ICEditorActionDefinitionIds;
+import org.eclipse.cdt.internal.ui.text.AbstractInformationControl;
+import org.eclipse.cdt.internal.ui.viewsupport.EditorOpener;
+
+public class THInformationControl extends AbstractInformationControl implements ITHModelPresenter {
+
+ private THHierarchyModel fModel;
+ private THLabelProvider fHierarchyLabelProvider;
+ private TreeViewer fHierarchyTreeViewer;
+
+ public THInformationControl(Shell parent, int shellStyle, int treeStyle) {
+ super(parent, shellStyle, treeStyle, ICEditorActionDefinitionIds.OPEN_QUICK_TYPE_HIERARCHY, true);
+ }
+
+ protected boolean hasHeader() {
+ return true;
+ }
+
+ protected TreeViewer createTreeViewer(Composite parent, int style) {
+ Display display= getShell().getDisplay();
+ fModel= new THHierarchyModel(this, display);
+ fHierarchyLabelProvider= new THLabelProvider(display, fModel);
+ fHierarchyLabelProvider.setMarkImplementers(false);
+ fHierarchyTreeViewer = new TreeViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+ fHierarchyTreeViewer.setContentProvider(new THContentProvider());
+ fHierarchyTreeViewer.setLabelProvider(fHierarchyLabelProvider);
+ fHierarchyTreeViewer.setSorter(new ViewerSorter());
+ fHierarchyTreeViewer.setUseHashlookup(true);
+ return fHierarchyTreeViewer;
+ }
+
+ protected void onOpenElement(ISelection selection) {
+ ICElement elem= (ICElement) getSelectedElement();
+ if (elem != null) {
+ try {
+ EditorOpener.open(CUIPlugin.getActivePage(), elem);
+ } catch (CModelException e) {
+ CUIPlugin.getDefault().log(e);
+ }
+ }
+ }
+
+ public void setInput(Object input) {
+ if (input instanceof ICElement[]) {
+ ICElement[] splitInput= (ICElement[]) input;
+ if (TypeHierarchyUI.isValidTypeInput(splitInput[0])) {
+ fModel.setInput(splitInput[0], splitInput[1]);
+ fHierarchyLabelProvider.setHideNonImplementers(splitInput[1] != null);
+ fHierarchyTreeViewer.setInput(fModel);
+ fModel.computeGraph();
+ String msgfmt= Messages.THInformationControl_regularTitle;
+ String obj= splitInput[0].getElementName();
+ if (splitInput[1] != null) {
+ msgfmt= Messages.THInformationControl_showDefiningTypesTitle;
+ obj= splitInput[1].getElementName();
+ }
+ String title= MessageFormat.format(msgfmt, new Object[] {obj});
+ setTitleText(title);
+ }
+ }
+ }
+
+ protected String getId() {
+ return "org.eclipse.cdt.internal.ui.typehierarchy.QuickHierarchy"; //$NON-NLS-1$
+ }
+
+ protected Object getSelectedElement() {
+ THNode node= selectionToNode(fHierarchyTreeViewer.getSelection());
+ if (node != null) {
+ ICElement elem= node.getElement();
+ if (node.isImplementor()) {
+ fModel.onHierarchySelectionChanged(node);
+ ICElement melem= fModel.getSelectedMember();
+ if (melem != null) {
+ return melem;
+ }
+ }
+ return elem;
+ }
+ return null;
+ }
+
+ private THNode selectionToNode(ISelection selection) {
+ if (selection instanceof IStructuredSelection) {
+ IStructuredSelection ss= (IStructuredSelection) selection;
+ for (Iterator iter = ss.iterator(); iter.hasNext(); ) {
+ Object cand= iter.next();
+ if (cand instanceof THNode) {
+ return (THNode) cand;
+ }
+ }
+ }
+ return null;
+ }
+
+ public void onEvent(int event) {
+ switch (event) {
+ case THHierarchyModel.END_OF_COMPUTATION:
+ if (fModel.hasTrivialHierarchy()) {
+ fHierarchyLabelProvider.setHideNonImplementers(false);
+ }
+ fHierarchyTreeViewer.refresh();
+ THNode selection= fModel.getSelectionInHierarchy();
+ if (selection != null) {
+ fHierarchyTreeViewer.setSelection(new StructuredSelection(selection));
+ fHierarchyTreeViewer.expandToLevel(selection, 1);
+ }
+ break;
+ }
+ }
+
+ public void setMessage(String msg) {
+ }
+
+ public IWorkbenchSiteProgressService getProgressService() {
+ return null;
+ }
+
+ protected void selectFirstMatch() {
+ Tree tree= fHierarchyTreeViewer.getTree();
+ Object element= findElement(tree.getItems());
+ if (element != null)
+ fHierarchyTreeViewer.setSelection(new StructuredSelection(element), true);
+ else
+ fHierarchyTreeViewer.setSelection(StructuredSelection.EMPTY);
+ }
+
+ private THNode findElement(TreeItem[] items) {
+ for (int i= 0; i < items.length; i++) {
+ Object item= items[i].getData();
+ THNode element= null;
+ if (item instanceof THNode) {
+ element= (THNode)item;
+ if (fStringMatcher == null)
+ return element;
+
+ if (element != null) {
+ String label= fHierarchyLabelProvider.getText(element);
+ if (fStringMatcher.match(label))
+ return element;
+ }
+ }
+ element= findElement(items[i].getItems());
+ if (element != null)
+ return element;
+ }
+ return null;
+ }
+}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THInformationProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THInformationProvider.java
new file mode 100644
index 00000000000..a2555339068
--- /dev/null
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THInformationProvider.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2007 Wind River Systems, Inc. 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Markus Schorn - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.internal.ui.typehierarchy;
+
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.information.IInformationProvider;
+import org.eclipse.jface.text.information.IInformationProviderExtension;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+public class THInformationProvider implements IInformationProviderExtension, IInformationProvider {
+
+ private ITextEditor fEditor;
+
+ public THInformationProvider(ITextEditor editor) {
+ fEditor= editor;
+ }
+
+ public Object getInformation2(ITextViewer textViewer, IRegion subject) {
+ return fEditor == null ? null : TypeHierarchyUI.getInput(fEditor, subject);
+ }
+
+ public String getInformation(ITextViewer textViewer, IRegion subject) {
+ return null;
+ }
+
+ public IRegion getSubject(ITextViewer textViewer, int offset) {
+ return new Region(offset, 0);
+ }
+}
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 4c0eba14919..0925f46e0c5 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
@@ -39,6 +39,8 @@ public class THLabelProvider extends LabelProvider implements IColorProvider {
private THHierarchyModel fModel;
private HashMap fCachedImages= new HashMap();
private Color fColorInactive;
+ private boolean fMarkImplementers= true;
+ private boolean fHideNonImplementers= false;
public THLabelProvider(Display display, THHierarchyModel model) {
fColorInactive= display.getSystemColor(SWT.COLOR_DARK_GRAY);
@@ -50,7 +52,8 @@ public class THLabelProvider extends LabelProvider implements IColorProvider {
THNode node= (THNode) element;
ICElement decl= node.getElement();
if (decl != null) {
- if (node.isFiltered()) {
+ if (node.isFiltered() ||
+ (fHideNonImplementers && !node.isImplementor())) {
fCLabelProvider.setImageFlags(CElementImageProvider.LIGHT_TYPE_ICONS);
}
Image image= fCLabelProvider.getImage(decl);
@@ -98,7 +101,7 @@ public class THLabelProvider extends LabelProvider implements IColorProvider {
flags |= CElementImageDescriptor.REFERENCED_BY;
}
}
- if (node.isImplementor()) {
+ if (fMarkImplementers && node.isImplementor()) {
flags |= CElementImageDescriptor.DEFINES;
}
@@ -130,4 +133,12 @@ public class THLabelProvider extends LabelProvider implements IColorProvider {
public void setShowFiles(boolean show) {
fCLabelProvider.setTextFlags(show ? LABEL_OPTIONS_SHOW_FILES : LABEL_OPTIONS_SIMPLE);
}
+
+ public void setMarkImplementers(boolean val) {
+ fMarkImplementers= val;
+ }
+
+ public void setHideNonImplementers(boolean val) {
+ fHideNonImplementers= val;
+ }
}
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 21d317803e2..3952506a601 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
@@ -67,6 +67,7 @@ import org.eclipse.ui.PartInitException;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.part.PageBook;
import org.eclipse.ui.part.ViewPart;
+import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
import com.ibm.icu.text.MessageFormat;
@@ -94,7 +95,7 @@ import org.eclipse.cdt.internal.ui.viewsupport.WorkingSetFilterUI;
/**
* The view part for the include browser.
*/
-public class THViewPart extends ViewPart {
+public class THViewPart extends ViewPart implements ITHModelPresenter {
private static final int MAX_HISTORY_SIZE = 10;
private static final String TRUE = String.valueOf(true);
private static final String KEY_WORKING_SET_FILTER = "workingSetFilter"; //$NON-NLS-1$
@@ -868,6 +869,7 @@ public class THViewPart extends ViewPart {
if (!fShowsMessage) {
fIgnoreSelectionChanges++;
try {
+ fHierarchyLabelProvider.setMarkImplementers(!fModel.hasTrivialHierarchy());
fHierarchyTreeViewer.refresh();
fMemberViewer.refresh();
setSelections();
@@ -1051,4 +1053,8 @@ public class THViewPart extends ViewPart {
break;
}
}
+
+ public IWorkbenchSiteProgressService getProgressService() {
+ return (IWorkbenchSiteProgressService) getSite().getAdapter(IWorkbenchSiteProgressService.class);
+ }
}
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 3a8280106fd..5419aabab58 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
@@ -16,11 +16,14 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.Region;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.DOMException;
@@ -44,7 +47,6 @@ import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.ui.CUIPlugin;
-import org.eclipse.cdt.internal.ui.editor.CEditor;
import org.eclipse.cdt.internal.ui.util.ExceptionHandler;
import org.eclipse.cdt.internal.ui.viewsupport.FindNameForSelectionVisitor;
import org.eclipse.cdt.internal.ui.viewsupport.IndexUI;
@@ -85,35 +87,55 @@ public class TypeHierarchyUI {
return null;
}
- public static void open(final CEditor editor, final ITextSelection sel) {
+ public static ICElement[] getInput(final ITextEditor editor, IRegion region) {
if (editor != null) {
- final ICProject project= editor.getInputCElement().getCProject();
final IEditorInput editorInput = editor.getEditorInput();
- final Display display= Display.getCurrent();
-
- Job job= new Job(Messages.TypeHierarchyUI_OpenTypeHierarchy) {
- protected IStatus run(IProgressMonitor monitor) {
- try {
- final ICElement[] elems= findInput(project, editorInput, sel);
- if (elems != null && elems.length == 2) {
- display.asyncExec(new Runnable() {
- public void run() {
- openInViewPart(editor.getSite().getWorkbenchWindow(), elems[0], elems[1]);
- }});
- }
- return Status.OK_STATUS;
- }
- catch (CoreException e) {
- return e.getStatus();
- }
+ ICElement inputCElement = CUIPlugin.getDefault().getWorkingCopyManager().getWorkingCopy(editorInput);
+ if (inputCElement != null) {
+ final ICProject project= inputCElement.getCProject();
+ try {
+ return findInput(project, editorInput, region);
+ } catch (CoreException e) {
+ CUIPlugin.getDefault().log(e);
}
- };
- job.setUser(true);
- job.schedule();
+ }
+ }
+ return null;
+ }
+
+ public static void open(final ITextEditor editor, final ITextSelection sel) {
+ if (editor != null) {
+ ICElement inputCElement = CUIPlugin.getDefault().getWorkingCopyManager().getWorkingCopy(editor.getEditorInput());
+ if (inputCElement != null) {
+ final ICProject project= inputCElement.getCProject();
+ final IEditorInput editorInput = editor.getEditorInput();
+ final Display display= Display.getCurrent();
+
+ Job job= new Job(Messages.TypeHierarchyUI_OpenTypeHierarchy) {
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ IRegion reg= new Region(sel.getOffset(), sel.getLength());
+ final ICElement[] elems= findInput(project, editorInput, reg);
+ if (elems != null && elems.length == 2) {
+ display.asyncExec(new Runnable() {
+ public void run() {
+ openInViewPart(editor.getSite().getWorkbenchWindow(), elems[0], elems[1]);
+ }});
+ }
+ return Status.OK_STATUS;
+ }
+ catch (CoreException e) {
+ return e.getStatus();
+ }
+ }
+ };
+ job.setUser(true);
+ job.schedule();
+ }
}
}
- private static ICElement[] findInput(ICProject project, IEditorInput editorInput, ITextSelection sel) throws CoreException {
+ private static ICElement[] findInput(ICProject project, IEditorInput editorInput, IRegion sel) throws CoreException {
try {
IIndex index= CCorePlugin.getIndexManager().getIndex(project, IIndexManager.ADD_DEPENDENCIES | IIndexManager.ADD_DEPENDENT);
@@ -231,9 +253,9 @@ public class TypeHierarchyUI {
return IndexUI.findAnyDeclaration(index, project, binding);
}
- private static IASTName getSelectedName(IIndex index, IEditorInput editorInput, ITextSelection selection) throws CoreException {
- int selectionStart = selection.getOffset();
- int selectionLength = selection.getLength();
+ private static IASTName getSelectedName(IIndex index, IEditorInput editorInput, IRegion sel) throws CoreException {
+ int selectionStart = sel.getOffset();
+ int selectionLength = sel.getLength();
IWorkingCopy workingCopy = CUIPlugin.getDefault().getWorkingCopyManager().getWorkingCopy(editorInput);
if (workingCopy == null)
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/messages.properties b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/messages.properties
index 1679f7d4ef0..1b223f11de7 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/messages.properties
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/messages.properties
@@ -51,3 +51,5 @@ TypeHierarchyUI_OpenTypeHierarchy=Open Type Hierarchy
TypeHierarchyUI_SelectFromList=Select one element from the list
OpenTypeHierarchyAction_label=Open Type Hierarchy
OpenTypeHierarchyAction_tooltip=Open Type Hierarchy
+THInformationControl_regularTitle=Type Hierarchy of {0}
+THInformationControl_showDefiningTypesTitle=Types defining or implementing {0}