/* * 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.design; import java.io.IOException; import java.io.ObjectInputStream; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; import net.sf.jasperreports.engine.JRAnchor; import net.sf.jasperreports.engine.JRConstants; import net.sf.jasperreports.engine.JRDefaultStyleProvider; import net.sf.jasperreports.engine.JRExpression; import net.sf.jasperreports.engine.JRExpressionCollector; import net.sf.jasperreports.engine.JRGroup; import net.sf.jasperreports.engine.JRHyperlinkHelper; import net.sf.jasperreports.engine.JRHyperlinkParameter; import net.sf.jasperreports.engine.JRTextField; import net.sf.jasperreports.engine.JRVisitor; import net.sf.jasperreports.engine.base.JRBaseStyle; import net.sf.jasperreports.engine.base.JRBaseTextField; import net.sf.jasperreports.engine.type.EvaluationTimeEnum; import net.sf.jasperreports.engine.type.HyperlinkTargetEnum; import net.sf.jasperreports.engine.type.HyperlinkTypeEnum; import net.sf.jasperreports.engine.util.JRStyleResolver; /** * @author Teodor Danciu (teodord@users.sourceforge.net) * @version $Id: JRDesignTextField.java 3715 2010-04-08 18:08:49Z teodord $ */ public class JRDesignTextField extends JRDesignTextElement implements JRTextField { /** * */ private static final long serialVersionUID = JRConstants.SERIAL_VERSION_UID; /* * Text field properties */ public static final String PROPERTY_ANCHOR_NAME_EXPRESSION = "anchorNameExpression"; public static final String PROPERTY_BOOKMARK_LEVEL = "bookmarkLevel"; public static final String PROPERTY_EVALUATION_GROUP = "evaluationGroup"; public static final String PROPERTY_EVALUATION_TIME = "evaluationTime"; public static final String PROPERTY_EXPRESSION = "expression"; /** * */ protected boolean isStretchWithOverflow = false; protected EvaluationTimeEnum evaluationTimeValue = EvaluationTimeEnum.NOW; protected String pattern = null; protected Boolean isBlankWhenNull = null; protected String linkType; protected String linkTarget; private List hyperlinkParameters; /** * */ protected JRGroup evaluationGroup = null; protected JRExpression expression = null; protected JRExpression anchorNameExpression = null; protected JRExpression hyperlinkReferenceExpression = null; protected JRExpression hyperlinkAnchorExpression = null; protected JRExpression hyperlinkPageExpression = null; private JRExpression hyperlinkTooltipExpression; /** * The bookmark level for the anchor associated with this field. * @see JRAnchor#getBookmarkLevel() */ protected int bookmarkLevel = JRAnchor.NO_BOOKMARK; /** * */ public JRDesignTextField() { super(null); hyperlinkParameters = new ArrayList(); } /** * */ public JRDesignTextField(JRDefaultStyleProvider defaultStyleProvider) { super(defaultStyleProvider); hyperlinkParameters = new ArrayList(); } /** * */ public boolean isStretchWithOverflow() { return this.isStretchWithOverflow; } /** * @deprecated Replaced by {@link #getEvaluationTimeValue()}. */ public byte getEvaluationTime() { return getEvaluationTimeValue().getValue(); } /** * */ public EvaluationTimeEnum getEvaluationTimeValue() { return this.evaluationTimeValue; } /** * */ public String getPattern() { return JRStyleResolver.getPattern(this); } public String getOwnPattern() { return this.pattern; } /** * */ public boolean isBlankWhenNull() { return JRStyleResolver.isBlankWhenNull(this); } /** * */ public Boolean isOwnBlankWhenNull() { return isBlankWhenNull; } /** * @deprecated Replaced by {@link #getHyperlinkTypeValue()}. */ public byte getHyperlinkType() { return getHyperlinkTypeValue().getValue(); } /** * */ public HyperlinkTypeEnum getHyperlinkTypeValue() { return JRHyperlinkHelper.getHyperlinkTypeValue(this); } /** * */ public byte getHyperlinkTarget() { return JRHyperlinkHelper.getHyperlinkTarget(this); } /** * */ public JRGroup getEvaluationGroup() { return this.evaluationGroup; } /** * */ public JRExpression getExpression() { return this.expression; } /** * */ public JRExpression getAnchorNameExpression() { return this.anchorNameExpression; } /** * */ public JRExpression getHyperlinkReferenceExpression() { return this.hyperlinkReferenceExpression; } /** * */ public JRExpression getHyperlinkAnchorExpression() { return this.hyperlinkAnchorExpression; } /** * */ public JRExpression getHyperlinkPageExpression() { return this.hyperlinkPageExpression; } /** * */ public void setStretchWithOverflow(boolean isStretch) { boolean old = this.isStretchWithOverflow; this.isStretchWithOverflow = isStretch; getEventSupport().firePropertyChange(JRBaseTextField.PROPERTY_STRETCH_WITH_OVERFLOW, old, this.isStretchWithOverflow); } /** * @deprecated Replaced by {@link #setEvaluationTime(EvaluationTimeEnum)}. */ public void setEvaluationTime(byte evaluationTime) { setEvaluationTime(EvaluationTimeEnum.getByValue(evaluationTime)); } /** * */ public void setEvaluationTime(EvaluationTimeEnum evaluationTimeValue) { Object old = this.evaluationTimeValue; this.evaluationTimeValue = evaluationTimeValue; getEventSupport().firePropertyChange(PROPERTY_EVALUATION_TIME, old, this.evaluationTimeValue); } /** * */ public void setPattern(String pattern) { Object old = this.pattern; this.pattern = pattern; getEventSupport().firePropertyChange(JRBaseStyle.PROPERTY_PATTERN, old, this.pattern); } /** * */ public void setBlankWhenNull(boolean isBlank) { setBlankWhenNull(isBlank ? Boolean.TRUE : Boolean.FALSE); } /** * */ public void setBlankWhenNull(Boolean isBlank) { Object old = this.isBlankWhenNull; this.isBlankWhenNull = isBlank; getEventSupport().firePropertyChange(JRBaseStyle.PROPERTY_BLANK_WHEN_NULL, old, this.isBlankWhenNull); } /**@deprecated Repalced by {@link #setHyperlinkType(HyperlinkTypeEnum)}. */ public void setHyperlinkType(byte hyperlinkType) { setHyperlinkType(HyperlinkTypeEnum.getByValue(hyperlinkType)); } /** * Sets the link type as a built-in hyperlink type. * * @param hyperlinkType the built-in hyperlink type * @see #getLinkType() */ public void setHyperlinkType(HyperlinkTypeEnum hyperlinkType) { setLinkType(JRHyperlinkHelper.getLinkType(hyperlinkType)); } /** * @deprecated Replaced by {@link #setHyperlinkTarget(HyperlinkTargetEnum)}. */ public void setHyperlinkTarget(byte hyperlinkTarget) { setHyperlinkTarget(HyperlinkTargetEnum.getByValue(hyperlinkTarget)); } /** * */ public void setHyperlinkTarget(HyperlinkTargetEnum hyperlinkTarget) { setLinkTarget(JRHyperlinkHelper.getLinkTarget(hyperlinkTarget)); } /** * */ public void setEvaluationGroup(JRGroup evaluationGroup) { Object old = this.evaluationGroup; this.evaluationGroup = evaluationGroup; getEventSupport().firePropertyChange(PROPERTY_EVALUATION_GROUP, old, this.evaluationGroup); } /** * */ public void setExpression(JRExpression expression) { Object old = this.expression; this.expression = expression; getEventSupport().firePropertyChange(PROPERTY_EXPRESSION, old, this.expression); } /** * */ public void setAnchorNameExpression(JRExpression anchorNameExpression) { Object old = this.anchorNameExpression; this.anchorNameExpression = anchorNameExpression; getEventSupport().firePropertyChange(PROPERTY_ANCHOR_NAME_EXPRESSION, old, this.anchorNameExpression); } /** * */ public void setHyperlinkReferenceExpression(JRExpression hyperlinkReferenceExpression) { Object old = this.hyperlinkReferenceExpression; this.hyperlinkReferenceExpression = hyperlinkReferenceExpression; getEventSupport().firePropertyChange(JRDesignHyperlink.PROPERTY_HYPERLINK_REFERENCE_EXPRESSION, old, this.hyperlinkReferenceExpression); } /** * */ public void setHyperlinkAnchorExpression(JRExpression hyperlinkAnchorExpression) { Object old = this.hyperlinkAnchorExpression; this.hyperlinkAnchorExpression = hyperlinkAnchorExpression; getEventSupport().firePropertyChange(JRDesignHyperlink.PROPERTY_HYPERLINK_ANCHOR_EXPRESSION, old, this.hyperlinkAnchorExpression); } /** * */ public void setHyperlinkPageExpression(JRExpression hyperlinkPageExpression) { Object old = this.hyperlinkPageExpression; this.hyperlinkPageExpression = hyperlinkPageExpression; getEventSupport().firePropertyChange(JRDesignHyperlink.PROPERTY_HYPERLINK_PAGE_EXPRESSION, old, this.hyperlinkPageExpression); } /** * */ public void collectExpressions(JRExpressionCollector collector) { collector.collect(this); } /** * */ public void visit(JRVisitor visitor) { visitor.visitTextField(this); } public int getBookmarkLevel() { return bookmarkLevel; } /** * Sets the boomark level for the anchor associated with this field. * * @param bookmarkLevel the bookmark level (starting from 1) * or {@link JRAnchor#NO_BOOKMARK NO_BOOKMARK} if no bookmark should be created */ public void setBookmarkLevel(int bookmarkLevel) { int old = this.bookmarkLevel; this.bookmarkLevel = bookmarkLevel; getEventSupport().firePropertyChange(PROPERTY_BOOKMARK_LEVEL, old, this.bookmarkLevel); } public String getLinkType() { return linkType; } /** * Sets the hyperlink type. * <p> * The type can be one of the built-in types * (Reference, LocalAnchor, LocalPage, RemoteAnchor, RemotePage), * or can be an arbitrary type. * </p> * @param type the hyperlink type */ public void setLinkType(String type) { Object old = this.linkType; this.linkType = type; getEventSupport().firePropertyChange(JRDesignHyperlink.PROPERTY_LINK_TYPE, old, this.linkType); } public String getLinkTarget() { return linkTarget; } /** * Sets the hyperlink target name. * <p> * The target name can be one of the built-in names * (Self, Blank, Top, Parent), * or can be an arbitrary name. * </p> * @param target the hyperlink target name */ public void setLinkTarget(String target) { Object old = this.linkTarget; this.linkTarget = target; getEventSupport().firePropertyChange(JRDesignHyperlink.PROPERTY_LINK_TARGET, old, this.linkTarget); } public JRHyperlinkParameter[] getHyperlinkParameters() { JRHyperlinkParameter[] parameters; if (hyperlinkParameters.isEmpty()) { parameters = null; } else { parameters = new JRHyperlinkParameter[hyperlinkParameters.size()]; hyperlinkParameters.toArray(parameters); } return parameters; } /** * Returns the list of custom hyperlink parameters. * * @return the list of custom hyperlink parameters */ public List getHyperlinkParametersList() { return hyperlinkParameters; } /** * Adds a custom hyperlink parameter. * * @param parameter the parameter to add */ public void addHyperlinkParameter(JRHyperlinkParameter parameter) { hyperlinkParameters.add(parameter); getEventSupport().fireCollectionElementAddedEvent(JRDesignHyperlink.PROPERTY_HYPERLINK_PARAMETERS, parameter, hyperlinkParameters.size() - 1); } /** * Removes a custom hyperlink parameter. * * @param parameter the parameter to remove */ public void removeHyperlinkParameter(JRHyperlinkParameter parameter) { int idx = hyperlinkParameters.indexOf(parameter); if (idx >= 0) { hyperlinkParameters.remove(idx); getEventSupport().fireCollectionElementRemovedEvent(JRDesignHyperlink.PROPERTY_HYPERLINK_PARAMETERS, parameter, idx); } } /** * Removes a custom hyperlink parameter. * <p> * If multiple parameters having the specified name exist, all of them * will be removed * </p> * * @param parameterName the parameter name */ public void removeHyperlinkParameter(String parameterName) { for (ListIterator it = hyperlinkParameters.listIterator(); it.hasNext();) { JRHyperlinkParameter parameter = (JRHyperlinkParameter) it.next(); if (parameter.getName() != null && parameter.getName().equals(parameterName)) { it.remove(); getEventSupport().fireCollectionElementRemovedEvent(JRDesignHyperlink.PROPERTY_HYPERLINK_PARAMETERS, parameter, it.nextIndex()); } } } public JRExpression getHyperlinkTooltipExpression() { return hyperlinkTooltipExpression; } /** * Sets the expression which will be used to generate the hyperlink tooltip. * * @param hyperlinkTooltipExpression the expression which will be used to generate the hyperlink tooltip * @see #getHyperlinkTooltipExpression() */ public void setHyperlinkTooltipExpression(JRExpression hyperlinkTooltipExpression) { Object old = this.hyperlinkTooltipExpression; this.hyperlinkTooltipExpression = hyperlinkTooltipExpression; getEventSupport().firePropertyChange(JRDesignHyperlink.PROPERTY_HYPERLINK_TOOLTIP_EXPRESSION, old, this.hyperlinkTooltipExpression); } /** * */ public Object clone() { JRDesignTextField clone = (JRDesignTextField)super.clone(); if (hyperlinkParameters != null) { clone.hyperlinkParameters = new ArrayList(hyperlinkParameters.size()); for(int i = 0; i < hyperlinkParameters.size(); i++) { clone.hyperlinkParameters.add(((JRHyperlinkParameter)hyperlinkParameters.get(i)).clone()); } } if (expression != null) { clone.expression = (JRExpression)expression.clone(); } if (anchorNameExpression != null) { clone.anchorNameExpression = (JRExpression)anchorNameExpression.clone(); } if (hyperlinkReferenceExpression != null) { clone.hyperlinkReferenceExpression = (JRExpression)hyperlinkReferenceExpression.clone(); } if (hyperlinkAnchorExpression != null) { clone.hyperlinkAnchorExpression = (JRExpression)hyperlinkAnchorExpression.clone(); } if (hyperlinkPageExpression != null) { clone.hyperlinkPageExpression = (JRExpression)hyperlinkPageExpression.clone(); } if (hyperlinkTooltipExpression != null) { clone.hyperlinkTooltipExpression = (JRExpression)hyperlinkTooltipExpression.clone(); } return clone; } /* * These fields are only for serialization backward compatibility. */ private int PSEUDO_SERIAL_VERSION_UID = JRConstants.PSEUDO_SERIAL_VERSION_UID; //NOPMD /** * @deprecated */ private byte hyperlinkType; /** * @deprecated */ private byte hyperlinkTarget; /** * @deprecated */ private byte evaluationTime; private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); if (linkType == null) { linkType = JRHyperlinkHelper.getLinkType(HyperlinkTypeEnum.getByValue(hyperlinkType)); } if (linkTarget == null) { linkTarget = JRHyperlinkHelper.getLinkTarget(HyperlinkTargetEnum.getByValue(hyperlinkTarget)); } if (PSEUDO_SERIAL_VERSION_UID < JRConstants.PSEUDO_SERIAL_VERSION_UID_3_7_2) { evaluationTimeValue = EvaluationTimeEnum.getByValue(evaluationTime); } } }