/**
* Copyright (c) 2012 Eclipse contributors 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
*/
package org.eclipse.emf.codegen.ecore.xtext.ui;
import java.net.URL;
import org.eclipse.emf.codegen.ecore.genmodel.GenBase;
import org.eclipse.emf.codegen.ecore.genmodel.GenFeature;
import org.eclipse.emf.ecore.EModelElement;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.provider.AdapterFactoryItemDelegator;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.widgets.Display;
import org.eclipse.xtext.naming.IQualifiedNameConverter;
import org.eclipse.xtext.naming.IQualifiedNameProvider;
import org.eclipse.xtext.naming.QualifiedName;
import org.eclipse.xtext.ui.editor.hover.html.DefaultEObjectHoverProvider;
import com.google.inject.Inject;
public class GenModelHoverProvider extends DefaultEObjectHoverProvider
{
protected static final String LEADING_PADDING = "<div style='position: relative; left: 16;'>";
protected static final String TRAILING_PADDING = "</div><div style='visibility: hidden;'>xx</div>";
@Inject
private IQualifiedNameProvider nameProvider;
@Inject
private IQualifiedNameConverter nameConverter;
private AdapterFactoryItemDelegator labelProvider = new AdapterFactoryItemDelegator(new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE));
protected String getImageTagLink(ImageDescriptor imageDescriptor)
{
URL url = getURL(imageDescriptor);
return url == null ? "" : "<div style='position: absolute; left: 0; top: 0;'><image src='" + url.toExternalForm() + "'/></div>";
}
@SuppressWarnings("restriction")
protected URL getURL(ImageDescriptor descriptor)
{
return org.eclipse.jdt.internal.ui.JavaPlugin.getDefault().getImagesOnFSRegistry().getImageURL(descriptor);
}
protected String getImage(final EObject eObject)
{
final String[] result = new String[1];
Display.getDefault().syncExec
(new Runnable()
{
public void run()
{
ImageDescriptor image = ExtendedImageRegistry.INSTANCE.getImageDescriptor(labelProvider.getImage(eObject));
result[0] = getImageTagLink(image);
}
});
return result[0];
}
@Override
protected String getFirstLine(EObject eObject)
{
if (eObject instanceof GenBase || eObject instanceof EModelElement)
{
String image = getImage(eObject);
if (image != null)
{
QualifiedName qualifiedName =
eObject instanceof GenFeature ?
nameProvider.getFullyQualifiedName(eObject.eContainer()).append(((GenFeature)eObject).getName()) :
nameProvider.getFullyQualifiedName(eObject);
String name = nameConverter.toString(qualifiedName);
return image + LEADING_PADDING + "<b>" + name + "</b>" + TRAILING_PADDING;
}
}
return null;
}
@Override
protected boolean hasHover(EObject eObject)
{
return eObject instanceof GenFeature || super.hasHover(eObject);
}
}