package bndtools.editor.workspace;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.StyledCellLabelProvider;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.plugin.AbstractUIPlugin;

import aQute.bnd.build.model.clauses.HeaderClause;
import bndtools.Plugin;

public class PluginClauseLabelProvider extends StyledCellLabelProvider {

    private final Map<String, IConfigurationElement> configElements;
    private final Map<String, Image> images = new HashMap<String, Image>();

    public PluginClauseLabelProvider(Map<String, IConfigurationElement> configElements) {
        this.configElements = configElements;
    }

    @Override
    public void update(ViewerCell cell) {
        HeaderClause header = (HeaderClause) cell.getElement();

        String className = header.getName();
        StyledString label = new StyledString(className);

        Map<String, String> attribs = header.getAttribs();
        if (!attribs.isEmpty())
            label.append(" ");
        for (Iterator<Entry<String, String>> iter = attribs.entrySet()
            .iterator(); iter.hasNext();) {
            Entry<String, String> entry = iter.next();
            label.append(entry.getKey(), StyledString.QUALIFIER_STYLER);
            label.append("=", StyledString.QUALIFIER_STYLER);
            label.append(entry.getValue(), StyledString.COUNTER_STYLER);

            if (iter.hasNext())
                label.append(", ");
        }

        cell.setText(label.toString());
        cell.setStyleRanges(label.getStyleRanges());

        Image image = images.get(className);
        if (image == null) {
            IConfigurationElement configElem = configElements.get(className);
            if (configElem != null) {
                String iconPath = configElem.getAttribute("icon");
                if (iconPath != null) {
                    ImageDescriptor descriptor = AbstractUIPlugin.imageDescriptorFromPlugin(configElem.getContributor()
                        .getName(), iconPath);
                    if (descriptor != null) {
                        image = descriptor.createImage();
                        images.put(className, image);
                    }
                }
            }
        }
        if (image == null) {
            image = images.get("__DEFAULT__");
            if (image == null) {
                image = AbstractUIPlugin.imageDescriptorFromPlugin(Plugin.PLUGIN_ID, "/icons/plugin.png")
                    .createImage();
                images.put("__DEFAULT__", image);
            }
        }
        cell.setImage(image);
    }

    @Override
    public void dispose() {
        super.dispose();
        for (Image image : images.values()) {
            if (!image.isDisposed())
                image.dispose();
        }
    }
}
