diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/HistoryAction.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/HistoryAction.java index b1379d26db2..e232905ea3c 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/HistoryAction.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/HistoryAction.java @@ -86,6 +86,18 @@ static StyledString getSingleElementLabel(IJavaElement element) { * @since 3.7 */ static String getElementLabel(IJavaElement[] elements) { + return getElementLabel(elements, JavaElementLabels.ALL_DEFAULT | JavaElementLabels.ALL_POST_QUALIFIED | JavaElementLabels.P_COMPRESSED); + } + + /** + * Fetches the label for all the java elements. + * + * @param elements the java elements + * @param flags flags for label generation + * @return the label for all the java elements + * @since 3.35 + */ + static String getElementLabel(IJavaElement[] elements, long flags) { switch (elements.length) { case 0: Assert.isTrue(false); @@ -93,13 +105,13 @@ static String getElementLabel(IJavaElement[] elements) { case 1: return Messages.format(TypeHierarchyMessages.HistoryAction_inputElements_1, - new String[] { getShortLabel(elements[0]) }); + new String[] { getShortLabel(elements[0], flags) }); case 2: return Messages.format(TypeHierarchyMessages.HistoryAction_inputElements_2, - new String[] { getShortLabel(elements[0]), getShortLabel(elements[1]) }); + new String[] { getShortLabel(elements[0], flags), getShortLabel(elements[1], flags) }); default: return Messages.format(TypeHierarchyMessages.HistoryAction_inputElements_more, - new String[] { getShortLabel(elements[0]), getShortLabel(elements[1]), getShortLabel(elements[2]) }); + new String[] { getShortLabel(elements[0], flags), getShortLabel(elements[1], flags), getShortLabel(elements[2], flags) }); } } @@ -111,7 +123,19 @@ static String getElementLabel(IJavaElement[] elements) { * @since 3.7 */ static String getShortLabel(IJavaElement element) { - return JavaElementLabels.getElementLabel(element, JavaElementLabels.ALL_DEFAULT | JavaElementLabels.ALL_POST_QUALIFIED | JavaElementLabels.P_COMPRESSED); + return getShortLabel(element, JavaElementLabels.ALL_DEFAULT | JavaElementLabels.ALL_POST_QUALIFIED | JavaElementLabels.P_COMPRESSED); + } + + /** + * Fetches the short label for the java element. + * + * @param element the java element + * @param flags flags for label generation + * @return the short label for the java element + * @since 3.35 + */ + static String getShortLabel(IJavaElement element, long flags) { + return JavaElementLabels.getElementLabel(element, flags); } } diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyViewPart.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyViewPart.java index 285e509ea7a..a732135aaaf 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyViewPart.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyViewPart.java @@ -18,6 +18,7 @@ import java.util.Arrays; import java.util.Iterator; import java.util.List; +import java.util.stream.Stream; import org.eclipse.help.IContextProvider; @@ -116,6 +117,7 @@ import org.eclipse.jdt.ui.IContextMenuConstants; import org.eclipse.jdt.ui.ITypeHierarchyViewPart; +import org.eclipse.jdt.ui.JavaElementLabels; import org.eclipse.jdt.ui.JavaUI; import org.eclipse.jdt.ui.PreferenceConstants; import org.eclipse.jdt.ui.actions.CCPActionGroup; @@ -1643,7 +1645,7 @@ private void restoreState(final IMemento memento) { int i= 0; while (elementId != null) { input= JavaCore.create(elementId); - if (input == null || !input.exists()) { + if (input == null) { inputList= null; break; } @@ -1654,16 +1656,24 @@ private void restoreState(final IMemento memento) { doRestoreState(memento, input); } else { final IJavaElement[] hierarchyInput= inputList.toArray(new IJavaElement[inputList.size()]); - synchronized (this) { - String label= Messages.format(TypeHierarchyMessages.TypeHierarchyViewPart_restoreinput, HistoryAction.getElementLabel(hierarchyInput)); + long flags = JavaElementLabels.M_APP_TYPE_PARAMETERS| JavaElementLabels.M_PARAMETER_TYPES | JavaElementLabels.ALL_POST_QUALIFIED | JavaElementLabels.P_COMPRESSED; + String label= Messages.format(TypeHierarchyMessages.TypeHierarchyViewPart_restoreinput, HistoryAction.getElementLabel(hierarchyInput, flags)); fNoHierarchyShownLabel.setText(label); fRestoreStateJob= new Job(label) { @Override protected IStatus run(IProgressMonitor monitor) { try { - doRestoreInBackground(memento, hierarchyInput, monitor); + Job.getJobManager().join(JavaUI.ID_PLUGIN, monitor); + IJavaElement[] existingHierarchyInput = Stream.of(hierarchyInput).filter(IJavaElement::exists).toArray(length -> new IJavaElement[length]); + if(existingHierarchyInput.length == 0) { + PlatformUI.getWorkbench().getDisplay().asyncExec(() -> { + doRestoreState(memento, new IJavaElement[0]); + }); + } else { + doRestoreInBackground(memento, existingHierarchyInput, monitor); + } } catch (JavaModelException e) { return e.getStatus(); } catch (OperationCanceledException e) { @@ -1671,6 +1681,8 @@ protected IStatus run(IProgressMonitor monitor) { showEmptyViewer(); } return Status.CANCEL_STATUS; + } catch (InterruptedException e) { + showEmptyViewer(); } return Status.OK_STATUS; }