/******************************************************************************* * 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; } }