/* * 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.PageContext; import javax.servlet.jsp.tagext.Tag; import org.apache.commons.lang.StringUtils; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.rice.core.api.config.property.ConfigurationService; import org.kuali.rice.kns.web.ui.Field; import org.kuali.rice.krad.util.KRADConstants; /** * Base class for all renderers which render fields */ public abstract class FieldRendererBase implements FieldRenderer { private Field field; private String dynamicNameLabel; private int arbitrarilyHighTabIndex = -1; private String onBlur; private boolean showError; private String accessibleTitle; private static String riceImageBase; /** * Sets the field to render * @see org.kuali.kfs.sys.document.web.renderers.FieldRenderer#setField(org.kuali.rice.kns.web.ui.Field) * * KRAD Conversion - Setting the field - No Use of data dictionary */ public void setField(Field field) { this.field = field; } /** * Returns the field to render * @return the field to render * * KRAD Conversion - Getting the field - No Use of data dictionary */ public Field getField() { return this.field; } /** * @return the name this field should have on the form */ protected String getFieldName() { if (!StringUtils.isBlank(field.getPropertyPrefix())) { return field.getPropertyPrefix() + "." + field.getPropertyName(); } return field.getPropertyName(); } /** * Clears the field * @see org.kuali.kfs.sys.document.web.renderers.Renderer#clear() */ public void clear() { this.field = null; this.arbitrarilyHighTabIndex = -1; this.onBlur = null; } /** * Returns an accessible title for the field being rendered * @return an accessible title for the field to render */ protected String getAccessibleTitle() { return accessibleTitle; } /** * Sets the accessible title of the current field * @param accessibleTitle the given the accessible title */ public void setAccessibleTitle(String accessibleTitle) { this.accessibleTitle = accessibleTitle; } /** * Renders a quick finder for the field if one is warranted * @param pageContext the page context to render to * @param parentTag the parent tag requesting all of this rendering * @param businessObjectToRender the business object that will be rendered * @throws JspException thrown if something's off */ protected void renderQuickFinderIfNecessary(PageContext pageContext, Tag parentTag) throws JspException { if (!StringUtils.isBlank(getField().getQuickFinderClassNameImpl()) && renderQuickfinder()) { QuickFinderRenderer renderer = new QuickFinderRenderer(); renderer.setField(getField()); renderer.setTabIndex(getQuickfinderTabIndex()); renderer.setAccessibleTitle(getField().getFieldLabel()); renderer.render(pageContext, parentTag); renderer.clear(); } } /** * Writes the onblur call for the wrapped field * @return a value for onblur= */ protected String buildOnBlur() { if (onBlur == null) { StringBuilder onblur = new StringBuilder(); if (!StringUtils.isBlank(getField().getWebOnBlurHandler())) { onblur.append(getField().getWebOnBlurHandler()); onblur.append("( this.name"); if (!StringUtils.isBlank(getDynamicNameLabel())) { onblur.append(", '"); onblur.append(getDynamicNameLabel()); onblur.append("'"); } onblur.append(" );"); } onBlur = onblur.toString(); } return onBlur; } /** * Overrides the onBlur setting for this renderer * @param onBlur the onBlur value to set and return from buildOnBlur */ public void overrideOnBlur(String onBlur) { this.onBlur = onBlur; } /** * @return the dynamic name label field */ protected String getDynamicNameLabel() { return dynamicNameLabel; } /** * @see org.kuali.kfs.sys.document.web.renderers.FieldRenderer#setDynamicNameLabel(java.lang.String) */ public void setDynamicNameLabel(String dynamicNameLabel) { this.dynamicNameLabel = dynamicNameLabel; } /** * @see org.kuali.kfs.sys.document.web.renderers.FieldRenderer#setArbitrarilyHighTabIndex(int) */ public void setArbitrarilyHighTabIndex(int tabIndex) { this.arbitrarilyHighTabIndex = tabIndex; } /** * @return the tab index the quick finder should use - which, by default, is the arbitrarily high tab index */ protected int getQuickfinderTabIndex() { return arbitrarilyHighTabIndex; } /** * @see org.kuali.kfs.sys.document.web.renderers.FieldRenderer#closeNoWrapSpan() */ public void closeNoWrapSpan(PageContext pageContext, Tag parentTag) throws JspException { try { pageContext.getOut().write("</span>"); } catch (IOException ioe) { throw new JspException("Could not render closing of no-wrap span", ioe); } } /** * @see org.kuali.kfs.sys.document.web.renderers.FieldRenderer#openNoWrapSpan() */ public void openNoWrapSpan(PageContext pageContext, Tag parentTag) throws JspException { try { pageContext.getOut().write("<span class=\"nowrap\">"); } catch (IOException ioe) { throw new JspException("Could not render opening of no-wrap span", ioe); } } /** * Gets the showError attribute. * @return Returns the showError. */ public boolean isShowError() { return showError; } /** * Sets the showError attribute value. * @param showError The showError to set. */ public void setShowError(boolean showError) { this.showError = showError; } /** * Renders the error icon * @param pageContext the page context to render to * @throws IOException thrown if the pageContext cannot be written to */ protected void renderErrorIcon(PageContext pageContext) throws JspException { try { pageContext.getOut().write(getErrorIconImageTag()); } catch (IOException ioe) { throw new JspException("Could not render error icon", ioe); } } /** * @return the tag for the error icon */ protected String getErrorIconImageTag() { return "<img src=\""+getErrorIconImageSrc()+"\" alt=\"error\" />"; } /** * @return the source of the error icon */ private String getErrorIconImageSrc() { return getRiceImageBase()+"errormark.gif"; } /** * @return the source of rice images */ private String getRiceImageBase() { if (riceImageBase == null) { riceImageBase = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(KRADConstants.EXTERNALIZABLE_IMAGES_URL_KEY); } return riceImageBase; } @Override public void renderExplodableLink(PageContext context) throws JspException { String textAreaLabel="Description"; String docFormKey="88888888"; String readonly="false"; String maxLength=Integer.toString(field.getMaxLength()); String actionName=((String)context.getRequest().getAttribute("org.apache.struts.globals.ORIGINAL_URI_KEY")); /* Here we get the action url without decoration turning * /arCustomerInvoiceDocument.do into arCustomerInvoiceDocument */ actionName=actionName.substring(1,actionName.length() - 3); String title="Description"; String imageUrl = String.format("%s%s", getRiceImageBase(), "pencil_add.png"); try { context.getOut().write(String.format("<input type=\"image\" name=\"methodToCall.updateTextArea.((`%s`))\" src=\"%s\" " + "onclick=\"javascript: textAreaPop('%s', '%s', '%s', '%s', '%s', '%s'); return false\" class=\"tinybutton\" title=\"%s\" alt=\"Expand Text Area\">", getFieldName(), imageUrl, getFieldName(), actionName, textAreaLabel, docFormKey, readonly, maxLength, title)); } catch (IOException ex) { throw new JspException("Could not render Explodable Link", ex); } } }