/*******************************************************************************
 * 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
 *     David Carver (STAR) - bug 246500 - added ability to get parameters in global variables.
 *******************************************************************************/
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;
	}
}
