1 | |
|
2 | |
|
3 | |
|
4 | |
|
5 | |
|
6 | |
|
7 | |
|
8 | |
|
9 | |
|
10 | |
|
11 | |
|
12 | |
|
13 | |
|
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 | |
|
34 | |
|
35 | |
|
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 | |
|
106 | 0 | if (m_arrRows != null) return; |
107 | |
|
108 | |
|
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 | |
|
128 | 0 | String strSortColumn = objSortingState.getSortColumn(); |
129 | 0 | if (strSortColumn == null) return; |
130 | |
|
131 | 0 | boolean bSortOrder = objSortingState.getSortOrder(); |
132 | |
|
133 | |
|
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 | |
|
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 | |
|
159 | |
|
160 | |
|
161 | |
|
162 | |
public ITableDataModel getDataModel() |
163 | |
{ |
164 | 0 | return m_objDataModel; |
165 | |
} |
166 | |
|
167 | |
|
168 | |
|
169 | |
|
170 | |
|
171 | |
|
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 | |
} |