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}