Coverage Report - org.apache.tapestry.contrib.table.model.simple.SimpleTableModel
 
Classes in this File Line Coverage Branch Coverage Complexity
SimpleTableModel
0%
0/61
0%
0/22
2.308
 
 1  
 // Copyright 2004, 2005 The Apache Software Foundation
 2  
 //
 3  
 // Licensed under the Apache License, Version 2.0 (the "License");
 4  
 // you may not use this file except in compliance with the License.
 5  
 // You may obtain a copy of the License at
 6  
 //
 7  
 //     http://www.apache.org/licenses/LICENSE-2.0
 8  
 //
 9  
 // Unless required by applicable law or agreed to in writing, software
 10  
 // distributed under the License is distributed on an "AS IS" BASIS,
 11  
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 12  
 // See the License for the specific language governing permissions and
 13  
 // limitations under the License.
 14  
 
 15  
 package org.apache.tapestry.contrib.table.model.simple;
 16  
 
 17  
 import java.util.Arrays;
 18  
 import java.util.Comparator;
 19  
 import java.util.Iterator;
 20  
 
 21  
 import org.apache.tapestry.contrib.table.model.CTableDataModelEvent;
 22  
 import org.apache.tapestry.contrib.table.model.IFullTableModel;
 23  
 import org.apache.tapestry.contrib.table.model.ITableColumn;
 24  
 import org.apache.tapestry.contrib.table.model.ITableColumnModel;
 25  
 import org.apache.tapestry.contrib.table.model.ITableDataModel;
 26  
 import org.apache.tapestry.contrib.table.model.ITableDataModelListener;
 27  
 import org.apache.tapestry.contrib.table.model.ITableSortingState;
 28  
 import org.apache.tapestry.contrib.table.model.common.AbstractTableModel;
 29  
 import org.apache.tapestry.contrib.table.model.common.ArrayIterator;
 30  
 import org.apache.tapestry.contrib.table.model.common.ReverseComparator;
 31  
 
 32  
 /**
 33  
  * A simple generic table model implementation.
 34  
  * 
 35  
  * @author mindbridge
 36  
  */
 37  
 public class SimpleTableModel extends AbstractTableModel implements
 38  
         IFullTableModel, ITableDataModelListener
 39  
 {
 40  
 
 41  
     private static final long serialVersionUID = 1L;
 42  
 
 43  0
     private ITableDataModel m_objDataModel = null;
 44  0
     private Object[] m_arrRows = null;
 45  0
     private ITableColumnModel m_objColumnModel = null;
 46  
 
 47  
     private SimpleTableSortingState m_objLastSortingState;
 48  
 
 49  
     public SimpleTableModel(Object[] arrData, ITableColumn[] arrColumns)
 50  
     {
 51  0
         this(new SimpleListTableDataModel(arrData), new SimpleTableColumnModel(
 52  
                 arrColumns));
 53  0
     }
 54  
 
 55  
     public SimpleTableModel(Object[] arrData, ITableColumnModel objColumnModel)
 56  
     {
 57  0
         this(new SimpleListTableDataModel(arrData), objColumnModel);
 58  0
     }
 59  
 
 60  
     public SimpleTableModel(ITableDataModel objDataModel,
 61  
             ITableColumnModel objColumnModel)
 62  
     {
 63  0
         this(objDataModel, objColumnModel, new SimpleTableState());
 64  0
     }
 65  
 
 66  
     public SimpleTableModel(ITableDataModel objDataModel,
 67  
             ITableColumnModel objColumnModel, SimpleTableState objState)
 68  
     {
 69  0
         super(objState);
 70  
 
 71  0
         m_arrRows = null;
 72  0
         m_objColumnModel = objColumnModel;
 73  0
         m_objLastSortingState = new SimpleTableSortingState();
 74  
 
 75  0
         setDataModel(objDataModel);
 76  0
     }
 77  
 
 78  
     public ITableColumnModel getColumnModel()
 79  
     {
 80  0
         return m_objColumnModel;
 81  
     }
 82  
 
 83  
     public Iterator getCurrentPageRows()
 84  
     {
 85  0
         sortRows();
 86  
 
 87  0
         int nPageSize = getPagingState().getPageSize();
 88  0
         if (nPageSize <= 0) return new ArrayIterator(m_arrRows);
 89  
 
 90  0
         int nCurrentPage = getPagingState().getCurrentPage();
 91  0
         int nFrom = nCurrentPage * nPageSize;
 92  0
         int nTo = (nCurrentPage + 1) * nPageSize;
 93  
 
 94  0
         return new ArrayIterator(m_arrRows, nFrom, nTo);
 95  
     }
 96  
 
 97  
     public int getRowCount()
 98  
     {
 99  0
         updateRows();
 100  0
         return m_arrRows.length;
 101  
     }
 102  
 
 103  
     private void updateRows()
 104  
     {
 105  
         // If it is not null, then there is no need to extract the data
 106  0
         if (m_arrRows != null) return;
 107  
 
 108  
         // Extract the data from the model
 109  0
         m_objLastSortingState = new SimpleTableSortingState();
 110  
 
 111  0
         int nRowCount = m_objDataModel.getRowCount();
 112  0
         Object[] arrRows = new Object[nRowCount];
 113  
 
 114  0
         int i = 0;
 115  0
         for(Iterator it = m_objDataModel.getRows(); it.hasNext();)
 116  0
             arrRows[i++] = it.next();
 117  
 
 118  0
         m_arrRows = arrRows;
 119  0
     }
 120  
 
 121  
     protected void sortRows()
 122  
     {
 123  0
         updateRows();
 124  
 
 125  0
         ITableSortingState objSortingState = getSortingState();
 126  
 
 127  
         // see if there is sorting required
 128  0
         String strSortColumn = objSortingState.getSortColumn();
 129  0
         if (strSortColumn == null) return;
 130  
 
 131  0
         boolean bSortOrder = objSortingState.getSortOrder();
 132  
 
 133  
         // See if the table is already sorted this way. If so, return.
 134  0
         if (strSortColumn.equals(m_objLastSortingState.getSortColumn())
 135  0
                 && m_objLastSortingState.getSortOrder() == bSortOrder) return;
 136  
 
 137  0
         ITableColumn objColumn = getColumnModel().getColumn(strSortColumn);
 138  0
         if (objColumn == null || !objColumn.getSortable()) return;
 139  
 
 140  0
         Comparator objCmp = objColumn.getComparator();
 141  0
         if (objCmp == null) return;
 142  
 
 143  
         // Okay, we have everything in place. Sort the rows.
 144  0
         if (bSortOrder == ITableSortingState.SORT_DESCENDING)
 145  0
             objCmp = new ReverseComparator(objCmp);
 146  
 
 147  0
         Arrays.sort(m_arrRows, objCmp);
 148  
 
 149  0
         m_objLastSortingState.setSortColumn(strSortColumn, bSortOrder);
 150  0
     }
 151  
 
 152  
     public void tableDataChanged(CTableDataModelEvent objEvent)
 153  
     {
 154  0
         m_arrRows = null;
 155  0
     }
 156  
 
 157  
     /**
 158  
      * Returns the dataModel.
 159  
      * 
 160  
      * @return ITableDataModel
 161  
      */
 162  
     public ITableDataModel getDataModel()
 163  
     {
 164  0
         return m_objDataModel;
 165  
     }
 166  
 
 167  
     /**
 168  
      * Sets the dataModel.
 169  
      * 
 170  
      * @param dataModel
 171  
      *            The dataModel to set
 172  
      */
 173  
     public void setDataModel(ITableDataModel dataModel)
 174  
     {
 175  0
         if (m_objDataModel != null)
 176  0
             m_objDataModel.removeTableDataModelListener(this);
 177  
 
 178  0
         m_objDataModel = dataModel;
 179  0
         m_objDataModel.addTableDataModelListener(this);
 180  
 
 181  0
         m_arrRows = null;
 182  0
     }
 183  
 
 184  
     public Iterator getRows()
 185  
     {
 186  0
         updateRows();
 187  0
         return new ArrayIterator(m_arrRows);
 188  
     }
 189  
 
 190  
 }