1 package org.weda.tapestry.component;
2 import java.util.Arrays;
3 import java.util.Collection;
4 import java.util.HashMap;
5 import java.util.List;
6 import java.util.Map;
7 import org.apache.commons.logging.Log;
8 import org.apache.commons.logging.LogFactory;
9 import org.apache.tapestry.BaseComponent;
10 import org.apache.tapestry.IMarkupWriter;
11 import org.apache.tapestry.IRequestCycle;
12 import org.apache.tapestry.annotations.ComponentClass;
13 import org.apache.tapestry.annotations.InjectObject;
14 import org.apache.tapestry.annotations.Parameter;
15 import org.apache.tapestry.event.PageEvent;
16 import org.weda.action.ActionContainer;
17 import org.weda.action.ActionContainerProvider;
18 import org.weda.action.ActionEvent;
19 import org.weda.action.ActionExecutionContext;
20 import org.weda.action.ActionListener;
21 import org.weda.model.TableModelData;
22 import org.weda.model.actions.ObjectTableModelSelectAction;
23 import org.weda.model.TableModel;
24 import org.weda.model.TableModelException;
25 import org.weda.model.impl.FilterEditorModel;
26 import org.weda.model.impl.FilterEditorModelGroup;
27 import org.weda.model.impl.TableModelDataId;
28 import org.weda.tapestry.renderer.Renderer;
29 import org.weda.property.PropertyDescriptor;
30 import org.weda.tapestry.RendererRegistry;
31 import static org.weda.Constants.*;
32
33 /**Tapestry component.<br/>
34 *Цель: представление данных в виде таблицы
35 *
36 * @author Mikhail Titov
37 */
38 @ComponentClass(allowBody=true, allowInformalParameters=true)
39 public abstract class Table
40 extends BaseComponent
41 implements ActionContainerProvider, ActionListener
42 {
43 private final static Log log = LogFactory.getLog(Table.class);
44
45 private TableModel model;
46 private TableModelData modelData;
47
48 public PropertyDescriptor descriptor;
49 public Object[] row;
50 public int rowNum;
51 public Object cellValue;
52 public int colNum;
53 public Renderer[] valueRenderers;
54 public Integer[] rowsInd;
55 public Integer[] colsInd;
56 public boolean[] rowSelectionState;
57 public FilterEditorModel[] filterModels;
58 public FilterEditorModel filterModel;
59 public boolean hasFilters;
60
61
62
63
64 @InjectObject("service:org.weda.tapestry.RendererRegistry")
65 public abstract RendererRegistry getRendererRegistry();
66
67
68 @Parameter(required=true)
69 public abstract TableModel getTableModel();
70 @Parameter(required=false)
71 public abstract FilterEditorModelGroup getFilterModelGroup();
72 @Parameter(required=false)
73 public abstract Map<String, String> getFilterPageMapping();
74
75 public String getTableHeaderRowClass(){
76 return TABLE_HEADER_ROW_CLASS;
77 }
78
79 public String getTableClass(){
80 return TABLE_CLASS;
81 }
82
83 public String getTableSummaryRowClass(){
84 return TABLE_SUMMARY_ROW_CLASS;
85 }
86
87 public String getTableDataRowClass(){
88 return rowSelectionState[rowNum]?
89 TABLE_DATA_ROW_SELECTED_CLASS : TABLE_DATA_ROW_CLASS;
90 }
91
92 public String getCheckboxClass(){
93 return EDITOR_CLASS;
94 }
95
96 public String getTableDataCellClass(){
97 return TABLE_DATA_CELL_CLASS;
98 }
99
100 public List<PropertyDescriptor> getColumnDescriptors(){
101 return getTableModel().getColumnDescriptors();
102 }
103
104 public String getFilterPageName(){
105 String pageName = getFilterPageMapping().get(getFilterModelName());
106 log.debug(">>!! <--getFilterPageName. colNum = "+colNum+", result = "+pageName);
107 return pageName;
108 }
109
110 public boolean isFilterDirectValueSet(){
111 return getFilterPageName()!=null;
112 }
113
114 public String getFilterModelName(){
115 return filterModels[colNum].getName();
116 }
117
118 public Map<String, Object> getActionParameters(int row, int col){
119 Map<String, Object> params = new HashMap<String, Object>();
120 params.put(
121 "dataId"
122 , new TableModelDataId(
123 getTableModel().getName(), row, col));
124 return params;
125 }
126
127 public Object getDataId(int row, int col){
128 if (!valueRenderers[col].isNeedDataId())
129 return null;
130 else
131 return new TableModelDataId(getTableModel().getName(), row, col);
132 }
133
134 public Object getValue(int row, int col) throws TableModelException {
135 if (valueRenderers[col].isNeedValue())
136 return modelData.getValueAt(row, col);
137 else
138 return null;
139 }
140
141 public boolean hasSummaryRow() throws TableModelException {
142 return modelData==null? false : modelData.hasSummaryRow();
143 }
144
145 public Object getSummaryValue(int col) throws TableModelException {
146 if (valueRenderers[col].isNeedValue())
147 return modelData.getSummaryValueAt(col);
148 else
149 return null;
150 }
151
152 public Object[] getActionContainers(int colNum){
153 return new Object[]{getColumnDescriptors().get(colNum)};
154 }
155
156 protected void prepareForRender(IRequestCycle cycle) {
157 try{
158 ActionPanelHelper.addActionListener(cycle, this);
159 ActionPanelHelper.addActionContainerProvider(cycle, this);
160
161 model = getTableModel();
162 List<PropertyDescriptor> columnDescriptors =
163 model.getColumnDescriptors();
164 valueRenderers = new Renderer[columnDescriptors.size()];
165 colsInd = new Integer[model.getColumnCount()];
166 if (model.getMode()==TableModel.Mode.VIEW){
167 modelData = model.getData();
168 rowsInd = new Integer[modelData.getRowCount()];
169 rowSelectionState=new boolean[rowsInd.length];
170 for (int i=0; i<rowSelectionState.length; ++i)
171 rowSelectionState[i]=modelData.isRowSelected(i);
172 }else{
173 rowsInd = new Integer[0];
174 rowSelectionState=new boolean[0];
175 modelData = null;
176 }
177
178 RendererRegistry rendererRegistry = getRendererRegistry();
179 for (int i=0; i<columnDescriptors.size(); i++){
180 valueRenderers[i]=
181 rendererRegistry.getRenderer(columnDescriptors.get(i));
182 if (log.isDebugEnabled()){
183 log.debug(String.format(
184 "Renderer (%s) setted for column (%d)"
185 , valueRenderers[i].getClass().getName()
186 , i));
187 }
188 }
189
190 FilterEditorModelGroup filterGroup = getFilterModelGroup();
191 hasFilters = false;
192 if (filterGroup != null){
193 filterModels = new FilterEditorModel[valueRenderers.length];
194 Collection<FilterEditorModel> models =
195 filterGroup.getEditorModels();
196 for(int i=0; i<columnDescriptors.size(); ++i){
197 PropertyDescriptor colDesc = columnDescriptors.get(i);
198 for (FilterEditorModel filterModel: models){
199 if (colDesc.equals(filterModel.getPropertyDescriptor()))
200 {
201 filterModels[i] = filterModel;
202 hasFilters = true;
203 break;
204 }
205 }
206 }
207 }
208 super.prepareForRender(cycle);
209 }catch(Exception e){
210 String message=
211 String.format("Can't prepare for render table for " +
212 "tableModel (%s)"
213 , model==null ? "null" : model.getName());
214 log.error(message, e);
215 throw new Error(message, e);
216 }
217 }
218
219 public void pageEndRender(PageEvent event) {
220 model=null;
221 valueRenderers = null;
222 super.pageEndRender(event);
223 }
224
225 protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle) {
226 writer.begin("table");
227 renderInformalParameters(writer, cycle);
228 super.renderComponent(writer, cycle);
229 writer.end();
230 }
231
232 public void confirmSelection(){
233 for (int i=0; i<rowSelectionState.length; ++i)
234 if (rowSelectionState[i])
235 modelData.selectRow(i);
236 else
237 modelData.deselectRow(i);
238 }
239
240 public List<ActionContainer> getActionContainers() throws Exception{
241 return Arrays.asList((ActionContainer)getTableModel());
242 }
243
244 public void beforeExecute(ActionEvent event) throws Exception
245 {
246 ActionExecutionContext context = event.getExecutionContext();
247 if (ObjectTableModelSelectAction.class
248 .equals(context.getActionDescriptor().getActionClass()))
249 {
250 context.setActionParameterValue(
251 "rowSelectionState", rowSelectionState);
252 }
253 }
254
255 public void afterExecute(ActionEvent event) throws Exception {
256 }
257
258 }