1 33 34 package com.icesoft.faces.component.ext; 35 36 import com.icesoft.faces.context.effects.JavascriptContext; 37 import com.icesoft.faces.component.CSS_DEFAULT; 38 import com.icesoft.faces.component.ext.renderkit.TableRenderer; 39 import com.icesoft.faces.component.ext.taglib.Util; 40 41 import javax.faces.component.UIComponentBase; 42 import javax.faces.component.UIComponent; 43 import javax.faces.context.FacesContext; 44 import javax.faces.el.MethodBinding; 45 import javax.faces.el.ValueBinding; 46 import javax.faces.event.FacesEvent; 47 import javax.faces.event.PhaseId; 48 import java.io.IOException ; 49 import java.util.StringTokenizer ; 50 51 55 public class RowSelector extends UIComponentBase { 56 private Boolean value; 57 private Boolean toggleOnClick; 58 private Boolean multiple; 60 private String mouseOverClass; 61 private String selectedClass; 62 private MethodBinding selectionListener; 63 private MethodBinding selectionAction; 64 private Integer clickedRow; 65 66 67 public static final String COMPONENT_TYPE = "com.icesoft.faces.RowSelector"; 68 public static final String RENDERER_TYPE = 69 "com.icesoft.faces.RowSelectorRenderer"; 70 public static final String COMPONENT_FAMILY = 71 "com.icesoft.faces.RowSelectorFamily"; 72 73 public RowSelector(){ 74 JavascriptContext 75 .includeLib(JavascriptContext.ICE_EXTRAS, getFacesContext()); 76 } 77 78 public String getFamily() { 79 return COMPONENT_FAMILY; 80 } 81 82 public Boolean getValue() { 83 ValueBinding vb = getValueBinding("value"); 84 if (vb != null) { 85 return (Boolean ) vb.getValue(getFacesContext()); 86 } 87 if (value != null) { 88 return value; 89 } 90 return Boolean.FALSE; 91 } 92 93 public void setValue(Boolean value) { 94 ValueBinding vb = getValueBinding("value"); 95 if (vb != null) { 96 vb.setValue(getFacesContext(), value); 97 } else { 98 this.value = value; 99 } 100 } 101 102 public Integer getClickedRow() { 103 ValueBinding vb = getValueBinding("clickedRow"); 104 if (vb != null) { 105 return (Integer ) vb.getValue(getFacesContext()); 106 } 107 if (clickedRow != null) { 108 return clickedRow; 109 } 110 return new Integer (-1); 111 } 112 113 public void setClickedRow(Integer clickedRow) { 114 ValueBinding vb = getValueBinding("clickedRow"); 115 if (vb != null) { 116 vb.setValue(getFacesContext(), clickedRow); 117 } else { 118 this.clickedRow = clickedRow; 119 } 120 } 121 122 public Boolean getMultiple() { 123 ValueBinding vb = getValueBinding("multiple"); 124 if (vb != null) { 125 return (Boolean ) vb.getValue(getFacesContext()); 126 } 127 if (multiple != null) { 128 return multiple; 129 } 130 return Boolean.FALSE; 131 } 132 133 public void setMultiple(Boolean multiple) { 134 this.multiple = multiple; 135 } 136 137 public Boolean getToggleOnClick() { 138 ValueBinding vb = getValueBinding("toggleOnClick"); 139 if (vb != null) { 140 return (Boolean ) vb.getValue(getFacesContext()); 141 } 142 if (toggleOnClick != null) { 143 return toggleOnClick; 144 } 145 return Boolean.TRUE; 146 } 147 148 public void setToggleOnClick(Boolean toggleOnClick) { 149 this.toggleOnClick = toggleOnClick; 150 } 151 152 153 public String getMouseOverClass() { 154 return Util.getQualifiedStyleClass(this, 155 mouseOverClass, 156 CSS_DEFAULT.ROW_SELECTION_MOUSE_OVER, 157 "mouseOverClass"); 158 } 159 160 public void setMouseOverClass(String mouseOverClass) { 161 this.mouseOverClass = mouseOverClass; 162 } 163 164 public String getSelectedClass() { 165 return Util.getQualifiedStyleClass(this, 166 selectedClass, 167 CSS_DEFAULT.ROW_SELECTION_SELECTED, 168 "selectedClass"); 169 } 170 171 public void setSelectedClass(String selectedClass) { 172 this.selectedClass = selectedClass; 173 } 174 175 public MethodBinding getSelectionListener() { 176 return selectionListener; 177 } 178 179 public void setSelectionListener(MethodBinding selectionListener) { 180 this.selectionListener = selectionListener; 181 } 182 183 public MethodBinding getSelectionAction() { 184 return selectionAction; 185 } 186 187 public void setSelectionAction(MethodBinding selectionListener) { 188 this.selectionAction = selectionListener; 189 } 190 191 192 193 public void processDecodes(FacesContext facesContext){ 194 HtmlDataTable dataTable = getParentDataTable(this); 196 197 String dataTableId = dataTable.getClientId(facesContext); 198 String selectedRowsParameter = 199 TableRenderer.getSelectedRowParameterName(dataTableId); 200 String selectedRows = (String ) facesContext.getExternalContext() 201 .getRequestParameterMap().get(selectedRowsParameter); 202 203 if (selectedRows == null || selectedRows.trim().length() == 0) { 204 return; 205 } 206 207 int rowIndex = dataTable.getRowIndex(); 209 StringTokenizer st = new StringTokenizer (selectedRows, ","); 210 boolean rowClicked = false; 211 while (st.hasMoreTokens()) { 212 int row = Integer.parseInt(st.nextToken()); 213 if (row == rowIndex) { 214 rowClicked = true; 215 break; 216 } 217 } 218 RowSelector rowSelector = (RowSelector) this; 219 220 try { 221 if (rowClicked) { 222 boolean b = rowSelector.getValue().booleanValue(); 224 b = !b; 225 rowSelector.setValue(new Boolean (b)); 226 setClickedRow(new Integer (rowIndex)); 227 if (rowSelector.getSelectionListener() != null) { 228 RowSelectorEvent evt = 229 new RowSelectorEvent(rowSelector, rowIndex, b); 230 evt.setPhaseId(PhaseId.APPLY_REQUEST_VALUES); 231 232 rowSelector.queueEvent(evt); 233 } if(rowSelector.getSelectionAction() != null){ 234 rowSelector.getSelectionAction().invoke(facesContext, null); 235 } 236 237 238 } else { 239 if (Boolean.FALSE.equals(rowSelector.getMultiple())) { 240 rowSelector.setValue(Boolean.FALSE); 242 } 243 } 244 } catch (Exception e) { 245 e.printStackTrace(); 246 } 247 248 249 250 } 251 private static HtmlDataTable getParentDataTable(UIComponent uiComponenent) { 252 UIComponent parentComp = uiComponenent.getParent(); 253 if (parentComp == null) { 254 throw new RuntimeException ( 255 "RowSelectorRenderer: decode. Could not find an Ice:dataTable as a parent componenent"); 256 } 257 if (parentComp instanceof com.icesoft.faces.component.ext.HtmlDataTable) { 258 return (HtmlDataTable) parentComp; 259 } 260 return getParentDataTable(parentComp); 261 } 262 263 public void encodeEnd(FacesContext facesContext) 264 throws IOException { 265 266 268 } 270 271 public void encodeBegin(FacesContext facesContext) 272 throws IOException { 273 274 } 278 279 public void broadcast(FacesEvent event) { 280 281 super.broadcast(event); 282 if (event instanceof RowSelectorEvent && selectionListener != null) { 283 284 selectionListener.invoke(getFacesContext(), 285 new Object []{(RowSelectorEvent) event}); 286 287 } 288 } 289 290 public Object saveState(FacesContext context) { 291 Object [] state = new Object [12]; 292 state[0] = super.saveState(context); 293 state[1] = value; 294 state[2] = multiple; 295 state[3] = mouseOverClass; 296 state[4] = selectedClass; 297 state[5] = selectionListener; 298 return state; 299 } 300 301 public void restoreState(FacesContext context, Object stateIn) { 302 Object [] state = (Object []) stateIn; 303 super.restoreState(context, state[0]); 304 value = (Boolean ) state[1]; 305 multiple = (Boolean ) state[2]; 306 mouseOverClass = (String ) state[3]; 307 selectedClass = (String ) state[4]; 308 selectionListener = (MethodBinding) state[5]; 309 } 310 311 String styleClass; 312 315 public void setStyleClass(String styleClass) { 316 this.styleClass = styleClass; 317 } 318 319 322 public String getStyleClass() { 323 return Util.getQualifiedStyleClass(this, 324 styleClass, 325 CSS_DEFAULT.ROW_SELECTION_BASE, 326 "styleClass"); 327 } 328 } 329 | Popular Tags |