package com.explido.components.extendedtable; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hivemind.ApplicationRuntimeException; import org.apache.tapestry.IAsset; import org.apache.tapestry.IRequestCycle; import org.apache.tapestry.IActionListener; import org.apache.tapestry.components.Block; import org.apache.tapestry.listener.ListenerInvoker; import org.apache.tapestry.util.ComponentAddress; import org.apache.tapestry.contrib.table.components.Table; import org.apache.tapestry.contrib.table.model.ITableColumn; import org.apache.tapestry.contrib.table.model.ITableModelSource; import org.apache.tapestry.contrib.table.model.ITableRendererSource; import org.apache.tapestry.contrib.table.model.common.AbstractTableColumn; import org.apache.tapestry.contrib.table.model.common.BlockTableRendererSource; import org.apache.tapestry.contrib.table.model.simple.SimpleListTableDataModel; import org.apache.tapestry.contrib.table.model.simple.SimpleTableModel; public abstract class ExtendedTable extends Table implements ITableModelSource { private static final Log LOG = LogFactory.getLog(ExtendedTable.class); /** Injected */ public abstract ListenerInvoker getListenerInvoker(); // parameters public abstract Object getColumns(); public abstract Boolean getShowIfEmpty(); public abstract Boolean getCanShowRow(); public abstract Boolean getCanEditRow(); public abstract Boolean getCanDeleteRow(); public abstract IAsset getShowRowImage(); public abstract IAsset getEditRowImage(); public abstract IAsset getDeleteRowImage(); public abstract IActionListener getOnShowRowListener(); public abstract IActionListener getOnEditRowListener(); public abstract IActionListener getOnDeleteRowListener(); public void refreshTableData() { SimpleTableModel tableModel = ((SimpleTableModel)getTableModel()); // discard the cache inside the table model tableModel.tableDataChanged(null); // instruct the table to update the cache in the session fireObservedStateChange(); } public void setTableData(Collection arrRows) { LOG.debug(getClass().getSimpleName() + " : setSource(Collection arrRows)"); // get the table model containing data and state SimpleTableModel tableModel = ((SimpleTableModel)getTableModel()); // wrap the list in a SimpleListTableDataModel tableModel.setDataModel(new SimpleListTableDataModel(arrRows)); // discard the cache inside the table model tableModel.tableDataChanged(null); // instruct the table to update the cache in the session fireObservedStateChange(); } public void setTableData(Iterator objRows) { LOG.debug(getClass().getSimpleName() + " : setSource(Iterator objRows)"); // get the table model containing data and state SimpleTableModel tableModel = ((SimpleTableModel)getTableModel()); // wrap the list in a SimpleListTableDataModel tableModel.setDataModel(new SimpleListTableDataModel(objRows)); // discard the cache inside the table model tableModel.tableDataChanged(null); // instruct the table to update the cache in the session fireObservedStateChange(); } public void setTableData(List arrRows) { LOG.debug(getClass().getSimpleName() + " : setSource(List arrRows)"); // get the table model containing data and state SimpleTableModel tableModel = ((SimpleTableModel)getTableModel()); // wrap the list in a SimpleListTableDataModel tableModel.setDataModel(new SimpleListTableDataModel(arrRows)); // discard the cache inside the table model tableModel.tableDataChanged(null); // instruct the table to update the cache in the session fireObservedStateChange(); } public void setTableData(Object[] arrRows) { LOG.debug(getClass().getSimpleName() + " : setSource(Object[] arrRows)"); // get the table model containing data and state SimpleTableModel tableModel = ((SimpleTableModel)getTableModel()); // wrap the list in a SimpleListTableDataModel tableModel.setDataModel(new SimpleListTableDataModel(arrRows)); // discard the cache inside the table model tableModel.tableDataChanged(null); // instruct the table to update the cache in the session fireObservedStateChange(); } /** * If the columns are defined via a String, make sure they use * the form-specific column headers. */ public Object getExtendedColumns() { Object objColumns = getColumns(); if (objColumns instanceof String){ objColumns = ((String)objColumns).concat(actionColumns()); } LOG.debug(getClass().getSimpleName() + " Columns: " + objColumns); return objColumns; } protected String actionColumns() { String ognlCompAccessString = "components." + this.getId(); String actionColumns = ""; if (getCanShowRow()){ actionColumns += ", =" + ognlCompAccessString + ".showColumn"; } if (getCanEditRow()){ actionColumns += ", =" + ognlCompAccessString + ".editColumn"; } if (getCanDeleteRow()){ actionColumns += ", =" + ognlCompAccessString + ".deleteColumn"; } return actionColumns; } public ITableColumn getShowColumn() { return tableColum("show", "showColumnHeader", "showColumnValue"); } public ITableColumn getEditColumn() { return tableColum("edit", "editColumnHeader", "editColumnValue"); } public ITableColumn getDeleteColumn() { return tableColum("delete", "deleteColumnHeader", "deleteColumnValue"); } private ITableColumn tableColum(String columnName, String headerBlockName, String valueBlockName) { Block headerBlock = (Block)getComponent(headerBlockName); ITableRendererSource headerRenderer = new BlockTableRendererSource(new ComponentAddress(headerBlock)); Block valueBlock = (Block)getComponent(valueBlockName); ITableRendererSource valueRenderer = new BlockTableRendererSource(new ComponentAddress(valueBlock)); return new AbstractTableColumn(columnName, false, null, headerRenderer, valueRenderer); } /* private void setColumnBlockRenderer(ITableModel tm, String columnName, String headerBlockName, String valueBlockName) { Block headerBlock = (Block)getComponent(headerBlockName); ITableRendererSource headerRenderer = new BlockTableRendererSource(new ComponentAddress(headerBlock)); Block valueBlock = (Block)getComponent(valueBlockName); ITableRendererSource valueRenderer = new BlockTableRendererSource(new ComponentAddress(valueBlock)); AbstractTableColumn tc = (AbstractTableColumn)tm.getColumnModel().getColumn(columnName); if (tc != null) { tc.setColumnName(columnName); tc.setSortable(false); tc.setComparator(null); tc.setColumnRendererSource(headerRenderer); tc.setValueRendererSource(valueRenderer); } } */ public void onShowRow() { if (getCanShowRow()){ IRequestCycle cycle = getPage().getRequestCycle(); getListenerInvoker().invokeListener(getOnShowRowListener(), this, cycle); } } public void onEditRow() { if (getCanEditRow()){ IRequestCycle cycle = getPage().getRequestCycle(); getListenerInvoker().invokeListener(getOnEditRowListener(), this, cycle); } } public void onDeleteRow() { if (getCanDeleteRow()){ IRequestCycle cycle = getPage().getRequestCycle(); getListenerInvoker().invokeListener(getOnDeleteRowListener(), this, cycle); } } }