package org.eclipse.jst.pagedesigner.editors.palette;


import javax.xml.namespace.QName;

import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
import org.eclipse.jst.pagedesigner.editors.palette.impl.TaglibPaletteDrawer;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;

/**
 * ITagDropSourceData implementation useable by TagToolPaletteEntry for its 
 * drop transfer object.
 * 
 * @author cbateman
 * 
 */
public final class TagToolCreationAdapter implements ITagDropSourceData
{
    private String _uri;
    private String _tagName;
    private String _defaultPrefix;
    private String _id;

    /**
     * @param uri 
     * @param tagName 
     * @param defaultPrefix 
     * @param id 
     */
    public TagToolCreationAdapter(final String uri,  final String tagName, final String defaultPrefix,
            final String id)
    {
        _uri = uri;
        _tagName = tagName;
        _defaultPrefix = defaultPrefix;
        _id = id;
    }

    public String getDefaultPrefix()
    {
        return _defaultPrefix;
    }

    public String getTagName()
    {
        return _tagName;
    }

    public String getNamespace()
    {
        return _uri;
    }

    public String getId()
    {
        return _id;
    }

    /**
     * @param provider
     * @param model
     * @return a metadata tag creation adapter for an existing tag
     * creation provider (which need not itself be a TagToolCreationAdapter)
     * and a dom model.
     */
    public static MetadataTagDropSourceData createMdTagCreationProvider(final ITagDropSourceData provider, final IDOMModel model)
    {
        return new MetadataTagDropSourceData(provider, model);
    }

    /**
     * @param container
     * @return the tag creation provider
     */
    public static ITagDropSourceData findProviderForContainer(
            final QName container)
    {
        return findProviderForContainer(container.getNamespaceURI(), container
                .getLocalPart(), PaletteItemManager.getCurrentInstance());
    }

    /**
     * @param uri
     * @param tagName
     * @param itemManager
     * @return the tag creation provider
     */
    public static ITagDropSourceData findProviderForContainer(
            final String uri, final String tagName,
            final PaletteItemManager itemManager)
    {
        final TaglibPaletteDrawer category = itemManager.findCategoryByURI(uri);
        if (category != null)
        {
            final TagToolPaletteEntry tagItem = category
                    .getTagPaletteEntryByTagName(tagName);
            if (tagItem != null)
            {
                return tagItem.getTemplate();
            }
        }
        return null;
    }

}
