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.HashSet;
019 import java.util.List;
020 import java.util.Map;
021 import java.util.Set;
022
023 import org.kuali.kfs.sys.businessobject.AccountingLine;
024 import org.kuali.kfs.sys.document.AccountingDocument;
025 import org.kuali.kfs.sys.document.datadictionary.AccountingLineViewLineDefinition;
026 import org.kuali.kfs.sys.document.service.AccountingLineFieldRenderingTransformation;
027
028 /**
029 * Represents a single table row to be rendered as part of an accounting line view.
030 */
031 public class AccountingLineViewLine implements ReadOnlyable, AccountingLineViewLineFillingElement {
032 private List<RenderableElement> elements;
033 private AccountingLineViewLineDefinition definition;
034
035 /**
036 * Gets the definition attribute.
037 * @return Returns the definition.
038 */
039 public AccountingLineViewLineDefinition getDefinition() {
040 return definition;
041 }
042 /**
043 * Sets the definition attribute value.
044 * @param definition The definition to set.
045 */
046 public void setDefinition(AccountingLineViewLineDefinition definition) {
047 this.definition = definition;
048 }
049
050 /**
051 * @see org.kuali.kfs.sys.document.web.AccountingLineViewRenderableElementContainer#getName()
052 */
053 public String getName() {
054 return definition.getElementName();
055 }
056 /**
057 * Gets the elements attribute.
058 * @return Returns the elements.
059 */
060 public List<RenderableElement> getElements() {
061 return elements;
062 }
063 /**
064 * Sets the elements attribute value.
065 * @param elements The elements to set.
066 */
067 public void setElements(List<RenderableElement> fields) {
068 this.elements = fields;
069 }
070
071 /**
072 * Gets the number of actual rows requested (1)
073 * @see org.kuali.kfs.sys.document.web.AccountingLineViewRenderableElement#getRequestedRowCount()
074 */
075 public int getRequestedRowCount() {
076 return getMaxRequestedRowCount();
077 }
078
079 /**
080 * Determines the max requested row count in the line.
081 * @return the number of rows to create for this line
082 */
083 protected int getMaxRequestedRowCount() {
084 for (RenderableElement element : elements) {
085 if (element instanceof TableJoiningWithHeader && !element.isHidden()) {
086 return 2;
087 }
088 }
089 return 1;
090 }
091
092 /**
093 * @see org.kuali.kfs.sys.document.web.TableJoining#joinRow(org.kuali.kfs.sys.document.web.AccountingLineTableRow)
094 */
095 public void joinRow(AccountingLineTableRow headerRow, AccountingLineTableRow row) {
096 for (RenderableElement element : elements) {
097 if (element instanceof TableJoining) {
098 ((TableJoining)element).joinRow(headerRow, row);
099 } else {
100 headerRow.addCell(createTableCellForNonTableJoining(element));
101 }
102 }
103 }
104
105 /**
106 * Creates a table cell to wrap the given rendering element
107 * @param element the element to wrap
108 * @return a table cell wrapping that element
109 */
110 protected AccountingLineTableCell createTableCellForNonTableJoining(RenderableElement element) {
111 AccountingLineTableCell cell = new AccountingLineTableCell();
112 cell.addRenderableElement(element);
113 cell.setRowSpan(getRequestedRowCount());
114 return cell;
115 }
116
117 /**
118 * Always throws an exception - a line may only join a table through a parent lines element
119 * @see org.kuali.kfs.sys.document.web.TableJoining#joinTable(java.util.List)
120 */
121 public void joinTable(List<AccountingLineTableRow> rows) {
122 throw new IllegalStateException("Line elements may not join a table directly; the specified rendering is incorrect");
123 }
124
125 /**
126 * This element should be padded out
127 * @see org.kuali.kfs.sys.document.web.AccountingLineViewLineFillingElement#stretchToFillLine()
128 */
129 public boolean shouldStretchToFillLine() {
130 return false;
131 }
132
133 /**
134 * @see org.kuali.kfs.sys.document.web.TableJoining#readOnlyize()
135 */
136 public void readOnlyize() {
137 for (RenderableElement element : elements) {
138 if (element instanceof ReadOnlyable) {
139 ((ReadOnlyable)element).readOnlyize();
140 }
141 }
142 }
143
144 /**
145 * @see org.kuali.kfs.sys.document.web.ReadOnlyable#isReadOnly()
146 */
147 public boolean isReadOnly() {
148 for (RenderableElement element : elements) {
149 if (element instanceof ReadOnlyable && !((ReadOnlyable)element).isReadOnly()) {
150 return false;
151 }
152 }
153 return true;
154 }
155
156 /**
157 * @see org.kuali.kfs.sys.document.web.TableJoining#removeAllActionBlocks()
158 */
159 public void removeAllActionBlocks() {
160 Set<RenderableElement> actionBlocksToRemove = new HashSet<RenderableElement>();
161 for (RenderableElement element : elements) {
162 if (element.isActionBlock()) {
163 actionBlocksToRemove.add(element);
164 }
165 }
166 elements.removeAll(actionBlocksToRemove);
167 }
168
169 /**
170 * @see org.kuali.kfs.sys.document.web.TableJoining#removeUnviewableBlocks()
171 */
172 public void removeUnviewableBlocks(Set<String> unviewableBlocks) {
173 Set<RenderableElement> elementsToRemove = new HashSet<RenderableElement>();
174 for (RenderableElement element : elements) {
175 if (element instanceof TableJoining) {
176 if (unviewableBlocks.contains(((TableJoining)element).getName())) {
177 elementsToRemove.add(element);
178 } else {
179 ((TableJoining)element).removeUnviewableBlocks(unviewableBlocks);
180 }
181 }
182 }
183 elements.removeAll(elementsToRemove);
184 }
185
186 /**
187 * Shuffles responsibility on to any TableJoining children
188 * @see org.kuali.kfs.sys.document.web.TableJoining#readOnlyizeReadOnlyBlocks(java.util.Set)
189 */
190 public void readOnlyizeReadOnlyBlocks(Set<String> readOnlyBlocks) {
191 for (RenderableElement element : elements) {
192 if (element instanceof TableJoining) {
193 ((TableJoining)element).readOnlyizeReadOnlyBlocks(readOnlyBlocks);
194 }
195 }
196 }
197
198 /**
199 * @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)
200 */
201 public void performFieldTransformations(List<AccountingLineFieldRenderingTransformation> fieldTransformations, AccountingLine accountingLine, Map unconvertedValues) {
202 for (RenderableElement element : elements) {
203 if (element instanceof TableJoining) {
204 ((TableJoining)element).performFieldTransformations(fieldTransformations, accountingLine, unconvertedValues);
205 }
206 }
207 }
208
209 /**
210 * Finds the number of table cells this line expects to take up
211 * @return the number of displayed table cells this line expects to render as
212 */
213 public int getDisplayingFieldWidth() {
214 int count = 0;
215 for (RenderableElement element : elements) {
216 if (!element.isHidden()) {
217 if (element instanceof AccountingLineViewField && ((AccountingLineViewField)element).getColSpanOverride() > 1) {
218 count += ((AccountingLineViewField)element).getColSpanOverride();
219 } else {
220 count += 1;
221 }
222 }
223 }
224 return count;
225 }
226
227 /**
228 * @see org.kuali.kfs.sys.document.web.ReadOnlyable#setEditable()
229 */
230 public void setEditable() {
231 for (RenderableElement element : elements) {
232 if (element instanceof ReadOnlyable) {
233 ((ReadOnlyable)element).setEditable();
234 }
235 }
236 }
237
238 /**
239 * @see org.kuali.kfs.sys.document.web.TableJoining#setEditableBlocks(java.util.Set)
240 */
241 public void setEditableBlocks(Set<String> editableBlocks) {
242 for (RenderableElement element : elements) {
243 if (element instanceof TableJoining) {
244 ((TableJoining)element).setEditableBlocks(editableBlocks);
245 }
246 }
247 }
248 }