/*
* JasperReports - Free Java Reporting Library.
* Copyright (C) 2001 - 2009 Jaspersoft Corporation. All rights reserved.
* http://www.jaspersoft.com
*
* Unless you have purchased a commercial license agreement from Jaspersoft,
* the following license terms apply:
*
* This program is part of JasperReports.
*
* JasperReports is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* JasperReports is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with JasperReports. If not, see <http://www.gnu.org/licenses/>.
*/
package net.sf.jasperreports.engine;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
/**
* Default {@link JRTemplate} implementation.
*
* @author Lucian Chirita (lucianc@users.sourceforge.net)
* @version $Id: JRSimpleTemplate.java 3033 2009-08-27 11:46:22Z teodord $
*/
public class JRSimpleTemplate implements JRTemplate, Serializable
{
private static final long serialVersionUID = JRConstants.SERIAL_VERSION_UID;
private final List includedTemplates = new ArrayList();
private final List styles = new ArrayList();
private JRStyle defaultStyle;
/**
* Adds a style to the template.
*
* @param style the style to add
* @throws JRException when a style with the same name already exists
*/
public void addStyle(JRStyle style) throws JRException
{
checkExistingName(style.getName());
if (style.isDefault())
{
defaultStyle = style;
}
styles.add(style);
}
protected void checkExistingName(String name) throws JRException
{
if (getStyle(name) != null)
{
throw new JRException("Duplicate declaration of template style : " + name);
}
}
protected boolean nameMatches(JRStyle style, String name)
{
String styleName = style.getName();
return name == null ? styleName == null : name.equals(styleName);
}
/**
* Returns an included style by name.
*
* @param name the name of the style to be returned
* @return the style having the specified name, or <code>null</code> if not found
*/
public JRStyle getStyle(String name)
{
JRStyle style = null;
for (Iterator it = styles.iterator(); it.hasNext();)
{
JRStyle itStyle = (JRStyle) it.next();
if (nameMatches(itStyle, name))
{
style = itStyle;
break;
}
}
return style;
}
/**
* Removes an included style.
*
* @param style the style to remove
* @return <code>true</code> if and only if the style has been found and removed
*/
public boolean removeStyle(JRStyle style)
{
boolean removed = styles.remove(style);
if (removed)
{
if (style.isDefault())
{
defaultStyle = null;
}
}
return removed;
}
/**
* Removes an included style.
*
* @param name the name of the style to be removed
* @return the removed style, or <code>null</code> if not found
*/
public JRStyle removeStyle(String name)
{
JRStyle removed = null;
for (ListIterator it = styles.listIterator(); it.hasNext();)
{
JRStyle style = (JRStyle) it.next();
if (nameMatches(style, name))
{
if (style.isDefault())
{
defaultStyle = null;
}
removed = style;
it.remove();
break;
}
}
return removed;
}
public JRStyle[] getStyles()
{
return (JRStyle[]) styles.toArray(new JRStyle[styles.size()]);
}
public JRStyle getDefaultStyle()
{
return defaultStyle;
}
public JRReportFont getDefaultFont()
{
return null;
}
/**
* Adds an included template.
*
* @param reference the template reference
* @see #getIncludedTemplates()
*/
public void addIncludedTemplate(JRTemplateReference reference)
{
includedTemplates.add(reference);
}
/**
* Adds an included template.
*
* @param templateLocation the template location
* @see #getIncludedTemplates()
*/
public void addIncludedTemplate(String templateLocation)
{
includedTemplates.add(new JRTemplateReference(templateLocation));
}
/**
* Removes an included template.
*
* @param reference the template reference to remove
* @return <code>true</code> if and only if the included template has been found and removed
*/
public boolean removeIncludedTemplate(JRTemplateReference reference)
{
return includedTemplates.remove(reference);
}
/**
* Removes an included template.
* <p/>
* The first template reference that matches the location is removed.
*
* @param location the location of the template to remove
* @return the removed template reference, or <code>null</code> if not found
*/
public JRTemplateReference removeIncludedTemplate(String location)
{
JRTemplateReference removed = null;
for (ListIterator it = includedTemplates.listIterator(); it.hasNext();)
{
JRTemplateReference ref = (JRTemplateReference) it.next();
if (ref.getLocation().equals(location))
{
removed = ref;
it.remove();
}
}
return removed;
}
public JRTemplateReference[] getIncludedTemplates()
{
return (JRTemplateReference[]) includedTemplates.toArray(new JRTemplateReference[includedTemplates.size()]);
}
}