Index: DecoratorManager.java =================================================================== RCS file: /home/eclipse/org.eclipse.ui/Eclipse UI/org/eclipse/ui/internal/DecoratorManager.java,v retrieving revision 1.35 diff -u -r1.35 DecoratorManager.java --- DecoratorManager.java 11 Jun 2002 15:35:15 -0000 1.35 +++ DecoratorManager.java 8 Aug 2002 16:45:11 -0000 @@ -10,8 +10,6 @@ import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.viewers.*; -import org.eclipse.jface.viewers.ILabelDecorator; -import org.eclipse.jface.viewers.LabelProviderChangedEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.ui.IContributorResourceAdapter; import org.eclipse.ui.IDecoratorManager; @@ -126,8 +124,23 @@ if (checkAdapted) { //Get any adaptions to IResource Object adapted = getResourceAdapter(element); - if (adapted != null) - result = decorateText(result, adapted, false); + if (adapted != null) { + + // http://bugs.eclipse.org/bugs/show_bug.cgi?id=22118 + // + // don't do it recursive, will decorate twice sometimes + //result = decorateText(result, adapted, false); + + List alreadyAppliedDecorators = Arrays.asList(decorators); + DecoratorDefinition[] resourceDecorators = getDecoratorsFor(adapted); + for (int i = 0; i < resourceDecorators.length; i++) { + if( !alreadyAppliedDecorators.contains(resourceDecorators[i]) ) { + String newResult = resourceDecorators[i].decorateText(result, adapted); + if (newResult != null) + result = newResult; + } + } + } } return result; @@ -162,8 +175,23 @@ if (checkAdapted) { //Get any adaptions to IResource Object adapted = getResourceAdapter(element); - if (adapted != null) - result = decorateImage(result, adapted, false); + if (adapted != null) { + + // http://bugs.eclipse.org/bugs/show_bug.cgi?id=22118 + // + // don't do it recursive, will decorate twice sometimes + //result = decorateImage(result, adapted, false); + + List alreadyAppliedDecorators = Arrays.asList(decorators); + DecoratorDefinition[] resourceDecorators = getDecoratorsFor(adapted); + for (int i = 0; i < resourceDecorators.length; i++) { + if( !alreadyAppliedDecorators.contains(resourceDecorators[i]) ) { + Image newResult = resourceDecorators[i].decorateImage(result, adapted); + if (newResult != null) + result = newResult; + } + } + } } return result; @@ -205,14 +233,26 @@ Class elementClass = element.getClass(); String className = elementClass.getName(); - DecoratorDefinition[] decoratorArray = + + DecoratorDefinition[] decoratorArray = (DecoratorDefinition[]) cachedDecorators.get(className); if (decoratorArray != null) { + // http://bugs.eclipse.org/bugs/show_bug.cgi?id=22118 + // + // adaptable decorators are element dependend + Set adaptableDecorators = new HashSet(); + findDecorators((IAdaptable)element, enabledDefinitions(), adaptableDecorators); + if( !adaptableDecorators.isEmpty() ) + { + adaptableDecorators.addAll(Arrays.asList(decoratorArray)); + decoratorArray = new DecoratorDefinition[adaptableDecorators.size()]; + adaptableDecorators.toArray(decoratorArray); + } return decoratorArray; } List allClasses = computeClassOrder(elementClass); - ArrayList decorators = new ArrayList(); + Set decorators = new HashSet(); DecoratorDefinition[] enabledDefinitions = enabledDefinitions(); findDecorators(allClasses, enabledDefinitions, decorators); @@ -221,6 +261,12 @@ computeInterfaceOrder(allClasses), enabledDefinitions, decorators); + + // http://bugs.eclipse.org/bugs/show_bug.cgi?id=22118 + // + // dont forget to check for decorators also decorating adaptables + if( element instanceof IAdaptable ) + findDecorators((IAdaptable)element, enabledDefinitions, decorators); decoratorArray = new DecoratorDefinition[decorators.size()]; decorators.toArray(decoratorArray); @@ -235,7 +281,7 @@ private void findDecorators( Collection classList, DecoratorDefinition[] enabledDefinitions, - ArrayList result) { + Collection result) { Iterator classes = classList.iterator(); while (classes.hasNext()) { @@ -247,6 +293,38 @@ } } + + /** + * Find defined decorators that have a type that the specified adaptable object + * has an adapter for. + * NOTE: The result can't becached with this implementation. See source for details. + */ + private void findDecorators( + IAdaptable adaptableObject, + DecoratorDefinition[] enabledDefinitions, + Collection result) { + + // http://bugs.eclipse.org/bugs/show_bug.cgi?id=22118 + + for (int i = 0; i < enabledDefinitions.length; i++) { + if( enabledDefinitions[i].isAdaptable() ) { + try + { + Class objectClass = getClass().forName(enabledDefinitions[i].getObjectClass()); + if (null != adaptableObject.getAdapter(objectClass) ) { + + // NOTE: we are checking the object for an adapter + // it may be possible that not all objects of the same type have an adapter + // for the same type + // --> DO NOT cache result for types!!! + result.add(enabledDefinitions[i]); + } + } + catch (ClassNotFoundException e) + { /** @todo implement error handling */ } + } + } + } /** * Return whether or not the decorator registered for element