/* * Copyright 2004 original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.extremecomponents.table.handler; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.commons.lang.StringUtils; import org.apache.xpath.operations.And; import org.extremecomponents.table.bean.Column; import org.extremecomponents.table.calc.CalcResult; import org.extremecomponents.table.calc.CalcUtils; import org.extremecomponents.table.cell.Cell; import org.extremecomponents.table.core.PreferencesConstants; import org.extremecomponents.table.core.TableCache; import org.extremecomponents.table.core.TableConstants; import org.extremecomponents.table.core.TableModel; import org.extremecomponents.table.core.TableModelUtils; import org.extremecomponents.util.CollectionUtils; /** * The first pass over the table just loads up the column properties. The * properties will be loaded up and held here. * * @author Jeff Johnston */ public class ColumnHandler { private TableModel model; private List<Column> columns = new ArrayList<Column>(); private Column firstColumn; private Column lastColumn; private int columnDepth = 0; private int columnCount = 0; public ColumnHandler(TableModel model) { this.model = model; } public void addAutoGenerateColumn(Column column) { column.addAttribute(TableConstants.IS_AUTO_GENERATE_COLUMN, "true"); addColumn(column); } public void addColumn(Column column) { column.defaults(); addColumnAttributes(column); if (!isViewAllowed(column)) { return; } if (firstColumn == null) { firstColumn = column; column.setFirstColumn(true); } if (lastColumn != null) { lastColumn.setLastColumn(false); } lastColumn = column; column.setLastColumn(true); if (column.getDepth() > columnDepth) columnDepth = column.getDepth(); if (column.getParent() != null) { column.getParent().addChildren(column); if (column.getParent().isFirstColumn() && column.getParent().getChildren().size() == 1) { column.setFirstColumn(true); } } if (column.getParent() == null) { columnCount++; } else { if (column.getParent().getChildren().size() > 1) { columnCount++; } } columns.add(column); calcColumns(); } private void calcColumns() { if (columnDepth > 1) { for (Column column : columns) { column.setColspan(calcColumnCols(column)); column.setRowspan(calcColumnRows(column)); } } } private int calcColumnRows(Column column) { if (CollectionUtils.isEmpty(column.getChildren())) { return columnDepth - column.getDepth() + 1; } else { return 1; } } private int calcColumnCols(Column column) { int result = 0; if (!CollectionUtils.isEmpty(column.getChildren())) { for (Column c : column.getChildren()) { if (!CollectionUtils.isEmpty(c.getChildren())) { result += calcColumnCols(c); } else { result++; } } } else { result = 1; } return result; } public void addColumnAttributes(Column column) { String interceptor = TableModelUtils.getInterceptPreference(model, column.getInterceptor(), PreferencesConstants.COLUMN_INTERCEPTOR); column.setInterceptor(interceptor); TableCache.getInstance().getColumnInterceptor(interceptor).addColumnAttributes(model, column); } public void modifyColumnAttributes(Column column) { TableCache.getInstance().getColumnInterceptor(column.getInterceptor()).modifyColumnAttributes(model, column); } public int columnCount() { // return columns.size(); return columnCount; } public List<Column> getColumns() { List<Column> result = new ArrayList<Column>(); for (Column column : columns) { if (column.getChildren() == null) { result.add(column); } } return result; } public Column getColumnByAlias(String alias) { for (Iterator iter = columns.iterator(); iter.hasNext(); ) { Column column = (Column) iter.next(); String columnAlias = column.getAlias(); if (columnAlias != null && columnAlias.equals(alias)) { return column; } } return null; } public boolean hasMetatData() { return columnCount() > 0; } public List<Column> getFilterColumns() { boolean cleared = model.getLimit().isCleared(); List<Column> result = new ArrayList<Column>(); for (Iterator iter = columns.iterator(); iter.hasNext(); ) { Column column = (Column) iter.next(); if (column.getChildren() != null) continue; String value = model.getLimit().getFilterSet().getFilterValue(column.getAlias()); if (cleared || StringUtils.isEmpty(value)) { value = ""; } Cell cell = TableModelUtils.getFilterCell(column, value); column.setCellDisplay(cell.getHtmlDisplay(model, column)); result.add(column); } return result; } public List<Column> getHeaderColumns() { boolean isExported = model.getLimit().isExported(); for (Column column : columns) { Cell cell = TableModelUtils.getHeaderCell(column, column.getTitle()); if (!isExported) { column.setCellDisplay(cell.getHtmlDisplay(model, column)); } else { column.setCellDisplay(cell.getExportDisplay(model, column)); } } return columns; } private boolean isViewAllowed(Column column) { String view = model.getTableHandler().getTable().getView(); boolean isExported = model.getLimit().isExported(); if (isExported) { view = model.getExportHandler().getCurrentExport().getView(); } boolean allowView = allowView(column, view); boolean denyView = denyView(column, view); if (allowView & !denyView) { return true; } return false; } private boolean allowView(Column column, String view) { String viewsAllowed[] = column.getViewsAllowed(); if (viewsAllowed == null || viewsAllowed.length == 0) { return true; } for (int i = 0; i < viewsAllowed.length; i++) { if (view.equals(viewsAllowed[i])) { return true; } } return false; } private boolean denyView(Column column, String view) { String viewsDenied[] = column.getViewsDenied(); if (viewsDenied == null || viewsDenied.length == 0) { return false; } for (int i = 0; i < viewsDenied.length; i++) { if (view.equals(viewsDenied[i])) { return true; } } return false; } public Column getFirstCalcColumn() { for (Iterator iter = columns.iterator(); iter.hasNext(); ) { Column column = (Column) iter.next(); if (column.isCalculated()) { return column; } } return null; } public CalcResult[] getCalcResults(Column column) { if (!column.isCalculated()) { return null; } return CalcUtils.getCalcResults(model, column); } public int getColumnDepth() { return columnDepth; } }