/*******************************************************************************
 * Copyright (c) 2007 Chase Technology Ltd - http://www.chasetechnology.co.uk
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Doug Satchwell (Chase Technology Ltd) - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.xsl.core.model;

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

import org.eclipse.core.resources.IFile;

/**
 * The <code>xsl:stylesheet</code> model element.
 * 
 * @author Doug Satchwell
 * @since 1.0
 */
public class Stylesheet extends XSLElement
{
	final IFile file;
	final List<Include> includes = new ArrayList<Include>();
	final List<Import> imports = new ArrayList<Import>();
	final List<Template> templates = new ArrayList<Template>();
	final List<CallTemplate> calledTemplates = new ArrayList<CallTemplate>();
	final List<Variable> globalVariables = new ArrayList<Variable>();
	final List<XSLElement> elements = new ArrayList<XSLElement>();
	String version;

	/**
	 * Create an instance of this.
	 * 
	 * @param file the file that this represents
	 */
	public Stylesheet(IFile file)
	{
		super(null);
		this.file = file;
	}
	
	@Override
	public Stylesheet getStylesheet()
	{
		return this;
	}

	/**
	 * Add an <code>Include</code> to this.
	 * 
	 * @param include the include to add
	 */
	public void addInclude(Include include)
	{
		includes.add(include);
	}

	/**
	 * Add an <code>Import</code> to this.
	 * 
	 * @param include the import to add
	 */
	public void addImport(Import include)
	{
		imports.add(include);
	}

	/**
	 * Add a <code>Template</code> to this.
	 * 
	 * @param template the template to add
	 */
	public void addTemplate(Template template)
	{
		templates.add(template);
	}

	/**
	 * Add a <code>CallTemplate</code> to this.
	 * 
	 * @param template the template to add
	 */
	public void addCalledTemplate(CallTemplate template)
	{
		calledTemplates.add(template);
	}

	/**
	 * Get the file that this represents.
	 * 
	 * @return the file that this represents
	 */
	public IFile getFile()
	{
		return file;
	}

	/**
	 * Get the list of includes for this.
	 * 
	 * @return the list of includes
	 */
	public List<Include> getIncludes()
	{
		return includes;
	}
	
	/**
	 * Get the list of imports for this.
	 * 
	 * @return the list of imports
	 */
	public List<Import> getImports()
	{
		return imports;
	}

	/**
	 * Get the list of templates for this.
	 * 
	 * @return the list of templates
	 */
	public List<Template> getTemplates()
	{
		return templates;
	}

	/**
	 * Get the list of called templates for this.
	 * 
	 * @return the list of called templates
	 */
	public List<CallTemplate> getCalledTemplates()
	{
		return calledTemplates;
	}

	/**
	 * Add a global variable to this.
	 * 
	 * @param var the variable to add
	 */
	public void addGlobalVariable(Variable var)
	{
		globalVariables.add(var);
	}
	
	@Override
	public Type getModelType()
	{
		return Type.STYLESHEET;
	}

	/**
	 * Set the stylesheet version.
	 * 
	 * @param version the version to set
	 */
	public void setVersion(String version)
	{
		this.version = version;
	}

	/**
	 * Get the stylesheet version.
	 * @return 
	 */
	public String getVersion()
	{
		return version;
	}

	public List<Variable> getGlobalVariables()
	{
		return globalVariables;
	}
}
