/*
* 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.HashSet;
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.AccountingLineViewLineDefinition;
import org.kuali.kfs.sys.document.service.AccountingLineFieldRenderingTransformation;
/**
* Represents a single table row to be rendered as part of an accounting line view.
*/
public class AccountingLineViewLine implements ReadOnlyable, AccountingLineViewLineFillingElement {
private List<RenderableElement> elements;
private AccountingLineViewLineDefinition definition;
/**
* Gets the definition attribute.
* @return Returns the definition.
*/
public AccountingLineViewLineDefinition getDefinition() {
return definition;
}
/**
* Sets the definition attribute value.
* @param definition The definition to set.
*/
public void setDefinition(AccountingLineViewLineDefinition definition) {
this.definition = definition;
}
/**
* @see org.kuali.kfs.sys.document.web.AccountingLineViewRenderableElementContainer#getName()
*/
public String getName() {
return definition.getElementName();
}
/**
* Gets the elements attribute.
* @return Returns the elements.
*/
public List<RenderableElement> getElements() {
return elements;
}
/**
* Sets the elements attribute value.
* @param elements The elements to set.
*/
public void setElements(List<RenderableElement> fields) {
this.elements = fields;
}
/**
* Gets the number of actual rows requested (1)
* @see org.kuali.kfs.sys.document.web.AccountingLineViewRenderableElement#getRequestedRowCount()
*/
public int getRequestedRowCount() {
return getMaxRequestedRowCount();
}
/**
* Determines the max requested row count in the line.
* @return the number of rows to create for this line
*/
protected int getMaxRequestedRowCount() {
for (RenderableElement element : elements) {
if (element instanceof TableJoiningWithHeader && !element.isHidden()) {
return 2;
}
}
return 1;
}
/**
* @see org.kuali.kfs.sys.document.web.TableJoining#joinRow(org.kuali.kfs.sys.document.web.AccountingLineTableRow)
*/
public void joinRow(AccountingLineTableRow headerRow, AccountingLineTableRow row) {
for (RenderableElement element : elements) {
if (element instanceof TableJoining) {
((TableJoining)element).joinRow(headerRow, row);
} else {
headerRow.addCell(createTableCellForNonTableJoining(element));
}
}
}
/**
* Creates a table cell to wrap the given rendering element
* @param element the element to wrap
* @return a table cell wrapping that element
*/
protected AccountingLineTableCell createTableCellForNonTableJoining(RenderableElement element) {
AccountingLineTableCell cell = new AccountingLineTableCell();
cell.addRenderableElement(element);
cell.setRowSpan(getRequestedRowCount());
return cell;
}
/**
* Always throws an exception - a line may only join a table through a parent lines element
* @see org.kuali.kfs.sys.document.web.TableJoining#joinTable(java.util.List)
*/
public void joinTable(List<AccountingLineTableRow> rows) {
throw new IllegalStateException("Line elements may not join a table directly; the specified rendering is incorrect");
}
/**
* This element should be padded out
* @see org.kuali.kfs.sys.document.web.AccountingLineViewLineFillingElement#stretchToFillLine()
*/
public boolean shouldStretchToFillLine() {
return false;
}
/**
* @see org.kuali.kfs.sys.document.web.TableJoining#readOnlyize()
*/
public void readOnlyize() {
for (RenderableElement element : elements) {
if (element instanceof ReadOnlyable) {
((ReadOnlyable)element).readOnlyize();
}
}
}
/**
* @see org.kuali.kfs.sys.document.web.ReadOnlyable#isReadOnly()
*/
public boolean isReadOnly() {
for (RenderableElement element : elements) {
if (element instanceof ReadOnlyable && !((ReadOnlyable)element).isReadOnly()) {
return false;
}
}
return true;
}
/**
* @see org.kuali.kfs.sys.document.web.TableJoining#removeAllActionBlocks()
*/
public void removeAllActionBlocks() {
Set<RenderableElement> actionBlocksToRemove = new HashSet<RenderableElement>();
for (RenderableElement element : elements) {
if (element.isActionBlock()) {
actionBlocksToRemove.add(element);
}
}
elements.removeAll(actionBlocksToRemove);
}
/**
* @see org.kuali.kfs.sys.document.web.TableJoining#removeUnviewableBlocks()
*/
public void removeUnviewableBlocks(Set<String> unviewableBlocks) {
Set<RenderableElement> elementsToRemove = new HashSet<RenderableElement>();
for (RenderableElement element : elements) {
if (element instanceof TableJoining) {
if (unviewableBlocks.contains(((TableJoining)element).getName())) {
elementsToRemove.add(element);
} else {
((TableJoining)element).removeUnviewableBlocks(unviewableBlocks);
}
}
}
elements.removeAll(elementsToRemove);
}
/**
* Shuffles responsibility on to any TableJoining children
* @see org.kuali.kfs.sys.document.web.TableJoining#readOnlyizeReadOnlyBlocks(java.util.Set)
*/
public void readOnlyizeReadOnlyBlocks(Set<String> readOnlyBlocks) {
for (RenderableElement element : elements) {
if (element instanceof TableJoining) {
((TableJoining)element).readOnlyizeReadOnlyBlocks(readOnlyBlocks);
}
}
}
/**
* @see org.kuali.kfs.sys.document.web.TableJoining#performFieldTransformation(org.kuali.kfs.sys.document.service.AccountingLineFieldRenderingTransformation, org.kuali.kfs.sys.businessobject.AccountingLine, java.util.Map, java.util.Map)
*/
public void performFieldTransformations(List<AccountingLineFieldRenderingTransformation> fieldTransformations, AccountingLine accountingLine, Map unconvertedValues) {
for (RenderableElement element : elements) {
if (element instanceof TableJoining) {
((TableJoining)element).performFieldTransformations(fieldTransformations, accountingLine, unconvertedValues);
}
}
}
/**
* Finds the number of table cells this line expects to take up
* @return the number of displayed table cells this line expects to render as
*/
public int getDisplayingFieldWidth() {
int count = 0;
for (RenderableElement element : elements) {
if (!element.isHidden()) {
if (element instanceof AccountingLineViewField && ((AccountingLineViewField)element).getColSpanOverride() > 1) {
count += ((AccountingLineViewField)element).getColSpanOverride();
} else {
count += 1;
}
}
}
return count;
}
/**
* @see org.kuali.kfs.sys.document.web.ReadOnlyable#setEditable()
*/
public void setEditable() {
for (RenderableElement element : elements) {
if (element instanceof ReadOnlyable) {
((ReadOnlyable)element).setEditable();
}
}
}
/**
* @see org.kuali.kfs.sys.document.web.TableJoining#setEditableBlocks(java.util.Set)
*/
public void setEditableBlocks(Set<String> editableBlocks) {
for (RenderableElement element : elements) {
if (element instanceof TableJoining) {
((TableJoining)element).setEditableBlocks(editableBlocks);
}
}
}
}