From 26ae8e72d28f16e641eef62fb4c7e1b13e9baa63 Mon Sep 17 00:00:00 2001 From: "Andrew C. Oliver" Date: Thu, 4 Jul 2002 16:27:36 +0000 Subject: [PATCH] fixed double borders (how far to draw line 2 if no vs a border), dashdot looks good PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@352755 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/hssf/contrib/view/SVBorder.java | 159 +++++++++++++++++- 1 file changed, 153 insertions(+), 6 deletions(-) diff --git a/src/contrib/src/org/apache/poi/hssf/contrib/view/SVBorder.java b/src/contrib/src/org/apache/poi/hssf/contrib/view/SVBorder.java index c786f5a86d..63c5c71cfd 100644 --- a/src/contrib/src/org/apache/poi/hssf/contrib/view/SVBorder.java +++ b/src/contrib/src/org/apache/poi/hssf/contrib/view/SVBorder.java @@ -53,11 +53,12 @@ public class SVBorder extends AbstractBorder { Color oldColor = g.getColor(); int i; + // System.err.println("northBorder="+northBorderType); paintNormalBorders(g, x, y, width, height); paintDottedBorders(g, x, y, width, height); paintDashedBorders(g, x, y, width, height); paintDoubleBorders(g, x, y, width, height); - + paintDashDotDotBorders(g, x, y, width, height); g.setColor(oldColor); @@ -290,8 +291,19 @@ public class SVBorder extends AbstractBorder { g.setColor(northColor); + int leftx=x; + int rightx=width; + + // if there are borders on the west or east then + // the second line shouldn't cross them + if (westBorder) + leftx = x+3; + + if (eastBorder) + rightx = width-3; + g.drawLine(x,y,width,y); - g.drawLine(x+3,y+2,width-3,y+2); + g.drawLine(leftx,y+2,rightx,y+2); } if (eastBorder && @@ -303,8 +315,17 @@ public class SVBorder extends AbstractBorder { g.setColor(eastColor); + int topy=y; + int bottomy=height; + + if (northBorder) + topy=y+3; + + if (southBorder) + bottomy=height-3; + g.drawLine(width-1,y,width-1,height); - g.drawLine(width-3,y+3,width-3,height-3); + g.drawLine(width-3,topy,width-3,bottomy); } if (southBorder && @@ -313,9 +334,18 @@ public class SVBorder extends AbstractBorder { g.setColor(southColor); + int leftx=y; + int rightx=width; + + if (westBorder) + leftx=x+3; + + if (eastBorder) + rightx=width-3; + g.drawLine(x,height - 1,width,height - 1); - g.drawLine(x+3,height - 3,width-3,height - 3); + g.drawLine(leftx,height - 3,rightx,height - 3); } if (westBorder && @@ -327,11 +357,122 @@ public class SVBorder extends AbstractBorder { g.setColor(westColor); - g.drawLine(x,y,x,height); - g.drawLine(x+2,y+2,x+2,height-3); + int topy=y; + int bottomy=height-3; + + if (northBorder) + topy=y+2; + + if (southBorder) + bottomy=height-3; + + g.drawLine(x,y,x,height); + g.drawLine(x+2,topy,x+2,bottomy); } } + + private void paintDashDotDotBorders(Graphics g, int x, int y, int width, + int height) { + if (northBorder && + ((northBorderType == HSSFCellStyle.BORDER_DASH_DOT_DOT) || + (northBorderType == HSSFCellStyle.BORDER_MEDIUM_DASH_DOT_DOT)) + ) { + int thickness = getThickness(northBorderType); + + g.setColor(northColor); + for (int l=x; l < width;) { + l=l+drawDashDotDot(g, l, y, thickness, true, true); + } + + } + + if (eastBorder && + ((eastBorderType == HSSFCellStyle.BORDER_DASH_DOT_DOT) || + (eastBorderType == HSSFCellStyle.BORDER_MEDIUM_DASH_DOT_DOT)) + ) { + + int thickness = getThickness(eastBorderType); + + g.setColor(eastColor); + + for (int l=y;l < height;) { + //System.err.println("drawing east"); + l=l+drawDashDotDot(g,width-1,l,thickness,false,false); + } + } + + if (southBorder && + ((southBorderType == HSSFCellStyle.BORDER_DASH_DOT_DOT) || + (southBorderType == HSSFCellStyle.BORDER_MEDIUM_DASH_DOT_DOT)) + ) { + + int thickness = getThickness(southBorderType); + + g.setColor(southColor); + + for (int l=x; l < width;) { + //System.err.println("drawing south"); + l=l+drawDashDotDot(g, l, height-1, thickness, true, false); + } + } + + if (westBorder && + ((westBorderType == HSSFCellStyle.BORDER_DASH_DOT_DOT) || + (westBorderType == HSSFCellStyle.BORDER_MEDIUM_DASH_DOT_DOT)) + ) { + + int thickness = getThickness(westBorderType); + + g.setColor(westColor); + + for (int l=y;l < height;) { + //System.err.println("drawing west"); + l=l+drawDashDotDot(g,x,l,thickness,false,true); + } + + } + } + + /** + * Draws one dash dot dot horizontally or vertically with thickness drawn + * incrementally to either the right or left. + * + * @param g graphics object for drawing with + * @param x the x origin of the line + * @param y the y origin of the line + * @param thickness the thickness of the line + * @param horizontal or vertical (true for horizontal) + * @param right/bottom or left/top thickness (true for right or top), + * if true then the x or y origin will be incremented to provide + * thickness, if false, they'll be decremented. For vertical + * borders, x is incremented or decremented, for horizontal its y. + * Just set to true for north and west, and false for east and + * south. + * @returns length - returns the length of the line. + */ + private int drawDashDotDot(Graphics g,int x, int y, int thickness, + boolean horizontal, + boolean rightBottom) { + + for (int t=0; t < thickness; t++) { + if (!rightBottom) { + t = 0 - t; //add negative thickness so we go the other way + //then we'll decrement instead of increment. + } + if (horizontal) { + g.drawLine(x,y+t,x+5,y+t); + g.drawLine(x+8,y+t,x+10,y+t); + g.drawLine(x+13,y+t,x+15,y+t); + } else { + g.drawLine(x+t,y,x+t,y+5); + g.drawLine(x+t,y+8,x+t,y+10); + g.drawLine(x+t,y+13,x+t,y+15); + } + } + return 18; + } + private int getThickness(int thickness) { int retval=1; switch (thickness) { @@ -347,6 +488,12 @@ public class SVBorder extends AbstractBorder { case HSSFCellStyle.BORDER_DASHED: retval=1; break; + case HSSFCellStyle.BORDER_DASH_DOT_DOT: + retval=1; + break; + case HSSFCellStyle.BORDER_MEDIUM_DASH_DOT_DOT: + retval=3; + break; case HSSFCellStyle.BORDER_HAIR: retval=1; break; -- 2.39.5