/*
 *
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
 *
 *  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 org.apache.flex.compiler.fxg.flex;

import java.util.ArrayList;
import java.util.List;

import org.apache.flex.swf.tags.ICharacterTag;

/**
 * Used to map a SWF symbol generated for a particular FXG node to
 * an ActionScript class. This association links a tag primitive to more
 * complex assets, such as the ActionScript implementation of a TextGraphic
 * node (which does not have a tag primitive equivalent).
 */
public class FXGSymbolClass
{
    private static final String DEFAULT_PACKAGE = "";
    private static final char PACKAGE_SEPARATOR = '.';

    private String packageName;
    private String className;
    private String generatedSource;
    private ICharacterTag symbol;

    private List<FXGSymbolClass> additionalSymbolClasses;

    /**
     * An FXG node may have child nodes that also require a symbol class
     * mapping that will be included along with the parent symbol for the
     * compilation unit.
     * 
     * @param symbolClass - an additional symbol class
     */
    public void addAdditionalSymbolClass(FXGSymbolClass symbolClass)
    {
        if (additionalSymbolClasses == null)
            additionalSymbolClasses = new ArrayList<FXGSymbolClass>();

        additionalSymbolClasses.add(symbolClass);
    }

    /**
     * @return the list of additional symbol classes to be included with this
     * symbol class
     */
    public List<FXGSymbolClass> getAdditionalSymbolClasses()
    {
        return additionalSymbolClasses;
    }

    /**
     * @return the qualified class name of the generated ActionScript class
     */
    public String getQualifiedClassName()
    {
        if (packageName != null && packageName != DEFAULT_PACKAGE)
            return packageName + PACKAGE_SEPARATOR + className;

        return className;
    }

    /**
     * @return the package name of the generated ActionScript class
     */
    public String getPackageName()
    {
        if (packageName == null)
            return DEFAULT_PACKAGE;

        return packageName;
    }

    /**
     * @param value - the package name of the generated ActionScript class
     */
    public void setPackageName(String value)
    {
        packageName = value;
    }

    /**
     * @return the class name of the generated ActionScript class
     */
    public String getClassName()
    {
        return className;
    }

    /**
     * @param value - the class name of the generated ActionScript class
     */
    public void setClassName(String value)
    {
        className = value;
    }

    /**
     * @return - the source code of the generated ActionScript class
     */
    public String getGeneratedSource()
    {
        return generatedSource;
    }

    /**
     * @param value - the source code of the generated ActionScript class
     */
    public void setGeneratedSource(String value)
    {
        this.generatedSource = value;
    }

    /**
     * @return the SWF symbol
     */
    public ICharacterTag getSymbol()
    {
        return symbol;
    }

    /**
     * @param iCharacterTag - the SWF symbol
     */
    public void setSymbol(ICharacterTag iCharacterTag)
    {
        this.symbol = iCharacterTag;
    }

}
