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 org.kuali.kfs.sys.KFSPropertyConstants; 023 import org.kuali.kfs.sys.businessobject.AccountingLine; 024 import org.kuali.kfs.sys.context.SpringContext; 025 import org.kuali.kfs.sys.document.AccountingDocument; 026 import org.kuali.kfs.sys.document.datadictionary.AccountingLineViewDebitCreditAmountFieldDefinition; 027 import org.kuali.kfs.sys.document.datadictionary.AccountingLineViewFieldDefinition; 028 import org.kuali.kfs.sys.document.service.AccountingLineFieldRenderingTransformation; 029 import org.kuali.rice.kns.service.KualiConfigurationService; 030 import org.kuali.rice.kns.web.ui.Field; 031 032 /** 033 * A table joining element which adds two fields to an amount: debit amount and credit amount 034 */ 035 public class AccountingLineViewDebitCreditAmountLayoutElement implements TableJoiningWithHeader, ReadOnlyable { 036 private Field debitAmountField; 037 private Field creditAmountField; 038 private AccountingLineViewDebitCreditAmountFieldDefinition definition; 039 private AccountingLineViewFieldDefinition debitFieldDefinition; 040 private AccountingLineViewFieldDefinition creditFieldDefinition; 041 042 /** 043 * Returns whether the debit and the credit amount fields are both read only 044 * @see org.kuali.kfs.sys.document.web.ReadOnlyable#isReadOnly() 045 */ 046 public boolean isReadOnly() { 047 return (debitAmountField == null || debitAmountField.isReadOnly()) && (creditAmountField == null || creditAmountField.isReadOnly()); 048 } 049 050 /** 051 * Read onlyizes both the credit and the debit amount fields 052 * @see org.kuali.kfs.sys.document.web.ReadOnlyable#readOnlyize() 053 */ 054 public void readOnlyize() { 055 if (debitAmountField != null) { 056 debitAmountField.setReadOnly(true); 057 } 058 if (creditAmountField != null) { 059 creditAmountField.setReadOnly(true); 060 } 061 } 062 063 /** 064 * We don't generate headers 065 * @see org.kuali.kfs.sys.document.web.TableJoiningWithHeader#createHeaderLabel() 066 */ 067 public HeaderLabel createHeaderLabel() { 068 return null; 069 } 070 071 /** 072 * This isn't hidden 073 * @see org.kuali.kfs.sys.document.web.TableJoiningWithHeader#isHidden() 074 */ 075 public boolean isHidden() { 076 return false; 077 } 078 079 /** 080 * This renderable element...it ain't got no single name! 081 * @see org.kuali.kfs.sys.document.web.TableJoining#getName() 082 */ 083 public String getName() { 084 return null; 085 } 086 087 /** 088 * Request two rows - one for the header, one for the field 089 * @see org.kuali.kfs.sys.document.web.TableJoining#getRequestedRowCount() 090 */ 091 public int getRequestedRowCount() { 092 return 2; 093 } 094 095 /** 096 * @see org.kuali.kfs.sys.document.web.TableJoining#joinRow(org.kuali.kfs.sys.document.web.AccountingLineTableRow, org.kuali.kfs.sys.document.web.AccountingLineTableRow) 097 */ 098 public void joinRow(AccountingLineTableRow headerLabelRow, AccountingLineTableRow row) { 099 if (debitAmountField != null) { 100 headerLabelRow.addCell(createHeaderCellForField(true)); 101 row.addCell(createCellForField(debitAmountField, debitFieldDefinition, true)); 102 } 103 if (creditAmountField != null) { 104 headerLabelRow.addCell(createHeaderCellForField(false)); 105 row.addCell(createCellForField(creditAmountField, creditFieldDefinition, false)); 106 } 107 } 108 109 /** 110 * @see org.kuali.kfs.sys.document.web.TableJoining#joinTable(java.util.List) 111 */ 112 public void joinTable(List<AccountingLineTableRow> rows) { 113 final int remainingRowCount = rows.size() - 1; 114 115 if (debitAmountField != null) { 116 rows.get(0).addCell(createHeaderCellForField(true)); 117 118 AccountingLineTableCell currentCell = createCellForField(debitAmountField, debitFieldDefinition, true); 119 currentCell.setRowSpan(remainingRowCount); 120 rows.get(1).addCell(currentCell); 121 } 122 if (creditAmountField != null) { 123 rows.get(0).addCell(createHeaderCellForField(false)); 124 125 AccountingLineTableCell baseCell = createCellForField(creditAmountField, creditFieldDefinition, false); 126 baseCell.setRowSpan(remainingRowCount); 127 rows.get(1).addCell(baseCell); 128 } 129 } 130 131 /** 132 * Creates a table cell with a renderable field inside 133 * @param field the field to create a cell for 134 * @return a cell that wraps the given field 135 */ 136 protected AccountingLineTableCell createCellForField(Field field, AccountingLineViewFieldDefinition definition, boolean isDebit) { 137 AccountingLineTableCell cell = new AccountingLineTableCell(); 138 AccountingLineViewDebitCreditAmountField renderableField = new AccountingLineViewDebitCreditAmountField(field, definition, isDebit, (isDebit ? this.definition.getNewLineDebitAmountProperty() : this.definition.getNewLineCreditAmountProperty()), this.definition.getVoucherLineHelperProperty()); 139 cell.addRenderableElement(renderableField); 140 return cell; 141 } 142 143 /** 144 * Creates a header cell for the given field 145 * @param field the field to create a header cell for 146 * @return a header cell 147 */ 148 protected AccountingLineTableCell createHeaderCellForField(boolean isDebit) { 149 AccountingLineTableCell headerCell = new AccountingLineTableCell(); 150 headerCell.setRendersAsHeader(true); 151 final String propertyName = isDebit ? getDebitPropertyName() : getCreditPropertyName(); 152 final String label = SpringContext.getBean(KualiConfigurationService.class).getPropertyString(propertyName); 153 headerCell.addRenderableElement(new LiteralHeaderLabel(label)); 154 return headerCell; 155 } 156 157 /** 158 * @return the property name for debit labels 159 */ 160 protected String getDebitPropertyName() { 161 return "label.document.journalVoucher.accountingLine.debit"; 162 } 163 164 /** 165 * @return the property name for credit labels 166 */ 167 protected String getCreditPropertyName() { 168 return "label.document.journalVoucher.accountingLine.credit"; 169 } 170 171 /** 172 * @see org.kuali.kfs.sys.document.web.TableJoining#performFieldTransformations(java.util.List, org.kuali.kfs.sys.businessobject.AccountingLine, java.util.Map, java.util.Map) 173 */ 174 public void performFieldTransformations(List<AccountingLineFieldRenderingTransformation> fieldTransformations, AccountingLine accountingLine, Map unconvertedValues) { 175 for (AccountingLineFieldRenderingTransformation fieldTransformation : fieldTransformations) { 176 fieldTransformation.transformField(accountingLine, getDebitAmountField(), getDebitFieldDefinition(), unconvertedValues); 177 fieldTransformation.transformField(accountingLine, getCreditAmountField(), getCreditFieldDefinition(), unconvertedValues); 178 } 179 } 180 181 /** 182 * @see org.kuali.kfs.sys.document.web.TableJoining#readOnlyizeReadOnlyBlocks(java.util.Set) 183 */ 184 public void readOnlyizeReadOnlyBlocks(Set<String> readOnlyBlocks) { 185 if (readOnlyBlocks.contains(KFSPropertyConstants.AMOUNT)) { 186 if (debitAmountField != null) { 187 debitAmountField.setReadOnly(true); 188 } 189 if (creditAmountField != null) { 190 creditAmountField.setReadOnly(true); 191 } 192 } 193 } 194 195 /** 196 * Does nothing - we don't have action blocks, like, ever 197 * @see org.kuali.kfs.sys.document.web.TableJoining#removeAllActionBlocks() 198 */ 199 public void removeAllActionBlocks() {} 200 201 /** 202 * @see org.kuali.kfs.sys.document.web.TableJoining#removeUnviewableBlocks(java.util.Set) 203 */ 204 public void removeUnviewableBlocks(Set<String> unviewableBlocks) { 205 if (unviewableBlocks.contains(KFSPropertyConstants.AMOUNT)) { 206 if (debitAmountField != null) { 207 debitAmountField = null; 208 } 209 if (creditAmountField != null) { 210 creditAmountField = null; 211 } 212 } 213 } 214 215 /** 216 * Gets the creditAmountField attribute. 217 * @return Returns the creditAmountField. 218 */ 219 public Field getCreditAmountField() { 220 return creditAmountField; 221 } 222 /** 223 * Sets the creditAmountField attribute value. 224 * @param creditAmountField The creditAmountField to set. 225 */ 226 public void setCreditAmountField(Field creditAmountField) { 227 this.creditAmountField = creditAmountField; 228 } 229 /** 230 * Gets the creditFieldDefinition attribute. 231 * @return Returns the creditFieldDefinition. 232 */ 233 public AccountingLineViewFieldDefinition getCreditFieldDefinition() { 234 return creditFieldDefinition; 235 } 236 /** 237 * Sets the creditFieldDefinition attribute value. 238 * @param creditFieldDefinition The creditFieldDefinition to set. 239 */ 240 public void setCreditFieldDefinition(AccountingLineViewFieldDefinition creditFieldDefinition) { 241 this.creditFieldDefinition = creditFieldDefinition; 242 } 243 /** 244 * Gets the debitAmountField attribute. 245 * @return Returns the debitAmountField. 246 */ 247 public Field getDebitAmountField() { 248 return debitAmountField; 249 } 250 /** 251 * Sets the debitAmountField attribute value. 252 * @param debitAmountField The debitAmountField to set. 253 */ 254 public void setDebitAmountField(Field debitAmountField) { 255 this.debitAmountField = debitAmountField; 256 } 257 /** 258 * Gets the debitFieldDefinition attribute. 259 * @return Returns the debitFieldDefinition. 260 */ 261 public AccountingLineViewFieldDefinition getDebitFieldDefinition() { 262 return debitFieldDefinition; 263 } 264 /** 265 * Sets the debitFieldDefinition attribute value. 266 * @param debitFieldDefinition The debitFieldDefinition to set. 267 */ 268 public void setDebitFieldDefinition(AccountingLineViewFieldDefinition debitFieldDefinition) { 269 this.debitFieldDefinition = debitFieldDefinition; 270 } 271 /** 272 * Gets the definition attribute. 273 * @return Returns the definition. 274 */ 275 public AccountingLineViewDebitCreditAmountFieldDefinition getDefinition() { 276 return definition; 277 } 278 /** 279 * Sets the definition attribute value. 280 * @param definition The definition to set. 281 */ 282 public void setDefinition(AccountingLineViewDebitCreditAmountFieldDefinition definition) { 283 this.definition = definition; 284 } 285 286 /** 287 * @see org.kuali.kfs.sys.document.web.TableJoining#setEditableBlocks(java.util.Set) 288 */ 289 public void setEditableBlocks(Set<String> editableBlocks) { 290 if (editableBlocks.contains(KFSPropertyConstants.AMOUNT)) { 291 if (debitAmountField != null) { 292 debitAmountField.setReadOnly(false); 293 } 294 if (creditAmountField != null) { 295 creditAmountField.setReadOnly(false); 296 } 297 } 298 } 299 300 /** 301 * @see org.kuali.kfs.sys.document.web.ReadOnlyable#setEditable() 302 */ 303 public void setEditable() { 304 if (debitAmountField != null) { 305 debitAmountField.setReadOnly(false); 306 } 307 308 if (creditAmountField != null) { 309 creditAmountField.setReadOnly(false); 310 } 311 } 312 }