/*
* Copyright (c) 2005, 2008 Borland Software Corporation
*
* 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:
* Radek Dvorak (Borland) - initial API and implementation
* Artem Tikhomirov (Borland) - refactoring
*/
package org.eclipse.gmf.internal.validate;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.ENamedElement;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.EValidator.SubstitutionLabelProvider;
import org.eclipse.emf.ecore.provider.EcoreItemProviderAdapterFactory;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
public class LabelProvider implements SubstitutionLabelProvider {
public static final SubstitutionLabelProvider INSTANCE = new LabelProvider();
private final AdapterFactory ecoreLabelProviderFactory = new EcoreItemProviderAdapterFactory();
private LabelProvider() {
super();
}
public String getFeatureLabel(EStructuralFeature eStructuralFeature) {
return eStructuralFeature.getName();
}
public String getObjectLabel(EObject eObject) {
if(eObject == null) {
return String.valueOf(eObject);
}
if(eObject instanceof EStructuralFeature) {
return getFeatureLabel((EStructuralFeature)eObject);
}
else if(eObject instanceof ENamedElement) {
return qualifiedName((ENamedElement)eObject, new StringBuffer()).toString();
}
String displayName = toDisplayName(eObject);
return (displayName != null) ? displayName : EcoreUtil.getIdentification(eObject);
}
public String getValueLabel(EDataType eDataType, Object value) {
return EcoreUtil.convertToString(eDataType, value);
}
private static StringBuffer qualifiedName(ENamedElement namedElement, StringBuffer buf) {
if(buf == null) {
buf = new StringBuffer();
}
EObject container = namedElement.eContainer();
if(container instanceof ENamedElement) {
ENamedElement owner = (ENamedElement)container;
qualifiedName(owner, buf);
buf.append("::"); //$NON-NLS-1$
}
buf.append(namedElement.getName());
return buf;
}
private String toDisplayName(EObject eObject) {
IItemLabelProvider labelAdapter = (IItemLabelProvider)EcoreUtil.getRegisteredAdapter(EcorePackage.eINSTANCE.getEAnnotation(), IItemLabelProvider.class);
if(labelAdapter == null) {
labelAdapter = (IItemLabelProvider)ecoreLabelProviderFactory.adapt(eObject, IItemLabelProvider.class);
}
String label = null;
try {
label = labelAdapter.getText(eObject);
} catch(RuntimeException e) {
// Ensure fault isolation of the item provider
label = EcoreUtil.getIdentification(eObject);
}
return label;
}
// FIXME no real need for static LabelProvider instance, can replace uses with AbstractProvider#getLabelProvider call
public static final String getTextLabel(Object obj) {
return (obj instanceof EObject) ? INSTANCE.getObjectLabel((EObject)obj) : String.valueOf(obj);
}
}