### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.ui Index: ui/org/eclipse/jdt/internal/ui/viewsupport/JavaUILabelProvider.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/JavaUILabelProvider.java,v retrieving revision 1.26 diff -u -r1.26 JavaUILabelProvider.java --- ui/org/eclipse/jdt/internal/ui/viewsupport/JavaUILabelProvider.java 28 Mar 2006 16:53:46 -0000 1.26 +++ ui/org/eclipse/jdt/internal/ui/viewsupport/JavaUILabelProvider.java 14 Mar 2007 14:25:43 -0000 @@ -29,7 +29,7 @@ import org.eclipse.jdt.ui.JavaElementLabels; -public class JavaUILabelProvider implements ILabelProvider, IColorProvider { +public class JavaUILabelProvider implements ILabelProvider, IColorProvider, IRichLabelProvider { protected ListenerList fListeners = new ListenerList(); @@ -147,7 +147,10 @@ if (fLabelDecorators != null && text.length() > 0) { for (int i= 0; i < fLabelDecorators.size(); i++) { ILabelDecorator decorator= (ILabelDecorator) fLabelDecorators.get(i); - text= decorator.decorateText(text, element); + String decorated= decorator.decorateText(text, element); + if (decorated != null) { + text= decorated; + } } } return text; @@ -162,10 +165,21 @@ if (result.length() == 0 && (element instanceof IStorage)) { result= fStorageLabelProvider.getText(element); } - return decorateText(result, element); } - + + public ColoredString getRichTextLabel(Object element) { + ColoredString string= ColoredJavaElementLabels.getTextLabel(element, evaluateTextFlags(element) | ColoredJavaElementLabels.COLORIZE); + if (string.length() == 0 && (element instanceof IStorage)) { + string= new ColoredString(fStorageLabelProvider.getText(element)); + } + String decorated= decorateText(string.getString(), element); + if (decorated != null) { + return ColoredJavaElementLabels.decorateColoredString(string, decorated, ColoredJavaElementLabels.DECORATIONS_COLOR); + } + return string; + } + /* (non-Javadoc) * @see IBaseLabelProvider#dispose */ Index: ui/org/eclipse/jdt/internal/ui/viewsupport/DecoratingJavaLabelProvider.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/DecoratingJavaLabelProvider.java,v retrieving revision 1.12 diff -u -r1.12 DecoratingJavaLabelProvider.java --- ui/org/eclipse/jdt/internal/ui/viewsupport/DecoratingJavaLabelProvider.java 11 Apr 2006 10:49:23 -0000 1.12 +++ ui/org/eclipse/jdt/internal/ui/viewsupport/DecoratingJavaLabelProvider.java 14 Mar 2007 14:25:43 -0000 @@ -10,11 +10,11 @@ *******************************************************************************/ package org.eclipse.jdt.internal.ui.viewsupport; -import org.eclipse.swt.graphics.Color; - import org.eclipse.jface.viewers.DecoratingLabelProvider; import org.eclipse.jface.viewers.DecorationContext; -import org.eclipse.jface.viewers.IColorProvider; +import org.eclipse.jface.viewers.ILabelDecorator; +import org.eclipse.jface.viewers.ILabelProvider; +import org.eclipse.jface.viewers.LabelDecorator; import org.eclipse.ui.PlatformUI; @@ -22,12 +22,13 @@ import org.eclipse.jdt.internal.ui.packageview.HierarchicalDecorationContext; -public class DecoratingJavaLabelProvider extends DecoratingLabelProvider implements IColorProvider { +public class DecoratingJavaLabelProvider extends DecoratingLabelProvider implements IRichLabelProvider { /** * Decorating label provider for Java. Combines a JavaUILabelProvider - * with problem and override indicuator with the workbench decorator (label + * with problem and override indicator with the workbench decorator (label * decorator extension point). + * @param labelProvider the label provider to decorate */ public DecoratingJavaLabelProvider(JavaUILabelProvider labelProvider) { this(labelProvider, true); @@ -37,6 +38,8 @@ * Decorating label provider for Java. Combines a JavaUILabelProvider * (if enabled with problem indicator) with the workbench * decorator (label decorator extension point). + * @param labelProvider the label provider to decorate + * @param errorTick show error ticks */ public DecoratingJavaLabelProvider(JavaUILabelProvider labelProvider, boolean errorTick) { this(labelProvider, errorTick, true); @@ -46,6 +49,9 @@ * Decorating label provider for Java. Combines a JavaUILabelProvider * (if enabled with problem indicator) with the workbench * decorator (label decorator extension point). + * @param labelProvider the label provider to decorate + * @param errorTick show error ticks + * @param flatPackageMode configure flat package mode */ public DecoratingJavaLabelProvider(JavaUILabelProvider labelProvider, boolean errorTick, boolean flatPackageMode) { super(labelProvider, PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator()); @@ -66,21 +72,33 @@ setDecorationContext(HierarchicalDecorationContext.CONTEXT); } } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object) - */ - public Color getForeground(Object element) { - // label provider is a JavaUILabelProvider - return ((IColorProvider) getLabelProvider()).getForeground(element); - } /* (non-Javadoc) - * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object) + * @see org.eclipse.jdt.internal.ui.viewsupport.IRichLabelProvider#getRichTextLabel(Object) */ - public Color getBackground(Object element) { - // label provider is a JavaUILabelProvider - return ((IColorProvider) getLabelProvider()).getBackground(element); + public ColoredString getRichTextLabel(Object element) { + ILabelProvider labelProvider= getLabelProvider(); + if (labelProvider instanceof IRichLabelProvider) { + // get a rich label from the label decorator + IRichLabelProvider richLabelProvider= (IRichLabelProvider) labelProvider; + ColoredString richLabel= richLabelProvider.getRichTextLabel(element); + if (richLabel != null) { + String decorated= null; + ILabelDecorator labelDecorator= getLabelDecorator(); + if (labelDecorator != null) { + if (labelDecorator instanceof LabelDecorator) { + decorated= ((LabelDecorator) labelDecorator).decorateText(richLabel.getString(), element, getDecorationContext()); + } else { + decorated= labelDecorator.decorateText(richLabel.getString(), element); + } + } + if (decorated != null) { + return ColoredJavaElementLabels.decorateColoredString(richLabel, decorated, ColoredJavaElementLabels.DECORATIONS_COLOR); + } + return richLabel; + } + } + return null; } } Index: ui/org/eclipse/jdt/internal/ui/typehierarchy/MethodsLabelProvider.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/MethodsLabelProvider.java,v retrieving revision 1.9 diff -u -r1.9 MethodsLabelProvider.java --- ui/org/eclipse/jdt/internal/ui/typehierarchy/MethodsLabelProvider.java 14 Oct 2005 12:14:24 -0000 1.9 +++ ui/org/eclipse/jdt/internal/ui/typehierarchy/MethodsLabelProvider.java 14 Mar 2007 14:25:42 -0000 @@ -26,6 +26,7 @@ import org.eclipse.jdt.ui.JavaElementLabels; import org.eclipse.jdt.internal.ui.viewsupport.AppearanceAwareLabelProvider; +import org.eclipse.jdt.internal.ui.viewsupport.ColoredString; /** * Label provider for the hierarchy method viewers. @@ -83,21 +84,40 @@ */ public String getText(Object element) { String text= super.getText(element); + String qualifier= getQualifier(element); + if (qualifier != null) { + return qualifier + text; + } + return text; + } + + /* (non-Javadoc) + * @see org.eclipse.jdt.internal.ui.viewsupport.JavaUILabelProvider#getRichTextLabel(java.lang.Object) + */ + public ColoredString getRichTextLabel(Object element) { + ColoredString text= super.getRichTextLabel(element); + String qualifier= getQualifier(element); + if (qualifier != null) { + return new ColoredString(qualifier).append(text); + } + return text; + + } + + private String getQualifier(Object element) { if (fShowDefiningType) { try { IType type= getDefiningType(element); if (type != null) { - StringBuffer buf= new StringBuffer(super.getText(type)); - buf.append(JavaElementLabels.CONCAT_STRING); - buf.append(text); - return buf.toString(); + return super.getText(type) + JavaElementLabels.CONCAT_STRING; } } catch (JavaModelException e) { } } - return text; + return null; } - + + /* (non-Javadoc) * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object) */ Index: ui/org/eclipse/jdt/internal/ui/typehierarchy/MethodsViewer.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/MethodsViewer.java,v retrieving revision 1.72 diff -u -r1.72 MethodsViewer.java --- ui/org/eclipse/jdt/internal/ui/typehierarchy/MethodsViewer.java 21 Sep 2006 14:57:55 -0000 1.72 +++ ui/org/eclipse/jdt/internal/ui/typehierarchy/MethodsViewer.java 14 Mar 2007 14:25:43 -0000 @@ -48,6 +48,7 @@ import org.eclipse.jdt.internal.ui.util.JavaUIHelp; import org.eclipse.jdt.internal.ui.util.SelectionUtil; import org.eclipse.jdt.internal.ui.viewsupport.DecoratingJavaLabelProvider; +import org.eclipse.jdt.internal.ui.viewsupport.OwnerDrawSupport; import org.eclipse.jdt.internal.ui.viewsupport.ProblemTableViewer; /** @@ -98,6 +99,8 @@ showInheritedMethodsNoRedraw(false); sortByDefiningTypeNoRedraw(false); + OwnerDrawSupport.install(this); + JavaUIHelp.setHelp(this, IJavaHelpContextIds.TYPE_HIERARCHY_VIEW); } Index: ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyViewer.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyViewer.java,v retrieving revision 1.48 diff -u -r1.48 TypeHierarchyViewer.java --- ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyViewer.java 21 Sep 2006 14:57:55 -0000 1.48 +++ ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyViewer.java 14 Mar 2007 14:25:43 -0000 @@ -34,6 +34,7 @@ import org.eclipse.jdt.internal.ui.IJavaHelpContextIds; import org.eclipse.jdt.internal.ui.util.JavaUIHelp; import org.eclipse.jdt.internal.ui.viewsupport.DecoratingJavaLabelProvider; +import org.eclipse.jdt.internal.ui.viewsupport.OwnerDrawSupport; import org.eclipse.jdt.internal.ui.viewsupport.ProblemTreeViewer; import org.eclipse.jdt.ui.JavaElementLabels; @@ -62,6 +63,8 @@ } }); + OwnerDrawSupport.install(this); + JavaUIHelp.setHelp(this, IJavaHelpContextIds.TYPE_HIERARCHY_VIEW); } Index: ui/org/eclipse/jdt/internal/ui/typehierarchy/HierarchyLabelProvider.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/HierarchyLabelProvider.java,v retrieving revision 1.41 diff -u -r1.41 HierarchyLabelProvider.java --- ui/org/eclipse/jdt/internal/ui/typehierarchy/HierarchyLabelProvider.java 17 Jun 2005 15:51:57 -0000 1.41 +++ ui/org/eclipse/jdt/internal/ui/typehierarchy/HierarchyLabelProvider.java 14 Mar 2007 14:25:42 -0000 @@ -119,16 +119,7 @@ } return true; } - - /* (non-Javadoc) - * @see ILabelProvider#getText - */ - public String getText(Object element) { - String text= super.getText(element); - return decorateText(text, element); - } - - + /* (non-Javadoc) * @see ILabelProvider#getImage */ Index: ui/org/eclipse/jdt/internal/ui/search/PostfixLabelProvider.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/PostfixLabelProvider.java,v retrieving revision 1.16 diff -u -r1.16 PostfixLabelProvider.java --- ui/org/eclipse/jdt/internal/ui/search/PostfixLabelProvider.java 27 Apr 2005 16:04:47 -0000 1.16 +++ ui/org/eclipse/jdt/internal/ui/search/PostfixLabelProvider.java 14 Mar 2007 14:25:42 -0000 @@ -21,6 +21,9 @@ import org.eclipse.jdt.ui.JavaElementLabels; +import org.eclipse.jdt.internal.ui.viewsupport.ColoredJavaElementLabels; +import org.eclipse.jdt.internal.ui.viewsupport.ColoredString; + public class PostfixLabelProvider extends SearchLabelProvider { private ITreeContentProvider fContentProvider; @@ -38,8 +41,11 @@ public String getText(Object element) { String labelWithCounts= getLabelWithCounts(element, internalGetText(element)); - - StringBuffer res= new StringBuffer(labelWithCounts); + return labelWithCounts + getQualification(element); + } + + private String getQualification(Object element) { + StringBuffer res= new StringBuffer(); ITreeContentProvider provider= (ITreeContentProvider) fPage.getViewer().getContentProvider(); Object visibleParent= provider.getParent(element); @@ -54,7 +60,6 @@ } return res.toString(); } - protected boolean hasChildren(Object element) { ITreeContentProvider contentProvider= (ITreeContentProvider) fPage.getViewer().getContentProvider(); @@ -81,5 +86,14 @@ } return false; } + + /* (non-Javadoc) + * @see org.eclipse.jdt.internal.ui.viewsupport.IRichLabelProvider#getRichTextLabel(java.lang.Object) + */ + public ColoredString getRichTextLabel(Object element) { + ColoredString coloredString= getColoredLabelWithCounts(element, super.getRichTextLabel(element)); + coloredString.append(getQualification(element), ColoredJavaElementLabels.QUALIFIER_COLOR); + return coloredString; + } } Index: ui/org/eclipse/jdt/internal/ui/search/JavaSearchResultPage.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/JavaSearchResultPage.java,v retrieving revision 1.66 diff -u -r1.66 JavaSearchResultPage.java --- ui/org/eclipse/jdt/internal/ui/search/JavaSearchResultPage.java 3 Oct 2006 16:17:12 -0000 1.66 +++ ui/org/eclipse/jdt/internal/ui/search/JavaSearchResultPage.java 14 Mar 2007 14:25:42 -0000 @@ -32,7 +32,6 @@ import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.util.TransferDragSourceListener; -import org.eclipse.jface.viewers.DecoratingLabelProvider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; @@ -48,7 +47,6 @@ import org.eclipse.ui.IMemento; import org.eclipse.ui.IPageLayout; import org.eclipse.ui.PartInitException; -import org.eclipse.ui.PlatformUI; import org.eclipse.ui.actions.ActionContext; import org.eclipse.ui.dialogs.PreferencesUtil; import org.eclipse.ui.part.IPageSite; @@ -85,6 +83,8 @@ import org.eclipse.jdt.internal.ui.dnd.ResourceTransferDragAdapter; import org.eclipse.jdt.internal.ui.packageview.SelectionTransferDragAdapter; import org.eclipse.jdt.internal.ui.util.ExceptionHandler; +import org.eclipse.jdt.internal.ui.viewsupport.DecoratingJavaLabelProvider; +import org.eclipse.jdt.internal.ui.viewsupport.OwnerDrawSupport; import org.eclipse.jdt.internal.ui.viewsupport.ProblemTableViewer; import org.eclipse.jdt.internal.ui.viewsupport.ProblemTreeViewer; @@ -135,6 +135,8 @@ private SelectionDispatchAction fCopyQualifiedNameAction; + private SortingLabelProvider fSortingLabelProvider; + private int fCurrentGrouping; private static final String[] SHOW_IN_TARGETS= new String[] { JavaUI.ID_PACKAGES , IPageLayout.ID_RES_NAV }; @@ -309,11 +311,11 @@ protected void configureTableViewer(TableViewer viewer) { viewer.setUseHashlookup(true); - SortingLabelProvider sortingLabelProvider= new SortingLabelProvider(this); - viewer.setLabelProvider(new ColorDecoratingLabelProvider(sortingLabelProvider, PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator())); + fSortingLabelProvider= new SortingLabelProvider(this); + viewer.setLabelProvider(new DecoratingJavaLabelProvider(fSortingLabelProvider, false)); fContentProvider=new JavaSearchTableContentProvider(this); viewer.setContentProvider(fContentProvider); - viewer.setComparator(new DecoratorIgnoringViewerSorter(sortingLabelProvider)); + viewer.setComparator(new DecoratorIgnoringViewerSorter(fSortingLabelProvider)); setSortOrder(fCurrentSortOrder); addDragAdapters(viewer); } @@ -322,29 +324,34 @@ PostfixLabelProvider postfixLabelProvider= new PostfixLabelProvider(this); viewer.setUseHashlookup(true); viewer.setComparator(new DecoratorIgnoringViewerSorter(postfixLabelProvider)); - viewer.setLabelProvider(new ColorDecoratingLabelProvider(postfixLabelProvider, PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator())); + viewer.setLabelProvider(new DecoratingJavaLabelProvider(postfixLabelProvider, false)); fContentProvider= new LevelTreeContentProvider(this, fCurrentGrouping); viewer.setContentProvider(fContentProvider); addDragAdapters(viewer); } protected TreeViewer createTreeViewer(Composite parent) { - return new ProblemTreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); + ProblemTreeViewer problemTreeViewer= new ProblemTreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); + OwnerDrawSupport.install(problemTreeViewer); + return problemTreeViewer; } protected TableViewer createTableViewer(Composite parent) { - return new ProblemTableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); + ProblemTableViewer problemTableViewer= new ProblemTableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); + OwnerDrawSupport.install(problemTableViewer); + return problemTableViewer; } void setSortOrder(int order) { - fCurrentSortOrder= order; - StructuredViewer viewer= getViewer(); - viewer.getControl().setRedraw(false); - DecoratingLabelProvider dlp= (DecoratingLabelProvider) viewer.getLabelProvider(); - ((SortingLabelProvider)dlp.getLabelProvider()).setOrder(order); - viewer.getControl().setRedraw(true); - viewer.refresh(); - getSettings().put(KEY_SORTING, fCurrentSortOrder); + if (fSortingLabelProvider != null) { + fCurrentSortOrder= order; + StructuredViewer viewer= getViewer(); + //viewer.getControl().setRedraw(false); + fSortingLabelProvider.setOrder(order); + //viewer.getControl().setRedraw(true); + viewer.refresh(); + getSettings().put(KEY_SORTING, fCurrentSortOrder); + } } public void init(IPageSite site) { Index: ui/org/eclipse/jdt/internal/ui/search/SearchLabelProvider.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/SearchLabelProvider.java,v retrieving revision 1.11 diff -u -r1.11 SearchLabelProvider.java --- ui/org/eclipse/jdt/internal/ui/search/SearchLabelProvider.java 27 Apr 2005 16:04:47 -0000 1.11 +++ ui/org/eclipse/jdt/internal/ui/search/SearchLabelProvider.java 14 Mar 2007 14:25:42 -0000 @@ -43,6 +43,8 @@ import org.eclipse.jdt.internal.ui.JavaPlugin; import org.eclipse.jdt.internal.ui.viewsupport.AppearanceAwareLabelProvider; +import org.eclipse.jdt.internal.ui.viewsupport.ColoredJavaElementLabels; +import org.eclipse.jdt.internal.ui.viewsupport.ColoredString; public abstract class SearchLabelProvider extends AppearanceAwareLabelProvider { @@ -120,6 +122,15 @@ return res; } + protected final ColoredString getColoredLabelWithCounts(Object element, ColoredString coloredName) { + String name= coloredName.getString(); + String decorated= getLabelWithCounts(element, name); + if (decorated.length() > name.length()) { + ColoredJavaElementLabels.decorateColoredString(coloredName, decorated, ColoredJavaElementLabels.NUMBER_OF_MATCHES_COLOR); + } + return coloredName; + } + protected final String getLabelWithCounts(Object element, String elementName) { int matchCount= fPage.getDisplayedMatchCount(element); int potentialCount= getNumberOfPotentialMatches(element); Index: ui/org/eclipse/jdt/internal/ui/search/SortingLabelProvider.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/SortingLabelProvider.java,v retrieving revision 1.12 diff -u -r1.12 SortingLabelProvider.java --- ui/org/eclipse/jdt/internal/ui/search/SortingLabelProvider.java 27 Apr 2005 16:04:47 -0000 1.12 +++ ui/org/eclipse/jdt/internal/ui/search/SortingLabelProvider.java 14 Mar 2007 14:25:42 -0000 @@ -14,14 +14,14 @@ import org.eclipse.swt.graphics.Image; -import org.eclipse.jface.viewers.IColorProvider; - import org.eclipse.jdt.core.IImportDeclaration; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.ui.JavaElementLabels; -public class SortingLabelProvider extends SearchLabelProvider implements IColorProvider { +import org.eclipse.jdt.internal.ui.viewsupport.ColoredString; + +public class SortingLabelProvider extends SearchLabelProvider { public static final int SHOW_ELEMENT_CONTAINER= 1; // default public static final int SHOW_CONTAINER_ELEMENT= 2; public static final int SHOW_PATH= 3; @@ -40,17 +40,28 @@ } public final String getText(Object element) { - return getLabelWithCounts(element, internalGetText(element)); + if (element instanceof IImportDeclaration) + element= ((IImportDeclaration)element).getParent().getParent(); + + String text= super.getText(element); + if (text.length() > 0) { + return getLabelWithCounts(element, text); + } + return getParticipantText(element); } - - private String internalGetText(Object o) { - if (o instanceof IImportDeclaration) - o= ((IImportDeclaration)o).getParent().getParent(); - - String text= super.getText(o); - if (text != null && (text.length() > 0)) - return text; - return getParticipantText(o); + + /* (non-Javadoc) + * @see org.eclipse.jdt.internal.ui.viewsupport.JavaUILabelProvider#getRichTextLabel(java.lang.Object) + */ + public ColoredString getRichTextLabel(Object element) { + if (element instanceof IImportDeclaration) + element= ((IImportDeclaration)element).getParent().getParent(); + + ColoredString text= super.getRichTextLabel(element); + if (text.length() > 0) { + return getColoredLabelWithCounts(element, text); + } + return new ColoredString(getParticipantText(element)); } public void setOrder(int orderFlag) { Index: ui/org/eclipse/jdt/internal/ui/search/ColorDecoratingLabelProvider.java =================================================================== RCS file: ui/org/eclipse/jdt/internal/ui/search/ColorDecoratingLabelProvider.java diff -N ui/org/eclipse/jdt/internal/ui/search/ColorDecoratingLabelProvider.java --- ui/org/eclipse/jdt/internal/ui/search/ColorDecoratingLabelProvider.java 17 Jun 2005 15:51:51 -0000 1.3 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,38 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2005 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 - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.jdt.internal.ui.search; - -import org.eclipse.jface.viewers.DecoratingLabelProvider; -import org.eclipse.jface.viewers.IColorProvider; -import org.eclipse.jface.viewers.ILabelDecorator; -import org.eclipse.jface.viewers.ILabelProvider; -import org.eclipse.swt.graphics.Color; - -public class ColorDecoratingLabelProvider extends DecoratingLabelProvider implements IColorProvider { - - public ColorDecoratingLabelProvider(ILabelProvider provider, ILabelDecorator decorator) { - super(provider, decorator); - } - - public Color getForeground(Object element) { - ILabelProvider labelProvider = getLabelProvider(); - if (labelProvider instanceof IColorProvider) - return ((IColorProvider)labelProvider).getForeground(element); - return null; - } - - public Color getBackground(Object element) { - ILabelProvider labelProvider = getLabelProvider(); - if (labelProvider instanceof IColorProvider) - return ((IColorProvider)labelProvider).getBackground(element); - return null; - } -} Index: ui/org/eclipse/jdt/internal/ui/packageview/PackageExplorerLabelProvider.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/packageview/PackageExplorerLabelProvider.java,v retrieving revision 1.26 diff -u -r1.26 PackageExplorerLabelProvider.java --- ui/org/eclipse/jdt/internal/ui/packageview/PackageExplorerLabelProvider.java 19 Dec 2006 09:27:00 -0000 1.26 +++ ui/org/eclipse/jdt/internal/ui/packageview/PackageExplorerLabelProvider.java 14 Mar 2007 14:25:42 -0000 @@ -10,15 +10,28 @@ *******************************************************************************/ package org.eclipse.jdt.internal.ui.packageview; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IPath; import org.eclipse.core.resources.IFolder; +import org.eclipse.swt.graphics.Image; + +import org.eclipse.jface.resource.ImageDescriptor; + +import org.eclipse.ui.IWorkingSet; import org.eclipse.jdt.core.IPackageFragment; +import org.eclipse.jdt.ui.JavaElementLabels; + import org.eclipse.jdt.internal.ui.viewsupport.AppearanceAwareLabelProvider; +import org.eclipse.jdt.internal.ui.viewsupport.ColoredString; +import org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider; /** * Provides the labels for the Package Explorer. @@ -31,20 +44,33 @@ public class PackageExplorerLabelProvider extends AppearanceAwareLabelProvider { private PackageExplorerContentProvider fContentProvider; - + private Map fWorkingSetImages; + private boolean fIsFlatLayout; private PackageExplorerProblemsDecorator fProblemDecorator; - public PackageExplorerLabelProvider(long textFlags, int imageFlags, PackageExplorerContentProvider cp) { - super(textFlags, imageFlags); + public PackageExplorerLabelProvider(PackageExplorerContentProvider cp) { + super(DEFAULT_TEXTFLAGS | JavaElementLabels.P_COMPRESSED | JavaElementLabels.ALL_CATEGORY, DEFAULT_IMAGEFLAGS | JavaElementImageProvider.SMALL_ICONS); + fProblemDecorator= new PackageExplorerProblemsDecorator(); addLabelDecorator(fProblemDecorator); Assert.isNotNull(cp); fContentProvider= cp; + fWorkingSetImages= null; } - - - public String getText(Object element) { + + /* (non-Javadoc) + * @see org.eclipse.jdt.internal.ui.viewsupport.JavaUILabelProvider#getRichTextLabel(java.lang.Object) + */ + public ColoredString getRichTextLabel(Object element) { + String text= getSpecificText(element); + if (text != null) { + return new ColoredString(decorateText(text, element)); + } + return super.getRichTextLabel(element); + } + + private String getSpecificText(Object element) { if (!fIsFlatLayout && element instanceof IPackageFragment) { IPackageFragment fragment = (IPackageFragment) element; Object parent= fContentProvider.getHierarchicalPackageParent(fragment); @@ -53,6 +79,16 @@ } else if (parent instanceof IFolder) { // bug 152735 return getNameDelta((IFolder) parent, fragment); } + } else if (element instanceof IWorkingSet) { + return ((IWorkingSet) element).getLabel(); + } + return null; + } + + public String getText(Object element) { + String text= getSpecificText(element); + if (text != null) { + return decorateText(text, element); } return super.getText(element); } @@ -81,8 +117,34 @@ return fragment.getElementName(); } + public Image getImage(Object element) { + if (element instanceof IWorkingSet) { + ImageDescriptor image= ((IWorkingSet)element).getImageDescriptor(); + if (fWorkingSetImages == null) { + fWorkingSetImages= new HashMap(); + } + + Image result= (Image) fWorkingSetImages.get(image); + if (result == null) { + result= image.createImage(); + fWorkingSetImages.put(image, result); + } + return decorateImage(result, element); + } + return super.getImage(element); + } + public void setIsFlatLayout(boolean state) { fIsFlatLayout= state; fProblemDecorator.setIsFlatLayout(state); } + + public void dispose() { + if (fWorkingSetImages != null) { + for (Iterator iter= fWorkingSetImages.values().iterator(); iter.hasNext();) { + ((Image)iter.next()).dispose(); + } + } + super.dispose(); + } } Index: ui/org/eclipse/jdt/internal/ui/packageview/PackageExplorerPart.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/packageview/PackageExplorerPart.java,v retrieving revision 1.293 diff -u -r1.293 PackageExplorerPart.java --- ui/org/eclipse/jdt/internal/ui/packageview/PackageExplorerPart.java 8 Mar 2007 11:08:16 -0000 1.293 +++ ui/org/eclipse/jdt/internal/ui/packageview/PackageExplorerPart.java 14 Mar 2007 14:25:42 -0000 @@ -146,7 +146,7 @@ import org.eclipse.jdt.internal.ui.viewsupport.DecoratingJavaLabelProvider; import org.eclipse.jdt.internal.ui.viewsupport.FilterUpdater; import org.eclipse.jdt.internal.ui.viewsupport.IViewPartInputProvider; -import org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider; +import org.eclipse.jdt.internal.ui.viewsupport.OwnerDrawSupport; import org.eclipse.jdt.internal.ui.viewsupport.ProblemTreeViewer; import org.eclipse.jdt.internal.ui.viewsupport.StatusBarUpdater; import org.eclipse.jdt.internal.ui.workingsets.ConfigureWorkingSetAction; @@ -188,7 +188,8 @@ private int fRootMode; private WorkingSetModel fWorkingSetModel; - private PackageExplorerLabelProvider fLabelProvider; + private PackageExplorerLabelProvider fLabelProvider; + private DecoratingJavaLabelProvider fDecoratingLabelProvider; private PackageExplorerContentProvider fContentProvider; private FilterUpdater fFilterUpdater; @@ -245,6 +246,7 @@ public PackageExplorerProblemTreeViewer(Composite parent, int style) { super(parent, style); fPendingRefreshes= Collections.synchronizedList(new ArrayList()); + OwnerDrawSupport.install(this); } public void add(Object parentElement, Object[] childElements) { if (fPendingRefreshes.contains(parentElement)) { @@ -646,7 +648,8 @@ fLabelProvider= createLabelProvider(); fLabelProvider.setIsFlatLayout(fIsCurrentLayoutFlat); - fViewer.setLabelProvider(new DecoratingJavaLabelProvider(fLabelProvider, false, fIsCurrentLayoutFlat)); + fDecoratingLabelProvider= new DecoratingJavaLabelProvider(fLabelProvider, false, fIsCurrentLayoutFlat); + fViewer.setLabelProvider(fDecoratingLabelProvider); // problem decoration provided by PackageLabelProvider } @@ -673,7 +676,7 @@ if (fViewer != null) { fContentProvider.setIsFlatLayout(isFlatLayout()); fLabelProvider.setIsFlatLayout(isFlatLayout()); - ((DecoratingJavaLabelProvider) fViewer.getLabelProvider()).setFlatPackageMode(isFlatLayout()); + fDecoratingLabelProvider.setFlatPackageMode(isFlatLayout()); fViewer.getControl().setRedraw(false); fViewer.refresh(); @@ -695,14 +698,7 @@ } private PackageExplorerLabelProvider createLabelProvider() { - if (showProjects()) - return new PackageExplorerLabelProvider(AppearanceAwareLabelProvider.DEFAULT_TEXTFLAGS | JavaElementLabels.P_COMPRESSED | JavaElementLabels.ALL_CATEGORY, - AppearanceAwareLabelProvider.DEFAULT_IMAGEFLAGS | JavaElementImageProvider.SMALL_ICONS, - fContentProvider); - else - return new WorkingSetAwareLabelProvider(AppearanceAwareLabelProvider.DEFAULT_TEXTFLAGS | JavaElementLabels.P_COMPRESSED, - AppearanceAwareLabelProvider.DEFAULT_IMAGEFLAGS | JavaElementImageProvider.SMALL_ICONS, - fContentProvider); + return new PackageExplorerLabelProvider(fContentProvider); } private IElementComparer createElementComparer() { Index: ui/org/eclipse/jdt/internal/ui/packageview/WorkingSetAwareLabelProvider.java =================================================================== RCS file: ui/org/eclipse/jdt/internal/ui/packageview/WorkingSetAwareLabelProvider.java diff -N ui/org/eclipse/jdt/internal/ui/packageview/WorkingSetAwareLabelProvider.java --- ui/org/eclipse/jdt/internal/ui/packageview/WorkingSetAwareLabelProvider.java 22 Nov 2006 16:58:05 -0000 1.7 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,66 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2005 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 - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.jdt.internal.ui.packageview; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -import org.eclipse.swt.graphics.Image; - -import org.eclipse.jface.resource.ImageDescriptor; - -import org.eclipse.ui.IWorkingSet; - -public class WorkingSetAwareLabelProvider extends PackageExplorerLabelProvider { - - private Map fImages= new HashMap(); - - public WorkingSetAwareLabelProvider(long textFlags, int imageFlags, PackageExplorerContentProvider cp) { - super(textFlags, imageFlags, cp); - } - - /** - * {@inheritDoc} - */ - public String getText(Object element) { - if (element instanceof IWorkingSet) { - return decorateText(((IWorkingSet)element).getLabel(), element); - } - return super.getText(element); - } - - /** - * {@inheritDoc} - */ - public Image getImage(Object element) { - if (element instanceof IWorkingSet) { - ImageDescriptor image= ((IWorkingSet)element).getImageDescriptor(); - Image result= (Image)fImages.get(image); - if (result == null) { - result= image.createImage(); - fImages.put(image, result); - } - return decorateImage(result, element); - } - return super.getImage(element); - } - - /** - * {@inheritDoc} - */ - public void dispose() { - for (Iterator iter= fImages.values().iterator(); iter.hasNext();) { - ((Image)iter.next()).dispose(); - } - super.dispose(); - } -} Index: ui/org/eclipse/jdt/internal/ui/browsing/TypesView.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/browsing/TypesView.java,v retrieving revision 1.35 diff -u -r1.35 TypesView.java --- ui/org/eclipse/jdt/internal/ui/browsing/TypesView.java 2 Mar 2007 14:26:20 -0000 1.35 +++ ui/org/eclipse/jdt/internal/ui/browsing/TypesView.java 14 Mar 2007 14:25:42 -0000 @@ -15,11 +15,13 @@ import org.eclipse.core.runtime.Assert; +import org.eclipse.swt.widgets.Composite; import org.eclipse.jface.viewers.DecoratingLabelProvider; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.ui.IActionBars; @@ -35,15 +37,16 @@ import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IType; +import org.eclipse.jdt.ui.JavaElementLabels; +import org.eclipse.jdt.ui.JavaUI; +import org.eclipse.jdt.ui.PreferenceConstants; + import org.eclipse.jdt.internal.ui.IJavaHelpContextIds; import org.eclipse.jdt.internal.ui.actions.SelectAllAction; import org.eclipse.jdt.internal.ui.filters.NonJavaElementFilter; import org.eclipse.jdt.internal.ui.viewsupport.AppearanceAwareLabelProvider; import org.eclipse.jdt.internal.ui.viewsupport.JavaUILabelProvider; - -import org.eclipse.jdt.ui.JavaElementLabels; -import org.eclipse.jdt.ui.JavaUI; -import org.eclipse.jdt.ui.PreferenceConstants; +import org.eclipse.jdt.internal.ui.viewsupport.OwnerDrawSupport; public class TypesView extends JavaBrowsingPart { private SelectAllAction fSelectAllAction; @@ -60,6 +63,13 @@ AppearanceAwareLabelProvider.DEFAULT_IMAGEFLAGS); } + protected StructuredViewer createViewer(Composite parent) { + StructuredViewer viewer= super.createViewer(parent); + OwnerDrawSupport.install(viewer); + return viewer; + } + + /** * Answer the property defined by key. */ Index: ui/org/eclipse/jdt/internal/ui/browsing/PackagesViewTreeViewer.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/browsing/PackagesViewTreeViewer.java,v retrieving revision 1.12 diff -u -r1.12 PackagesViewTreeViewer.java --- ui/org/eclipse/jdt/internal/ui/browsing/PackagesViewTreeViewer.java 19 Dec 2006 10:36:30 -0000 1.12 +++ ui/org/eclipse/jdt/internal/ui/browsing/PackagesViewTreeViewer.java 14 Mar 2007 14:25:42 -0000 @@ -22,6 +22,7 @@ import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.ui.JavaPlugin; +import org.eclipse.jdt.internal.ui.viewsupport.OwnerDrawSupport; import org.eclipse.jdt.internal.ui.viewsupport.ProblemTreeViewer; /** @@ -31,6 +32,7 @@ public PackagesViewTreeViewer(Composite parent, int style) { super(parent, style); + OwnerDrawSupport.install(this); } /* Index: ui/org/eclipse/jdt/internal/ui/browsing/MembersView.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/browsing/MembersView.java,v retrieving revision 1.57 diff -u -r1.57 MembersView.java --- ui/org/eclipse/jdt/internal/ui/browsing/MembersView.java 2 Mar 2007 14:26:20 -0000 1.57 +++ ui/org/eclipse/jdt/internal/ui/browsing/MembersView.java 14 Mar 2007 14:25:42 -0000 @@ -43,10 +43,12 @@ import org.eclipse.jdt.internal.ui.IJavaHelpContextIds; import org.eclipse.jdt.internal.ui.JavaPlugin; -import org.eclipse.jdt.internal.ui.actions.*; +import org.eclipse.jdt.internal.ui.actions.CategoryFilterActionGroup; +import org.eclipse.jdt.internal.ui.actions.LexicalSortingAction; import org.eclipse.jdt.internal.ui.preferences.MembersOrderPreferenceCache; import org.eclipse.jdt.internal.ui.viewsupport.AppearanceAwareLabelProvider; import org.eclipse.jdt.internal.ui.viewsupport.JavaUILabelProvider; +import org.eclipse.jdt.internal.ui.viewsupport.OwnerDrawSupport; import org.eclipse.jdt.internal.ui.viewsupport.ProblemTreeViewer; public class MembersView extends JavaBrowsingPart implements IPropertyChangeListener { @@ -113,6 +115,7 @@ */ protected StructuredViewer createViewer(Composite parent) { ProblemTreeViewer viewer= new ProblemTreeViewer(parent, SWT.MULTI); + OwnerDrawSupport.install(viewer); fMemberFilterActionGroup= new MemberFilterActionGroup(viewer, JavaUI.ID_MEMBERS_VIEW); return viewer; } Index: ui/org/eclipse/jdt/internal/ui/browsing/PackagesViewTableViewer.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/browsing/PackagesViewTableViewer.java,v retrieving revision 1.8 diff -u -r1.8 PackagesViewTableViewer.java --- ui/org/eclipse/jdt/internal/ui/browsing/PackagesViewTableViewer.java 17 Jun 2005 15:51:52 -0000 1.8 +++ ui/org/eclipse/jdt/internal/ui/browsing/PackagesViewTableViewer.java 14 Mar 2007 14:25:42 -0000 @@ -19,6 +19,7 @@ import org.eclipse.jdt.core.IPackageFragment; +import org.eclipse.jdt.internal.ui.viewsupport.OwnerDrawSupport; import org.eclipse.jdt.internal.ui.viewsupport.ProblemTableViewer; /** @@ -28,6 +29,7 @@ public PackagesViewTableViewer(Composite parent, int style) { super(parent, style); + OwnerDrawSupport.install(this); } public void mapElement(Object element, Widget item) { Index: ui/org/eclipse/jdt/internal/ui/browsing/ProjectsView.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/browsing/ProjectsView.java,v retrieving revision 1.32 diff -u -r1.32 ProjectsView.java --- ui/org/eclipse/jdt/internal/ui/browsing/ProjectsView.java 12 May 2006 13:40:52 -0000 1.32 +++ ui/org/eclipse/jdt/internal/ui/browsing/ProjectsView.java 14 Mar 2007 14:25:42 -0000 @@ -39,6 +39,7 @@ import org.eclipse.jdt.internal.ui.IJavaHelpContextIds; import org.eclipse.jdt.internal.ui.JavaPlugin; import org.eclipse.jdt.internal.ui.viewsupport.FilterUpdater; +import org.eclipse.jdt.internal.ui.viewsupport.OwnerDrawSupport; import org.eclipse.jdt.internal.ui.viewsupport.ProblemTreeViewer; import org.eclipse.jdt.ui.JavaUI; @@ -56,6 +57,7 @@ */ protected StructuredViewer createViewer(Composite parent) { ProblemTreeViewer result= new ProblemTreeViewer(parent, SWT.MULTI); + OwnerDrawSupport.install(result); fFilterUpdater= new FilterUpdater(result); ResourcesPlugin.getWorkspace().addResourceChangeListener(fFilterUpdater); return result; Index: ui/org/eclipse/jdt/internal/ui/callhierarchy/CallHierarchyViewer.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/callhierarchy/CallHierarchyViewer.java,v retrieving revision 1.17 diff -u -r1.17 CallHierarchyViewer.java --- ui/org/eclipse/jdt/internal/ui/callhierarchy/CallHierarchyViewer.java 28 Mar 2006 16:53:45 -0000 1.17 +++ ui/org/eclipse/jdt/internal/ui/callhierarchy/CallHierarchyViewer.java 14 Mar 2007 14:25:42 -0000 @@ -30,6 +30,8 @@ import org.eclipse.jdt.internal.corext.callhierarchy.MethodWrapper; +import org.eclipse.jdt.internal.ui.viewsupport.OwnerDrawSupport; + class CallHierarchyViewer extends TreeViewer { private CallHierarchyViewPart fPart; @@ -58,6 +60,8 @@ fOpen.run(); } }); + + OwnerDrawSupport.install(this); clearViewer(); } Index: ui/org/eclipse/jdt/internal/ui/callhierarchy/CallHierarchyLabelProvider.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/callhierarchy/CallHierarchyLabelProvider.java,v retrieving revision 1.12 diff -u -r1.12 CallHierarchyLabelProvider.java --- ui/org/eclipse/jdt/internal/ui/callhierarchy/CallHierarchyLabelProvider.java 13 Apr 2005 17:35:11 -0000 1.12 +++ ui/org/eclipse/jdt/internal/ui/callhierarchy/CallHierarchyLabelProvider.java 14 Mar 2007 14:25:42 -0000 @@ -14,18 +14,21 @@ import java.util.Collection; import org.eclipse.swt.graphics.Image; -import org.eclipse.ui.model.IWorkbenchAdapter; import org.eclipse.jface.viewers.ILabelDecorator; -import org.eclipse.jdt.internal.ui.viewsupport.AppearanceAwareLabelProvider; -import org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider; +import org.eclipse.ui.model.IWorkbenchAdapter; import org.eclipse.jdt.internal.corext.callhierarchy.MethodWrapper; import org.eclipse.jdt.internal.corext.util.Messages; import org.eclipse.jdt.ui.JavaElementLabels; +import org.eclipse.jdt.internal.ui.viewsupport.AppearanceAwareLabelProvider; +import org.eclipse.jdt.internal.ui.viewsupport.ColoredJavaElementLabels; +import org.eclipse.jdt.internal.ui.viewsupport.ColoredString; +import org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider; + class CallHierarchyLabelProvider extends AppearanceAwareLabelProvider { private static final long TEXTFLAGS= DEFAULT_TEXTFLAGS | JavaElementLabels.ALL_POST_QUALIFIED | JavaElementLabels.P_COMPRESSED; private static final int IMAGEFLAGS= DEFAULT_IMAGEFLAGS | JavaElementImageProvider.SMALL_ICONS; @@ -60,26 +63,40 @@ * @see ILabelProvider#getText(Object) */ public String getText(Object element) { - if (element instanceof MethodWrapper) { - MethodWrapper methodWrapper = (MethodWrapper) element; - - if (methodWrapper.getMember() != null) { - return getElementLabel(methodWrapper); - } else { - return CallHierarchyMessages.CallHierarchyLabelProvider_root; - } - } else if (element == TreeTermination.SEARCH_CANCELED) { + if (element instanceof MethodWrapper && ((MethodWrapper) element).getMember() != null) { + return getElementLabel((MethodWrapper) element); + } + return getSpecialLabel(element); + } + + /* (non-Javadoc) + * @see org.eclipse.jdt.internal.ui.viewsupport.JavaUILabelProvider#getRichTextLabel(java.lang.Object) + */ + public ColoredString getRichTextLabel(Object element) { + if (element instanceof MethodWrapper && ((MethodWrapper) element).getMember() != null) { + MethodWrapper wrapper= (MethodWrapper) element; + String decorated= getElementLabel(wrapper); + ColoredString text= super.getRichTextLabel(wrapper.getMember()); + return ColoredJavaElementLabels.decorateColoredString(text, decorated, ColoredJavaElementLabels.NUMBER_OF_MATCHES_COLOR); + } + return new ColoredString(getSpecialLabel(element)); + } + + private String getSpecialLabel(Object element) { + if (element instanceof MethodWrapper) { + return CallHierarchyMessages.CallHierarchyLabelProvider_root; + } else if (element == TreeTermination.SEARCH_CANCELED) { return CallHierarchyMessages.CallHierarchyLabelProvider_searchCanceled; } else if (isPendingUpdate(element)) { return CallHierarchyMessages.CallHierarchyLabelProvider_updatePending; } - return CallHierarchyMessages.CallHierarchyLabelProvider_noMethodSelected; } - + private boolean isPendingUpdate(Object element) { return element instanceof IWorkbenchAdapter; } + private String getElementLabel(MethodWrapper methodWrapper) { String label = super.getText(methodWrapper.getMember()); Index: ui/org/eclipse/jdt/internal/ui/navigator/JavaNavigatorLabelProvider.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/navigator/JavaNavigatorLabelProvider.java,v retrieving revision 1.4 diff -u -r1.4 JavaNavigatorLabelProvider.java --- ui/org/eclipse/jdt/internal/ui/navigator/JavaNavigatorLabelProvider.java 18 May 2006 10:28:43 -0000 1.4 +++ ui/org/eclipse/jdt/internal/ui/navigator/JavaNavigatorLabelProvider.java 14 Mar 2007 14:25:42 -0000 @@ -33,8 +33,6 @@ import org.eclipse.jdt.internal.ui.navigator.IExtensionStateConstants.Values; import org.eclipse.jdt.internal.ui.packageview.PackageExplorerContentProvider; import org.eclipse.jdt.internal.ui.packageview.PackageExplorerLabelProvider; -import org.eclipse.jdt.internal.ui.viewsupport.AppearanceAwareLabelProvider; -import org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider; /** * Provides the labels for the Project Explorer. @@ -92,14 +90,7 @@ } private PackageExplorerLabelProvider createLabelProvider() { - - return new PackageExplorerLabelProvider( - AppearanceAwareLabelProvider.DEFAULT_TEXTFLAGS - | JavaElementLabels.P_COMPRESSED, - AppearanceAwareLabelProvider.DEFAULT_IMAGEFLAGS - | JavaElementImageProvider.SMALL_ICONS, - fContentProvider); - + return new PackageExplorerLabelProvider(fContentProvider); } public void dispose() { @@ -160,7 +151,7 @@ // Taken from StatusBarUpdater - protected String formatMessage(Object element) { + private String formatMessage(Object element) { if (element instanceof IJavaElement) { return formatJavaElementMessage((IJavaElement) element); } else if (element instanceof IResource) { Index: ui/org/eclipse/jdt/internal/ui/viewsupport/OwnerDrawSupport.java =================================================================== RCS file: ui/org/eclipse/jdt/internal/ui/viewsupport/OwnerDrawSupport.java diff -N ui/org/eclipse/jdt/internal/ui/viewsupport/OwnerDrawSupport.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ ui/org/eclipse/jdt/internal/ui/viewsupport/OwnerDrawSupport.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,148 @@ +/******************************************************************************* + * 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.jdt.internal.ui.viewsupport; + +import java.util.Iterator; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.TableItem; +import org.eclipse.swt.widgets.TreeItem; +import org.eclipse.swt.widgets.Widget; + +import org.eclipse.jface.viewers.IBaseLabelProvider; +import org.eclipse.jface.viewers.StructuredViewer; + +import org.eclipse.jdt.internal.ui.JavaPlugin; + +public class OwnerDrawSupport { + private static final String PREF="org.eclipse.jdt.ui.coloredlabels"; //$NON-NLS-1$ + + private final StructuredViewer fViewer; + private final Point fBoundOffset; + + private OwnerDrawSupport(StructuredViewer viewer) { + this(viewer, new Point(2, 2)); + } + + private OwnerDrawSupport(StructuredViewer viewer, Point boundOffset) { + fViewer= viewer; + fBoundOffset= boundOffset; + } + + private Listener fPaintListener= new Listener() { + public void handleEvent(Event event) { + performPaint(event); + } + }; + + public void installOwnerDraw() { + Control control= fViewer.getControl(); + control.addListener(SWT.PaintItem, fPaintListener); + } + + public void uninstallOwnerDraw() { + Control control= fViewer.getControl(); + control.removeListener(SWT.PaintItem, fPaintListener); + } + + private void performPaint(Event event) { + if ((event.detail & SWT.SELECTED) != 0) { + return; + } + + IBaseLabelProvider labelProvider= fViewer.getLabelProvider(); + if (labelProvider instanceof IRichLabelProvider) { + IRichLabelProvider richLabelProvider= (IRichLabelProvider) labelProvider; + Widget item= event.item; + ColoredString richLabel= richLabelProvider.getRichTextLabel(item.getData()); + if (richLabel != null) { + if (item instanceof TreeItem) { + Rectangle bounds= ((TreeItem) item).getBounds(); + processRichLabel(event.gc, bounds.x + fBoundOffset.x, bounds.y + fBoundOffset.y, richLabel); + } else if (item instanceof TableItem) { + Rectangle bounds= ((TableItem) item).getBounds(); + processRichLabel(event.gc, bounds.x +2, bounds.y + 2, richLabel); + } + } + } + } + + private void processRichLabel(GC gc, int x, int y, ColoredString richLabel) { + String text= richLabel.getString(); + + int offsetProcessed= 0; + Iterator ranges= richLabel.getRanges(); + while (ranges.hasNext()) { + ColoredString.ColorRange curr= (ColoredString.ColorRange) ranges.next(); + if (offsetProcessed < curr.offset) { + x= draw(gc, x, y, text.substring(offsetProcessed, curr.offset), 0, 0); + } + x= draw(gc, x, y, text.substring(curr.offset, curr.offset + curr.length), curr.foregroundColor, curr.backgroundColor); + offsetProcessed= curr.offset + curr.length; + } + } + + private int draw(GC gc, int x, int y, String text, int foregroundColor, int backgroundColor) { + Point p= gc.textExtent(text); + if (foregroundColor > 0 || backgroundColor > 0) { + gc.setForeground(getForegroundColor(gc, foregroundColor)); + gc.drawText(text, x, y, SWT.NONE); + } + return x + p.x; + } + + private Color getForegroundColor(GC gc, int color) { + switch (color) { + case 0: + return gc.getDevice().getSystemColor(SWT.COLOR_LIST_FOREGROUND); + case 1: + return gc.getDevice().getSystemColor(SWT.COLOR_DARK_GRAY); + case 2: + return gc.getDevice().getSystemColor(SWT.COLOR_DARK_BLUE); + case 3: + return gc.getDevice().getSystemColor(SWT.COLOR_GRAY); + case 4: + return gc.getDevice().getSystemColor(SWT.COLOR_DARK_RED); + case 5: + return gc.getDevice().getSystemColor(SWT.COLOR_DARK_CYAN); + default: + return gc.getDevice().getSystemColor(SWT.COLOR_RED); + } + } + + public static void install(StructuredViewer viewer) { + String property= System.getProperty(PREF, "false"); //$NON-NLS-1$ + if (Boolean.valueOf(property).booleanValue()) { + OwnerDrawSupport support= new OwnerDrawSupport(viewer); + support.installOwnerDraw(); + return; + } + int index= property.indexOf(':'); + if (index != -1) { + try { + int x= Integer.parseInt(property.substring(0, index)); + int y= Integer.parseInt(property.substring(index + 1)); + OwnerDrawSupport support= new OwnerDrawSupport(viewer, new Point(x, y)); + support.installOwnerDraw(); + } catch (NumberFormatException e) { + JavaPlugin.logErrorMessage("Invalid arguments for " + PREF); //$NON-NLS-1$ + } + } + } + +} Index: ui/org/eclipse/jdt/internal/ui/viewsupport/ColoredString.java =================================================================== RCS file: ui/org/eclipse/jdt/internal/ui/viewsupport/ColoredString.java diff -N ui/org/eclipse/jdt/internal/ui/viewsupport/ColoredString.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ ui/org/eclipse/jdt/internal/ui/viewsupport/ColoredString.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,124 @@ +/******************************************************************************* + * 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.jdt.internal.ui.viewsupport; + +import java.util.ArrayList; +import java.util.Iterator; + + +public class ColoredString { + + private StringBuffer fBuffer; + private ArrayList fRanges; + + public ColoredString() { + fBuffer= new StringBuffer(); + fRanges= new ArrayList(5); + } + + public ColoredString(String text) { + this(text, 0, 0); + } + + public ColoredString(String text, int foregroundColor, int backgroundColor) { + this(); + append(text, foregroundColor, backgroundColor); + } + + public String getString() { + return fBuffer.toString(); + } + + public int length() { + return fBuffer.length(); + } + + public Iterator getRanges() { + return fRanges.iterator(); + } + + public ColoredString append(String text) { + return append(text, 0, 0); + } + + public ColoredString append(char ch) { + return append(String.valueOf(ch), 0, 0); + } + + public ColoredString append(ColoredString string) { + int offset= fBuffer.length(); + fBuffer.append(string.getString()); + for (Iterator iterator= string.getRanges(); iterator.hasNext();) { + ColorRange curr= (ColorRange) iterator.next(); + fRanges.add(new ColorRange(offset + curr.offset, curr.length, curr.foregroundColor, curr.backgroundColor)); + } + return this; + } + + public ColoredString append(String text, int foregroundColor) { + return append(text, foregroundColor, 0); + } + + public ColoredString append(String text, int foregroundColor, int backgroundColor) { + if (text.length() == 0) + return this; + + int offset= fBuffer.length(); + fBuffer.append(text); + if (foregroundColor != 0 || backgroundColor != 0) { + if (!fRanges.isEmpty()) { + ColorRange last= (ColorRange) fRanges.get(fRanges.size() - 1); + if (last.offset + last.length == offset && last.foregroundColor == foregroundColor && last.backgroundColor == backgroundColor) { + last.length += text.length(); + return this; + } + } + fRanges.add(new ColorRange(offset, text.length(), foregroundColor, backgroundColor)); + } + return this; + } + + public void colorize(int offset, int length, int foregroundColor, int backgroundColor) { + if (offset < 0 || offset + length > fBuffer.length()) { + throw new IllegalArgumentException("Invalid offset (" + offset + ") or length (" + length + ")"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ + } + + + int insertPos= 0; + for (int i= 0; i < fRanges.size(); i++) { + ColorRange curr= (ColorRange) fRanges.get(i); + if (curr.offset + curr.length <= offset) { + insertPos= i + 1; + } + } + if (insertPos < fRanges.size()) { + ColorRange curr= (ColorRange) fRanges.get(insertPos); + if (curr.offset > offset + length) { + throw new IllegalArgumentException("Overlapping ranges"); //$NON-NLS-1$ + } + } + fRanges.add(insertPos, new ColorRange(offset, length, foregroundColor, backgroundColor)); + } + + public static class ColorRange { + public int offset; + public int length; + public int foregroundColor; + public int backgroundColor; + + public ColorRange(int offset, int length, int foregroundColor, int backgroundColor) { + this.offset= offset; + this.length= length; + this.foregroundColor= foregroundColor; + this.backgroundColor= backgroundColor; + } + } +} Index: ui/org/eclipse/jdt/internal/ui/viewsupport/IRichLabelProvider.java =================================================================== RCS file: ui/org/eclipse/jdt/internal/ui/viewsupport/IRichLabelProvider.java diff -N ui/org/eclipse/jdt/internal/ui/viewsupport/IRichLabelProvider.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ ui/org/eclipse/jdt/internal/ui/viewsupport/IRichLabelProvider.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,19 @@ +/******************************************************************************* + * 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.jdt.internal.ui.viewsupport; + +import org.eclipse.jface.viewers.ILabelProvider; + +public interface IRichLabelProvider extends ILabelProvider { + + ColoredString getRichTextLabel(Object object); + +} Index: ui/org/eclipse/jdt/internal/ui/viewsupport/ColoredJavaElementLabels.java =================================================================== RCS file: ui/org/eclipse/jdt/internal/ui/viewsupport/ColoredJavaElementLabels.java diff -N ui/org/eclipse/jdt/internal/ui/viewsupport/ColoredJavaElementLabels.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ ui/org/eclipse/jdt/internal/ui/viewsupport/ColoredJavaElementLabels.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,973 @@ +/******************************************************************************* + * 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.jdt.internal.ui.viewsupport; + +import org.eclipse.core.runtime.IPath; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; + +import org.eclipse.ui.model.IWorkbenchAdapter; + +import org.eclipse.jdt.core.BindingKey; +import org.eclipse.jdt.core.ClasspathContainerInitializer; +import org.eclipse.jdt.core.Flags; +import org.eclipse.jdt.core.IClassFile; +import org.eclipse.jdt.core.IClasspathContainer; +import org.eclipse.jdt.core.IClasspathEntry; +import org.eclipse.jdt.core.ICompilationUnit; +import org.eclipse.jdt.core.IField; +import org.eclipse.jdt.core.IInitializer; +import org.eclipse.jdt.core.IJavaElement; +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.ILocalVariable; +import org.eclipse.jdt.core.IMember; +import org.eclipse.jdt.core.IMethod; +import org.eclipse.jdt.core.IPackageFragment; +import org.eclipse.jdt.core.IPackageFragmentRoot; +import org.eclipse.jdt.core.IType; +import org.eclipse.jdt.core.ITypeParameter; +import org.eclipse.jdt.core.JavaCore; +import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.core.Signature; + +import org.eclipse.jdt.internal.corext.util.JavaModelUtil; +import org.eclipse.jdt.internal.corext.util.Messages; + +import org.eclipse.jdt.ui.JavaElementLabels; + +import org.eclipse.jdt.internal.ui.JavaPlugin; +import org.eclipse.jdt.internal.ui.JavaUIMessages; + +public class ColoredJavaElementLabels { + + public static final int QUALIFIER_COLOR= 1; + public static final int NUMBER_OF_MATCHES_COLOR= 2; + public static final int DECORATIONS_COLOR= 4; + public static final int FILE_SUFFIX_COLOR= 0; + + public final static long COLORIZE= 1L << 55; + + + private final static long QUALIFIER_FLAGS= JavaElementLabels.P_COMPRESSED | JavaElementLabels.USE_RESOLVED; + + + private static final boolean getFlag(long flags, long flag) { + return (flags & flag) != 0; + } + + /** + * Returns the label of the given object. The object must be of type {@link IJavaElement} or adapt to {@link IWorkbenchAdapter}. The empty string is returned + * if the element type is not known. + * @param obj Object to get the label from. + * @param flags The rendering flags + * @return Returns the label or the empty string if the object type is not supported. + */ + public static ColoredString getTextLabel(Object obj, long flags) { + if (obj instanceof IJavaElement) { + return getElementLabel((IJavaElement) obj, flags); + } else if (obj instanceof IResource) { + ColoredString result= new ColoredString(((IResource) obj).getName()); + if (obj instanceof IFile && getFlag(flags, COLORIZE) && FILE_SUFFIX_COLOR != 0) { + int extLen= ((IFile) obj).getFileExtension().length(); + result.colorize(result.length() - extLen, extLen, FILE_SUFFIX_COLOR, 0); + } + return result; + } + return new ColoredString(JavaElementLabels.getTextLabel(obj, flags), 0, 0); + } + + /** + * Returns the label for a Java element with the flags as defined by this class. + * @param element The element to render. + * @param flags The rendering flags. + * @return the label of the Java element + */ + public static ColoredString getElementLabel(IJavaElement element, long flags) { + ColoredString result= new ColoredString(); + getElementLabel(element, flags, result); + return result; + } + + /** + * Returns the label for a Java element with the flags as defined by this class. + * @param element The element to render. + * @param flags The rendering flags. + * @param result The buffer to append the resulting label to. + */ + public static void getElementLabel(IJavaElement element, long flags, ColoredString result) { + int type= element.getElementType(); + IPackageFragmentRoot root= null; + + if (type != IJavaElement.JAVA_MODEL && type != IJavaElement.JAVA_PROJECT && type != IJavaElement.PACKAGE_FRAGMENT_ROOT) + root= JavaModelUtil.getPackageFragmentRoot(element); + if (root != null && getFlag(flags, JavaElementLabels.PREPEND_ROOT_PATH)) { + getPackageFragmentRootLabel(root, JavaElementLabels.ROOT_QUALIFIED, result); + result.append(JavaElementLabels.CONCAT_STRING); + } + + switch (type) { + case IJavaElement.METHOD: + getMethodLabel((IMethod) element, flags, result); + break; + case IJavaElement.FIELD: + getFieldLabel((IField) element, flags, result); + break; + case IJavaElement.LOCAL_VARIABLE: + getLocalVariableLabel((ILocalVariable) element, flags, result); + break; + case IJavaElement.INITIALIZER: + getInitializerLabel((IInitializer) element, flags, result); + break; + case IJavaElement.TYPE: + getTypeLabel((IType) element, flags, result); + break; + case IJavaElement.CLASS_FILE: + getClassFileLabel((IClassFile) element, flags, result); + break; + case IJavaElement.COMPILATION_UNIT: + getCompilationUnitLabel((ICompilationUnit) element, flags, result); + break; + case IJavaElement.PACKAGE_FRAGMENT: + getPackageFragmentLabel((IPackageFragment) element, flags, result); + break; + case IJavaElement.PACKAGE_FRAGMENT_ROOT: + getPackageFragmentRootLabel((IPackageFragmentRoot) element, flags, result); + break; + case IJavaElement.IMPORT_CONTAINER: + case IJavaElement.IMPORT_DECLARATION: + case IJavaElement.PACKAGE_DECLARATION: + getDeclarationLabel(element, flags, result); + break; + case IJavaElement.JAVA_PROJECT: + case IJavaElement.JAVA_MODEL: + result.append(element.getElementName()); + break; + default: + result.append(element.getElementName()); + } + + if (root != null && getFlag(flags, JavaElementLabels.APPEND_ROOT_PATH)) { + int offset= result.length(); + result.append(JavaElementLabels.CONCAT_STRING); + getPackageFragmentRootLabel(root, JavaElementLabels.ROOT_QUALIFIED, result); + + if (getFlag(flags, COLORIZE)) { + result.colorize(offset, result.length() - offset, QUALIFIER_COLOR, 0); + } + + } + } + + /** + * Appends the label for a method to a {@link ColoredString}. Considers the M_* flags. + * @param method The element to render. + * @param flags The rendering flags. Flags with names starting with 'M_' are considered. + * @param result The buffer to append the resulting label to. + */ + public static void getMethodLabel(IMethod method, long flags, ColoredString result) { + try { + BindingKey resolvedKey= getFlag(flags, JavaElementLabels.USE_RESOLVED) && method.isResolved() ? new BindingKey(method.getKey()) : null; + String resolvedSig= (resolvedKey != null) ? resolvedKey.toSignature() : null; + + // type parameters + if (getFlag(flags, JavaElementLabels.M_PRE_TYPE_PARAMETERS)) { + if (resolvedKey != null) { + if (resolvedKey.isParameterizedMethod()) { + String[] typeArgRefs= resolvedKey.getTypeArguments(); + if (typeArgRefs.length > 0) { + getTypeArgumentSignaturesLabel(typeArgRefs, flags, result); + result.append(' '); + } + } else { + String[] typeParameterSigs= Signature.getTypeParameters(resolvedSig); + if (typeParameterSigs.length > 0) { + getTypeParameterSignaturesLabel(typeParameterSigs, flags, result); + result.append(' '); + } + } + } else if (method.exists()) { + ITypeParameter[] typeParameters= method.getTypeParameters(); + if (typeParameters.length > 0) { + getTypeParametersLabel(typeParameters, flags, result); + result.append(' '); + } + } + } + + // return type + if (getFlag(flags, JavaElementLabels.M_PRE_RETURNTYPE) && method.exists() && !method.isConstructor()) { + String returnTypeSig= resolvedSig != null ? Signature.getReturnType(resolvedSig) : method.getReturnType(); + getTypeSignatureLabel(returnTypeSig, flags, result); + result.append(' '); + } + + // qualification + if (getFlag(flags, JavaElementLabels.M_FULLY_QUALIFIED)) { + getTypeLabel(method.getDeclaringType(), JavaElementLabels.T_FULLY_QUALIFIED | (flags & QUALIFIER_FLAGS), result); + result.append('.'); + } + + result.append(method.getElementName()); + + // parameters + result.append('('); + if (getFlag(flags, JavaElementLabels.M_PARAMETER_TYPES | JavaElementLabels.M_PARAMETER_NAMES)) { + String[] types= null; + int nParams= 0; + boolean renderVarargs= false; + if (getFlag(flags, JavaElementLabels.M_PARAMETER_TYPES)) { + if (resolvedSig != null) { + types= Signature.getParameterTypes(resolvedSig); + } else { + types= method.getParameterTypes(); + } + nParams= types.length; + renderVarargs= method.exists() && Flags.isVarargs(method.getFlags()); + } + String[] names= null; + if (getFlag(flags, JavaElementLabels.M_PARAMETER_NAMES) && method.exists()) { + names= method.getParameterNames(); + if (types == null) { + nParams= names.length; + } else { // types != null + if (nParams != names.length) { + if (resolvedSig != null && types.length > names.length) { + // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=99137 + nParams= names.length; + String[] typesWithoutSyntheticParams= new String[nParams]; + System.arraycopy(types, types.length - nParams, typesWithoutSyntheticParams, 0, nParams); + types= typesWithoutSyntheticParams; + } else { + // https://bugs.eclipse.org/bugs/show_bug.cgi?id=101029 + // JavaPlugin.logErrorMessage("JavaElementLabels: Number of param types(" + nParams + ") != number of names(" + names.length + "): " + method.getElementName()); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ + names= null; // no names rendered + } + } + } + } + + for (int i= 0; i < nParams; i++) { + if (i > 0) { + result.append(JavaElementLabels.COMMA_STRING); + } + if (types != null) { + String paramSig= types[i]; + if (renderVarargs && (i == nParams - 1)) { + int newDim= Signature.getArrayCount(paramSig) - 1; + getTypeSignatureLabel(Signature.getElementType(paramSig), flags, result); + for (int k= 0; k < newDim; k++) { + result.append('[').append(']'); + } + result.append(JavaElementLabels.ELLIPSIS_STRING); + } else { + getTypeSignatureLabel(paramSig, flags, result); + } + } + if (names != null) { + if (types != null) { + result.append(' '); + } + result.append(names[i]); + } + } + } else { + if (method.getParameterTypes().length > 0) { + result.append(JavaElementLabels.ELLIPSIS_STRING); + } + } + result.append(')'); + + if (getFlag(flags, JavaElementLabels.M_EXCEPTIONS)) { + String[] types; + if (resolvedKey != null) { + types= resolvedKey.getThrownExceptions(); + } else { + types= method.exists() ? method.getExceptionTypes() : new String[0]; + } + if (types.length > 0) { + result.append(" throws "); //$NON-NLS-1$ + for (int i= 0; i < types.length; i++) { + if (i > 0) { + result.append(JavaElementLabels.COMMA_STRING); + } + getTypeSignatureLabel(types[i], flags, result); + } + } + } + + if (getFlag(flags, JavaElementLabels.M_APP_TYPE_PARAMETERS)) { + if (resolvedKey != null) { + if (resolvedKey.isParameterizedMethod()) { + String[] typeArgRefs= resolvedKey.getTypeArguments(); + if (typeArgRefs.length > 0) { + result.append(' '); + getTypeArgumentSignaturesLabel(typeArgRefs, flags, result); + } + } else { + String[] typeParameterSigs= Signature.getTypeParameters(resolvedSig); + if (typeParameterSigs.length > 0) { + result.append(' '); + getTypeParameterSignaturesLabel(typeParameterSigs, flags, result); + } + } + } else if (method.exists()) { + ITypeParameter[] typeParameters= method.getTypeParameters(); + if (typeParameters.length > 0) { + result.append(' '); + getTypeParametersLabel(typeParameters, flags, result); + } + } + } + + if (getFlag(flags, JavaElementLabels.M_APP_RETURNTYPE) && method.exists() && !method.isConstructor()) { + result.append(JavaElementLabels.DECL_STRING); + String returnTypeSig= resolvedSig != null ? Signature.getReturnType(resolvedSig) : method.getReturnType(); + getTypeSignatureLabel(returnTypeSig, flags, result); + } + + // category + if (getFlag(flags, JavaElementLabels.M_CATEGORY) && method.exists()) + getCategoryLabel(method, result); + + // post qualification + if (getFlag(flags, JavaElementLabels.M_POST_QUALIFIED)) { + int offset= result.length(); + result.append(JavaElementLabels.CONCAT_STRING); + getTypeLabel(method.getDeclaringType(), JavaElementLabels.T_FULLY_QUALIFIED | (flags & QUALIFIER_FLAGS), result); + if (getFlag(flags, COLORIZE)) { + result.colorize(offset, result.length() - offset, QUALIFIER_COLOR, 0); + } + } + + } catch (JavaModelException e) { + JavaPlugin.log(e); // NotExistsException will not reach this point + } + } + + private static void getCategoryLabel(IMember member, ColoredString result) throws JavaModelException { + String[] categories= member.getCategories(); + if (categories.length > 0) { + ColoredString categoriesBuf= new ColoredString(); + for (int i= 0; i < categories.length; i++) { + if (i > 0) + categoriesBuf.append(JavaUIMessages.JavaElementLabels_category_separator_string); + categoriesBuf.append(categories[i]); + } + result.append(JavaElementLabels.CONCAT_STRING); + result.append(Messages.format(JavaUIMessages.JavaElementLabels_category , categoriesBuf.toString())); + } + } + + private static void getTypeParametersLabel(ITypeParameter[] typeParameters, long flags, ColoredString result) { + if (typeParameters.length > 0) { + result.append('<'); + for (int i = 0; i < typeParameters.length; i++) { + if (i > 0) { + result.append(JavaElementLabels.COMMA_STRING); + } + result.append(typeParameters[i].getElementName()); + } + result.append('>'); + } + } + + /** + * Appends the label for a field to a {@link ColoredString}. Considers the F_* flags. + * @param field The element to render. + * @param flags The rendering flags. Flags with names starting with 'F_' are considered. + * @param result The buffer to append the resulting label to. + */ + public static void getFieldLabel(IField field, long flags, ColoredString result) { + try { + + if (getFlag(flags, JavaElementLabels.F_PRE_TYPE_SIGNATURE) && field.exists() && !Flags.isEnum(field.getFlags())) { + if (getFlag(flags, JavaElementLabels.USE_RESOLVED) && field.isResolved()) { + getTypeSignatureLabel(new BindingKey(field.getKey()).toSignature(), flags, result); + } else { + getTypeSignatureLabel(field.getTypeSignature(), flags, result); + } + result.append(' '); + } + + // qualification + if (getFlag(flags, JavaElementLabels.F_FULLY_QUALIFIED)) { + getTypeLabel(field.getDeclaringType(), JavaElementLabels.T_FULLY_QUALIFIED | (flags & QUALIFIER_FLAGS), result); + result.append('.'); + } + result.append(field.getElementName()); + + if (getFlag(flags, JavaElementLabels.F_APP_TYPE_SIGNATURE) && field.exists() && !Flags.isEnum(field.getFlags())) { + result.append(JavaElementLabels.DECL_STRING); + if (getFlag(flags, JavaElementLabels.USE_RESOLVED) && field.isResolved()) { + getTypeSignatureLabel(new BindingKey(field.getKey()).toSignature(), flags, result); + } else { + getTypeSignatureLabel(field.getTypeSignature(), flags, result); + } + } + + // category + if (getFlag(flags, JavaElementLabels.F_CATEGORY) && field.exists()) + getCategoryLabel(field, result); + + // post qualification + if (getFlag(flags, JavaElementLabels.F_POST_QUALIFIED)) { + int offset= result.length(); + result.append(JavaElementLabels.CONCAT_STRING); + getTypeLabel(field.getDeclaringType(), JavaElementLabels.T_FULLY_QUALIFIED | (flags & QUALIFIER_FLAGS), result); + if (getFlag(flags, COLORIZE)) { + result.colorize(offset, result.length() - offset, QUALIFIER_COLOR, 0); + } + } + + } catch (JavaModelException e) { + JavaPlugin.log(e); // NotExistsException will not reach this point + } + } + + /** + * Appends the label for a local variable to a {@link ColoredString}. + * @param localVariable The element to render. + * @param flags The rendering flags. Flags with names starting with 'F_' are considered. + * @param result The buffer to append the resulting label to. + */ + public static void getLocalVariableLabel(ILocalVariable localVariable, long flags, ColoredString result) { + if (getFlag(flags, JavaElementLabels.F_PRE_TYPE_SIGNATURE)) { + getTypeSignatureLabel(localVariable.getTypeSignature(), flags, result); + result.append(' '); + } + + if (getFlag(flags, JavaElementLabels.F_FULLY_QUALIFIED)) { + getElementLabel(localVariable.getParent(), JavaElementLabels.M_PARAMETER_TYPES | JavaElementLabels.M_FULLY_QUALIFIED | JavaElementLabels.T_FULLY_QUALIFIED | (flags & QUALIFIER_FLAGS), result); + result.append('.'); + } + + result.append(localVariable.getElementName()); + + if (getFlag(flags, JavaElementLabels.F_APP_TYPE_SIGNATURE)) { + result.append(JavaElementLabels.DECL_STRING); + getTypeSignatureLabel(localVariable.getTypeSignature(), flags, result); + } + + // post qualification + if (getFlag(flags, JavaElementLabels.F_POST_QUALIFIED)) { + result.append(JavaElementLabels.CONCAT_STRING); + getElementLabel(localVariable.getParent(), JavaElementLabels.M_PARAMETER_TYPES | JavaElementLabels.M_FULLY_QUALIFIED | JavaElementLabels.T_FULLY_QUALIFIED | (flags & QUALIFIER_FLAGS), result); + } + } + + /** + * Appends the label for a initializer to a {@link ColoredString}. Considers the I_* flags. + * @param initializer The element to render. + * @param flags The rendering flags. Flags with names starting with 'I_' are considered. + * @param result The buffer to append the resulting label to. + */ + public static void getInitializerLabel(IInitializer initializer, long flags, ColoredString result) { + // qualification + if (getFlag(flags, JavaElementLabels.I_FULLY_QUALIFIED)) { + getTypeLabel(initializer.getDeclaringType(), JavaElementLabels.T_FULLY_QUALIFIED | (flags & QUALIFIER_FLAGS), result); + result.append('.'); + } + result.append(JavaUIMessages.JavaElementLabels_initializer); + + // post qualification + if (getFlag(flags, JavaElementLabels.I_POST_QUALIFIED)) { + int offset= result.length(); + result.append(JavaElementLabels.CONCAT_STRING); + getTypeLabel(initializer.getDeclaringType(), JavaElementLabels.T_FULLY_QUALIFIED | (flags & QUALIFIER_FLAGS), result); + if (getFlag(flags, COLORIZE)) { + result.colorize(offset, result.length() - offset, QUALIFIER_COLOR, 0); + } + } + } + + private static void getTypeSignatureLabel(String typeSig, long flags, ColoredString result) { + int sigKind= Signature.getTypeSignatureKind(typeSig); + switch (sigKind) { + case Signature.BASE_TYPE_SIGNATURE: + result.append(Signature.toString(typeSig)); + break; + case Signature.ARRAY_TYPE_SIGNATURE: + getTypeSignatureLabel(Signature.getElementType(typeSig), flags, result); + for (int dim= Signature.getArrayCount(typeSig); dim > 0; dim--) { + result.append('[').append(']'); + } + break; + case Signature.CLASS_TYPE_SIGNATURE: + String baseType= Signature.toString(Signature.getTypeErasure(typeSig)); + result.append(Signature.getSimpleName(baseType)); + + String[] typeArguments= Signature.getTypeArguments(typeSig); + getTypeArgumentSignaturesLabel(typeArguments, flags, result); + break; + case Signature.TYPE_VARIABLE_SIGNATURE: + result.append(Signature.toString(typeSig)); + break; + case Signature.WILDCARD_TYPE_SIGNATURE: + char ch= typeSig.charAt(0); + if (ch == Signature.C_STAR) { //workaround for bug 85713 + result.append('?'); + } else { + if (ch == Signature.C_EXTENDS) { + result.append("? extends "); //$NON-NLS-1$ + getTypeSignatureLabel(typeSig.substring(1), flags, result); + } else if (ch == Signature.C_SUPER) { + result.append("? super "); //$NON-NLS-1$ + getTypeSignatureLabel(typeSig.substring(1), flags, result); + } + } + break; + case Signature.CAPTURE_TYPE_SIGNATURE: + getTypeSignatureLabel(typeSig.substring(1), flags, result); + break; + default: + // unknown + } + } + + private static void getTypeArgumentSignaturesLabel(String[] typeArgsSig, long flags, ColoredString result) { + if (typeArgsSig.length > 0) { + result.append('<'); + for (int i = 0; i < typeArgsSig.length; i++) { + if (i > 0) { + result.append(JavaElementLabels.COMMA_STRING); + } + getTypeSignatureLabel(typeArgsSig[i], flags, result); + } + result.append('>'); + } + } + + private static void getTypeParameterSignaturesLabel(String[] typeParamSigs, long flags, ColoredString result) { + if (typeParamSigs.length > 0) { + result.append('<'); + for (int i = 0; i < typeParamSigs.length; i++) { + if (i > 0) { + result.append(JavaElementLabels.COMMA_STRING); + } + result.append(Signature.getTypeVariable(typeParamSigs[i])); + } + result.append('>'); + } + } + + + /** + * Appends the label for a type to a {@link ColoredString}. Considers the T_* flags. + * @param type The element to render. + * @param flags The rendering flags. Flags with names starting with 'T_' are considered. + * @param result The buffer to append the resulting label to. + */ + public static void getTypeLabel(IType type, long flags, ColoredString result) { + + if (getFlag(flags, JavaElementLabels.T_FULLY_QUALIFIED)) { + IPackageFragment pack= type.getPackageFragment(); + if (!pack.isDefaultPackage()) { + getPackageFragmentLabel(pack, (flags & QUALIFIER_FLAGS), result); + result.append('.'); + } + } + if (getFlag(flags, JavaElementLabels.T_FULLY_QUALIFIED | JavaElementLabels.T_CONTAINER_QUALIFIED)) { + IType declaringType= type.getDeclaringType(); + if (declaringType != null) { + getTypeLabel(declaringType, JavaElementLabels.T_CONTAINER_QUALIFIED | (flags & QUALIFIER_FLAGS), result); + result.append('.'); + } + int parentType= type.getParent().getElementType(); + if (parentType == IJavaElement.METHOD || parentType == IJavaElement.FIELD || parentType == IJavaElement.INITIALIZER) { // anonymous or local + getElementLabel(type.getParent(), 0, result); + result.append('.'); + } + } + + String typeName= type.getElementName(); + if (typeName.length() == 0) { // anonymous + try { + if (type.getParent() instanceof IField && type.isEnum()) { + typeName= '{' + JavaElementLabels.ELLIPSIS_STRING + '}'; + } else { + String supertypeName; + String[] superInterfaceNames= type.getSuperInterfaceNames(); + if (superInterfaceNames.length > 0) { + supertypeName= Signature.getSimpleName(superInterfaceNames[0]); + } else { + supertypeName= Signature.getSimpleName(type.getSuperclassName()); + } + typeName= Messages.format(JavaUIMessages.JavaElementLabels_anonym_type , supertypeName); + } + } catch (JavaModelException e) { + //ignore + typeName= JavaUIMessages.JavaElementLabels_anonym; + } + } + result.append(typeName); + if (getFlag(flags, JavaElementLabels.T_TYPE_PARAMETERS)) { + if (getFlag(flags, JavaElementLabels.USE_RESOLVED) && type.isResolved()) { + BindingKey key= new BindingKey(type.getKey()); + if (key.isParameterizedType()) { + String[] typeArguments= key.getTypeArguments(); + getTypeArgumentSignaturesLabel(typeArguments, flags, result); + } else { + String[] typeParameters= Signature.getTypeParameters(key.toSignature()); + getTypeParameterSignaturesLabel(typeParameters, flags, result); + } + } else if (type.exists()) { + try { + getTypeParametersLabel(type.getTypeParameters(), flags, result); + } catch (JavaModelException e) { + // ignore + } + } + } + + // category + if (getFlag(flags, JavaElementLabels.T_CATEGORY) && type.exists()) { + try { + getCategoryLabel(type, result); + } catch (JavaModelException e) { + // ignore + } + } + + // post qualification + if (getFlag(flags, JavaElementLabels.T_POST_QUALIFIED)) { + int offset= result.length(); + result.append(JavaElementLabels.CONCAT_STRING); + IType declaringType= type.getDeclaringType(); + if (declaringType != null) { + getTypeLabel(declaringType, JavaElementLabels.T_FULLY_QUALIFIED | (flags & QUALIFIER_FLAGS), result); + int parentType= type.getParent().getElementType(); + if (parentType == IJavaElement.METHOD || parentType == IJavaElement.FIELD || parentType == IJavaElement.INITIALIZER) { // anonymous or local + result.append('.'); + getElementLabel(type.getParent(), 0, result); + } + } else { + getPackageFragmentLabel(type.getPackageFragment(), flags & QUALIFIER_FLAGS, result); + } + if (getFlag(flags, COLORIZE)) { + result.colorize(offset, result.length() - offset, QUALIFIER_COLOR, 0); + } + } + } + + /** + * Appends the label for a import container, import or package declaration to a {@link ColoredString}. Considers the D_* flags. + * @param declaration The element to render. + * @param flags The rendering flags. Flags with names starting with 'D_' are considered. + * @param result The buffer to append the resulting label to. + */ + public static void getDeclarationLabel(IJavaElement declaration, long flags, ColoredString result) { + if (getFlag(flags, JavaElementLabels.D_QUALIFIED)) { + IJavaElement openable= (IJavaElement) declaration.getOpenable(); + if (openable != null) { + result.append(getElementLabel(openable, JavaElementLabels.CF_QUALIFIED | JavaElementLabels.CU_QUALIFIED | (flags & QUALIFIER_FLAGS))); + result.append('/'); + } + } + if (declaration.getElementType() == IJavaElement.IMPORT_CONTAINER) { + result.append(JavaUIMessages.JavaElementLabels_import_container); + } else { + result.append(declaration.getElementName()); + } + // post qualification + if (getFlag(flags, JavaElementLabels.D_POST_QUALIFIED)) { + int offset= result.length(); + IJavaElement openable= (IJavaElement) declaration.getOpenable(); + if (openable != null) { + result.append(JavaElementLabels.CONCAT_STRING); + result.append(getElementLabel(openable, JavaElementLabels.CF_QUALIFIED | JavaElementLabels.CU_QUALIFIED | (flags & QUALIFIER_FLAGS))); + } + if (getFlag(flags, COLORIZE)) { + result.colorize(offset, result.length() - offset, QUALIFIER_COLOR, 0); + } + } + } + + /** + * Appends the label for a class file to a {@link ColoredString}. Considers the CF_* flags. + * @param classFile The element to render. + * @param flags The rendering flags. Flags with names starting with 'CF_' are considered. + * @param result The buffer to append the resulting label to. + */ + public static void getClassFileLabel(IClassFile classFile, long flags, ColoredString result) { + if (getFlag(flags, JavaElementLabels.CF_QUALIFIED)) { + IPackageFragment pack= (IPackageFragment) classFile.getParent(); + if (!pack.isDefaultPackage()) { + getPackageFragmentLabel(pack, (flags & QUALIFIER_FLAGS), result); + result.append('.'); + } + } + result.append(classFile.getElementName()); + if (getFlag(flags, COLORIZE) && FILE_SUFFIX_COLOR != 0) { + int extLen= 6; + result.colorize(result.length() - extLen, extLen, FILE_SUFFIX_COLOR, 0); + } + + if (getFlag(flags, JavaElementLabels.CF_POST_QUALIFIED)) { + int offset= result.length(); + result.append(JavaElementLabels.CONCAT_STRING); + getPackageFragmentLabel((IPackageFragment) classFile.getParent(), flags & QUALIFIER_FLAGS, result); + if (getFlag(flags, COLORIZE)) { + result.colorize(offset, result.length() - offset, QUALIFIER_COLOR, 0); + } + } + } + + /** + * Appends the label for a compilation unit to a {@link ColoredString}. Considers the CU_* flags. + * @param cu The element to render. + * @param flags The rendering flags. Flags with names starting with 'CU_' are considered. + * @param result The buffer to append the resulting label to. + */ + public static void getCompilationUnitLabel(ICompilationUnit cu, long flags, ColoredString result) { + if (getFlag(flags, JavaElementLabels.CU_QUALIFIED)) { + IPackageFragment pack= (IPackageFragment) cu.getParent(); + if (!pack.isDefaultPackage()) { + getPackageFragmentLabel(pack, (flags & QUALIFIER_FLAGS), result); + result.append('.'); + } + } + result.append(cu.getElementName()); + if (getFlag(flags, COLORIZE) && FILE_SUFFIX_COLOR != 0) { + int extLen= cu.getPath().getFileExtension().length(); + result.colorize(result.length() - extLen, extLen, FILE_SUFFIX_COLOR, 0); + } + + if (getFlag(flags, JavaElementLabels.CU_POST_QUALIFIED)) { + int offset= result.length(); + result.append(JavaElementLabels.CONCAT_STRING); + getPackageFragmentLabel((IPackageFragment) cu.getParent(), flags & QUALIFIER_FLAGS, result); + if (getFlag(flags, COLORIZE)) { + result.colorize(offset, result.length() - offset, QUALIFIER_COLOR, 0); + } + } + } + + /** + * Appends the label for a package fragment to a {@link ColoredString}. Considers the P_* flags. + * @param pack The element to render. + * @param flags The rendering flags. Flags with names starting with P_' are considered. + * @param result The buffer to append the resulting label to. + */ + public static void getPackageFragmentLabel(IPackageFragment pack, long flags, ColoredString result) { + if (getFlag(flags, JavaElementLabels.P_QUALIFIED)) { + getPackageFragmentRootLabel((IPackageFragmentRoot) pack.getParent(), JavaElementLabels.ROOT_QUALIFIED, result); + result.append('/'); + } + if (pack.isDefaultPackage()) { + result.append(JavaElementLabels.DEFAULT_PACKAGE); + } else if (getFlag(flags, JavaElementLabels.P_COMPRESSED)) { + StringBuffer buf= new StringBuffer(); + JavaElementLabels.getPackageFragmentLabel(pack, JavaElementLabels.P_COMPRESSED, buf); + result.append(buf.toString()); + } else { + result.append(pack.getElementName()); + } + if (getFlag(flags, JavaElementLabels.P_POST_QUALIFIED)) { + int offset= result.length(); + result.append(JavaElementLabels.CONCAT_STRING); + getPackageFragmentRootLabel((IPackageFragmentRoot) pack.getParent(), JavaElementLabels.ROOT_QUALIFIED, result); + if (getFlag(flags, COLORIZE)) { + result.colorize(offset, result.length() - offset, QUALIFIER_COLOR, 0); + } + } + } + + /** + * Appends the label for a package fragment root to a {@link ColoredString}. Considers the ROOT_* flags. + * @param root The element to render. + * @param flags The rendering flags. Flags with names starting with ROOT_' are considered. + * @param result The buffer to append the resulting label to. + */ + public static void getPackageFragmentRootLabel(IPackageFragmentRoot root, long flags, ColoredString result) { + if (root.isArchive()) + getArchiveLabel(root, flags, result); + else + getFolderLabel(root, flags, result); + } + + private static void getArchiveLabel(IPackageFragmentRoot root, long flags, ColoredString result) { + // Handle variables different + if (getFlag(flags, JavaElementLabels.ROOT_VARIABLE) && getVariableLabel(root, flags, result)) + return; + boolean external= root.isExternal(); + if (external) + getExternalArchiveLabel(root, flags, result); + else + getInternalArchiveLabel(root, flags, result); + } + + private static boolean getVariableLabel(IPackageFragmentRoot root, long flags, ColoredString result) { + try { + IClasspathEntry rawEntry= root.getRawClasspathEntry(); + if (rawEntry != null && rawEntry.getEntryKind() == IClasspathEntry.CPE_VARIABLE) { + IPath path= rawEntry.getPath().makeRelative(); + int offset= result.length(); + if (getFlag(flags, JavaElementLabels.REFERENCED_ROOT_POST_QUALIFIED)) { + int segements= path.segmentCount(); + if (segements > 0) { + result.append(path.segment(segements - 1)); + if (segements > 1) { + result.append(JavaElementLabels.CONCAT_STRING); + result.append(path.removeLastSegments(1).toOSString()); + } + } else { + result.append(path.toString()); + } + } else { + result.append(path.toString()); + } + result.append(JavaElementLabels.CONCAT_STRING); + if (root.isExternal()) + result.append(root.getPath().toOSString()); + else + result.append(root.getPath().makeRelative().toString()); + + if (getFlag(flags, COLORIZE)) { + result.colorize(offset, result.length() - offset, QUALIFIER_COLOR, 0); + } + return true; + } + } catch (JavaModelException e) { + JavaPlugin.log(e); // problems with class path + } + return false; + } + + private static void getExternalArchiveLabel(IPackageFragmentRoot root, long flags, ColoredString result) { + IPath path= root.getPath(); + if (getFlag(flags, JavaElementLabels.REFERENCED_ROOT_POST_QUALIFIED)) { + int segements= path.segmentCount(); + if (segements > 0) { + result.append(path.segment(segements - 1)); + int offset= result.length(); + if (segements > 1 || path.getDevice() != null) { + result.append(JavaElementLabels.CONCAT_STRING); + result.append(path.removeLastSegments(1).toOSString()); + } + if (getFlag(flags, COLORIZE)) { + result.colorize(offset, result.length() - offset, QUALIFIER_COLOR, 0); + } + } else { + result.append(path.toOSString()); + } + } else { + result.append(path.toOSString()); + } + } + + private static void getInternalArchiveLabel(IPackageFragmentRoot root, long flags, ColoredString result) { + IResource resource= root.getResource(); + boolean rootQualified= getFlag(flags, JavaElementLabels.ROOT_QUALIFIED); + boolean referencedQualified= getFlag(flags, JavaElementLabels.REFERENCED_ROOT_POST_QUALIFIED) && isReferenced(root); + if (rootQualified) { + result.append(root.getPath().makeRelative().toString()); + } else { + result.append(root.getElementName()); + int offset= result.length(); + if (referencedQualified) { + result.append(JavaElementLabels.CONCAT_STRING); + result.append(resource.getParent().getFullPath().makeRelative().toString()); + } else if (getFlag(flags, JavaElementLabels.ROOT_POST_QUALIFIED)) { + result.append(JavaElementLabels.CONCAT_STRING); + result.append(root.getParent().getPath().makeRelative().toString()); + } else { + return; + } + if (getFlag(flags, COLORIZE)) { + result.colorize(offset, result.length() - offset, QUALIFIER_COLOR, 0); + } + } + } + + private static void getFolderLabel(IPackageFragmentRoot root, long flags, ColoredString result) { + IResource resource= root.getResource(); + boolean rootQualified= getFlag(flags, JavaElementLabels.ROOT_QUALIFIED); + boolean referencedQualified= getFlag(flags, JavaElementLabels.REFERENCED_ROOT_POST_QUALIFIED) && isReferenced(root); + if (rootQualified) { + result.append(root.getPath().makeRelative().toString()); + } else { + if (resource != null) { + IPath projectRelativePath= resource.getProjectRelativePath(); + if (projectRelativePath.segmentCount() == 0) { + result.append(resource.getName()); + referencedQualified= false; + } else { + result.append(projectRelativePath.toString()); + } + } else + result.append(root.getElementName()); + int offset= result.length(); + if (referencedQualified) { + result.append(JavaElementLabels.CONCAT_STRING); + result.append(resource.getProject().getName()); + } else if (getFlag(flags, JavaElementLabels.ROOT_POST_QUALIFIED)) { + result.append(JavaElementLabels.CONCAT_STRING); + result.append(root.getParent().getElementName()); + } else { + return; + } + if (getFlag(flags, COLORIZE)) { + result.colorize(offset, result.length() - offset, QUALIFIER_COLOR, 0); + } + } + } + + /** + * Returns true if the given package fragment root is + * referenced. This means it is own by a different project but is referenced + * by the root's parent. Returns false if the given root + * doesn't have an underlying resource. + * + * @since 3.2 + */ + private static boolean isReferenced(IPackageFragmentRoot root) { + IResource resource= root.getResource(); + if (resource != null) { + IProject jarProject= resource.getProject(); + IProject container= root.getJavaProject().getProject(); + return !container.equals(jarProject); + } + return false; + } + + /** + * Returns the label of a classpath container + * @param containerPath The path of the container. + * @param project The project the container is resolved in. + * @return Returns the label of the classpath container + * @throws JavaModelException Thrown when the resolving of the container failed. + */ + public static String getContainerEntryLabel(IPath containerPath, IJavaProject project) throws JavaModelException { + IClasspathContainer container= JavaCore.getClasspathContainer(containerPath, project); + if (container != null) { + return container.getDescription(); + } + ClasspathContainerInitializer initializer= JavaCore.getClasspathContainerInitializer(containerPath.segment(0)); + if (initializer != null) { + return initializer.getDescription(containerPath, project); + } + return containerPath.toString(); + } + + public static ColoredString decorateColoredString(ColoredString string, String decorated, int color) { + String label= string.getString(); + if (!decorated.startsWith(label)) { + return new ColoredString(decorated, 0, 0); // the decorator did something wild + } + if (decorated.length() > label.length()) { // decorator appended something + return string.append(decorated.substring(label.length()), color); + } + return string; // no change + } + +} #P org.eclipse.jdt.junit Index: src/org/eclipse/jdt/internal/junit/ui/TestViewer.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/TestViewer.java,v retrieving revision 1.15 diff -u -r1.15 TestViewer.java --- src/org/eclipse/jdt/internal/junit/ui/TestViewer.java 13 Mar 2007 10:37:08 -0000 1.15 +++ src/org/eclipse/jdt/internal/junit/ui/TestViewer.java 14 Mar 2007 14:25:44 -0000 @@ -57,6 +57,7 @@ import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.internal.ui.viewsupport.OwnerDrawSupport; import org.eclipse.jdt.internal.ui.viewsupport.SelectionProviderMediator; import org.eclipse.jdt.internal.junit.model.TestCaseElement; @@ -173,6 +174,7 @@ fViewerbook= new PageBook(parent, SWT.NULL); fTreeViewer= new TreeViewer(fViewerbook, SWT.V_SCROLL | SWT.SINGLE); + OwnerDrawSupport.install(fTreeViewer); fTreeViewer.setUseHashlookup(true); fTreeContentProvider= new TestSessionTreeContentProvider(); fTreeViewer.setContentProvider(fTreeContentProvider); @@ -180,6 +182,7 @@ fTreeViewer.setLabelProvider(fTreeLabelProvider); fTableViewer= new TableViewer(fViewerbook, SWT.V_SCROLL | SWT.H_SCROLL | SWT.SINGLE); + OwnerDrawSupport.install(fTableViewer); fTableViewer.setUseHashlookup(true); fTableContentProvider= new TestSessionTableContentProvider(); fTableViewer.setContentProvider(fTableContentProvider); Index: src/org/eclipse/jdt/internal/junit/ui/TestSessionLabelProvider.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/TestSessionLabelProvider.java,v retrieving revision 1.9 diff -u -r1.9 TestSessionLabelProvider.java --- src/org/eclipse/jdt/internal/junit/ui/TestSessionLabelProvider.java 30 May 2006 14:48:26 -0000 1.9 +++ src/org/eclipse/jdt/internal/junit/ui/TestSessionLabelProvider.java 14 Mar 2007 14:25:44 -0000 @@ -15,14 +15,21 @@ import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jdt.internal.ui.viewsupport.ColoredJavaElementLabels; +import org.eclipse.jdt.internal.ui.viewsupport.ColoredString; +import org.eclipse.jdt.internal.ui.viewsupport.IRichLabelProvider; + +import org.eclipse.jdt.junit.model.ITestCaseElement; +import org.eclipse.jdt.junit.model.ITestElement; +import org.eclipse.jdt.junit.model.ITestRunSession; +import org.eclipse.jdt.junit.model.ITestSuiteElement; + import org.eclipse.jdt.internal.junit.Messages; import org.eclipse.jdt.internal.junit.model.TestCaseElement; -import org.eclipse.jdt.internal.junit.model.TestElement; -import org.eclipse.jdt.internal.junit.model.TestRoot; import org.eclipse.jdt.internal.junit.model.TestSuiteElement; import org.eclipse.jdt.internal.junit.model.TestElement.Status; -public class TestSessionLabelProvider extends LabelProvider { +public class TestSessionLabelProvider extends LabelProvider implements IRichLabelProvider { private final TestRunnerViewPart fTestRunnerPart; private final int fLayoutMode; @@ -31,37 +38,62 @@ fTestRunnerPart= testRunnerPart; fLayoutMode= layoutMode; } - - public String getText(Object element) { - if (element instanceof TestCaseElement) { - TestCaseElement testCaseElement= (TestCaseElement) element; - String testMethodName= testCaseElement.getTestMethodName(); - if (fLayoutMode == TestRunnerViewPart.LAYOUT_HIERARCHICAL) { - return getElementLabel(testMethodName, testCaseElement); - } else { - String className= testCaseElement.getClassName(); - return Messages.format(JUnitMessages.TestSessionLabelProvider_testMethodName_className, new Object[] { testMethodName, className }); + + /* (non-Javadoc) + * @see org.eclipse.jdt.internal.ui.viewsupport.IRichLabelProvider#getRichTextLabel(java.lang.Object) + */ + public ColoredString getRichTextLabel(Object element) { + String label= getSimpleLabel(element); + if (label == null) { + return new ColoredString(element.toString()); + } + ColoredString text= new ColoredString(label); + if (fLayoutMode == TestRunnerViewPart.LAYOUT_HIERARCHICAL) { + if (((ITestElement) element).getParentContainer() instanceof ITestRunSession) { + String testKindDisplayName= fTestRunnerPart.getTestKindDisplayName(); + if (testKindDisplayName != null) { + String decorated= Messages.format(JUnitMessages.TestSessionLabelProvider_testName_JUnitVersion, new Object[] { label, testKindDisplayName }); + return ColoredJavaElementLabels.decorateColoredString(text, decorated, ColoredJavaElementLabels.QUALIFIER_COLOR); + } } - - } else if (element instanceof TestElement) { - TestElement testElement= (TestElement) element; - String testName= testElement.getTestName(); - return getElementLabel(testName, testElement); } else { - throw new IllegalArgumentException(String.valueOf(element)); + if (element instanceof ITestCaseElement) { + String className= ((ITestCaseElement) element).getTestClassName(); + String decorated= Messages.format(JUnitMessages.TestSessionLabelProvider_testMethodName_className, new Object[] { label, className }); + return ColoredJavaElementLabels.decorateColoredString(text, decorated, ColoredJavaElementLabels.QUALIFIER_COLOR); + } + } + return text; + } + + private String getSimpleLabel(Object element) { + if (element instanceof ITestCaseElement) { + return ((ITestCaseElement) element).getTestMethodName(); + } else if (element instanceof ITestSuiteElement) { + return ((ITestSuiteElement) element).getSuiteTypeName(); } + return null; } - private String getElementLabel(String name, TestElement testElement) { - if (fLayoutMode == TestRunnerViewPart.LAYOUT_HIERARCHICAL && testElement.getParent() instanceof TestRoot) { - String testKindDisplayName= fTestRunnerPart.getTestKindDisplayName(); - if (testKindDisplayName == null) - return name; - else - return Messages.format(JUnitMessages.TestSessionLabelProvider_testName_JUnitVersion, new Object[] { name, testKindDisplayName }); - } else - return name; - + public String getText(Object element) { + String label= getSimpleLabel(element); + if (label == null) { + return element.toString(); + } + if (fLayoutMode == TestRunnerViewPart.LAYOUT_HIERARCHICAL) { + if (((ITestElement) element).getParentContainer() instanceof ITestRunSession) { + String testKindDisplayName= fTestRunnerPart.getTestKindDisplayName(); + if (testKindDisplayName != null) { + return Messages.format(JUnitMessages.TestSessionLabelProvider_testName_JUnitVersion, new Object[] { label, testKindDisplayName }); + } + } + } else { + if (element instanceof ITestCaseElement) { + String className= ((ITestCaseElement) element).getTestClassName(); + return Messages.format(JUnitMessages.TestSessionLabelProvider_testMethodName_className, new Object[] { label, className }); + } + } + return label; } public Image getImage(Object element) { @@ -103,4 +135,6 @@ throw new IllegalArgumentException(String.valueOf(element)); } } + + }