blob: 274c6d283879972aeacf9a696886c82437ad5f4e [file] [log] [blame]
/*******************************************************************************
* 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;
}
}