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.ArrayList; 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.datadictionary.AccountingLineViewHideShowLinesDefinition; 025 import org.kuali.kfs.sys.document.service.AccountingLineFieldRenderingTransformation; 026 027 /** 028 * The layout element for a hide/show wrapper of other elements 029 */ 030 public class HideShowLayoutElement implements AccountingLineViewLineFillingElement { 031 private List<AccountingLineViewLineFillingElement> lines; 032 private AccountingLineViewHideShowLinesDefinition definition; 033 034 /** 035 * Returns the name of the child element - if that gets removed, then we need to be removed as well 036 * @see org.kuali.kfs.sys.document.web.TableJoining#getName() 037 */ 038 public String getName() { 039 return definition.getName(); 040 } 041 042 /** 043 * All hide/show elements fit into one row 044 * @see org.kuali.kfs.sys.document.web.TableJoining#getRequestedRowCount() 045 */ 046 public int getRequestedRowCount() { 047 return 1; 048 } 049 050 /** 051 * Joins the header label row with a cell that colspans the width of the row and that spans 2 052 * @see org.kuali.kfs.sys.document.web.TableJoining#joinRow(org.kuali.kfs.sys.document.web.AccountingLineTableRow, org.kuali.kfs.sys.document.web.AccountingLineTableRow) 053 */ 054 public void joinRow(AccountingLineTableRow headerLabelRow, AccountingLineTableRow row) { 055 AccountingLineTableCell cell = new AccountingLineTableCell(); 056 if (row != null) { 057 cell.setRowSpan(2); 058 } 059 cell.setStyleClassOverride("total-line"); 060 cell.addRenderableElement(createHideShowBlock((row == null ? 1 : 2))); 061 headerLabelRow.addCell(cell); 062 } 063 064 /** 065 * This layout element should be stretched 066 * @see org.kuali.kfs.sys.document.web.AccountingLineViewLineFillingElement#stretchToFillLine() 067 */ 068 public boolean shouldStretchToFillLine() { 069 return true; 070 } 071 072 /** 073 * 074 * @see org.kuali.kfs.sys.document.web.TableJoining#joinTable(java.util.List) 075 */ 076 public void joinTable(List<AccountingLineTableRow> rows) { 077 throw new IllegalStateException("Line elements may not join a table directly; the specified rendering is incorrect"); 078 } 079 080 /** 081 * Creates the hide/show block 082 * @param headerRowCount the number of header rows 083 * @return the hide show block 084 */ 085 protected HideShowBlock createHideShowBlock(int headerRowCount) { 086 HideShowBlock block = new HideShowBlock(); 087 List<AccountingLineTableRow> rows = createBlankRows(getRowsRequested()); 088 089 haveLinesJoinRows(rows, headerRowCount); 090 091 block.setContentRows(rows); 092 block.setDefinition(definition); 093 return block; 094 } 095 096 /** 097 * Returns the total number of rows requested by each child line 098 * @return the total number of rows requested 099 */ 100 protected int getRowsRequested() { 101 int count = 0; 102 for (AccountingLineViewLineFillingElement line : lines) { 103 count += line.getRequestedRowCount(); 104 } 105 return count; 106 } 107 108 /** 109 * Creates empty rows to populate the content of the hide/show block 110 * @param cellCount the number of rows which will be returned 111 * @return a List of empty rows 112 */ 113 protected List<AccountingLineTableRow> createBlankRows(int cellCount) { 114 List<AccountingLineTableRow> rows = new ArrayList<AccountingLineTableRow>(); 115 int count = 0; 116 while (count < cellCount) { 117 rows.add(new AccountingLineTableRow()); 118 count += 1; 119 } 120 return rows; 121 } 122 123 /** 124 * Causes child lines to join the given set of rows 125 * @param rows the List of rows which child lines can join 126 * @param headerRowCount the number of header rows 127 */ 128 protected void haveLinesJoinRows(List<AccountingLineTableRow> rows, int headerRowCount) { 129 int count = 0; 130 for (AccountingLineViewLineFillingElement line : lines) { 131 132 if (line.getRequestedRowCount() > 1) { 133 line.joinRow(rows.get(count), rows.get(count+1)); 134 count += 2; 135 } else { 136 line.joinRow(rows.get(count), null); 137 count += 1; 138 } 139 } 140 } 141 142 /** 143 * Has the inner content perform any field transformations 144 * @see org.kuali.kfs.sys.document.web.TableJoining#performFieldTransformations(java.util.List, org.kuali.kfs.sys.businessobject.AccountingLine, java.util.Map, java.util.Map) 145 */ 146 public void performFieldTransformations(List<AccountingLineFieldRenderingTransformation> fieldTransformations, AccountingLine accountingLine, Map unconvertedValues) { 147 for (AccountingLineViewLineFillingElement line : lines) { 148 line.performFieldTransformations(fieldTransformations, accountingLine, unconvertedValues); 149 } 150 } 151 152 /** 153 * Has the inner content read onlyize any blocks it needs to 154 * @see org.kuali.kfs.sys.document.web.TableJoining#readOnlyizeReadOnlyBlocks(java.util.Set) 155 */ 156 public void readOnlyizeReadOnlyBlocks(Set<String> readOnlyBlocks) { 157 for (AccountingLineViewLineFillingElement line : lines) { 158 line.readOnlyizeReadOnlyBlocks(readOnlyBlocks); 159 } 160 } 161 162 /** 163 * Shuffles the responsibility off to the inner content 164 * @see org.kuali.kfs.sys.document.web.TableJoining#removeAllActionBlocks() 165 */ 166 public void removeAllActionBlocks() { 167 for (AccountingLineViewLineFillingElement line : lines) { 168 line.removeAllActionBlocks(); 169 } 170 } 171 172 /** 173 * Passes the unviewable blocks off the inner content 174 * @see org.kuali.kfs.sys.document.web.TableJoining#removeUnviewableBlocks(java.util.Set) 175 */ 176 public void removeUnviewableBlocks(Set<String> unviewableBlocks) { 177 List<AccountingLineViewLineFillingElement> unviewableLines = new ArrayList<AccountingLineViewLineFillingElement>(); 178 for (AccountingLineViewLineFillingElement line : lines) { 179 if (unviewableBlocks.contains(line.getName())) { 180 unviewableLines.add(line); 181 } else { 182 line.removeUnviewableBlocks(unviewableBlocks); 183 } 184 } 185 lines.removeAll(unviewableLines); 186 } 187 188 /** 189 * Gets the lines attribute. 190 * @return Returns the lines. 191 */ 192 public List<AccountingLineViewLineFillingElement> getLines() { 193 return lines; 194 } 195 196 /** 197 * Sets the lines attribute value. 198 * @param lines The lines to set. 199 */ 200 public void setLines(List<AccountingLineViewLineFillingElement> lines) { 201 this.lines = lines; 202 } 203 204 /** 205 * Adds a single line to this element's list of lines 206 * @param line the line to add 207 */ 208 public void addLine(AccountingLineViewLineFillingElement line) { 209 if (lines == null) { 210 lines = new ArrayList<AccountingLineViewLineFillingElement>(); 211 } 212 lines.add(line); 213 } 214 215 /** 216 * Gets the definition attribute. 217 * @return Returns the definition. 218 */ 219 public AccountingLineViewHideShowLinesDefinition getDefinition() { 220 return definition; 221 } 222 223 /** 224 * Sets the definition attribute value. 225 * @param definition The definition to set. 226 */ 227 public void setDefinition(AccountingLineViewHideShowLinesDefinition definition) { 228 this.definition = definition; 229 } 230 231 /** 232 * Checks that all child lines are read only; if none are, then this must be read only too 233 * @see org.kuali.kfs.sys.document.web.ReadOnlyable#isReadOnly() 234 */ 235 public boolean isReadOnly() { 236 for (AccountingLineViewLineFillingElement line : lines) { 237 if (!line.isReadOnly()) return false; 238 } 239 return true; 240 } 241 242 /** 243 * Read-onlyizes child lines 244 * @see org.kuali.kfs.sys.document.web.ReadOnlyable#readOnlyize() 245 */ 246 public void readOnlyize() { 247 for (AccountingLineViewLineFillingElement line : lines) { 248 line.readOnlyize(); 249 } 250 } 251 252 /** 253 * Always returns 1; this will appear in one table cell 254 * @see org.kuali.kfs.sys.document.web.AccountingLineViewLineFillingElement#getDisplayingFieldWidth() 255 */ 256 public int getDisplayingFieldWidth() { 257 return 1; 258 } 259 260 /** 261 * @see org.kuali.kfs.sys.document.web.TableJoining#setEditableBlocks(java.util.Set) 262 */ 263 public void setEditableBlocks(Set<String> editableBlocks) { 264 for (AccountingLineViewLineFillingElement line : lines) { 265 line.setEditableBlocks(editableBlocks); 266 } 267 } 268 269 /** 270 * @see org.kuali.kfs.sys.document.web.ReadOnlyable#setEditable() 271 */ 272 public void setEditable() { 273 for (AccountingLineViewLineFillingElement line : lines) { 274 line.setEditable(); 275 } 276 } 277 278 }