package com.venky.swf.views.controls.page.layout;
import java.util.ArrayList;
import java.util.List;
import com.venky.swf.views.controls.Control;
import com.venky.swf.views.controls._IControl;
public class FluidTable extends FluidContainer{
/**
*
*/
private static final long serialVersionUID = 1018558947954429757L;
private int numColumnsLayout = 1;
private int width = 12/numColumnsLayout;
private void setNumColumnsLayout(int maxColumnsPerRow){
if (maxColumnsPerRow < 1 || maxColumnsPerRow > 12){
throw new RuntimeException("maxColumnsPerRow out of bound [1,12]");
}
for (int i = Math.min(12,maxColumnsPerRow) ; i > 1 ; i -- ){
if (12 % i == 0){
numColumnsLayout = i;
width = 12/numColumnsLayout;
break;
}
}
}
public FluidTable(int maxColumnsPerRow){
this(maxColumnsPerRow,null);
}
public FluidTable(int maxColumnsPerRow, _IControl layoutControl){
super();
setNumColumnsLayout(maxColumnsPerRow);
if (layoutControl != null ){
this.layoutControl = layoutControl;
super.addControl(layoutControl);
}else {
this.layoutControl = null;
}
}
_IControl layoutControl ;
int numColumnsOccupied = 0;
Row currentRow = null;
@Override
public void addControl(_IControl control){
addControl(control,false,0,1);
}
public Column addControl(_IControl control, boolean forceNewRow, int colSpanOffset, int colSpan){
if (forceNewRow) {
numColumnsOccupied= 0;
}
int controlIndexInRowBeingAdded = (numColumnsOccupied % numColumnsLayout);
if (control.isVisible() || currentRow == null) {
if (controlIndexInRowBeingAdded == 0){
currentRow = new Row();
if (layoutControl != null){
layoutControl.addControl(currentRow);
}else{
super.addControl(currentRow); //Prevent Recurrsion.
}
}
}
Column column = null;
if (control.isVisible()) {
column = currentRow.createColumn(colSpanOffset * width, width * colSpan);
}else {
List<Column> columns = new ArrayList<Column>();
Control.hunt(currentRow, Column.class, columns);
if (columns.isEmpty()){
column = currentRow.createColumn(colSpanOffset * width, width * 1);
}else {
column = columns.get(columns.size() - 1);
}
}
column.addControl(control);
numColumnsOccupied = (numColumnsOccupied + colSpanOffset + colSpan)%numColumnsLayout;
return column;
}
}