/*
* 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.commons.lang.StringUtils;
import org.apache.struts.taglib.html.HiddenTag;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.rice.core.api.config.property.ConfigurationService;
import org.kuali.rice.kns.web.taglib.html.KNSImageTag;
/**
* Renders the header of an accounting line table
*/
public class AccountingLineTableHeaderRenderer implements Renderer {
private int cellCount;
private boolean hideDetails;
private String accountingLineImportInstructionsUrl;
private KNSImageTag showHideTag = new KNSImageTag();
private HiddenTag hideStateTag = new HiddenTag();
/**
* Constructs a AccountingLineTableHeaderRenderer, updating the tags used by this renderer to keep constant properties
*/
public AccountingLineTableHeaderRenderer() {
hideStateTag.setName("KualiForm");
hideStateTag.setProperty("hideDetails");
showHideTag.setStyleClass("tinybutton");
}
/**
* Clears out the mutable, changing qualities of this renderer so it can be repooled
*/
public void clear() {
cellCount = 0;
hideDetails = false;
accountingLineImportInstructionsUrl = null;
showHideTag.setPageContext(null);
showHideTag.setParent(null);
showHideTag.setProperty(null);
showHideTag.setAlt(null);
showHideTag.setTitle(null);
showHideTag.setSrc(null);
hideStateTag.setPageContext(null);
hideStateTag.setParent(null);
}
/**
* Renders the header for the accounting line table to the screen
* @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 {
JspWriter out = pageContext.getOut();
try {
out.write(buildDivStart());
out.write(buildTableStart());
out.write(buildSubheadingWithDetailToggleRowBeginning());
renderHideDetails(pageContext, parentTag);
out.write(buildSubheadingWithDetailToggleRowEnding());
}
catch (IOException ioe) {
throw new JspException("Difficulty rendering AccountingLineTableHeader", ioe);
}
}
/**
* Builds the beginning of the tab-container div
* @return the beginning of the tab-container div in HTML
*/
protected String buildDivStart() {
return "<div class=\"tab-container\" align=\"center\">\n";
}
/**
* Builds the very start of the table
* @return the very start of the table expressed as HTML
*/
protected String buildTableStart() {
return "<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"datatable\">\n";
}
/**
* Builds the start of the subheading row of the table
* @return the start of the subheading row of the table expressed as HTML
*/
protected String buildSubheadingWithDetailToggleRowBeginning() {
StringBuilder row = new StringBuilder();
row.append("\t<tr>\n");
row.append("\t\t<td colspan=\"");
row.append(cellCount);
row.append("\" class=\"subhead\">\n");
row.append("\t\t\t<span class=\"subhead-left\">");
row.append(buildSubHeading());
row.append("</span>\n");
row.append("\t\t\t<span class=\"subhead-right\">\n");
return row.toString();
}
/**
* Builds the subheading for the table
* @return the subheading for the table, expressed as HTML
*/
protected String buildSubHeading() {
if (StringUtils.isBlank(accountingLineImportInstructionsUrl)) return " ";
StringBuilder subheading = new StringBuilder();
subheading.append("Accounting Lines <a href=\"");
subheading.append(accountingLineImportInstructionsUrl);
subheading.append("\" target=\"helpWindow\">");
subheading.append("<img src=\"");
subheading.append(SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString("kr.externalizable.images.url"));
subheading.append("my_cp_inf.gif\" title=\"Accounting Lines Help\" alt=\"Accounting Lines Help\" hspace=\"5\" border=\"0\" align=\"middle\" />");
subheading.append("</a>");
return subheading.toString();
}
/**
* Renders the show/hide button
* @param pageContext the page context to render to
* @param parentTag the tag requesting all this rendering
* @throws JspException thrown under terrible circumstances when the rendering failed and had to be left behind like so much refuse
*/
protected void renderHideDetails(PageContext pageContext, Tag parentTag) throws JspException {
hideStateTag.setPageContext(pageContext);
hideStateTag.setParent(parentTag);
hideStateTag.doStartTag();
hideStateTag.doEndTag();
String toggle = hideDetails ? "show" : "hide";
showHideTag.setPageContext(pageContext);
showHideTag.setParent(parentTag);
showHideTag.setProperty("methodToCall."+toggle+"Details");
showHideTag.setSrc(SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString("kr.externalizable.images.url")+"det-"+toggle+".gif");
showHideTag.setAlt(toggle+" transaction details");
showHideTag.setTitle(toggle+" transaction details");
showHideTag.doStartTag();
showHideTag.doEndTag();
}
/**
* Builds the ending of the toggle row
* @return the ending of the toggle row expressed as HTML
*/
protected String buildSubheadingWithDetailToggleRowEnding() {
StringBuilder row = new StringBuilder();
row.append("\t\t\t</span>\n");
row.append("\t\t</td>\n");
row.append("\t</tr>\n");
return row.toString();
}
/**
* Gets the accountingLineImportInstructionsUrl attribute.
* @return Returns the accountingLineImportInstructionsUrl.
*/
public String getAccountingLineImportInstructionsUrl() {
return accountingLineImportInstructionsUrl;
}
/**
* Sets the accountingLineImportInstructionsUrl attribute value.
* @param accountingLineImportInstructionsUrl The accountingLineImportInstructionsUrl to set.
*/
public void setAccountingLineImportInstructionsUrl(String accountingLineImportInstructionsUrl) {
this.accountingLineImportInstructionsUrl = accountingLineImportInstructionsUrl;
}
/**
* Gets the cellCount attribute.
* @return Returns the cellCount.
*/
public int getCellCount() {
return cellCount;
}
/**
* Sets the cellCount attribute value.
* @param cellCount The cellCount to set.
*/
public void setCellCount(int cellCount) {
this.cellCount = cellCount;
}
/**
* Gets the hideDetails attribute.
* @return Returns the hideDetails.
*/
public boolean getHideDetails() {
return hideDetails;
}
/**
* Sets the hideDetails attribute value.
* @param hideDetails The hideDetails to set.
*/
public void setHideDetails(boolean hideDetails) {
this.hideDetails = hideDetails;
}
}