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.PageContext;
022 import javax.servlet.jsp.tagext.Tag;
023
024 import org.apache.commons.lang.StringUtils;
025 import org.kuali.kfs.sys.context.SpringContext;
026 import org.kuali.rice.kns.service.KualiConfigurationService;
027 import org.kuali.rice.kns.util.KNSConstants;
028 import org.kuali.rice.kns.web.ui.Field;
029
030 /**
031 * Base class for all renderers which render fields
032 */
033 public abstract class FieldRendererBase implements FieldRenderer {
034 private Field field;
035 private String dynamicNameLabel;
036 private int arbitrarilyHighTabIndex = -1;
037 private String onBlur;
038 private boolean showError;
039 private String accessibleTitle;
040 private static String riceImageBase;
041
042 /**
043 * Sets the field to render
044 * @see org.kuali.kfs.sys.document.web.renderers.FieldRenderer#setField(org.kuali.rice.kns.web.ui.Field)
045 */
046 public void setField(Field field) {
047 this.field = field;
048 }
049
050 /**
051 * Returns the field to render
052 * @return the field to render
053 */
054 public Field getField() {
055 return this.field;
056 }
057
058 /**
059 * @return the name this field should have on the form
060 */
061 protected String getFieldName() {
062 if (!StringUtils.isBlank(field.getPropertyPrefix())) return field.getPropertyPrefix()+"."+field.getPropertyName();
063 return field.getPropertyName();
064 }
065
066 /**
067 * Clears the field
068 * @see org.kuali.kfs.sys.document.web.renderers.Renderer#clear()
069 */
070 public void clear() {
071 this.field = null;
072 this.arbitrarilyHighTabIndex = -1;
073 this.onBlur = null;
074 }
075
076 /**
077 * Returns an accessible title for the field being rendered
078 * @return an accessible title for the field to render
079 */
080 protected String getAccessibleTitle() {
081 return accessibleTitle;
082 }
083
084 /**
085 * Sets the accessible title of the current field
086 * @param accessibleTitle the given the accessible title
087 */
088 public void setAccessibleTitle(String accessibleTitle) {
089 this.accessibleTitle = accessibleTitle;
090 }
091
092 /**
093 * Renders a quick finder for the field if one is warranted
094 * @param pageContext the page context to render to
095 * @param parentTag the parent tag requesting all of this rendering
096 * @param businessObjectToRender the business object that will be rendered
097 * @throws JspException thrown if something's off
098 */
099 protected void renderQuickFinderIfNecessary(PageContext pageContext, Tag parentTag) throws JspException {
100 if (!StringUtils.isBlank(getField().getQuickFinderClassNameImpl()) && renderQuickfinder()) {
101 QuickFinderRenderer renderer = new QuickFinderRenderer();
102 renderer.setField(getField());
103 renderer.setTabIndex(getQuickfinderTabIndex());
104 renderer.setAccessibleTitle(getField().getFieldLabel());
105 renderer.render(pageContext, parentTag);
106 renderer.clear();
107 }
108 }
109
110 /**
111 * Writes the onblur call for the wrapped field
112 * @return a value for onblur=
113 */
114 protected String buildOnBlur() {
115 if (onBlur == null) {
116 StringBuilder onblur = new StringBuilder();
117 if (!StringUtils.isBlank(getField().getWebOnBlurHandler())) {
118 onblur.append(getField().getWebOnBlurHandler());
119 onblur.append("( this.name");
120 if (!StringUtils.isBlank(getDynamicNameLabel())) {
121 onblur.append(", '");
122 onblur.append(getDynamicNameLabel());
123 onblur.append("'");
124 }
125 onblur.append(" );");
126 }
127 onBlur = onblur.toString();
128 }
129 return onBlur;
130 }
131
132 /**
133 * Overrides the onBlur setting for this renderer
134 * @param onBlur the onBlur value to set and return from buildOnBlur
135 */
136 public void overrideOnBlur(String onBlur) {
137 this.onBlur = onBlur;
138 }
139
140 /**
141 * @return the dynamic name label field
142 */
143 protected String getDynamicNameLabel() {
144 return dynamicNameLabel;
145 }
146
147 /**
148 * @see org.kuali.kfs.sys.document.web.renderers.FieldRenderer#setDynamicNameLabel(java.lang.String)
149 */
150 public void setDynamicNameLabel(String dynamicNameLabel) {
151 this.dynamicNameLabel = dynamicNameLabel;
152 }
153
154 /**
155 * @see org.kuali.kfs.sys.document.web.renderers.FieldRenderer#setArbitrarilyHighTabIndex(int)
156 */
157 public void setArbitrarilyHighTabIndex(int tabIndex) {
158 this.arbitrarilyHighTabIndex = tabIndex;
159 }
160
161 /**
162 * @return the tab index the quick finder should use - which, by default, is the arbitrarily high tab index
163 */
164 protected int getQuickfinderTabIndex() {
165 return arbitrarilyHighTabIndex;
166 }
167
168 /**
169 * @see org.kuali.kfs.sys.document.web.renderers.FieldRenderer#closeNoWrapSpan()
170 */
171 public void closeNoWrapSpan(PageContext pageContext, Tag parentTag) throws JspException {
172 try {
173 pageContext.getOut().write("</span>");
174 }
175 catch (IOException ioe) {
176 throw new JspException("Could not render closing of no-wrap span", ioe);
177 }
178 }
179
180 /**
181 * @see org.kuali.kfs.sys.document.web.renderers.FieldRenderer#openNoWrapSpan()
182 */
183 public void openNoWrapSpan(PageContext pageContext, Tag parentTag) throws JspException {
184 try {
185 pageContext.getOut().write("<span class=\"nowrap\">");
186 }
187 catch (IOException ioe) {
188 throw new JspException("Could not render opening of no-wrap span", ioe);
189 }
190 }
191
192 /**
193 * Gets the showError attribute.
194 * @return Returns the showError.
195 */
196 public boolean isShowError() {
197 return showError;
198 }
199
200 /**
201 * Sets the showError attribute value.
202 * @param showError The showError to set.
203 */
204 public void setShowError(boolean showError) {
205 this.showError = showError;
206 }
207
208 /**
209 * Renders the error icon
210 * @param pageContext the page context to render to
211 * @throws IOException thrown if the pageContext cannot be written to
212 */
213 protected void renderErrorIcon(PageContext pageContext) throws JspException {
214 try {
215 pageContext.getOut().write(getErrorIconImageTag());
216 }
217 catch (IOException ioe) {
218 throw new JspException("Could not render error icon", ioe);
219 }
220 }
221
222 /**
223 * @return the tag for the error icon
224 */
225 protected String getErrorIconImageTag() {
226 return "<img src=\""+getErrorIconImageSrc()+"\" alt=\"error\" />";
227 }
228
229 /**
230 * @return the source of the error icon
231 */
232 private String getErrorIconImageSrc() {
233 return getRiceImageBase()+"errormark.gif";
234 }
235
236 /**
237 * @return the source of rice images
238 */
239 private String getRiceImageBase() {
240 if (riceImageBase == null) {
241 riceImageBase = SpringContext.getBean(KualiConfigurationService.class).getPropertyString(KNSConstants.EXTERNALIZABLE_IMAGES_URL_KEY);
242 }
243 return riceImageBase;
244 }
245 }