package org.eclipse.emf.editor.provider;
/**
* <copyright>
*
* Copyright (c) 2008 itemis AG 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:
* itemis AG - Initial API and implementation
*
* </copyright>
*
*/
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.emf.editor.EEPlugin;
import org.eclipse.emf.editor.extxpt.ExtXptFacade;
import org.eclipse.emf.editor.ui.ImageRegistry;
/**
* @author Dennis Huebner
*
*/
public class ExtendedLabelProvider implements IItemLabelProvider {
private static final String ICONS_FOLDER = "icons";
private static final String ICON_EXTENSION_NAME = "icon";
private static final String LABEL_EXTENSION_NAME = "label";
private final ExtXptFacade facade;
private IItemLabelProvider registryItemLabelProvider;
public ExtendedLabelProvider(ExtXptFacade facade) {
this.facade = facade;
this.registryItemLabelProvider = new RegistryItemLabelProvider();
}
public Object getImage(Object element) {
Object retVal = null;
try {
if (element instanceof EObject) {
EObject eObject = (EObject) element;
String iconName = evaluate(eObject, ICON_EXTENSION_NAME);
if (iconName != null) {
// TODO try instance scope
retVal = locateImage(iconName, eObject.eResource(), eObject);
// if not found try metamodel scope
Resource eResource = eObject.eClass().eResource();
if (retVal == null)
retVal = locateImage(iconName, eResource, eObject);
}
}
}
catch (Throwable ex) {
EEPlugin.logError("ERROR fetching Icon", ex);
}
if (retVal == null) {
// Fallback: Ask registry for image
retVal = registryItemLabelProvider.getImage(element);
}
return retVal;
}
/**
* @param iconName
* @param eResource
* @param eObject
* @return
* @throws MalformedURLException
* @throws IOException
*/
private Object locateImage(String iconName, Resource eResource, EObject eObject) throws MalformedURLException,
IOException {
// TODO understand the requirements :)
Object retVal = null;
if (eResource != null) {
URI metaModelURI = eResource.getURI();
URI iconURI = createIconURI(eObject, iconName, metaModelURI);
if (metaModelURI.isPlatform()) {
// platform resource... good
String platformString = metaModelURI.toPlatformString(true);
IFile metaModelFile = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(platformString));
if (metaModelFile != null) {
// using IFile to allow resource change listening
IFile f = metaModelFile.getProject().getFile(iconURI.path());
if (f != null && f.exists()) {
// ask registry
retVal = ImageRegistry.getDefault().getImage(f);
}
}
}
else if (metaModelURI.isArchive()) {// archived
// handle archived resources
// return URI. Image will be stored in
// ExtendedImageRegistry
// which is not refreshable
if (checkAccessable(iconURI))
retVal = iconURI;
}
else {
// eResource not present physically... bad
URI classpathURI = URI.createURI(ClasspathUriResolver.CLASSPATH_SCHEME + ":" + iconURI.path());
URI iconNormalizedURI = new ClasspathUriResolver().resolve(facade.getProject(), classpathURI);
// return URI. Image will be stored in
// ExtendedImageRegistry
// which is not refreshable
if (!ClasspathUriResolver.isClasspathUri(iconNormalizedURI) && checkAccessable(iconNormalizedURI))
retVal = iconNormalizedURI;
}
}
return retVal;
}
private boolean checkAccessable(URI iconURI) throws IOException {
URL url = new URL(iconURI.toString());
try {
InputStream in = url.openStream();// check readable
in.close();
return true;
}
catch (FileNotFoundException e) {
// ignore no feedback to user
}
return false;
}
/**
* @param element
* @param iconName
* @param metaModelURI
* @return
*/
private URI createIconURI(EObject eObject, String iconName, URI metaModelURI) {
String packageName = packageName(eObject);
return metaModelURI.trimSegments(metaModelURI.segmentCount()).appendSegment(ICONS_FOLDER).appendSegment(
packageName).appendSegment(iconName);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.emf.edit.provider.IItemLabelProvider#getText(java.lang.Object
* )
*/
public String getText(Object element) {
String text = evaluate(element, LABEL_EXTENSION_NAME);
return text;
}
/**
* @param element
* @param retVal
* @return
*/
private String evaluate(Object element, String name) {
String retVal = null;
if (element instanceof EObject && facade != null) {
EObject eO = (EObject) element;
retVal = (String) facade.style(name, eO);
}
return retVal;
}
/**
* @param object
* @return
*/
private String packageName(EObject object) {
return object.eClass().getEPackage().getName();
}
}