/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Eclipse Public License, Version 1.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.eclipse.org/org/documents/epl-v10.php
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.ide.eclipse.adt.internal.editors.layout.gre;

import static com.android.SdkConstants.ANDROID_NS_NAME_PREFIX;
import static com.android.SdkConstants.ANDROID_URI;

import com.android.ide.eclipse.adt.internal.editors.IconFactory;
import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
import com.android.ide.eclipse.adt.internal.editors.layout.gle2.SimpleAttribute;
import com.android.ide.eclipse.adt.internal.editors.layout.gle2.SimpleElement;

import org.eclipse.swt.graphics.Image;
import org.w3c.dom.Element;

/**
 * Special version of {@link ViewElementDescriptor} which is initialized by the palette
 * with specific metadata for how to instantiate particular variations of an existing
 * {@link ViewElementDescriptor} with initial values.
 */
public class PaletteMetadataDescriptor extends ViewElementDescriptor {
    private String mInitString;
    private String mIconName;

    public PaletteMetadataDescriptor(ViewElementDescriptor descriptor, String displayName,
            String initString, String iconName) {
        super(descriptor.getXmlName(),
                displayName,
                descriptor.getFullClassName(),
                descriptor.getTooltip(),
                descriptor.getSdkUrl(),
                descriptor.getAttributes(),
                descriptor.getLayoutAttributes(),
                descriptor.getChildren(), descriptor.getMandatory() == Mandatory.MANDATORY);
        mInitString = initString;
        mIconName = iconName;
        setSuperClass(descriptor.getSuperClassDesc());
    }

    /**
     * Returns a String which contains a comma separated list of name=value tokens,
     * where the name can start with "android:" to indicate a property in the android namespace,
     * or no prefix for plain attributes.
     *
     * @return the initialization string, which can be empty but never null
     */
    public String getInitializedAttributes() {
        return mInitString != null ? mInitString : ""; //$NON-NLS-1$
    }

    @Override
    public Image getGenericIcon() {
        if (mIconName != null) {
            IconFactory factory = IconFactory.getInstance();
            Image icon = factory.getIcon(mIconName);
            if (icon != null) {
                return icon;
            }
        }

        return super.getGenericIcon();
    }

    /**
     * Initializes a new {@link SimpleElement} with the palette initialization
     * configuration
     *
     * @param element the new element to initialize
     */
    public void initializeNew(SimpleElement element) {
        initializeNew(element, null);
    }

    /**
     * Initializes a new {@link Element} with the palette initialization configuration
     *
     * @param element the new element to initialize
     */
    public void initializeNew(Element element) {
        initializeNew(null, element);
    }

    private void initializeNew(SimpleElement simpleElement, Element domElement) {
        String initializedAttributes = mInitString;
        if (initializedAttributes != null && initializedAttributes.length() > 0) {
            for (String s : initializedAttributes.split(",")) { //$NON-NLS-1$
                String[] nameValue = s.split("="); //$NON-NLS-1$
                String name = nameValue[0];
                String value = nameValue[1];
                String nameSpace = ""; //$NON-NLS-1$
                if (name.startsWith(ANDROID_NS_NAME_PREFIX)) {
                    name = name.substring(ANDROID_NS_NAME_PREFIX.length());
                    nameSpace = ANDROID_URI;
                }

                if (simpleElement != null) {
                    SimpleAttribute attr = new SimpleAttribute(nameSpace, name, value);
                    simpleElement.addAttribute(attr);
                }

                if (domElement != null) {
                    domElement.setAttributeNS(nameSpace, name, value);
                }
            }
        }
    }
}
