blob: e207f4ac9cc1641f397918df7c7ef3166dfcb007 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2008 Oracle Corporation 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:
* Oracle Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.jsf.ui.internal.common;
import java.util.Iterator;
import org.eclipse.core.resources.IFile;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jst.jsf.common.dom.TagIdentifier;
import org.eclipse.jst.jsf.common.metadata.Entity;
import org.eclipse.jst.jsf.common.metadata.Model;
import org.eclipse.jst.jsf.common.metadata.Trait;
import org.eclipse.jst.jsf.common.metadata.internal.IImageDescriptorProvider;
import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataDomainContext;
import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
import org.eclipse.jst.jsf.common.metadata.query.internal.MetaDataQueryContextFactory;
import org.eclipse.jst.jsf.common.metadata.query.internal.MetaDataQueryFactory;
import org.eclipse.jst.jsf.common.metadata.query.internal.taglib.ITaglibDomainMetaDataQuery;
import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo;
import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfos;
import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
import org.eclipse.swt.graphics.Image;
/**
* @author cbateman
*
*/
public class MetadataTagImageManager
{
private static final String TRAIT_ICON_SMALL = "small-icon"; //$NON-NLS-1$
private static final String TRAIT_ICON_LARGE = "large-icon"; //$NON-NLS-1$
/**
* @param file
* @param tagId
* @return small image using metadata. May be null.
*/
public Image getSmallIconImage(final IFile file, final TagIdentifier tagId)
{
return getSmallIconImage(file, tagId.getUri(), tagId.getTagName());
}
/**
* Returns small image using metadata and may be null. Caller should NOT
* dispose the image, but should call TagImageManager's dispose(image)
*
* @param file
* @param nsUri
* @param tagName
* @return small image using metadata. May be null.
*/
public Image getSmallIconImage(final IFile file, final String nsUri,
final String tagName)
{
Image image = null;
final IMetaDataDomainContext context = MetaDataQueryContextFactory.getInstance().createTaglibDomainModelContext(file);
final ITaglibDomainMetaDataQuery query = MetaDataQueryFactory.getInstance().createQuery(context);
final Model model = getModel(query, nsUri);
if (model != null)
{
final ImageDescriptor imgDesc = getIconImageDescriptor(query, model,
tagName, true);
image = getOrCreateImage(imgDesc);
}
return image;
}
private Image getOrCreateImage(final ImageDescriptor imgDesc)
{
Image image = null;
if (imgDesc != null)
{
image = JSFUiPlugin.getDefault().getImageRegistry().get(
imgDesc.toString());
if (image == null)
{
image = imgDesc.createImage();
JSFUiPlugin.getDefault().getImageRegistry().put(
imgDesc.toString(), image);
}
else if (image.isDisposed())
{ // should not occur, but handling just in case
JSFUiPlugin.getDefault().getImageRegistry().remove(
imgDesc.toString());
image = imgDesc.createImage();
JSFUiPlugin.getDefault().getImageRegistry().put(
imgDesc.toString(), image);
}
}
return image;
}
private Model getModel(final ITaglibDomainMetaDataQuery query, final String nsUri)
{
final Model model = query.findTagLibraryModel(nsUri);
// no caching at this time so there is no need to listen to model
// notifications
// if (model != null && !hasAdapter(model))
// addAdapter(model);
return model;
}
private ImageDescriptor getIconImageDescriptor(final ITaglibDomainMetaDataQuery query, final Model model,
final String tagName, final boolean small)
{
ImageDescriptor icon = null;
// use palette infos if available
final Trait trait = query.findTrait(model,
"paletteInfos"); //$NON-NLS-1$
if (trait != null)
{
final PaletteInfos tags = (PaletteInfos) trait.getValue();
for (final Iterator it = tags.getInfos().iterator(); it.hasNext();)
{
final PaletteInfo tag = (PaletteInfo) it.next();
if (tag.getId().equalsIgnoreCase(tagName))
{
final IMetaDataSourceModelProvider sourceProvider = ((Trait) tag
.eContainer().eContainer())
.getSourceModelProvider();
if (small)
{
icon = getImageDescriptorFromString(sourceProvider, tag
.getSmallIcon());
}
else
{
icon = getImageDescriptorFromString(sourceProvider, tag
.getLargeIcon());
}
break;
}
}
}
else
{
for (final Iterator it = model.getChildEntities().iterator(); it
.hasNext();)
{
final Entity tagAsEntity = (Entity) it.next();
if (tagAsEntity.getId().equalsIgnoreCase(tagName))
{
if (small)
{
icon = getImageDescriptorFromTagTraitValueAsString(query,
tagAsEntity, TRAIT_ICON_SMALL, ImageDescriptor
.getMissingImageDescriptor());
}
else
{
icon = getImageDescriptorFromTagTraitValueAsString(query,
tagAsEntity, TRAIT_ICON_LARGE, ImageDescriptor
.getMissingImageDescriptor());
}
break;
}
}
}
return icon;
}
private ImageDescriptor getImageDescriptorFromString(
IMetaDataSourceModelProvider sourceModelProvider, String imgDesc)
{
ImageDescriptor image = null;
IImageDescriptorProvider imageProvider = (IImageDescriptorProvider) sourceModelProvider
.getAdapter(IImageDescriptorProvider.class);
if (imageProvider != null)
{
image = imageProvider.getImageDescriptor(imgDesc);
}
return image;
}
private ImageDescriptor getImageDescriptorFromTagTraitValueAsString(
final ITaglibDomainMetaDataQuery query, Entity entity, String key, ImageDescriptor defaultValue)
{
Trait t = query.findTrait(entity, key);
if (t != null)
{
String imgDesc = TraitValueHelper.getValueAsString(t);
return getImageDescriptorFromString(t.getSourceModelProvider(),
imgDesc);
}
return defaultValue;
}
}