##################################################################
## 
## 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.
##
##################################################################
## Template to create the Java class representing an ODF element.
##
## Documentation of template development can be found in local file
## TemplateHelp.html.
##
#set ($base = $javamodel.getBaseclass($context))
#set ($baseElement = ${model.getElement($base.getQName())})
#set($classname = "${model.camelCase($base)}ElementBase")
##
## Set Superclass
#if (${base.isStylable()})
#set ($stylable = true)
#set ($superclass = "OdfStylableElement")
#if ($baseElement)
#set ($elementStyleFamily=${odfmodel.getStyleFamilies($baseElement)})
#set ($useOdfStyleableShapeElement = false)
#foreach($f in $elementStyleFamily)
#if (${f.getQName()}=="draw:graphic" || ${f.getQName()}=="presentation:presentation")
#set ($useOdfStyleableShapeElement = true)
#end
#end
#end
#else
#set ($superclass = 'OdfElement')
#end
#if ($context== "text:list-level-style")
#set ($superclass = 'OdfStyleBase')
#end

#if ($useOdfStyleableShapeElement || $classname=="DrawShapeElementBase")
#set ($superclass = "OdfStyleableShapeElement")
#end
##
## Begin Code
#include('copyright.txt')
/*
 * This file is automatically generated.
 * Don't edit manually.
 */
package org.odftoolkit.odfdom.dom.element.${base.getNamespace()};

##
## ---------------------------------------------------
##  Imports
## ---------------------------------------------------
##
import org.odftoolkit.odfdom.pkg.OdfFileDom;
import org.odftoolkit.odfdom.pkg.OdfName;
import org.odftoolkit.odfdom.dom.OdfDocumentNamespace;
import org.odftoolkit.odfdom.pkg.OdfElement;
import org.odftoolkit.odfdom.dom.element.OdfStyleBase;
import org.odftoolkit.odfdom.dom.element.OdfStylableElement;
import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
import org.odftoolkit.odfdom.dom.element.OdfStyleableShapeElement;
#foreach ($attribute in ${base.getBaseAttributes().withoutMultiples()})
#if ($attribute == "*")
#set ($anyattribute = true)
#else
import org.odftoolkit.odfdom.dom.attribute.${attribute.getNamespace()}.${model.camelCase($attribute)}Attribute;
#end
#end

##
## ---------------------------------------------------
##  Class
## ---------------------------------------------------
##
/**
 * DOM implementation of OpenDocument base element
 *
#if ($anyattribute)
 * This class can have any org.w3c.dom.Attribute attribute.
#end
 */
public abstract class $classname extends $superclass {

	/**
	 * Create the instance of <code>$classname</code>
	 *
	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
	 */
#if (${base.isStylable()}&& ($useOdfStyleableShapeElement == false) || $classname=="TextParagraphElementBase")
	public $classname(OdfFileDom ownerDoc, OdfName elementName, OdfStyleFamily styleFamily, OdfName styleAttrName) {
		super(ownerDoc, elementName, styleFamily, styleAttrName);
	}
#else
	public $classname(OdfFileDom ownerDoc, OdfName elementName) {
		super(ownerDoc, elementName);
	}
#end

##
## ---------------------------------------------------
##  Attribute getters and setters
## ---------------------------------------------------
##
#foreach ($attr in ${base.getBaseAttributes().withoutMultiples()})
#set ($valueObject = "String")
#set ($simpleValue = "")
#set ($dataTypes = ${attr.getDatatypes().withoutMultiples()})
#set ($valueTypes = ${javamodel.getValuetypes($dataTypes)})
#foreach ($valueType in $valueTypes)
#set ($valueObject = $valueType)
#end
#set($values = ${attr.getValues().withoutMultiples()})
#if ($values.size() ==2)
#set ($trueFlag = false)
#set ($falseFlag = false)
#foreach ($value in $values)
#if ($value==true)
#set ($trueFlag = true)
#end
#if ($value==false)
#set ($falseFlag = true)
#end
#end
#if ($trueFlag and $falseFlag)
#set ($hasdatatype = true)
#set ($valueObject = "Boolean")
#end
#end
#if ($valueObject != "String" && $valueObject != "Double" && $valueObject != "Integer" && $valueObject != "Boolean")
#set ($valueObject = "String")
#end
#if ($valueObject != "String")
#set ($simpleValue = ${javamodel.getPrimitiveType($valueObject)})
#end
#if ($attr != "*")
#set ($attribute = ${attr.withMultiples()})
#set ($aNS = ${attribute.getNamespace()})
#set ($aClassname = "${model.camelCase($attribute)}Attribute")
#set ($aParam = "${model.javaCase($attribute)}Value")

	/**
	 * Receives the value of the ODFDOM attribute representation <code>$aClassname</code> , See {@odf.attribute ${attribute.getQName()}}
	 *
	 * @return - the <code>$valueObject</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
	 */
	public $valueObject get${aClassname}() {
		$aClassname attr = ($aClassname) getOdfAttribute(OdfDocumentNamespace.${aNS.toUpperCase()}, "${attribute.getLocalName()}");
		if (attr != null) {
#if ($simpleValue!="")
			return ${valueObject}.valueOf(attr.${simpleValue}Value());
#else
			return ${valueObject}.valueOf(attr.getValue());
#end
		}
#if ($odfmodel.getDefaultAttributeValue($attr, $base))
#set ($defaultValue = ${model.escapeLiteral($odfmodel.getDefaultAttributeValue($attr, $base))})
#set ($defaultValueSet = $odfmodel.getDefaultAttributeValues($attr))
#if ($defaultValueSet.size()>1)
#set ($constant = $model.constantCase($defaultValue))
#if ($valueObject == "String")
		return ${aClassname}.DEFAULT_VALUE_${model.escapeKeyword($constant)};
#else
		return ${valueObject}.valueOf(${aClassname}.DEFAULT_VALUE_${model.escapeKeyword($constant)});
#end
#else
#if ($valueObject == "String")
		return ${aClassname}.DEFAULT_VALUE;
#else
		return ${valueObject}.valueOf(${aClassname}.DEFAULT_VALUE);
#end
#end
#else
		return null;
#end
	}

	/**
	 * Sets the value of ODFDOM attribute representation <code>$aClassname</code> , See {@odf.attribute ${attribute.getQName()}}
	 *
	 * @param $aParam   The type is <code>$valueObject</code>
	 */
	public void set${aClassname}($valueObject $aParam) {
		$aClassname attr = new ${aClassname}((OdfFileDom) this.ownerDocument);
		setOdfAttribute(attr);
#if ($valueObject == "String")
		attr.setValue($aParam);
#else
		attr.set${model.camelCase($simpleValue)}Value($aParam.${simpleValue}Value());
#end
	}
#end
#end
}
