blob: d76a0b98df57fbc3942f69443479078dabf1fca5 [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.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.IMetaDataSourceModelProvider;
import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
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 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/GENERIC/large/PD_Palette_Default.gif");
private static final String TRAIT_ICON_SMALL = "small-icon";
private static final String TRAIT_ICON_LARGE = "large-icon";
/**
* @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 project
* @param nsUri
* @param tagName
* @return small image using metadata. May be null.
*/
public Image getSmallIconImage(IProject project, String nsUri, String tagName) {
Image image = null;
Model model = getModel(project, nsUri);
if (model != null){
ImageDescriptor imgDesc = getSmallIconImageDescriptor(model, tagName);
image = getOrCreateImage(imgDesc);
}
return image;
}
/**
* @param project
* @param nsUri
* @param tagName
* @return large image using metadata. May be null.
*/
public Image getLargeIconImage(IProject project, String nsUri, String tagName) {
Image image = null;
Model model = getModel(project, nsUri);
if (model != null){
ImageDescriptor imgDesc = getLargeIconImageDescriptor(model, nsUri);
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(IProject project, String nsUri) {
ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, nsUri);
Model model =TaglibDomainMetaDataQueryHelper.getModel(modelContext);
// 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 void addAdapter(Model model) {
// if (model != null){
//// model.eAdapters().add(INSTANCE);
// }
// }
//
// private boolean hasAdapter(Model model) {
// for(Adapter a : model.eAdapters()){
// if (a == INSTANCE)
// return true;
// }
// return false;
// }
private ImageDescriptor getSmallIconImageDescriptor(Model model, String tagName) {
return getIconImageDescriptor(model, tagName, true);
}
private ImageDescriptor getLargeIconImageDescriptor(Model model, String tagName) {
return getIconImageDescriptor(model, tagName, false);
}
private ImageDescriptor getIconImageDescriptor(Model model, String tagName, boolean small) {
ImageDescriptor icon = null;
//use palette infos if available
Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(model, "paletteInfos");
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(tagAsEntity, TRAIT_ICON_SMALL, DEFAULT_SMALL_ICON);
else
icon = getImageDescriptorFromTagTraitValueAsString(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(Entity entity, String key, ImageDescriptor defaultValue){
Trait t = TaglibDomainMetaDataQueryHelper.getTrait(entity, key);
if (t != null){
String imgDesc = TraitValueHelper.getValueAsString(t);
return getImageDescriptorFromString(t.getSourceModelProvider(), imgDesc, defaultValue);
}
return defaultValue;
}
}