blob: 077aafe682bcc2e6c926e02bc21b15dae3c284b2 [file] [log] [blame]
/*******************************************************************************
* 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.ui.internal.decorators;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.ui.internal.ActionExpression;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.internal.registry.RegistryReader;
/**
* The DecoratorDefinition is the class that holds onto
* the label decorator, the name and the name of the
* class a decorator definition applies to,
*/
public abstract class DecoratorDefinition {
private static final String ATT_LABEL = "label"; //$NON-NLS-1$
private static final String ATT_OBJECT_CLASS = "objectClass"; //$NON-NLS-1$
static final String CHILD_ENABLEMENT = "enablement"; //$NON-NLS-1$
private static final String ATT_ADAPTABLE = "adaptable"; //$NON-NLS-1$
private static final String ATT_ENABLED = "state"; //$NON-NLS-1$
private ActionExpression enablement;
protected boolean enabled;
private boolean defaultEnabled;
private String id;
protected IConfigurationElement definingElement;
//A flag that is set if there is an error creating the decorator
protected boolean labelProviderCreationFailed = false;
private boolean hasReadEnablement;
static final String ATT_CLASS = "class";//$NON-NLS-1$
/**
* Create a new instance of the receiver with the
* supplied values.
*/
DecoratorDefinition(String identifier, IConfigurationElement element) {
this.id = identifier;
this.definingElement = element;
this.enabled = this.defaultEnabled = Boolean.valueOf(element.getAttribute(ATT_ENABLED)).booleanValue();
}
/**
* Gets the name.
* @return Returns a String
*/
public String getName() {
return definingElement.getAttribute(ATT_LABEL);
}
/**
* Returns the description.
* @return String
*/
public String getDescription() {
return RegistryReader.getDescription(definingElement);
}
/**
* Gets the enabled.
* @return Returns a boolean
*/
public boolean isEnabled() {
return enabled;
}
/**
* Sets the enabled flag and adds or removes the decorator
* manager as a listener as appropriate.
* @param newState The enabled to set
*/
public void setEnabled(boolean newState) {
//Only refresh if there has been a change
if (this.enabled != newState) {
this.enabled = newState;
try {
refreshDecorator();
} catch (CoreException exception) {
handleCoreException(exception);
}
}
}
/**
* Refresh the current decorator based on our enable
* state.
*/
protected abstract void refreshDecorator() throws CoreException;
/**
* Dispose the decorator instance and remove listeners
* as appropirate.
* @param disposedDecorator
*/
protected void disposeCachedDecorator(IBaseLabelProvider disposedDecorator) {
disposedDecorator.removeListener(WorkbenchPlugin.getDefault()
.getDecoratorManager());
disposedDecorator.dispose();
}
/**
* Return whether or not this decorator should be
* applied to adapted types.
*
* @return whether or not this decorator should be
* applied to adapted types
*/
public boolean isAdaptable() {
return Boolean.valueOf(definingElement.getAttribute(ATT_ADAPTABLE)).booleanValue();
}
/**
* Gets the id.
* @return Returns a String
*/
public String getId() {
return id;
}
/**
* Return the default value for this type - this value
* is the value read from the element description.
*
* @return the default value for this type - this value
* is the value read from the element description
*/
public boolean getDefaultValue() {
return defaultEnabled;
}
/**
* Returns the enablement.
* @return ActionExpression
*/
protected ActionExpression getEnablement() {
if (!hasReadEnablement) {
hasReadEnablement = true;
initializeEnablement();
}
return enablement;
}
/**
* Initialize the enablement expression for this decorator
*/
protected void initializeEnablement() {
IConfigurationElement[] elements = definingElement.getChildren(CHILD_ENABLEMENT);
if (elements.length == 0) {
String className = definingElement.getAttribute(ATT_OBJECT_CLASS);
if (className != null) {
enablement = new ActionExpression(ATT_OBJECT_CLASS,
className);
}
} else {
enablement = new ActionExpression(elements[0]);
}
}
/**
* Add a listener for the decorator.If there is an exception
* then inform the user and disable the receiver.
* This method should not be called unless a check for
* isEnabled() has been done first.
*/
void addListener(ILabelProviderListener listener) {
try {
//Internal decorator might be null so be prepared
IBaseLabelProvider currentDecorator = internalGetLabelProvider();
if (currentDecorator != null) {
currentDecorator.addListener(listener);
}
} catch (CoreException exception) {
handleCoreException(exception);
}
}
/**
* Return whether or not the decorator registered for element
* has a label property called property name. If there is an
* exception disable the receiver and return false.
* This method should not be called unless a check for
* isEnabled() has been done first.
*/
boolean isLabelProperty(Object element, String property) {
try { //Internal decorator might be null so be prepared
IBaseLabelProvider currentDecorator = internalGetLabelProvider();
if (currentDecorator != null) {
return currentDecorator.isLabelProperty(element, property);
}
} catch (CoreException exception) {
handleCoreException(exception);
return false;
}
return false;
}
/**
* Gets the label provider and creates it if it does not exist yet.
* Throws a CoreException if there is a problem
* creating the labelProvider.
* This method should not be called unless a check for
* enabled to be true is done first.
* @return Returns a ILabelDecorator
*/
protected abstract IBaseLabelProvider internalGetLabelProvider()
throws CoreException;
/**
* A CoreException has occured. Inform the user and disable
* the receiver.
*/
protected void handleCoreException(CoreException exception) {
//If there is an error then reset the enabling to false
WorkbenchPlugin.log(exception);
crashDisable();
}
/**
* A crash has occured. Disable the receiver without notification.
*/
public void crashDisable() {
this.enabled = false;
}
/**
* Return whether or not this is a full or lightweight definition.
* @return <code>true</code> if this is not a lightweight decorator.
*/
public abstract boolean isFull();
/**
* Return the configuration element.
*
* @return the configuration element
* @since 3.1
*/
public IConfigurationElement getConfigurationElement() {
return definingElement;
}
/**
* Return whether the decorator is applicable to the given element
* @param element the element to be decorated
* @return whether the decorator w=should be applied to the element
*/
public boolean isEnabledFor(Object element) {
if(isEnabled()){
ActionExpression expression = getEnablement();
if(expression != null) {
return expression.isEnabledFor(element);
}
return true;//Always on if no expression
}
return false;
}
}