You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

137 lines
5.3 KiB

/*******************************************************************************
* Copyright 2017 Bstek
*
* 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 com.bstek.ureport.export.builder.right;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.bstek.ureport.Range;
import com.bstek.ureport.definition.BlankCellInfo;
import com.bstek.ureport.definition.CellDefinition;
import com.bstek.ureport.parser.BuildUtils;
/**
* @author Jacky.gao
* @since 2017年2月27日
*/
public class TopParentCellCreator {
public List<Range> buildParentCells(CellDefinition cell){
List<Range> rangeList=new ArrayList<Range>();
Range childRange=buildChildrenCellRange(cell);
List<CellDefinition> parentCells=new ArrayList<CellDefinition>();
collectParentCells(cell,parentCells);
buildParents(cell, parentCells, childRange, rangeList);
return rangeList;
}
private void collectParentCells(CellDefinition cell,List<CellDefinition> parentCells){
CellDefinition topParentCell=cell.getTopParentCell();
if(topParentCell==null){
return;
}
parentCells.add(topParentCell);
collectParentCells(topParentCell,parentCells);
}
private void buildParents(CellDefinition mainCell,List<CellDefinition> parentCells,Range childRange,List<Range> rangeList){
int colNumberStart=mainCell.getColumnNumber();
int colNumberEnd=BuildUtils.buildColNumberEnd(mainCell, colNumberStart);
rangeList.add(new Range(colNumberStart,colNumberEnd));
int start=childRange.getStart(),end=childRange.getEnd();
Map<String,BlankCellInfo> newBlankCellsMap=mainCell.getNewBlankCellsMap();
boolean increase=true;
for(CellDefinition parentCell:parentCells){
String parentCellName=parentCell.getName();
int parentColNumberStart=parentCell.getColumnNumber();
int parentColNumberEnd=BuildUtils.buildColNumberEnd(parentCell,parentColNumberStart);
int offset=parentColNumberStart-colNumberStart;
int parentColSpan=parentCell.getColSpan();
boolean isOut=assertOut(parentCell, mainCell, childRange);
if(isOut){
increase=false;
boolean doBlank=assertDoBlank(parentCell.getTopParentCell(), parentCell, mainCell, childRange);
if(doBlank){
newBlankCellsMap.put(parentCellName, new BlankCellInfo(offset,parentColSpan,true));
rangeList.add(new Range(parentColNumberStart,parentColNumberEnd));
}
continue;
}
if((start!=-1 && start<parentColNumberStart) || end>parentColNumberEnd){
newBlankCellsMap.put(parentCellName, new BlankCellInfo(offset,parentColSpan,true));
rangeList.add(new Range(parentColNumberStart,parentColNumberEnd));
increase=false;
continue;
}
if(increase){
mainCell.getIncreaseSpanCellNames().add(parentCellName);
}else{
newBlankCellsMap.put(parentCellName, new BlankCellInfo(offset,parentColSpan,true));
rangeList.add(new Range(parentColNumberStart,parentColNumberEnd));
}
}
}
private boolean assertDoBlank(CellDefinition nextParentCell,CellDefinition parentCell,CellDefinition mainCell,Range childRange){
if(nextParentCell==null){
return false;
}
boolean isOut=assertOut(nextParentCell, mainCell, childRange);
if(isOut){
return assertDoBlank(nextParentCell.getTopParentCell(), parentCell, mainCell, childRange);
}
int start=parentCell.getColumnNumber(),end=BuildUtils.buildColNumberEnd(parentCell, start);
int nextStart=nextParentCell.getColumnNumber();
if(nextStart<=end){
return true;
}
return assertDoBlank(nextParentCell.getTopParentCell(), parentCell, mainCell, childRange);
}
private boolean assertOut(CellDefinition parentCell,CellDefinition mainCell,Range childRange){
int start=parentCell.getColumnNumber(),end=BuildUtils.buildColNumberEnd(parentCell, start);
int rangeStart=childRange.getStart(),rangeEnd=childRange.getEnd();
if(rangeStart!=-1){
if((start>=rangeStart && start<=rangeEnd) || (end>=rangeStart && end<=rangeEnd)){
return false;
}
}
int colStart=mainCell.getColumnNumber(),colEnd=BuildUtils.buildColNumberEnd(mainCell, colStart);
if((start>=colStart && start<=colEnd) || (end>=colStart && end<=colEnd) || (start<=colStart && end>=colEnd)){
return false;
}
return true;
}
private Range buildChildrenCellRange(CellDefinition mainCell){
Range range=new Range();
List<CellDefinition> childrenCells=mainCell.getColumnChildrenCells();
for(CellDefinition childCell:childrenCells){
int childColumnNumberStart=childCell.getColumnNumber();
int childColSpan=childCell.getColSpan();
childColSpan=childColSpan>0 ? childColSpan-1 :childColSpan;
int childColumnNumberEnd=childColumnNumberStart+childColSpan;
if(range.getStart()==-1 || childColumnNumberStart<range.getStart()){
range.setStart(childColumnNumberStart);
}
if(childColumnNumberEnd>range.getEnd()){
range.setEnd(childColumnNumberEnd);
}
}
return range;
}
}