@ -49,6 +49,7 @@ import com.fr.stable.script.CalculatorUtils;
import com.fr.stable.unit.FU ;
import com.fr.stable.AssistUtils ;
import com.fr.third.antlr.ANTLRException ;
import com.fr.third.guava.collect.HashMultimap ;
import javax.swing.JComponent ;
import javax.swing.UIManager ;
@ -73,6 +74,7 @@ import java.awt.geom.Rectangle2D;
import java.util.ArrayList ;
import java.util.Iterator ;
import java.util.List ;
import java.util.Objects ;
public class GridUI extends ComponentUI {
@ -91,6 +93,7 @@ public class GridUI extends ComponentUI {
protected List paintCellElementList = new ArrayList ( ) ;
protected List paintCellElementRectangleList = new ArrayList ( ) ;
protected List paginateLineList = new ArrayList ( ) ; // 分页线
protected HashMultimap < CellPosition , Integer > mergeCellElementTable = HashMultimap . create ( ) ;
// 为了画白色的背景.
protected static Background WHITE_Backgorund = ColorBackground . getInstance ( Color . WHITE ) ;
// CellElementPainter
@ -247,7 +250,7 @@ public class GridUI extends ComponentUI {
- reportSettings . getFooterHeight ( ) . toPixD ( resolution ) ;
}
private void paintGridLine ( Graphics g , Grid grid , double realWidth , double realHeight ,
private void paintGridLine ( Graphics g , Grid grid , TemplateElementCase report , double realWidth , double realHeight ,
int resolution ) {
Graphics2D g2d = ( Graphics2D ) g ;
@ -257,22 +260,51 @@ public class GridUI extends ComponentUI {
// 分页线
paginateLineList . clear ( ) ;
// 合并单元格
mergeCellElementTable . clear ( ) ;
boolean isShowVerticalPaginateLine = grid . getPaginateLineShowType ( ) = = Grid . MULTIPLE_PAGINATE_LINE ;
boolean isShowHorizontalPaginateLine = grid . getPaginateLineShowType ( ) ! = Grid . NO_PAGINATE_LINE ;
new DrawVerticalLineHelper ( grid . getVerticalBeginValue ( ) , verticalEndValue ,
grid . isShowGridLine ( ) , isShowVerticalPaginateLine , rowHeightList , paperPaintHeight ,
paginateLineList , realWidth , resolution ) . iterateStart2End ( g2d ) ;
Iterator cells = report . intersect ( grid . getHorizontalBeginValue ( ) , grid . getVerticalBeginValue ( ) ,
horizontalEndValue - grid . getHorizontalBeginValue ( ) , verticalEndValue - grid . getVerticalBeginValue ( ) ) ;
while ( cells . hasNext ( ) ) {
TemplateCellElement cellElement = ( TemplateCellElement ) cells . next ( ) ;
if ( cellElement = = null ) {
continue ;
}
int columnSpan = cellElement . getColumnSpan ( ) ;
int rowSpan = cellElement . getRowSpan ( ) ;
if ( columnSpan > 1 | | rowSpan > 1 ) {
for ( int c = 0 ; c < columnSpan - 1 ; c + + ) {
for ( int r = 0 ; r < rowSpan ; r + + ) {
mergeCellElementTable . put ( CellPosition . value ( cellElement . getRow ( ) + r , cellElement . getColumn ( ) + c ) , CellPosition . RIGHT ) ;
}
}
for ( int r = 0 ; r < rowSpan - 1 ; r + + ) {
for ( int c = 0 ; c < columnSpan ; c + + ) {
mergeCellElementTable . put ( CellPosition . value ( cellElement . getRow ( ) + r , cellElement . getColumn ( ) + c ) , CellPosition . BOTTOM ) ;
}
}
}
}
GridRange gridRange = GridRange . range ( grid . getHorizontalBeginValue ( ) , horizontalEndValue , grid . getVerticalBeginValue ( ) , verticalEndValue )
. rangeList ( rowHeightList , columnWidthList )
. realSize ( realWidth , realHeight ) ;
new DrawHorizontalLineHelper ( grid . getHorizontalBeginValue ( ) , horizontalEndValue ,
grid . isShowGridLine ( ) , isShowHorizontalPaginateLine , columnWidthList , paperPaintWidth ,
paginateLineList , realHeight , resolution ) . iterateStart2End ( g2d ) ;
new DrawVerticalLineHelper ( gridRange , grid . isShowGridLine ( ) ,
isShowVerticalPaginateLine , paperPaintHeight ,
paginateLineList , resolution ) . iterateStart2End ( g2d ) ;
new DrawHorizontalLineHelper ( gridRange , grid . isShowGridLine ( ) ,
isShowHorizontalPaginateLine , paperPaintWidth ,
paginateLineList , resolution ) . iterateStart2End ( g2d ) ;
}
/ * *
* 最后处理
* /
@Override
public void finalize ( ) {
try {
super . finalize ( ) ;
@ -285,80 +317,34 @@ public class GridUI extends ComponentUI {
}
private static abstract class DrawLineHelper {
private int startIndex ;
private int endIndex ;
protected GridRange gridRange ;
private boolean showGridLine ;
private boolean showPaginateLine ;
protected boolean showGridLine ;
protected boolean showPaginateLine ;
private DynamicUnitList sizeList ;
private double paperPaintSize ;
protected double paperPaintSize ;
private List paginateLineList ;
protected List paginateLineList ;
Line2D tmpLine2D = new Line2D . Double ( 0 , 0 , 0 , 0 ) ;
private int resolution ;
protected int resolution ;
private static final double THRESHOLD = 1 . 0E - 4D ;
protected static final double THRESHOLD = 1 . 0E - 4D ;
DrawLineHelper ( int startIndex , int endIndex , boolean showGridLine ,
boolean showPaginateLine , DynamicUnitList sizeList , double paperPaintSize ,
DrawLineHelper ( GridRange gridRange , boolean showGridLine ,
boolean showPaginateLine , double paperPaintSize ,
List paginateLineList , int resolution ) {
this . startIndex = startIndex ;
this . endIndex = endIndex ;
this . gridRange = gridRange ;
this . showGridLine = showGridLine ;
this . showPaginateLine = showPaginateLine ;
this . sizeList = sizeList ;
this . paperPaintSize = paperPaintSize ;
this . paginateLineList = paginateLineList ;
this . resolution = resolution ;
}
protected void iterateStart2End ( Graphics2D g2d ) {
float tmpSize = 0 , paperSumSize = 0 , sumSize = 0 ;
for ( int i = 0 ; i < = endIndex ; i + + ) {
// denny: 开始
if ( i = = 0 ) {
i = startIndex ;
// denny: 增加从0到Grid左边被hide的列宽
for ( int k = 0 ; k < startIndex ; k + + ) {
tmpSize = sizeList . get ( k ) . toPixF ( resolution ) ;
paperSumSize + = tmpSize ;
if ( paperSumSize > = paperPaintSize ) {
paperSumSize = tmpSize ;
}
}
}
// adjust height.
tmpSize = sizeList . get ( i ) . toPixF ( resolution ) ;
paperSumSize + = tmpSize ;
if ( showGridLine ) { // paint line.
setLine2D ( ( int ) sumSize ) ;
g2d . draw ( tmpLine2D ) ;
}
// paint paper margin line.
if ( showPaginateLine & & paperSumSize - paperPaintSize > THRESHOLD ) {
paginateLineList . add ( getPaginateLine2D ( ( int ) sumSize ) ) ;
paperSumSize = tmpSize ;
}
sumSize + = tmpSize ;
}
// paint 最后一个横线..
if ( showGridLine ) {
drawLastLine ( g2d , ( int ) sumSize ) ;
}
}
protected abstract void setLine2D ( int sumSize ) ;
protected abstract void iterateStart2End ( Graphics2D g2d ) ;
protected abstract Line2D . Double getPaginateLine2D ( int sumSize ) ;
@ -366,14 +352,12 @@ public class GridUI extends ComponentUI {
}
private class DrawVerticalLineHelper extends DrawLineHelper {
private double realWidth ;
DrawVerticalLineHelper ( int startIndex , int endIndex , boolean showGridLine ,
boolean showPaginateLine , DynamicUnitList unitSizeList , double paperPaintSize ,
List paginateLineList , double realWidth , int resolution ) {
super ( startIndex , endIndex , showGridLine , showPaginateLine , unitSizeList ,
DrawVerticalLineHelper ( GridRange gridRange , boolean showGridLine ,
boolean showPaginateLine , double paperPaintSize ,
List paginateLineList , int resolution ) {
super ( gridRange , showGridLine , showPaginateLine ,
paperPaintSize , paginateLineList , resolution ) ;
this . realWidth = realWidth ;
}
@Override
@ -382,25 +366,58 @@ public class GridUI extends ComponentUI {
}
@Override
protected void setLine2D ( int sumHeight ) {
tmpLine2D . set Line( 0 , sumHeight , realWidth , sumHeight ) ;
protected void drawLastLine ( Graphics2D g2d , int sumHeight ) {
GraphHelper . draw Line( g2d , 0 , sumHeight , gridRange . realWidth , sumHeight ) ;
}
@Override
protected void drawLastLine ( Graphics2D g2d , int sumHeight ) {
GraphHelper . drawLine ( g2d , 0 , sumHeight , realWidth , sumHeight ) ;
protected void iterateStart2End ( Graphics2D g2d ) {
float rowHeight , paperYAxisSumSize = 0 , yAxisSumSize = 0 ;
for ( int i = 0 ; i < = gridRange . yEndIndex ; i + + ) {
if ( i = = 0 ) {
i = gridRange . yBeginIndex ;
for ( int k = 0 ; k < gridRange . yBeginIndex ; k + + ) {
rowHeight = gridRange . rowHeightList . get ( k ) . toPixF ( resolution ) ;
paperYAxisSumSize + = rowHeight ;
if ( paperYAxisSumSize > = paperPaintSize ) {
paperYAxisSumSize = rowHeight ;
}
}
}
rowHeight = gridRange . rowHeightList . get ( i ) . toPixF ( resolution ) ;
paperYAxisSumSize + = rowHeight ;
if ( showGridLine ) {
float columnWidth , xAxisSumSize = 0 ;
for ( int j = gridRange . xBeginIndex ; j < = gridRange . xEndIndex ; j + + ) {
columnWidth = gridRange . columnWidthList . get ( j ) . toPixF ( resolution ) ;
if ( ! mergeCellElementTable . get ( CellPosition . value ( i - 1 , j ) ) . contains ( CellPosition . BOTTOM ) ) {
tmpLine2D . setLine ( xAxisSumSize , yAxisSumSize , xAxisSumSize + columnWidth , yAxisSumSize ) ;
g2d . draw ( tmpLine2D ) ;
}
xAxisSumSize + = columnWidth ;
}
}
if ( showPaginateLine & & paperYAxisSumSize - paperPaintSize > THRESHOLD ) {
paginateLineList . add ( getPaginateLine2D ( ( int ) yAxisSumSize ) ) ;
paperYAxisSumSize = rowHeight ;
}
yAxisSumSize + = rowHeight ;
}
// paint 最后一个横线..
if ( showGridLine ) {
drawLastLine ( g2d , ( int ) yAxisSumSize ) ;
}
}
}
private class DrawHorizontalLineHelper extends DrawLineHelper {
private double realHeight ;
DrawHorizontalLineHelper ( int startIndex , int endIndex , boolean showGridLine ,
boolean showPaginateLine , DynamicUnitList unitSizeList , double paperPaintSize ,
List paginateLineList , double realHeight , int resolution ) {
super ( startIndex , endIndex , showGridLine , showPaginateLine , unitSizeList ,
DrawHorizontalLineHelper ( GridRange gridRange , boolean showGridLine ,
boolean showPaginateLine , double paperPaintSize ,
List paginateLineList , int resolution ) {
super ( gridRange , showGridLine , showPaginateLine ,
paperPaintSize , paginateLineList , resolution ) ;
this . realHeight = realHeight ;
}
@Override
@ -409,13 +426,47 @@ public class GridUI extends ComponentUI {
}
@Override
protected void setLine2D ( int sumWidth ) {
tmpLine2D . set Line( sumWidth , 0 , sumWidth , realHeight ) ;
protected void drawLastLine ( Graphics2D g2d , int sumWidth ) {
GraphHelper . draw Line( g2d , sumWidth , 0 , sumWidth , gridRange . realHeight ) ;
}
@Override
protected void drawLastLine ( Graphics2D g2d , int sumWidth ) {
GraphHelper . drawLine ( g2d , sumWidth , 0 , sumWidth , realHeight ) ;
protected void iterateStart2End ( Graphics2D g2d ) {
float columnWidth , paperXAxisSumSize = 0 , xAxisSumSize = 0 ;
for ( int i = 0 ; i < = gridRange . xEndIndex ; i + + ) {
if ( i = = 0 ) {
i = gridRange . xBeginIndex ;
for ( int k = 0 ; k < gridRange . xBeginIndex ; k + + ) {
columnWidth = gridRange . columnWidthList . get ( k ) . toPixF ( resolution ) ;
paperXAxisSumSize + = columnWidth ;
if ( paperXAxisSumSize > = paperPaintSize ) {
paperXAxisSumSize = columnWidth ;
}
}
}
columnWidth = gridRange . columnWidthList . get ( i ) . toPixF ( resolution ) ;
paperXAxisSumSize + = columnWidth ;
if ( showGridLine ) {
float rowHeight , yAxisSumSize = 0 ;
for ( int j = gridRange . yBeginIndex ; j < = gridRange . yEndIndex ; j + + ) {
rowHeight = gridRange . rowHeightList . get ( j ) . toPixF ( resolution ) ;
if ( ! mergeCellElementTable . get ( CellPosition . value ( j , i - 1 ) ) . contains ( CellPosition . RIGHT ) ) {
tmpLine2D . setLine ( xAxisSumSize , yAxisSumSize , xAxisSumSize , yAxisSumSize + rowHeight ) ;
g2d . draw ( tmpLine2D ) ;
}
yAxisSumSize + = rowHeight ;
}
}
if ( showPaginateLine & & paperXAxisSumSize - paperPaintSize > THRESHOLD ) {
paginateLineList . add ( getPaginateLine2D ( ( int ) xAxisSumSize ) ) ;
paperXAxisSumSize = columnWidth ;
}
xAxisSumSize + = columnWidth ;
}
// paint 最后一个横线..
if ( showGridLine ) {
drawLastLine ( g2d , ( int ) xAxisSumSize ) ;
}
}
}
@ -482,18 +533,6 @@ public class GridUI extends ComponentUI {
// peter:tmpRectangle2D_3只是一个临时的Rectangle2D,由于后面不少地方需要用到这个矩形
this . cell_back_rect . setRect ( 0 , 0 , this . tmpRectangle . getWidth ( ) - 1 ,
this . tmpRectangle . getHeight ( ) - 1 . 5 ) ;
// peter:对于合并的单元格,需要先白色的背景来清除背景.
if ( tmpCellElement . getColumnSpan ( ) > 1 | | tmpCellElement . getRowSpan ( ) > 1 ) {
// REPORT-23492 要看下是否设置了纸张背景 如果设置了按照背景来画
ReportSettingsProvider reportSettings = getReportSettings ( report ) ;
Background currentBackground = reportSettings . getBackground ( ) ;
if ( currentBackground ! = null ) {
currentBackground . paint ( g2d , this . cell_back_rect ) ;
} else {
WHITE_Backgorund . paint ( g2d , this . cell_back_rect ) ;
}
//daniel:上面这里就有问题了啊....报表的背景在这个之前画的 会覆盖报表背景....不过只是设计器中看到预览浏览没问题
}
// peter:将这个元素添加到需要paint的元素列表当中去,留着画边框线..
paintCellElementList . add ( tmpCellElement ) ;
paintCellElementRectangleList . add ( this . tmpRectangle . clone ( ) ) ;
@ -1093,8 +1132,7 @@ public class GridUI extends ComponentUI {
this . paintBackground ( g2d , grid , elementCase , resolution ) ;
// 画Grid Line
this . paintGridLine ( g2d , grid , realWidth , realHeight , resolution ) ;
this . paintGridLine ( g2d , grid , elementCase , realWidth , realHeight , resolution ) ;
// peter:添上线程的支持,有时候,paint元素的时候,可能会有元素被删除了.
// 需要先清除画Border需要的元素.
paintCellElementList . clear ( ) ;
@ -1277,4 +1315,101 @@ public class GridUI extends ComponentUI {
paginateLineList . add ( new Line2D . Double ( 0 , sumHeight , width , sumHeight ) ) ;
}
}
/ * *
* 描述单元格位置的POJO
* /
private static class CellPosition {
public final static int TOP = 0 ;
public static final int LEFT = 1 ;
public final static int BOTTOM = 2 ;
public static final int RIGHT = 4 ;
public int x ;
public int y ;
public CellPosition ( int x , int y ) {
this . x = x ;
this . y = y ;
}
public static CellPosition value ( int x , int y ) {
return new CellPosition ( x , y ) ;
}
@Override
public boolean equals ( Object o ) {
if ( this = = o ) {
return true ;
}
if ( o = = null | | getClass ( ) ! = o . getClass ( ) ) {
return false ;
}
CellPosition that = ( CellPosition ) o ;
return x = = that . x & & y = = that . y ;
}
@Override
public int hashCode ( ) {
return Objects . hash ( x , y ) ;
}
}
/ * *
* 描述表格范围的POJO
* x轴为水平方向 , 对应的宽度表为列宽列表
* y轴为垂直方向 , 对应的宽度表为行高列表
* /
private static class GridRange {
public int xBeginIndex ;
public int xEndIndex ;
public int yBeginIndex ;
public int yEndIndex ;
double realWidth ;
double realHeight ;
/ * *
* 行高列表 , 对应y方向线段
* /
public DynamicUnitList rowHeightList ;
/ * *
* 列宽列表 , 对应x方向线段
* /
public DynamicUnitList columnWidthList ;
public GridRange ( int xBeginIndex , int xEndIndex , int yBeginIndex , int yEndIndex ) {
this . xBeginIndex = xBeginIndex ;
this . xEndIndex = xEndIndex ;
this . yBeginIndex = yBeginIndex ;
this . yEndIndex = yEndIndex ;
}
/ * *
* 设置行高列宽列表
*
* @param rowHeightList 行高列表
* @param columnWidthList 列宽列表
* /
public GridRange rangeList ( DynamicUnitList rowHeightList , DynamicUnitList columnWidthList ) {
this . rowHeightList = rowHeightList ;
this . columnWidthList = columnWidthList ;
return this ;
}
/ * *
* 设置表格真实宽高
*
* @param realWidth 宽度
* @param realHeight 高度
* /
public GridRange realSize ( double realWidth , double realHeight ) {
this . realWidth = realWidth ;
this . realHeight = realHeight ;
return this ;
}
public static GridRange range ( int xBeginIndex , int xEndIndex , int yBeginIndex , int yEndIndex ) {
return new GridRange ( xBeginIndex , xEndIndex , yBeginIndex , yEndIndex ) ;
}
}
}