/*
* 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.mapping.ui.diagram;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IDecoration;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILightweightLabelDecorator;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.teiid.designer.mapping.ui.PluginConstants;
import org.teiid.designer.mapping.ui.UiConstants;
import org.teiid.designer.mapping.ui.UiPlugin;
import org.teiid.designer.metamodels.diagram.Diagram;
import org.teiid.designer.ui.viewsupport.MarkerUtilities;
import org.teiid.designer.ui.viewsupport.ModelObjectUtilities;
/**
* MappingDiagramLabelProvider
* @since 8.0
*/
public class MappingDiagramLabelProvider extends LabelProvider
implements ILightweightLabelDecorator, UiConstants, PluginConstants.Images {
//============================================================================================================================
// Static Variables
public static boolean debug = false;
//============================================================================================================================
// Variables
private ILabelProvider defaultProvider;
//============================================================================================================================
// Constructors
/**
* @since 4.0
*/
public MappingDiagramLabelProvider() {
}
//============================================================================================================================
// Property methods
/**
* @since 4.0
*/
private ILabelProvider getDefaultProvider() {
if ( defaultProvider == null ) {
defaultProvider = new WorkbenchLabelProvider();
}
return defaultProvider;
}
//============================================================================================================================
// Overridden methods
/**
* Figures out which provider to delegate to.
* @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
* @since 4.0
*/
@Override
public Image getImage(Object element) {
try {
if ( element instanceof Diagram ) {
if ( ((Diagram)element).getType() != null &&
((Diagram)element).getType().equals(PluginConstants.MAPPING_DIAGRAM_TYPE_ID)) {
// If logical model, it's an XML Message Structure model. So change the label.
if( ModelObjectUtilities.isLogical(((Diagram)element).getTarget())) {
return UiPlugin.getDefault().getImage(STRUCTURE_DIAGRAM_ICON);
}
return UiPlugin.getDefault().getImage(MAPPING_DIAGRAM_ICON);
}
if ( ((Diagram)element).getType() != null &&
((Diagram)element).getType().equals(PluginConstants.MAPPING_TRANSFORMATION_DIAGRAM_TYPE_ID))
return UiPlugin.getDefault().getImage(MAPPING_TRANSFORMATION_DIAGRAM_ICON);
} else {
return getDefaultProvider().getImage(element);
}
} catch (final Exception err) {
Util.log(err);
}
return super.getImage(element);
}
/**
* Figures out which provider to delegate to.
* @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
* @since 4.0
*/
@Override
public String getText(Object element) {
if ( element instanceof Diagram ) {
if ( ((Diagram)element).getType() != null &&
((Diagram)element).getType().equals(PluginConstants.MAPPING_DIAGRAM_TYPE_ID)) {
// If logical model, it's an XML Message Structure model. So change the label.
if( ModelObjectUtilities.isLogical(((Diagram)element).getTarget())) {
return Util.getString("DiagramNames.structureDiagram"); //$NON-NLS-1$
}
return Util.getString("DiagramNames.mappingDiagram"); //$NON-NLS-1$
}
if ( ((Diagram)element).getType() != null &&
((Diagram)element).getType().equals(PluginConstants.MAPPING_TRANSFORMATION_DIAGRAM_TYPE_ID))
return Util.getString("DiagramNames.mappingTransformationDiagram"); //$NON-NLS-1$
}
return getDefaultProvider().getText(element);
}
//============================================================================================================================
// ILightweightLabelDecorator implementation
/**
* @see org.eclipse.jface.viewers.ILightweightLabelDecorator#decorate(java.lang.Object, org.eclipse.jface.viewers.IDecoration)
* @since 4.0
*/
@Override
public void decorate(final Object element, final IDecoration decoration) {
final IResource resrc = getResource(element);
if (resrc == null
|| ! resrc.exists()
|| ( (resrc instanceof IProject) && ! ((IProject) resrc).isOpen() ) ) {
return;
}
try {
final IMarker[] markers = resrc.findMarkers(IMarker.PROBLEM, false, IResource.DEPTH_INFINITE);
ImageDescriptor icon = null;
for (int ndx = markers.length; --ndx >= 0;) {
final Object attr = MarkerUtilities.getMarkerAttribute(markers[ndx], IMarker.SEVERITY);
if (attr == null) {
continue;
}
// Asserting attr is an Integer...
final int severity = ((Integer)attr).intValue();
if (severity == IMarker.SEVERITY_ERROR) {
icon = UiPlugin.getDefault().getImageDescriptor(ERROR_ICON);
break;
}
if (icon == null && severity == IMarker.SEVERITY_WARNING) {
icon = UiPlugin.getDefault().getImageDescriptor(WARNING_ICON);
}
}
if (icon != null) {
decoration.addOverlay(icon);
}
} catch (final CoreException err) {
Util.log(err);
}
}
//============================================================================================================================
// Utility methods
/**
* Returns the resource for the specified element, or null if there is no resource associated with it.
* @param element The element for which to find an associated resource
* @return The resource for the specified element; may be null.
* @since 4.0
*/
private IResource getResource(final Object element) {
if (element instanceof IResource) {
return (IResource)element;
}
if (element instanceof IAdaptable) {
return (IResource)((IAdaptable)element).getAdapter(IResource.class);
}
return null;
}
}