View Javadoc

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      //public abstract TableModelRegistry getTableModelRegistry();
63      
64      @InjectObject("service:org.weda.tapestry.RendererRegistry")
65      public abstract RendererRegistry getRendererRegistry();
66      
67      //public abstract String getTableModelName();
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 }