/******************************************************************************* * Copyright (c) 2000, 2008 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.ui.internal.decorators; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.ISafeRunnable; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.viewers.IBaseLabelProvider; import org.eclipse.jface.viewers.IDecoration; import org.eclipse.jface.viewers.ILightweightLabelDecorator; import org.eclipse.ui.internal.ActionExpression; import org.eclipse.ui.internal.IObjectContributor; import org.eclipse.ui.internal.LegacyResourceSupport; import org.eclipse.ui.internal.WorkbenchPlugin; /** * The DeclarativeDecoratorDefinition is a decorator definition that is defined * entirely from xml and will not require the activation of its defining * plug-in. */ class LightweightDecoratorDefinition extends DecoratorDefinition implements IObjectContributor { private static final String ATT_LOCATION = "location"; //$NON-NLS-1$ static final String ATT_ICON = "icon"; //$NON-NLS-1$ // Constants for quadrants /** * Position <code>TOP_LEFT</code>. Value <code>0</code> */ public static final int TOP_LEFT = 0; /** * Position <code>TOP_RIGHT</code>. Value <code>1</code> */ public static final int TOP_RIGHT = 1; /** * Position <code>BOTTOM_LEFT</code>. Value <code>2</code> */ public static final int BOTTOM_LEFT = 2; /** * Position <code>BOTTOM_RIGHT</code>. Value <code>3</code> */ public static final int BOTTOM_RIGHT = 3; /** * Position <code>UNDERLAY</code>. Value <code>4</code> */ public static final int UNDERLAY = 4; private static final String UNDERLAY_STRING = "UNDERLAY"; //$NON-NLS-1$ /** * Position <code>REPLACE</code>. Value <code>5</code> */ public static final int REPLACE = 5; private static final String REPLACE_STRING = "REPLACE"; //$NON-NLS-1$ private static final String ATT_QUADRANT = "quadrant"; //$NON-NLS-1$ // Constants for quadrants private static final String TOP_LEFT_STRING = "TOP_LEFT"; //$NON-NLS-1$ private static final String TOP_RIGHT_STRING = "TOP_RIGHT"; //$NON-NLS-1$ private static final String BOTTOM_LEFT_STRING = "BOTTOM_LEFT"; //$NON-NLS-1$ /** * The DeclarativeDecorator is the internal decorator supplied by the * decorator definition. */ private ILightweightLabelDecorator decorator; private int quadrant; private boolean hasReadQuadrant; private String[] objectClasses; LightweightDecoratorDefinition(String identifier, IConfigurationElement element) { super(identifier, element); } /** * Gets the decorator and creates it if it does not exist yet. Throws a * CoreException if there is a problem creating the decorator. This method * should not be called unless a check for enabled to be true is done first. * * @return Returns a ILabelDecorator */ protected ILightweightLabelDecorator internalGetDecorator() throws CoreException { if (labelProviderCreationFailed) { return null; } final CoreException[] exceptions = new CoreException[1]; if (decorator == null) { if (isDeclarative()) { decorator = new DeclarativeDecorator(definingElement, getIconLocation()); } else { Platform.run(new ISafeRunnable() { public void run() { try { decorator = (ILightweightLabelDecorator) WorkbenchPlugin .createExtension(definingElement, DecoratorDefinition.ATT_CLASS); decorator.addListener(WorkbenchPlugin.getDefault() .getDecoratorManager()); } catch (CoreException exception) { exceptions[0] = exception; } } /* * (non-Javadoc) Method declared on ISafeRunnable. */ public void handleException(Throwable e) { // Do nothing as Core will handle the logging } }); } } else { return decorator; } if (decorator == null) { this.labelProviderCreationFailed = true; setEnabled(false); } if (exceptions[0] != null) { throw exceptions[0]; } return decorator; } /** * Return whether or not this represents a declarative decorator. * * @return boolean <code>true</code> if this is declarative */ private boolean isDeclarative() { return definingElement.getAttribute(DecoratorDefinition.ATT_CLASS) == null; } /** * Return the icon location. * * @return the icon location */ private String getIconLocation() { return definingElement.getAttribute(ATT_ICON); } /* * (non-Javadoc) * * @see org.eclipse.ui.internal.decorators.DecoratorDefinition#internalGetLabelProvider() */ protected IBaseLabelProvider internalGetLabelProvider() throws CoreException { return internalGetDecorator(); } /* * (non-Javadoc) * * @see org.eclipse.ui.internal.decorators.DecoratorDefinition#isFull() */ public boolean isFull() { return false; } /** * Returns the quadrant.One of the following constants in * DecoratorRegistryReader: TOP_LEFT TOP_RIGHT BOTTOM_LEFT BOTTOM_RIGHT * UNDERLAY REPLACE * * @return int */ public int getQuadrant() { if (!hasReadQuadrant) { hasReadQuadrant = true; quadrant = getLocationConstant(definingElement .getAttribute(ATT_LOCATION), definingElement); } return quadrant; } /** * Get the constant value based on the location supplied. Default to bottom * right. * * @since 3.1 */ private int getLocationConstant(String locationDefinition, IConfigurationElement element) { // Backwards compatibility if (locationDefinition == null) { locationDefinition = element.getAttribute(ATT_QUADRANT); } if (TOP_RIGHT_STRING.equals(locationDefinition)) { return TOP_RIGHT; } if (TOP_LEFT_STRING.equals(locationDefinition)) { return TOP_LEFT; } if (BOTTOM_LEFT_STRING.equals(locationDefinition)) { return BOTTOM_LEFT; } if (UNDERLAY_STRING.equals(locationDefinition)) { return UNDERLAY; } if (REPLACE_STRING.equals(locationDefinition)) { return REPLACE; } return BOTTOM_RIGHT; } /** * Decorate the element using the decoration to store the result. * @param element * @param decoration */ public void decorate(Object element, IDecoration decoration) { try { // Internal decorator might be null so be prepared ILightweightLabelDecorator currentDecorator = internalGetDecorator(); if(currentDecorator == null) { return; } if (isAdaptable()) { String[] classes = getObjectClasses(); for (int i = 0; i < classes.length; i++) { String className = classes[i]; Object adapted = LegacyResourceSupport.getAdapter(element, className); if (adapted != null) { currentDecorator.decorate(adapted, decoration); } } } else{ if (currentDecorator != null && element != null) { currentDecorator.decorate(element, decoration); } } } catch (CoreException exception) { handleCoreException(exception); } } /** * Returns the lightweight decorator, or <code>null</code> if not enabled. * * @return the lightweight decorator, or <code>null</code> if not enabled */ public ILightweightLabelDecorator getDecorator() { return decorator; } /* * (non-Javadoc) * * @see org.eclipse.ui.internal.decorators.DecoratorDefinition#refreshDecorator() */ protected void refreshDecorator() { // Only do something if disabled so as to prevent // gratutitous activation if (!this.enabled && decorator != null) { IBaseLabelProvider cached = decorator; decorator = null; disposeCachedDecorator(cached); } } /* * (non-Javadoc) * * @see org.eclipse.ui.internal.IObjectContributor#isApplicableTo(java.lang.Object) */ public boolean isApplicableTo(Object object) { return isEnabledFor(object); } /* * (non-Javadoc) * * @see org.eclipse.ui.internal.IObjectContributor#canAdapt() */ public boolean canAdapt() { return isAdaptable(); } /** * Get the object classes to which this decorator is registered. * * @return String [] the object classes to which this decorator is * registered */ public String[] getObjectClasses() { if (objectClasses == null) { getEnablement(); } return objectClasses; } /* * (non-Javadoc) * * @see org.eclipse.ui.internal.decorators.DecoratorDefinition#initializeEnablement() */ protected void initializeEnablement() { super.initializeEnablement(); ActionExpression expression = getEnablement(); if (expression != null) { objectClasses = expression.extractObjectClasses(); } // If the class is null set it to Object if (objectClasses == null) { objectClasses = new String[] {Object.class.getName()}; } } }