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 |
|
} |