/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.ui.viewsupport;
import java.util.HashMap;
import java.util.Iterator;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.swt.graphics.Image;
import org.teiid.designer.metamodels.diagram.Diagram;
import org.teiid.designer.ui.UiConstants;
/**
* DiagramLabelProvider is the hook for all Diagram plugins to describe and decorate their Diagram objects
* in the tree. Any object of type PresentationEntity will be passed through all extensions of the
* diagramProvider extension point to render the object. The first one that provides a non-null label
* will be used to provide the label and icon.
*
* @since 8.0
*/
public class DiagramLabelProvider implements ILabelProvider, UiConstants.ExtensionPoints.DiagramLabelProvider {
private HashMap providerMap = new HashMap();
private ILabelProvider lastProvider;
private String lastType;
public DiagramLabelProvider() {
loadProviderList();
}
private void loadProviderList() {
// build a map of all DiagramProvider contributions of type ILabelProvider
// get the DiagramProvider extension point from the plugin class
IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(UiConstants.PLUGIN_ID, DIAGRAM_ID);
// get the all extensions to the DiagramProvider extension point
IExtension[] extensions = extensionPoint.getExtensions();
// walk through the extensions and find all ITreeContentProviders
for ( int i=0 ; i<extensions.length ; ++i ) {
IConfigurationElement[] elements = extensions[i].getConfigurationElements();
try {
// first, find the content provider instance and add it to the instance list
ILabelProvider labelProvider = null;
for ( int j=0 ; j<elements.length ; ++j ) {
if ( elements[j].getName().equals(DIAGRAM_CLASS)) {
Object provider = elements[j].createExecutableExtension(DIAGRAM_CLASSNAME);
if ( provider instanceof ILabelProvider ) {
labelProvider = (ILabelProvider) provider;
break;
}
}
}
// second, build a map referencing all the diagram types that this provider supports
for ( int j=0 ; j<elements.length ; ++j ) {
if ( elements[j].getName().equals(DIAGRAM_TYPE)) {
String type = elements[j].getAttribute(DIAGRAM_TYPE_NAME);
providerMap.put(type, labelProvider);
}
}
} catch (Exception e) {
// catch any Exception that occurred obtaining the configuration and log it
String message = UiConstants.Util.getString("DiagramLabelProvider.configurationErrorMessage", //$NON-NLS-1$
extensions[i].getUniqueIdentifier());
UiConstants.Util.log(IStatus.ERROR, e, message);
}
}
}
// =========================================
// ILabelProvider Methods
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
*/
@Override
public Image getImage(Object element) {
Image result = null;
if ( element instanceof Diagram ) {
String type = ((Diagram) element).getType();
if ( lastType != null ) {
if ( lastType.equals(type) ) {
try {
result = lastProvider.getImage(element);
} catch (Exception e) {
// catch any Exception that occurred in the diagram provider and log it
String message = UiConstants.Util.getString("DiagramLabelProvider.diagramProviderErrorMessage"); //$NON-NLS-1$
UiConstants.Util.log(IStatus.ERROR, e, message);
}
}
}
if ( result == null ) {
lastType = null;
lastProvider = (ILabelProvider) providerMap.get(type);
if ( lastProvider != null ) {
try {
result = lastProvider.getImage(element);
if ( result != null ) {
lastType = type;
}
} catch (Exception e) {
// catch any Exception that occurred in the diagram provider and log it
String message = UiConstants.Util.getString("DiagramLabelProvider.diagramProviderErrorMessage"); //$NON-NLS-1$
UiConstants.Util.log(IStatus.ERROR, e, message);
}
}
}
}
return result;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
*/
@Override
public String getText(Object element) {
String result = null;
if ( element instanceof Diagram ) {
String type = ((Diagram) element).getType();
if ( lastType != null ) {
if ( lastType.equals(type) ) {
try {
result = lastProvider.getText(element);
} catch (Exception e) {
// catch any Exception that occurred in the diagram provider and log it
String message = UiConstants.Util.getString("DiagramLabelProvider.diagramProviderErrorMessage"); //$NON-NLS-1$
UiConstants.Util.log(IStatus.ERROR, e, message);
}
}
}
if ( result == null ) {
lastType = null;
lastProvider = (ILabelProvider) providerMap.get(type);
if ( lastProvider != null ) {
try {
result = lastProvider.getText(element);
if ( result != null ) {
lastType = type;
}
} catch (Exception e) {
// catch any Exception that occurred in the diagram provider and log it
String message = UiConstants.Util.getString("DiagramLabelProvider.diagramProviderErrorMessage"); //$NON-NLS-1$
UiConstants.Util.log(IStatus.ERROR, e, message);
}
}
}
}
return result;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
*/
@Override
public void addListener(ILabelProviderListener listener) {
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
*/
@Override
public void dispose() {
if ( providerMap != null ) {
for ( Iterator iter = providerMap.values().iterator() ; iter.hasNext() ; ) {
ILabelProvider provider = (ILabelProvider) iter.next();
if ( provider != null ) {
try {
provider.dispose();
} catch (Exception e) {
// catch any Exception that occurred in the diagram provider and log it
String message = UiConstants.Util.getString("DiagramLabelProvider.diagramProviderErrorMessage"); //$NON-NLS-1$
UiConstants.Util.log(IStatus.ERROR, e, message);
}
}
}
}
lastProvider = null;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
*/
@Override
public boolean isLabelProperty(Object element, String property) {
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
*/
@Override
public void removeListener(ILabelProviderListener listener) {
}
}