/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.model.icons.impl; import java.util.*; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.swt.graphics.Image; import org.jboss.tools.common.meta.XMapping; import org.jboss.tools.common.model.*; import org.jboss.tools.common.model.plugin.ModelPlugin; import org.jboss.tools.common.model.util.ModelFeatureFactory; public class XModelObjectIcon { static Hashtable<String,ImageComponent> components = null; private static synchronized void load(XModelObject object) { if(components != null || object == null) return; components = new Hashtable<String,ImageComponent>(); XModel model = object.getModel(); XMapping mapping = model.getMetaData().getMapping("Icons"); //$NON-NLS-1$ if(mapping == null) return; String[] keys = mapping.getKeys(); for (int i = 0; i < keys.length; i++) { String v = mapping.getValue(keys[i]); components.put(keys[i], new ImageComponentWrapper(keys[i], v)); } } private XModelObject object = null; public XModelObjectIcon(XModelObject object) { load(object); this.object = object; } public Image getIcon1(String[] types) { if(object == null) return null; String code = "" + getIconHash(types); //$NON-NLS-1$ ImageRegistry registry = ModelPlugin.getDefault().getImageRegistry(); Image ii = null; synchronized (registry) { ii = registry.get(code); } if(ii != null && !ii.isDisposed()) { return ii; } Vector<Image> v = new Vector<Image>(3); for (int i = 0; i < types.length; i++) { ImageComponent component = components.get(types[i]); Image ic = (component == null) ? null : component.getImage(object); if(ic != null) { v.addElement(ic); return ic; } } return ii; } public int getIconHash() { return getIconHash(object.getModelEntity().getRenderer().getIconNames()); } private int getIconHash(String[] types) { int res = 0; for (int i = 0; i < types.length; i++) { ImageComponent component = components.get(types[i]); if(component != null) res += component.getHash(object); } return res; } public Image getEclipseImage() { return getEclipseImage0(object.getModelEntity().getRenderer().getIconNames()); } public Image getEclipseImage0(String[] types) { if(object == null) return null; String code = "" + getIconHash(types); //$NON-NLS-1$ ImageRegistry registry = ModelPlugin.getDefault().getImageRegistry(); Image iie = null; synchronized(registry) { iie = registry.get(code); } if(iie != null && !iie.isDisposed()) { return iie; } Image ii = getIcon1(types); if(ii != null) { synchronized(registry) { registry.remove(code); registry.put(code, ii); } } return ii; } } class ImageComponentWrapper implements ImageComponent { String key; String classname; ImageComponent imageComponent; ImageComponentWrapper(String key, String classname) { this.key = key; this.classname = classname; } public int getHash(XModelObject obj) { validate(); if(imageComponent == null) return 0; return imageComponent.getHash(obj); } public Image getImage(XModelObject obj) { validate(); if(imageComponent == null) return null; return imageComponent.getImage(obj); } void validate() { try { ImageComponent c = (ImageComponent)ModelFeatureFactory.getInstance().createFeatureInstance(classname); if(c == null) { XModelObjectIcon.components.remove(key); } else { XModelObjectIcon.components.put(key, c); } imageComponent = c; } catch (ClassCastException e) { ModelPlugin.getPluginLog().logError(e); XModelObjectIcon.components.remove(key); } } }