package bndtools.model.resolution;

import java.util.Map.Entry;

import org.bndtools.core.ui.resource.R5LabelFormatter;
import org.bndtools.utils.jface.ImageCachingLabelProvider;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.graphics.Image;
import org.osgi.resource.Capability;

import bndtools.Plugin;

public class CapabilityLabelProvider extends ImageCachingLabelProvider {

    private final boolean shortenNamespaces;

    public CapabilityLabelProvider() {
        this(false);
    }

    public CapabilityLabelProvider(boolean shortenNamespaces) {
        super(Plugin.PLUGIN_ID);
        this.shortenNamespaces = shortenNamespaces;
    }

    @Override
    public void update(ViewerCell cell) {
        Capability cap = (Capability) cell.getElement();

        StyledString label = new StyledString();
        R5LabelFormatter.appendCapability(label, cap, shortenNamespaces);
        cell.setText(label.toString());
        cell.setStyleRanges(label.getStyleRanges());

        // Get the icon from the capability namespace
        Image icon = getImage(R5LabelFormatter.getNamespaceImagePath(cap.getNamespace()), true);
        if (icon != null)
            cell.setImage(icon);
    }

    @Override
    public String getToolTipText(Object element) {
        if (element instanceof Capability) {
            Capability cap = (Capability) element;

            StringBuilder buf = new StringBuilder();
            buf.append(cap.getNamespace());
            for (Entry<String, Object> attribute : cap.getAttributes()
                .entrySet())
                buf.append(";\n\t")
                    .append(attribute.getKey())
                    .append(" = ")
                    .append(attribute.getValue());

            for (Entry<String, String> directive : cap.getDirectives()
                .entrySet())
                buf.append(";\n\t")
                    .append(directive.getKey())
                    .append(" := ")
                    .append(directive.getValue());

            return buf.toString();
        }

        return null;
    }

}
