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.kfs.sys.document.web.HideShowBlock; 029 import org.kuali.rice.kns.service.KualiConfigurationService; 030 import org.kuali.rice.kns.web.taglib.html.KNSImageTag; 031 032 /** 033 * Renders a hide show block 034 */ 035 public class HideShowBlockRenderer implements Renderer { 036 private HideShowBlock hideShowBlock; 037 private HiddenTag tabStateTag = new HiddenTag(); 038 private KNSImageTag showHideButton = new KNSImageTag(); 039 040 protected String riceImageURLProperty = "kr.externalizable.images.url"; 041 042 /** 043 * 044 * @see org.kuali.kfs.sys.document.web.renderers.Renderer#clear() 045 */ 046 public void clear() { 047 hideShowBlock = null; 048 cleanTabStateTag(); 049 cleanShowHideButton(); 050 } 051 052 /** 053 * Cleans the tab state hidden tag 054 */ 055 protected void cleanTabStateTag() { 056 tabStateTag.setPageContext(null); 057 tabStateTag.setParent(null); 058 tabStateTag.setProperty(null); 059 tabStateTag.setValue(null); 060 } 061 062 /** 063 * Cleans the show/hide button up 064 */ 065 protected void cleanShowHideButton() { 066 showHideButton.setPageContext(null); 067 showHideButton.setParent(null); 068 showHideButton.setSrc(null); 069 showHideButton.setAlt(null); 070 showHideButton.setTitle(null); 071 showHideButton.setProperty(null); 072 showHideButton.setStyleClass(null); 073 showHideButton.setStyleId(null); 074 showHideButton.setOnclick(null); 075 } 076 077 /** 078 * Renders the title row and forces the rendering of child content 079 * @see org.kuali.kfs.sys.document.web.renderers.Renderer#render(javax.servlet.jsp.PageContext, javax.servlet.jsp.tagext.Tag) 080 */ 081 public void render(PageContext pageContext, Tag parentTag) throws JspException { 082 JspWriter out = pageContext.getOut(); 083 084 try { 085 out.write(buildLabelButtonTableOpening()); 086 renderTabStateTag(pageContext, parentTag); 087 if (!StringUtils.isBlank(hideShowBlock.getLabel())) { 088 out.write(hideShowBlock.getLabel()); 089 } 090 renderShowHideButton(pageContext, parentTag); 091 out.write(buildLabelButtonTableClosing()); 092 out.write(buildInnerTableOpening()); 093 hideShowBlock.renderChildRows(pageContext, parentTag); 094 out.write(buildInnerTableClosing()); 095 } catch (IOException ioe) { 096 throw new JspException("Difficulty rendering Hide/Show block", ioe); 097 } 098 } 099 100 /** 101 * @return the HTML for the opening of the button table 102 */ 103 protected String buildLabelButtonTableOpening() { 104 return "<table class=\"datatable\" style=\"padding: 0px\"><tr><td class=\"tab-subhead\">"; 105 } 106 107 /** 108 * Renders a hidden tag which holds the current tab state 109 * @param pageContext the pageContext to render to 110 * @param parentTag the tag requesting all this rendering 111 * @throws JspException thrown if something goes wrong 112 */ 113 protected void renderTabStateTag(PageContext pageContext, Tag parentTag) throws JspException { 114 tabStateTag.setPageContext(pageContext); 115 tabStateTag.setParent(parentTag); 116 tabStateTag.setProperty("tabStates("+hideShowBlock.getTabKey()+")"); 117 tabStateTag.setValue(hideShowBlock.getTabState()); 118 119 tabStateTag.doStartTag(); 120 tabStateTag.doEndTag(); 121 } 122 123 /** 124 * @return the HTML for the closing of the label button table 125 */ 126 protected String buildLabelButtonTableClosing() { 127 return "</td></tr></table>"; 128 } 129 130 /** 131 * Renders the hide/show image button 132 * @param pageContext the pageContext to render to 133 * @param parentTag the tag requesting all this rendering 134 * @throws JspException thrown if something goes wrong 135 */ 136 protected void renderShowHideButton(PageContext pageContext, Tag parentTag) throws JspException { 137 showHideButton.setPageContext(pageContext); 138 showHideButton.setParent(parentTag); 139 showHideButton.setProperty("methodToCall.toggleTab.tab"+hideShowBlock.getTabKey()); 140 showHideButton.setStyleClass("tinybutton"); 141 showHideButton.setStyleId("tab-"+hideShowBlock.getTabKey()+"-imageToggle"); 142 showHideButton.setOnclick("javascript: return toggleTab(document, '"+hideShowBlock.getTabKey()+"'); "); 143 144 String riceImageDir = SpringContext.getBean(KualiConfigurationService.class).getPropertyString(riceImageURLProperty); 145 if (hideShowBlock.isShowing()) { 146 showHideButton.setSrc(riceImageDir+"tinybutton-hide.gif"); 147 showHideButton.setAlt("Hide "+hideShowBlock.getFullLabel()); 148 showHideButton.setTitle("Hide "+hideShowBlock.getFullLabel()); 149 } else { 150 showHideButton.setSrc(riceImageDir+"tinybutton-show.gif"); 151 showHideButton.setAlt("Show "+hideShowBlock.getFullLabel()); 152 showHideButton.setTitle("Show "+hideShowBlock.getFullLabel()); 153 } 154 155 showHideButton.doStartTag(); 156 showHideButton.doEndTag(); 157 } 158 159 /** 160 * Creates the HTML for the hiding/showing div and inner table to display children in 161 * @return the HTML for the opening of the inner table 162 */ 163 protected String buildInnerTableOpening() { 164 StringBuilder opening = new StringBuilder(); 165 opening.append("<div id=\"tab-"+hideShowBlock.getTabKey()+"-div\" style=\"display: "); 166 opening.append(hideShowBlock.isShowing() ? "block" : "none"); 167 opening.append("\">"); 168 169 opening.append("<table class=\"datatable\" style=\"width: 100%;\">"); 170 171 return opening.toString(); 172 } 173 174 /** 175 * Creates the HTML to close the inner table and hide/show div 176 * @return the HTML for the closing of the inner table 177 */ 178 protected String buildInnerTableClosing() { 179 return "</table></div>"; 180 } 181 182 183 /** 184 * Gets the hideShowBlock attribute. 185 * @return Returns the hideShowBlock. 186 */ 187 public HideShowBlock getHideShowBlock() { 188 return hideShowBlock; 189 } 190 191 /** 192 * Sets the hideShowBlock attribute value. 193 * @param hideShowBlock The hideShowBlock to set. 194 */ 195 public void setHideShowBlock(HideShowBlock hideShowBlock) { 196 this.hideShowBlock = hideShowBlock; 197 } 198 199 }