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    
020    import javax.servlet.jsp.JspException;
021    import javax.servlet.jsp.PageContext;
022    import javax.servlet.jsp.tagext.Tag;
023    
024    import org.kuali.kfs.fp.document.web.struts.VoucherForm;
025    import org.kuali.kfs.sys.context.SpringContext;
026    import org.kuali.kfs.sys.document.datadictionary.AccountingLineViewFieldDefinition;
027    import org.kuali.kfs.sys.document.service.AccountingLineRenderingService;
028    import org.kuali.kfs.sys.document.web.renderers.FieldRenderer;
029    import org.kuali.rice.kns.util.ObjectUtils;
030    import org.kuali.rice.kns.web.ui.Field;
031    
032    /**
033     * 
034     * This class...
035     */
036    public class AccountingLineViewDebitCreditAmountField implements RenderableElement, ElementNamable {
037        private Field debitOrCreditField;
038        private AccountingLineViewFieldDefinition definition;
039        private boolean isDebit;
040        private String newLineProperty;
041        private String collectionProperty;
042        private int arbitrarilyHighIndex;
043        
044        /**
045         * Constructs a AccountingLineViewDebitOrCreditAmountField
046         * @param debitOrCreditField
047         * @param definition
048         * @param isDebit
049         * @param newLineProperty
050         * @param collectionProperty
051         */
052        public AccountingLineViewDebitCreditAmountField(Field debitOrCreditField, AccountingLineViewFieldDefinition definition, boolean isDebit, String newLineProperty, String collectionProperty) {
053            this.debitOrCreditField = debitOrCreditField;
054            this.definition = definition;
055            this.isDebit = isDebit;
056            this.newLineProperty = newLineProperty;
057            this.collectionProperty = collectionProperty;
058        }
059    
060        /**
061         * @see org.kuali.kfs.sys.document.web.RenderableElement#appendFields(java.util.List)
062         */
063        public void appendFields(List<Field> fields) {
064            fields.add(debitOrCreditField);
065        }
066    
067        /**
068         * This is not an action block
069         * @see org.kuali.kfs.sys.document.web.RenderableElement#isActionBlock()
070         */
071        public boolean isActionBlock() {
072            return false;
073        }
074    
075        /**
076         * This isn't empty
077         * @see org.kuali.kfs.sys.document.web.RenderableElement#isEmpty()
078         */
079        public boolean isEmpty() {
080            return false;
081        }
082    
083        /**
084         * This is not hidden
085         * @see org.kuali.kfs.sys.document.web.RenderableElement#isHidden()
086         */
087        public boolean isHidden() {
088            return false;
089        }
090    
091        /**
092         * @see org.kuali.kfs.sys.document.web.RenderableElement#populateWithTabIndexIfRequested(int)
093         */
094        public void populateWithTabIndexIfRequested(int reallyHighIndex) {
095            this.arbitrarilyHighIndex = reallyHighIndex;
096        }
097    
098        /**
099         * @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)
100         */
101        public void renderElement(PageContext pageContext, Tag parentTag, AccountingLineRenderingContext renderingContext) throws JspException {
102            if (!renderingContext.isFieldModifyable(debitOrCreditField.getPropertyName())) {
103                debitOrCreditField.setReadOnly(true);
104            }
105            FieldRenderer renderer = SpringContext.getBean(AccountingLineRenderingService.class).getFieldRendererForField(getDebitOrCreditField(), renderingContext.getAccountingLine());
106            if (renderer != null) {
107                prepareFieldForRendering(getDebitOrCreditField(), (VoucherForm)renderingContext.getForm(), renderingContext.getCurrentLineCount());
108                renderer.setField(getDebitOrCreditField());
109                renderer.render(pageContext, parentTag);
110                renderer.clear();
111            }
112        }
113        
114        /**
115         * Sets up the field for rendering by setting the right property name and zeroing out amounts which aren't needed
116         * @param field the field to prepare
117         * @param accountingLine the accounting line being rendered
118         * @param count the count of the current line in the source lines, or null if it's a new line
119         */
120        protected void prepareFieldForRendering(Field field, VoucherForm form, Integer count) {
121            getDebitOrCreditField().setPropertyPrefix(null);
122            
123            // set the right property name
124            if (count == null) {
125                field.setPropertyName(getNewLineProperty());
126            } else {
127                final String subPropertyName = isDebit ? "debit" : "credit";
128                field.setPropertyName(getCollectionProperty()+"["+count.toString()+"]."+subPropertyName);
129            }
130            
131            // get the value from the form
132            field.setPropertyValue(ObjectUtils.getPropertyValue(form, field.getPropertyName()));
133        }
134    
135        /**
136         * Gets the arbitrarilyHighIndex attribute. 
137         * @return Returns the arbitrarilyHighIndex.
138         */
139        public int getArbitrarilyHighIndex() {
140            return arbitrarilyHighIndex;
141        }
142    
143        /**
144         * Gets the collectionProperty attribute. 
145         * @return Returns the collectionProperty.
146         */
147        public String getCollectionProperty() {
148            return collectionProperty;
149        }
150    
151        /**
152         * Gets the debitOrCreditField attribute. 
153         * @return Returns the debitOrCreditField.
154         */
155        public Field getDebitOrCreditField() {
156            return debitOrCreditField;
157        }
158    
159        /**
160         * Gets the definition attribute. 
161         * @return Returns the definition.
162         */
163        public AccountingLineViewFieldDefinition getDefinition() {
164            return definition;
165        }
166    
167        /**
168         * Gets the isDebit attribute. 
169         * @return Returns the isDebit.
170         */
171        public boolean isDebit() {
172            return isDebit;
173        }
174    
175        /**
176         * Gets the newLineProperty attribute. 
177         * @return Returns the newLineProperty.
178         */
179        public String getNewLineProperty() {
180            return newLineProperty;
181        }
182    
183        /**
184         * @see org.kuali.kfs.sys.document.web.ElementNamable#getName()
185         */
186        public String getName() {
187            return this.getDebitOrCreditField().getPropertyName();
188        }
189    
190    }