/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.sys.document.web.renderers; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.Tag; import org.apache.struts.taglib.html.HiddenTag; import org.kuali.kfs.sys.businessobject.AccountingLine; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.kfs.sys.document.service.AccountingLineRenderingService; import org.kuali.rice.kns.web.ui.Field; import org.springframework.web.util.HtmlUtils; /** * The renderer of an override field */ public class OverrideFieldRenderer extends FieldRendererBase { private LabelRenderer overrideLabelRenderer = new LabelRenderer(); private FieldRenderer overrideFieldRenderer; private HiddenTag overrideHiddenTag = new HiddenTag(); private HiddenTag overrideNeededTag = new HiddenTag(); private HiddenTag overridePresentTag = new HiddenTag(); private boolean readOnly = false; private String overrideNeededProperty; private String overrideNeededValue; private AccountingLine accountingLine; private String storedFieldValue; /** * We never render quick finders on these * @see org.kuali.kfs.sys.document.web.renderers.FieldRenderer#renderQuickfinder() */ public boolean renderQuickfinder() { return false; } /** * Cleans up the tags used to display this field * @see org.kuali.kfs.sys.document.web.renderers.FieldRendererBase#clear() */ @Override public void clear() { super.clear(); overrideLabelRenderer.clear(); overrideFieldRenderer = null; clearOverrideHiddenTag(); clearOverrideNeededTag(); overrideNeededProperty = null; overrideNeededValue = null; storedFieldValue = null; } /** * Cleans up the hidden that displays information for the override */ protected void clearOverrideHiddenTag() { overrideHiddenTag.setPageContext(null); overrideHiddenTag.setParent(null); overrideHiddenTag.setProperty(null); overrideHiddenTag.setValue(null); overridePresentTag.setPageContext(null); overridePresentTag.setParent(null); overridePresentTag.setProperty(null); overridePresentTag.setValue(null); } /** * Cleans up the HiddenTag that renders override needed properties */ protected void clearOverrideNeededTag() { overrideNeededTag.setPageContext(null); overrideNeededTag.setParent(null); overrideNeededTag.setProperty(null); } /** * Also sets the overrideNeededProperty name * @see org.kuali.kfs.sys.document.web.renderers.FieldRendererBase#setField(org.kuali.rice.kns.web.ui.Field) * KRAD Conversion: setting fields */ @Override public void setField(Field overrideField) { super.setField(overrideField); this.overrideNeededProperty = overrideField.getPropertyPrefix()+"."+overrideField.getPropertyName()+"Needed"; storedFieldValue = overrideField.getPropertyValue(); overrideField.setPropertyValue(null); } /** * Gets the readOnly attribute. * @return Returns the readOnly. */ public boolean isReadOnly() { return readOnly; } /** * Sets the readOnly attribute value. * @param readOnly The readOnly to set. */ public void setReadOnly(boolean readOnly) { this.readOnly = readOnly; } /** * Gets the overrideNeededValue attribute. * @return Returns the overrideNeededValue. */ public String getOverrideNeededValue() { return overrideNeededValue; } /** * Sets the overrideNeededValue attribute value. * @param overrideNeededValue The overrideNeededValue to set. */ public void setOverrideNeededValue(String overrideNeededValue) { this.overrideNeededValue = overrideNeededValue; } /** * Gets the accountingLine attribute. * @return Returns the accountingLine. */ public AccountingLine getAccountingLine() { return accountingLine; } /** * Sets the accountingLine attribute value. * @param accountingLine The accountingLine to set. */ public void setAccountingLine(AccountingLine accountingLine) { this.accountingLine = accountingLine; } /** * Renders the override field and its associated override needed field * @see org.kuali.kfs.sys.document.web.renderers.Renderer#render(javax.servlet.jsp.PageContext, javax.servlet.jsp.tagext.Tag) */ public void render(PageContext pageContext, Tag parentTag) throws JspException { if ((readOnly && getField().getPropertyValue().equals("Yes")) || overrideNeededValue.equals("Yes")) { renderOverrideAsNonHidden(pageContext, parentTag); if (!readOnly) { renderOverridePresent(pageContext, parentTag); } } else { } } /** * @return the HTML for a line break */ protected String buildLineBreak() { return "<br />"; } /** * @return the HTML for a non-breaking space */ protected String buildNonBreakingSpace() { return " "; } /** * @return builds the opening of the span tag to go around the label */ protected String buildLabelSpanOpening() { return "<span style=\"font-weight: normal\">"; } /** * @return builds the closing of the span tag to go around the label */ protected String buildLabelSpanClosing() { return "</span>"; } /** * Renders the override field as non-hidden (probably a checkbox) * @param pageContext the page context to render to * @param parentTag the tag requesting all this rendering * @throws JspException thrown if rendering fails */ protected void renderOverrideAsNonHidden(PageContext pageContext, Tag parentTag) throws JspException { JspWriter out = pageContext.getOut(); try { out.write(buildLineBreak()); openNoWrapSpan(pageContext, parentTag); out.write(buildLabelSpanOpening()); overrideLabelRenderer.setLabel(getField().getFieldLabel()); overrideLabelRenderer.setRequired(true); overrideLabelRenderer.setReadOnly(false); overrideLabelRenderer.setLabelFor(getField().getPropertyPrefix()+"."+getField().getPropertyName()); overrideLabelRenderer.render(pageContext, parentTag); out.write(buildLabelSpanClosing()); out.write(buildNonBreakingSpace()); overrideFieldRenderer = readOnly ? new ReadOnlyRenderer() : SpringContext.getBean(AccountingLineRenderingService.class).getFieldRendererForField(getField(), accountingLine); if (overrideFieldRenderer instanceof ReadOnlyRenderer) { ((ReadOnlyRenderer)overrideFieldRenderer).setShouldRenderInquiry(false); out.write(": "); // add a colon to make it prettier // populate the field again getField().setPropertyValue(storedFieldValue); } overrideFieldRenderer.setField(getField()); overrideFieldRenderer.setArbitrarilyHighTabIndex(getQuickfinderTabIndex()); overrideFieldRenderer.render(pageContext, parentTag); closeNoWrapSpan(pageContext, parentTag); } catch (IOException ioe) { throw new JspException("Difficulty rendering override field", ioe); } } /** * Renders the override field as a hidden field * @param pageContext the page context to render to * @param parentTag the tag requesting all this rendering * @throws JspException thrown if rendering fails */ protected void renderOverrideAsHidden(PageContext pageContext, Tag parentTag) throws JspException { overrideHiddenTag.setPageContext(pageContext); overrideHiddenTag.setParent(parentTag); overrideHiddenTag.setProperty(getField().getPropertyPrefix()+"."+getField().getPropertyName()); if (!readOnly && overrideNeededValue.equals("No")) { overrideHiddenTag.setValue("No"); } else { overrideHiddenTag.setValue(getField().getPropertyValue()); } overrideHiddenTag.doStartTag(); overrideHiddenTag.doEndTag(); } /** * Renders the override field as a hidden field * @param pageContext the page context to render to * @param parentTag the tag requesting all this rendering * @throws JspException thrown if rendering fails */ protected void renderOverridePresent(PageContext pageContext, Tag parentTag) throws JspException { overridePresentTag.setPageContext(pageContext); overridePresentTag.setParent(parentTag); overridePresentTag.setProperty(getField().getPropertyPrefix()+"."+getField().getPropertyName()+".present"); overridePresentTag.setValue("I'm here yo!"); overridePresentTag.doStartTag(); overridePresentTag.doEndTag(); } /** * Renders the overrideNeeded field (which is always hidden) * @param pageContext the page context to render to * @param parentTag the tag requesting all this rendering * @throws JspException thrown if rendering fails */ protected void renderOverrideNeededField(PageContext pageContext, Tag parentTag) throws JspException { overrideNeededTag.setPageContext(pageContext); overrideNeededTag.setParent(parentTag); overrideNeededTag.setProperty(overrideNeededProperty); overrideNeededTag.setValue(overrideNeededValue); overrideNeededTag.doStartTag(); overrideNeededTag.doEndTag(); } }