/* * 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; import java.util.List; import java.util.Map; import java.util.Set; import org.kuali.kfs.sys.businessobject.AccountingLine; import org.kuali.kfs.sys.document.datadictionary.AccountingLineViewCurrentBaseAmountFieldDefinition; import org.kuali.kfs.sys.document.datadictionary.AccountingLineViewFieldDefinition; import org.kuali.kfs.sys.document.service.AccountingLineFieldRenderingTransformation; import org.kuali.rice.kns.web.ui.Field; /** * Represents a current/base amount for an accounting line */ public class AccountingLineViewCurrentBaseAmount implements TableJoiningWithHeader, ReadOnlyable { private Field currentAmountField; private Field baseAmountField; private AccountingLineViewCurrentBaseAmountFieldDefinition definition; private AccountingLineViewFieldDefinition currentAmountFieldDefinition; private AccountingLineViewFieldDefinition baseAmountFieldDefinition; /** * Returns null; we don't want to participate in normal naming schemes * @see org.kuali.kfs.sys.document.web.TableJoining#getName() */ public String getName() { return null; } /** * Checks if either the current amount field or base amount field need to be set to read only * @see org.kuali.kfs.sys.document.web.FieldTableJoining#readOnlyizeReadOnlyBlocks(java.util.Set) */ public void readOnlyizeReadOnlyBlocks(Set<String> readOnlyBlocks) { if (currentAmountField != null) { readOnlyizeField(currentAmountField, readOnlyBlocks); } if (baseAmountField != null) { readOnlyizeField(baseAmountField, readOnlyBlocks); } if (baseAmountField != null && currentAmountField != null) { if (baseAmountField.isReadOnly() && !currentAmountField.isReadOnly()) { currentAmountField.setFieldRequired(true); } else if (currentAmountField.isReadOnly() && !baseAmountField.isReadOnly()) { baseAmountField.setFieldRequired(true); } } } /** * @see org.kuali.kfs.sys.document.web.ReadOnlyable#isReadOnly() */ public boolean isReadOnly() { boolean readOnly = true; if (currentAmountField != null) { readOnly &= currentAmountField.isReadOnly(); } if (baseAmountField != null) { readOnly &= baseAmountField.isReadOnly(); } return readOnly; } /** * @see org.kuali.kfs.sys.document.web.ReadOnlyable#readOnlyize() */ public void readOnlyize() { if (currentAmountField != null) { currentAmountField.setReadOnly(true); } if (baseAmountField != null) { baseAmountField.setReadOnly(true); } } /** * Checks if the given field is named as a readOnlyBlock; if so, makes it read only * @param field the field to check * @param readOnlyBlocks the names of all read only blocks * * KRAD Conversion: Customization of the fields by setting them to read only - No use of data dictionary */ protected void readOnlyizeField(Field field, Set<String> readOnlyBlocks) { if (field != null && readOnlyBlocks.contains(field.getPropertyName())) { field.setReadOnly(true); } } /** * Always returns 2 - one line for the header, one line for the fields * @see org.kuali.kfs.sys.document.web.TableJoining#getRequestedRowCount() */ public int getRequestedRowCount() { return 2; } /** * Adds the header cell to the first row, and the regular cell to the second row * @see org.kuali.kfs.sys.document.web.TableJoining#joinRow(org.kuali.kfs.sys.document.web.AccountingLineTableRow, org.kuali.kfs.sys.document.web.AccountingLineTableRow) */ public void joinRow(AccountingLineTableRow headerLabelRow, AccountingLineTableRow row) { if (currentAmountField != null) { headerLabelRow.addCell(createHeaderCellForField(currentAmountField)); row.addCell(createCellForField(currentAmountField, currentAmountFieldDefinition)); } if (baseAmountField != null) { headerLabelRow.addCell(createHeaderCellForField(baseAmountField)); row.addCell(createCellForField(baseAmountField, baseAmountFieldDefinition)); } } /** * Adds the header cell to the first row and adds to the second row a cell that spans all remaining rows * @see org.kuali.kfs.sys.document.web.TableJoining#joinTable(java.util.List) */ public void joinTable(List<AccountingLineTableRow> rows) { final int remainingRowCount = rows.size() - 1; if (currentAmountField != null) { rows.get(0).addCell(createHeaderCellForField(currentAmountField)); AccountingLineTableCell currentCell = createCellForField(currentAmountField, currentAmountFieldDefinition); currentCell.setRowSpan(remainingRowCount); rows.get(1).addCell(currentCell); } if (baseAmountField != null) { rows.get(0).addCell(createHeaderCellForField(baseAmountField)); AccountingLineTableCell baseCell = createCellForField(baseAmountField, baseAmountFieldDefinition); baseCell.setRowSpan(remainingRowCount); rows.get(1).addCell(baseCell); } } /** * Does nothing - we don't have action blocks, like, ever * @see org.kuali.kfs.sys.document.web.TableJoining#removeAllActionBlocks() */ public void removeAllActionBlocks() {} /** * Checks to see if either the current amount or the base amount are unviewable; if so, sets them to null * @see org.kuali.kfs.sys.document.web.FieldTableJoining#removeUnviewableBlocks(java.util.Set) */ public void removeUnviewableBlocks(Set<String> unviewableBlocks) { if (isFieldUnviewable(currentAmountField, unviewableBlocks)) { currentAmountField = null; } if (isFieldUnviewable(baseAmountField, unviewableBlocks)) { baseAmountField = null; } } /** * Determines if the given field is among the blocks which should not be viewable * @param field the field to check for unviewability * @param unviewableBlocks the names of all unviewable blocks * @return true if the field should not be viewable, false if we can see it */ protected boolean isFieldUnviewable(Field field, Set<String> unviewableBlocks) { return field != null && unviewableBlocks.contains(field.getPropertyName()); } /** * Creates a table cell with a renderable field inside * @param field the field to create a cell for * @return a cell that wraps the given field * * KRAD Conversion: Performs setting up the field for the cell */ protected AccountingLineTableCell createCellForField(Field field, AccountingLineViewFieldDefinition definition) { AccountingLineTableCell cell = new AccountingLineTableCell(); AccountingLineViewField renderableField = new AccountingLineViewField(); renderableField.setField(field); renderableField.setDefinition(definition); cell.addRenderableElement(renderableField); return cell; } /** * Creates a header cell for the given field * @param field the field to create a header cell for * @return a header cell * * KRAD Conversion: Customization of the header cell with label from fields - No use of data dictionary * */ protected AccountingLineTableCell createHeaderCellForField(Field field) { AccountingLineTableCell headerCell = new AccountingLineTableCell(); headerCell.setRendersAsHeader(true); headerCell.addRenderableElement(new LiteralHeaderLabel(field.getFieldLabel())); return headerCell; } /** * @see org.kuali.kfs.sys.document.web.FieldTableJoining#performFieldTransformations(java.util.List, org.kuali.kfs.sys.businessobject.AccountingLine, java.util.Map, java.util.Map) */ public void performFieldTransformations(List<AccountingLineFieldRenderingTransformation> fieldTransformations, AccountingLine accountingLine, Map unconvertedValues) { for (AccountingLineFieldRenderingTransformation fieldTransformation : fieldTransformations) { fieldTransformation.transformField(accountingLine, getCurrentAmountField(), getCurrentAmountFieldDefinition(), unconvertedValues); fieldTransformation.transformField(accountingLine, getBaseAmountField(), getBaseAmountFieldDefinition(), unconvertedValues); } } /** * Not used; returns null. * @see org.kuali.kfs.sys.document.web.TableJoiningWithHeader#createHeaderLabel() */ public HeaderLabel createHeaderLabel() { return null; } /** * This field is never hidden * @see org.kuali.kfs.sys.document.web.TableJoiningWithHeader#isHidden() */ public boolean isHidden() { return false; } /** * Gets the baseAmountField attribute. * @return Returns the baseAmountField. * * KRAD Conversion: Retrieving the field */ public Field getBaseAmountField() { return baseAmountField; } /** * Sets the baseAmountField attribute value. * @param baseAmountField The baseAmountField to set. * * KRAD Conversion: Setting up field's amount */ public void setBaseAmountField(Field baseAmountField) { this.baseAmountField = baseAmountField; } /** * Gets the currentAmountField attribute. * @return Returns the currentAmountField. */ public Field getCurrentAmountField() { return currentAmountField; } /** * Sets the currentAmountField attribute value. * @param currentAmountField The currentAmountField to set. */ public void setCurrentAmountField(Field currentAmountField) { this.currentAmountField = currentAmountField; } /** * Gets the definition attribute. * @return Returns the definition. */ public AccountingLineViewCurrentBaseAmountFieldDefinition getDefinition() { return definition; } /** * Sets the definition attribute value. * @param definition The definition to set. */ public void setDefinition(AccountingLineViewCurrentBaseAmountFieldDefinition definition) { this.definition = definition; } /** * Gets the baseAmountFieldDefinition attribute. * @return Returns the baseAmountFieldDefinition. */ public AccountingLineViewFieldDefinition getBaseAmountFieldDefinition() { return baseAmountFieldDefinition; } /** * Sets the baseAmountFieldDefinition attribute value. * @param baseAmountFieldDefinition The baseAmountFieldDefinition to set. */ public void setBaseAmountFieldDefinition(AccountingLineViewFieldDefinition baseAmountFieldDefinition) { this.baseAmountFieldDefinition = baseAmountFieldDefinition; } /** * Gets the currentAmountFieldDefinition attribute. * @return Returns the currentAmountFieldDefinition. */ public AccountingLineViewFieldDefinition getCurrentAmountFieldDefinition() { return currentAmountFieldDefinition; } /** * Sets the currentAmountFieldDefinition attribute value. * @param currentAmountFieldDefinition The currentAmountFieldDefinition to set. */ public void setCurrentAmountFieldDefinition(AccountingLineViewFieldDefinition currentAmountFieldDefinition) { this.currentAmountFieldDefinition = currentAmountFieldDefinition; } /** * @see org.kuali.kfs.sys.document.web.TableJoining#setEditableBlocks(java.util.Set) */ public void setEditableBlocks(Set<String> editableBlocks) { if (currentAmountField != null) { setEditableField(currentAmountField, editableBlocks); } if (baseAmountField != null) { setEditableField(baseAmountField, editableBlocks); } if (baseAmountField != null && currentAmountField != null) { if (baseAmountField.isReadOnly() && !currentAmountField.isReadOnly()) { currentAmountField.setReadOnly(false); } else if (currentAmountField.isReadOnly() && !baseAmountField.isReadOnly()) { baseAmountField.setReadOnly(false); } } } /** * @see org.kuali.kfs.sys.document.web.ReadOnlyable#setEditable() */ public void setEditable() { if (currentAmountField != null) { currentAmountField.setReadOnly(false); } if (baseAmountField != null) { baseAmountField.setReadOnly(false); } } /** * Checks if the given field is named as an editableBlocks; if so, makes it editable * @param field the field to check * @param editableBlocks the names of all editable blocks * * KRAD Conversion: Customization of the fields - No use of data dictionary */ protected void setEditableField(Field field, Set<String> editableBlocks) { if (field != null && editableBlocks.contains(field.getPropertyName())) { field.setReadOnly(false); } } }