int height = 0;
int rowCount = model.getRowCount(column);
for(int row = lastRow[column]; row < rowCount; row++) {
lastRow[column] = row;
ProgramPanel panel = model.getProgramPanel(column,row);
int startTime = panel.getProgram().getStartTime();
if(panel.getProgram().getDate().equals(nextProgramTableDate)) {
startTime += 24 * 60;
}
if((startTime >= block * blockSize) && (startTime < (block+1) * blockSize)) {
blockProgramList[column].add(panel);
// reset the preferred height of the panel
panel.setHeight(-1);
height += mCompactLayout && (!mOptimizedCompactLayout || !panel.getProgram().isOnAir()) ? panel.getMinimumHeight() : panel.getPreferredHeight();
if(height > maxHeight) {
maxHeight = height;
}
}
else {
break;
}
}
minimumBlockHeight[column] = height;
}
// increase overall height by block height
int blockStart = blockEnd;
blockEnd += maxHeight;
for(int col = 0; col < columnCount; col++) {
// first correct the last panel of this column to make it full size
if(lastLayoutComponentList[col] != null) {
lastLayoutComponentList[col].getPanel().setHeight(blockStart - lastLayoutComponentList[col].getPrePosition());
}
// set all panels in this block to preferred size
ArrayList<ProgramPanel> list = blockProgramList[col];
if(!list.isEmpty()) {
if(list.get(0).equals(model.getProgramPanel(col,0))) {
columnStartArr[col] = blockStart;
}
int internHeight = blockStart;
int internLastHeight = internHeight;
int additionalHeight = 0;
int additionalHeight2 = 0;
if(mOptimizedCompactLayout) {
additionalHeight = (blockEnd - blockStart - minimumBlockHeight[col]) / list.size();
int additionalCount = 0;
int preferredSizeHeights = 0;
int minimumSizeHeights = 0;
for(int i = 0; i < list.size(); i++) {
ProgramPanel panel = list.get(i);
if(panel.getPreferredHeight() < (panel.getMinimumHeight() + additionalHeight) || panel.getProgram().isOnAir()) {
preferredSizeHeights += panel.getPreferredHeight();
}
else {
additionalCount++;
minimumSizeHeights += panel.getMinimumHeight();
}
}
if(additionalCount != 0) {
additionalHeight2 = (blockEnd - blockStart - preferredSizeHeights - minimumSizeHeights) / additionalCount;
}
}
for(int i = 0; i < list.size(); i++) {
ProgramPanel panel = list.get(i);
if(mCompactLayout && !mOptimizedCompactLayout) {
panel.setHeight(panel.getMinimumHeight());
}
else if(!mOptimizedCompactLayout || (panel.getMinimumHeight() + additionalHeight > panel.getPreferredHeight() || panel.getProgram().isOnAir())) {
panel.setHeight(panel.getPreferredHeight());
}
else {
panel.setHeight(panel.getMinimumHeight() + additionalHeight2);
}
internLastHeight = internHeight;
internHeight += panel.getHeight();
}
lastLayoutComponentList[col] = new LastLayoutComponent(list.get(list.size()-1),internLastHeight);
}
}