/*
* Copyright 2011 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jbpm.formapi.shared.api.items;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.jbpm.formapi.shared.api.FormItemRepresentation;
import org.jbpm.formapi.shared.form.FormEncodingException;
import org.jbpm.formapi.shared.form.FormEncodingFactory;
import org.jbpm.formapi.shared.form.FormRepresentationDecoder;
import com.gwtent.reflection.client.Reflectable;
@Reflectable
public class TableRepresentation extends FormItemRepresentation {
private final List<List<FormItemRepresentation>> elements;
private Integer rows = 0;
private Integer columns = 0;
private Integer borderWidth;
private Integer cellPadding;
private Integer cellSpacing;
public TableRepresentation() {
super("table");
this.elements = new ArrayList<List<FormItemRepresentation>>();
}
public void setRows(Integer rows) {
this.rows = rows;
checkRoom();
}
public void setColumns(Integer columns) {
this.columns = columns;
checkRoom();
}
private void checkRoom() {
if (this.rows > 0 && this.columns > 0) {
for (int index = 0; index < this.rows; index++) {
List<FormItemRepresentation> row = new ArrayList<FormItemRepresentation>(this.columns);
for (int subIndex = 0; subIndex < this.columns; subIndex++) {
row.add(null);
}
this.elements.add(row);
}
}
}
public Integer getBorderWidth() {
return borderWidth;
}
public void setBorderWidth(Integer borderWidth) {
this.borderWidth = borderWidth;
}
public Integer getCellPadding() {
return cellPadding;
}
public void setCellPadding(Integer cellPadding) {
this.cellPadding = cellPadding;
}
public Integer getCellSpacing() {
return cellSpacing;
}
public void setCellSpacing(Integer cellSpacing) {
this.cellSpacing = cellSpacing;
}
public List<List<FormItemRepresentation>> getElements() {
return elements;
}
public void setElement(int rowNumber, int colNumber, FormItemRepresentation subRep) {
while (this.elements.size() <= rowNumber) {
this.elements.add(new ArrayList<FormItemRepresentation>());
this.rows = this.elements.size();
}
List<FormItemRepresentation> row = this.elements.get(rowNumber);
while (row.size() <= colNumber) {
row.add(null);
this.columns = row.size();
}
row.set(colNumber, subRep);
this.elements.set(rowNumber, row);
}
public Integer getRows() {
return rows;
}
public Integer getColumns() {
return columns;
}
@Override
public Map<String, Object> getDataMap() {
Map<String, Object> data = super.getDataMap();
data.put("borderWidth", this.borderWidth);
data.put("cellPadding", this.cellPadding);
data.put("cellSpacing", this.cellSpacing);
data.put("rows", this.rows);
data.put("columns", this.columns);
List<List<Map<String, Object>>> mapElements = new ArrayList<List<Map<String, Object>>>();
if (this.elements != null) {
for (List<FormItemRepresentation> row : this.elements) {
List<Map<String, Object>> mapRow = null;
if (row != null) {
mapRow = new ArrayList<Map<String, Object>>();
for (FormItemRepresentation cell : row) {
mapRow.add(cell == null ? null : cell.getDataMap());
}
}
mapElements.add(mapRow);
}
}
data.put("elements", mapElements);
return data;
}
@Override
@SuppressWarnings("unchecked")
public void setDataMap(Map<String, Object> data) throws FormEncodingException {
super.setDataMap(data);
this.borderWidth = data.get("borderWidth") == null ? null : ((Number) data.get("borderWidth")).intValue();
this.cellPadding = data.get("cellPadding") == null ? null : ((Number) data.get("cellPadding")).intValue();
this.cellSpacing = data.get("cellSpacing") == null ? null : ((Number) data.get("cellSpacing")).intValue();
this.columns = data.get("columns") == null ? null : ((Number) data.get("columns")).intValue();
this.rows = data.get("rows") == null ? null : ((Number) data.get("rows")).intValue();
this.elements.clear();
FormRepresentationDecoder decoder = FormEncodingFactory.getDecoder();
List<List<Map<String, Object>>> mapElements = (List<List<Map<String, Object>>>) data.get("elements");
if (mapElements != null) {
for (List<Map<String, Object>> mapRow : mapElements) {
List<FormItemRepresentation> row = new ArrayList<FormItemRepresentation>();
if (mapRow != null) {
for (Map<String, Object> mapCell : mapRow) {
row.add((FormItemRepresentation) decoder.decode(mapCell));
}
}
this.elements.add(row);
}
}
}
@Override
public boolean equals(Object obj) {
if (!super.equals(obj)) return false;
if (!(obj instanceof TableRepresentation)) return false;
TableRepresentation other = (TableRepresentation) obj;
boolean equals = (this.rows == null && other.rows == null) || (this.rows != null && this.rows.equals(other.rows));
if (!equals) return equals;
equals = (this.columns == null && other.columns == null) || (this.columns != null && this.columns.equals(other.columns));
if (!equals) return equals;
equals = (this.borderWidth == null && other.borderWidth == null) ||
(this.borderWidth != null && this.borderWidth.equals(other.borderWidth));
if (!equals) return equals;
equals = (this.cellPadding == null && other.cellPadding == null) ||
(this.cellPadding != null && this.cellPadding.equals(other.cellPadding));
if (!equals) return equals;
equals = (this.cellSpacing == null && other.cellSpacing == null) ||
(this.cellSpacing != null && this.cellSpacing.equals(other.cellSpacing));
if (!equals) return equals;
equals = (this.elements == null && other.elements == null) || (this.elements != null && this.elements.equals(other.elements));
return equals;
}
@Override
public int hashCode() {
int result = super.hashCode();
int aux = this.rows == null ? 0 : this.rows.hashCode();
result = 37 * result + aux;
aux = this.columns == null ? 0 : this.columns.hashCode();
result = 37 * result + aux;
aux = this.borderWidth == null ? 0 : this.borderWidth.hashCode();
result = 37 * result + aux;
aux = this.cellPadding == null ? 0 : this.cellPadding.hashCode();
result = 37 * result + aux;
aux = this.cellSpacing == null ? 0 : this.cellSpacing.hashCode();
result = 37 * result + aux;
aux = this.elements == null ? 0 : this.elements.hashCode();
result = 37 * result + aux;
return result;
}
}