/******************************************************************************* * Copyright (c) 2008 Oracle 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: * Oracle - initial API and implementation * ********************************************************************************/ package org.eclipse.jst.pagedesigner.editors.palette; import java.util.Iterator; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.jface.resource.ImageDescriptor; 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.common.ui.JSFUICommonPlugin; import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages; import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo; import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfos; import org.eclipse.jst.pagedesigner.PDPlugin; import org.eclipse.swt.graphics.Image; /** * Locates and creates Images for tags using the common metadata framework. * * Images are cached in the PDPlugin's ImageRegistry. * * Some code is being duplicated in palette helper. PaletteHelper should be re-factored to use this code * */ public class TagImageManager { private static final String PALETTE_DEFAULT_IMAGE_FILE = "palette/GENERIC/large/PD_Palette_Default.gif"; //$NON-NLS-1$ private static TagImageManager INSTANCE = null; private final static ImageDescriptor DEFAULT_SMALL_ICON = JSFUICommonPlugin .getDefault().getImageDescriptor( JSFSharedImages.DEFAULT_PALETTE_TAG_IMG); private final static ImageDescriptor DEFAULT_LARGE_ICON = PDPlugin .getDefault().getImageDescriptor( PALETTE_DEFAULT_IMAGE_FILE); private static final String TRAIT_ICON_SMALL = "small-icon"; //$NON-NLS-1$ private static final String TRAIT_ICON_LARGE = "large-icon"; //$NON-NLS-1$ /** * @return singleton instance */ public synchronized static TagImageManager getInstance() { if (INSTANCE == null) { INSTANCE = new TagImageManager(); } return INSTANCE; } /** * 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(IFile file, String nsUri, String tagName) { final IMetaDataDomainContext context = MetaDataQueryContextFactory.getInstance().createTaglibDomainModelContext(file); return getImage(context, nsUri, tagName, true); } /** * Returns small image using metadata and may be null. Caller should NOT dispose the image, but should call TagImageManager's dispose(image) * @param project * @param nsUri * @param tagName * @return small image using metadata. May be null. * @deprecated - use file rather than project */ public Image getSmallIconImage(IProject project, String nsUri, String tagName) { final IMetaDataDomainContext context = MetaDataQueryContextFactory.getInstance().createTaglibDomainModelContext(project); return getImage(context, nsUri, tagName, true); } /** * @param file * @param nsUri * @param tagName * @return large image using metadata. May be null. */ public Image getLargeIconImage(IFile file, String nsUri, String tagName) { final IMetaDataDomainContext context = MetaDataQueryContextFactory.getInstance().createTaglibDomainModelContext(file); return getImage(context, nsUri, tagName, false); } /** * @param project * @param nsUri * @param tagName * @return large image using metadata. May be null. * @deprecated - use file rather than project */ public Image getLargeIconImage(IProject project, String nsUri, String tagName) { final IMetaDataDomainContext context = MetaDataQueryContextFactory.getInstance().createTaglibDomainModelContext(project); return getImage(context, nsUri, tagName, false); } private Image getImage(final IMetaDataDomainContext context, final String nsUri, final String tagName, boolean getSmallImage) { Image image = null; final ITaglibDomainMetaDataQuery query = MetaDataQueryFactory.getInstance().createQuery(context); Model model = getModel(query, nsUri); if (model != null){ ImageDescriptor imgDesc = getIconImageDescriptor(query, model, tagName, getSmallImage); image = getOrCreateImage(imgDesc); } return image; } /** * Gets, and creates if necessary, a shared image. * @param imageDescriptor * @return Image from shared cache */ public static Image getOrCreateImage(ImageDescriptor imageDescriptor) { Image image = null; if (imageDescriptor != null){ image = PDPlugin.getDefault().getImageRegistry().get(imageDescriptor.toString()); if (image == null ){ image = imageDescriptor.createImage(); PDPlugin.getDefault().getImageRegistry().put(imageDescriptor.toString(), image); } else if (image.isDisposed()){ //should not occur, but handling just in case PDPlugin.getDefault().getImageRegistry().remove(imageDescriptor.toString()); image = imageDescriptor.createImage(); PDPlugin.getDefault().getImageRegistry().put(imageDescriptor.toString(), image); } } return image; } private Model getModel(ITaglibDomainMetaDataQuery query, String nsUri) { return query.findTagLibraryModel(nsUri); } private ImageDescriptor getIconImageDescriptor(ITaglibDomainMetaDataQuery query, Model model, String tagName, boolean small) { ImageDescriptor icon = null; //use palette infos if available Trait trait = query.findTrait(model, "paletteInfos"); //$NON-NLS-1$ if (trait != null){ PaletteInfos tags = (PaletteInfos)trait.getValue(); for (Iterator it=tags.getInfos().iterator();it.hasNext();){ PaletteInfo tag = (PaletteInfo)it.next(); if (tag.getId().equalsIgnoreCase(tagName)){ IMetaDataSourceModelProvider sourceProvider = ((Trait)tag.eContainer().eContainer()).getSourceModelProvider(); if (small) icon = getImageDescriptorFromString(sourceProvider, tag.getSmallIcon(), DEFAULT_SMALL_ICON); else icon = getImageDescriptorFromString(sourceProvider, tag.getLargeIcon(), DEFAULT_LARGE_ICON); break; } } } if (icon == null) { for (Iterator it=model.getChildEntities().iterator();it.hasNext();){ Entity tagAsEntity = (Entity)it.next(); if (tagAsEntity.getId().equalsIgnoreCase(tagName)){ if (small) icon = getImageDescriptorFromTagTraitValueAsString(query, tagAsEntity, TRAIT_ICON_SMALL, DEFAULT_SMALL_ICON); else icon = getImageDescriptorFromTagTraitValueAsString(query, tagAsEntity, TRAIT_ICON_LARGE, DEFAULT_LARGE_ICON); break; } } } return icon; } private ImageDescriptor getImageDescriptorFromString(IMetaDataSourceModelProvider sourceModelProvider, String imgDesc, ImageDescriptor defaultValue){ ImageDescriptor image = defaultValue; IImageDescriptorProvider imageProvider = (IImageDescriptorProvider)sourceModelProvider.getAdapter(IImageDescriptorProvider.class); if (imageProvider != null){ image = imageProvider.getImageDescriptor(imgDesc); } return image; } private ImageDescriptor getImageDescriptorFromTagTraitValueAsString(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, defaultValue); } return defaultValue; } }