/******************************************************************************* * Copyright (c) 2006-2013 The RCP Company 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: * The RCP Company - initial API and implementation *******************************************************************************/ package com.rcpcompany.uibindings.internal.decorators.extenders; import java.util.HashMap; import java.util.Map; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.emf.common.util.Enumerator; import org.eclipse.emf.ecore.EEnum; import org.eclipse.emf.ecore.EEnumLiteral; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.graphics.Image; import com.rcpcompany.uibindings.Constants; import com.rcpcompany.uibindings.IBindingDataType; import com.rcpcompany.uibindings.IEnumDecoratorProvider; import com.rcpcompany.uibindings.IUIBindingDecoratorExtenderContext; import com.rcpcompany.uibindings.IValueBinding; import com.rcpcompany.uibindings.decorators.extenders.AbstractUIBindingDecoratorExtender; import com.rcpcompany.uibindings.internal.Activator; import com.rcpcompany.utils.logging.LogUtils; /** * Extender that will add an image for an enumeration value ({@link EEnumLiteral}) if known. * * @author Tonny Madsen, The RCP Company */ public class EnumImageExtender extends AbstractUIBindingDecoratorExtender { /** * Map with all found mappings. */ protected static final Map<Object, Image> IMAGE_MAP = new HashMap<Object, Image>(); @Override public boolean isEnabled(IValueBinding binding) { return binding.getDecoratorProvider() instanceof IEnumDecoratorProvider; } @Override public void extend(IUIBindingDecoratorExtenderContext context) { final IValueBinding binding = context.getBinding(); if (!(binding.getDecoratorProvider() instanceof IEnumDecoratorProvider)) return; final IObservableValue modelObservable = binding.getModelObservableValue(); if (modelObservable == null) return; final Object value = modelObservable.getValue(); if (!(value instanceof Enumerator)) return; final Enumerator enumValue = (Enumerator) value; if (!IMAGE_MAP.containsKey(enumValue)) { final EEnum e = (EEnum) binding.getDataType().getEType(); final EEnumLiteral literal = e.getEEnumLiteralByLiteral(enumValue.getLiteral()); final IBindingDataType dataType = IBindingDataType.Factory.create(null, literal); final ImageDescriptor id = dataType.getArgument(Constants.ARG_IMAGE, binding.getType(), ImageDescriptor.class, null); if (id == null) { IMAGE_MAP.put(enumValue, null); return; } final Image image = Activator.getDefault().getResourceManager().createImage(id); if (image == null) { LogUtils.error(binding, "The image for enumration value " + binding.getDataType().getDataType().getName() + "#" + enumValue.getLiteral() + " cannot be loaded"); IMAGE_MAP.put(enumValue, null); return; } IMAGE_MAP.put(enumValue, image); } final Image image = IMAGE_MAP.get(enumValue); if (image != null) { context.setImage(image); } } }