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; 017 018 import java.util.List; 019 import java.util.Map; 020 import java.util.Set; 021 022 import javax.servlet.jsp.JspException; 023 import javax.servlet.jsp.PageContext; 024 import javax.servlet.jsp.tagext.Tag; 025 026 import org.kuali.kfs.sys.businessobject.AccountingLine; 027 import org.kuali.kfs.sys.document.datadictionary.AccountingLineViewOverrideFieldDefinition; 028 import org.kuali.kfs.sys.document.service.AccountingLineFieldRenderingTransformation; 029 import org.kuali.kfs.sys.document.web.renderers.OverrideFieldRenderer; 030 import org.kuali.rice.kns.util.FieldUtils; 031 import org.kuali.rice.kns.util.ObjectUtils; 032 import org.kuali.rice.kns.web.ui.Field; 033 034 /** 035 * An override field to be displayed for a field 036 */ 037 public class AccountingLineViewOverrideField implements RenderableElement { 038 private AccountingLineViewField parent; 039 private AccountingLineViewOverrideFieldDefinition definition; 040 private Field overrideField; 041 private int arbitrarilyHighIndex; 042 043 /** 044 * Constructs a AccountingLineViewOverrideField 045 * @param field the owning accounting line view field 046 * @param accountingLineClass the class of the accounting line we're rendering 047 */ 048 public AccountingLineViewOverrideField(AccountingLineViewField field, AccountingLineViewOverrideFieldDefinition definition, Class<? extends AccountingLine> accountingLineClass) { 049 this.parent = field; 050 this.definition = definition; 051 overrideField = FieldUtils.getPropertyField(accountingLineClass, definition.getName(), false); 052 } 053 054 /** 055 * Adds our override field (though not our override needed field - we'll let Struts handle the value population on that 056 * @see org.kuali.kfs.sys.document.web.RenderableElement#appendFields(java.util.List) 057 */ 058 public void appendFields(List<Field> fields) { 059 fields.add(overrideField); 060 } 061 062 /** 063 * This is not an action block 064 * @see org.kuali.kfs.sys.document.web.RenderableElement#isActionBlock() 065 */ 066 public boolean isActionBlock() { 067 return false; 068 } 069 070 /** 071 * Empty if our parent AccountingLineViewField is empty 072 * @see org.kuali.kfs.sys.document.web.RenderableElement#isEmpty() 073 */ 074 public boolean isEmpty() { 075 return parent.isEmpty(); 076 } 077 078 /** 079 * Hidden if our parent AccountingLineViewField is hidden 080 * @see org.kuali.kfs.sys.document.web.RenderableElement#isHidden() 081 */ 082 public boolean isHidden() { 083 return parent.isHidden(); 084 } 085 086 /** 087 * 088 * @see org.kuali.kfs.sys.document.web.RenderableElement#populateWithTabIndexIfRequested(int[], int) 089 */ 090 public void populateWithTabIndexIfRequested(int reallyHighIndex) { 091 arbitrarilyHighIndex = reallyHighIndex; 092 } 093 094 /** 095 * 096 * @see org.kuali.kfs.sys.document.web.RenderableElement#renderElement(javax.servlet.jsp.PageContext, javax.servlet.jsp.tagext.Tag, org.kuali.kfs.sys.document.web.AccountingLineRenderingContext) 097 */ 098 public void renderElement(PageContext pageContext, Tag parentTag, AccountingLineRenderingContext renderingContext) throws JspException { 099 OverrideFieldRenderer renderer = new OverrideFieldRenderer(); 100 renderer.setField(overrideField); 101 renderer.setArbitrarilyHighTabIndex(arbitrarilyHighIndex); 102 if (parent.isReadOnly() && definition.isAllowEditDespiteReadOnlyParentWhenAccoutingLineEditable() && renderingContext.isEditableLine()) { 103 renderer.setReadOnly(false); 104 } else { 105 renderer.setReadOnly(parent.isReadOnly()); 106 } 107 renderer.setOverrideNeededValue(getOverrideNeededValue(renderingContext.getAccountingLine())); 108 renderer.setAccountingLine(renderingContext.getAccountingLine()); 109 renderer.render(pageContext, parentTag); 110 renderer.clear(); 111 } 112 113 /** 114 * Retrieves the value of the override needed value associated with the override field 115 * @param accountingLine the accounting line to get the override needed value from 116 * @return a "Yes" if the override needed value is true, "No" if it is false 117 */ 118 protected String getOverrideNeededValue(AccountingLine accountingLine) { 119 String overrideNeededPropertyName = overrideField.getPropertyName()+"Needed"; 120 Boolean value = (Boolean)ObjectUtils.getPropertyValue(accountingLine, overrideNeededPropertyName); 121 return value != null && value.booleanValue() ? "Yes" : "No"; 122 } 123 124 /** 125 * Runs a field transformation against all the overrides encapsulated within this field 126 * @param fieldTransformation the field transformation which will utterly change our fields 127 * @param accountingLine the accounting line being rendered 128 * @param unconvertedValues a Map of unconvertedValues 129 */ 130 public void transformField(AccountingLineFieldRenderingTransformation fieldTransformation, AccountingLine accountingLine, Map unconvertedValues) { 131 fieldTransformation.transformField(accountingLine, overrideField, definition, unconvertedValues); 132 } 133 134 /** 135 * Sets the accounting Line Property 136 * @param propertyPrefix the accounting line property 137 */ 138 public void setAccountingLineProperty(String propertyPrefix) { 139 overrideField.setPropertyPrefix(propertyPrefix); 140 } 141 }