001 /*
002 * Copyright 2011 The Kuali Foundation.
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.kfs.sys.document.web.renderers;
017
018 import java.io.IOException;
019
020 import javax.servlet.jsp.JspException;
021 import javax.servlet.jsp.JspWriter;
022 import javax.servlet.jsp.PageContext;
023 import javax.servlet.jsp.tagext.Tag;
024
025 import org.apache.commons.lang.StringUtils;
026 import org.apache.struts.taglib.html.HiddenTag;
027 import org.kuali.kfs.sys.context.SpringContext;
028 import org.kuali.rice.kns.service.KualiConfigurationService;
029 import org.kuali.rice.kns.web.taglib.html.KNSImageTag;
030
031 /**
032 * Renders the header of an accounting line table
033 */
034 public class AccountingLineTableHeaderRenderer implements Renderer {
035 private int cellCount;
036 private boolean hideDetails;
037 private String accountingLineImportInstructionsUrl;
038 private KNSImageTag showHideTag = new KNSImageTag();
039 private HiddenTag hideStateTag = new HiddenTag();
040
041 /**
042 * Constructs a AccountingLineTableHeaderRenderer, updating the tags used by this renderer to keep constant properties
043 */
044 public AccountingLineTableHeaderRenderer() {
045 hideStateTag.setName("KualiForm");
046 hideStateTag.setProperty("hideDetails");
047
048 showHideTag.setStyleClass("tinybutton");
049 }
050
051 /**
052 * Clears out the mutable, changing qualities of this renderer so it can be repooled
053 */
054 public void clear() {
055 cellCount = 0;
056 hideDetails = false;
057 accountingLineImportInstructionsUrl = null;
058
059 showHideTag.setPageContext(null);
060 showHideTag.setParent(null);
061 showHideTag.setProperty(null);
062 showHideTag.setAlt(null);
063 showHideTag.setTitle(null);
064 showHideTag.setSrc(null);
065
066 hideStateTag.setPageContext(null);
067 hideStateTag.setParent(null);
068 }
069
070 /**
071 * Renders the header for the accounting line table to the screen
072 * @see org.kuali.kfs.sys.document.web.renderers.Renderer#render(javax.servlet.jsp.PageContext, javax.servlet.jsp.tagext.Tag)
073 */
074 public void render(PageContext pageContext, Tag parentTag) throws JspException {
075 JspWriter out = pageContext.getOut();
076
077 try {
078 out.write(buildDivStart());
079 out.write(buildTableStart());
080 out.write(buildSubheadingWithDetailToggleRowBeginning());
081 renderHideDetails(pageContext, parentTag);
082 out.write(buildSubheadingWithDetailToggleRowEnding());
083 }
084 catch (IOException ioe) {
085 throw new JspException("Difficulty rendering AccountingLineTableHeader", ioe);
086 }
087 }
088
089 /**
090 * Builds the beginning of the tab-container div
091 * @return the beginning of the tab-container div in HTML
092 */
093 protected String buildDivStart() {
094 return "<div class=\"tab-container\" align=\"center\">\n";
095 }
096
097 /**
098 * Builds the very start of the table
099 * @return the very start of the table expressed as HTML
100 */
101 protected String buildTableStart() {
102 return "<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"datatable\">\n";
103 }
104
105 /**
106 * Builds the start of the subheading row of the table
107 * @return the start of the subheading row of the table expressed as HTML
108 */
109 protected String buildSubheadingWithDetailToggleRowBeginning() {
110 StringBuilder row = new StringBuilder();
111 row.append("\t<tr>\n");
112 row.append("\t\t<td colspan=\"");
113 row.append(cellCount);
114 row.append("\" class=\"subhead\">\n");
115 row.append("\t\t\t<span class=\"subhead-left\">");
116 row.append(buildSubHeading());
117 row.append("</span>\n");
118 row.append("\t\t\t<span class=\"subhead-right\">\n");
119
120 return row.toString();
121 }
122
123 /**
124 * Builds the subheading for the table
125 * @return the subheading for the table, expressed as HTML
126 */
127 protected String buildSubHeading() {
128 if (StringUtils.isBlank(accountingLineImportInstructionsUrl)) return " ";
129
130 StringBuilder subheading = new StringBuilder();
131
132 subheading.append("Accounting Lines <a href=\"");
133 subheading.append(accountingLineImportInstructionsUrl);
134 subheading.append("\" target=\"helpWindow\">");
135 subheading.append("<img src=\"");
136 subheading.append(SpringContext.getBean(KualiConfigurationService.class).getPropertyString("kr.externalizable.images.url"));
137 subheading.append("my_cp_inf.gif\" title=\"Accounting Lines Help\" src=\"Accounting Lines Help\" hspace=\"5\" border=\"0\" align=\"middle\" />");
138 subheading.append("</a>");
139
140 return subheading.toString();
141 }
142
143 /**
144 * Renders the show/hide button
145 * @param pageContext the page context to render to
146 * @param parentTag the tag requesting all this rendering
147 * @throws JspException thrown under terrible circumstances when the rendering failed and had to be left behind like so much refuse
148 */
149 protected void renderHideDetails(PageContext pageContext, Tag parentTag) throws JspException {
150 hideStateTag.setPageContext(pageContext);
151 hideStateTag.setParent(parentTag);
152
153 hideStateTag.doStartTag();
154 hideStateTag.doEndTag();
155
156 String toggle = hideDetails ? "show" : "hide";
157
158 showHideTag.setPageContext(pageContext);
159 showHideTag.setParent(parentTag);
160 showHideTag.setProperty("methodToCall."+toggle+"Details");
161 showHideTag.setSrc(SpringContext.getBean(KualiConfigurationService.class).getPropertyString("kr.externalizable.images.url")+"det-"+toggle+".gif");
162 showHideTag.setAlt(toggle+" transaction details");
163 showHideTag.setTitle(toggle+" transaction details");
164
165 showHideTag.doStartTag();
166 showHideTag.doEndTag();
167 }
168
169 /**
170 * Builds the ending of the toggle row
171 * @return the ending of the toggle row expressed as HTML
172 */
173 protected String buildSubheadingWithDetailToggleRowEnding() {
174 StringBuilder row = new StringBuilder();
175 row.append("\t\t\t</span>\n");
176 row.append("\t\t</td>\n");
177 row.append("\t</tr>\n");
178 return row.toString();
179 }
180
181 /**
182 * Gets the accountingLineImportInstructionsUrl attribute.
183 * @return Returns the accountingLineImportInstructionsUrl.
184 */
185 public String getAccountingLineImportInstructionsUrl() {
186 return accountingLineImportInstructionsUrl;
187 }
188
189 /**
190 * Sets the accountingLineImportInstructionsUrl attribute value.
191 * @param accountingLineImportInstructionsUrl The accountingLineImportInstructionsUrl to set.
192 */
193 public void setAccountingLineImportInstructionsUrl(String accountingLineImportInstructionsUrl) {
194 this.accountingLineImportInstructionsUrl = accountingLineImportInstructionsUrl;
195 }
196
197 /**
198 * Gets the cellCount attribute.
199 * @return Returns the cellCount.
200 */
201 public int getCellCount() {
202 return cellCount;
203 }
204
205 /**
206 * Sets the cellCount attribute value.
207 * @param cellCount The cellCount to set.
208 */
209 public void setCellCount(int cellCount) {
210 this.cellCount = cellCount;
211 }
212
213 /**
214 * Gets the hideDetails attribute.
215 * @return Returns the hideDetails.
216 */
217 public boolean getHideDetails() {
218 return hideDetails;
219 }
220
221 /**
222 * Sets the hideDetails attribute value.
223 * @param hideDetails The hideDetails to set.
224 */
225 public void setHideDetails(boolean hideDetails) {
226 this.hideDetails = hideDetails;
227 }
228 }