]> source.dussan.org Git - poi.git/commitdiff
Awesome work from Jason Height http://nagoya.apache.org/bugzilla/show_bug.cgi?id...
authorAndrew C. Oliver <acoliver@apache.org>
Mon, 15 Jul 2002 01:27:17 +0000 (01:27 +0000)
committerAndrew C. Oliver <acoliver@apache.org>
Mon, 15 Jul 2002 01:27:17 +0000 (01:27 +0000)
PR:
Obtained from:
Submitted by:
Reviewed by:

git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@352771 13f79535-47bb-0310-9956-ffa450edef68

src/contrib/src/org/apache/poi/hssf/contrib/view/SVBorder.java
src/contrib/src/org/apache/poi/hssf/contrib/view/SVTableCellRenderer.java

index 63c5c71cfd119a366d9b12aca43eeb02eb0e39fb..866dff6be1f473169e7185ba9ba06eec0e284b54 100644 (file)
@@ -1,10 +1,6 @@
 package org.apache.poi.hssf.contrib.view;
 
-import java.awt.Graphics;
-import java.awt.Insets;
-import java.awt.Rectangle;
-import java.awt.Color;
-import java.awt.Component;
+import java.awt.*;
 
 import javax.swing.border.AbstractBorder;
 
@@ -15,91 +11,105 @@ import org.apache.poi.hssf.usermodel.HSSFCellStyle;
  *
  */
 public class SVBorder extends AbstractBorder {
-   Color northColor = null;
-   Color eastColor = null;
-   Color southColor = null; 
-   Color westColor = null;
-   int northBorderType;
-   int eastBorderType;
-   int southBorderType;
-   int westBorderType;
-   boolean northBorder=false;
-   boolean eastBorder=false;
-   boolean southBorder=false;
-   boolean westBorder=false;
-
-   public SVBorder(Color northColor, Color eastColor, 
-                   Color southColor, Color westColor,
-                   int northBorderType, int eastBorderType,
-                   int southBorderType, int westBorderType, 
-                   boolean northBorder, boolean eastBorder,
-                   boolean southBorder, boolean westBorder) {
-     this.northColor = northColor;
+  private Color northColor = null;
+  private Color eastColor = null;
+  private Color southColor = null;
+  private Color westColor = null;
+  private int northBorderType = HSSFCellStyle.BORDER_NONE;
+  private int eastBorderType =HSSFCellStyle.BORDER_NONE;
+  private int southBorderType = HSSFCellStyle.BORDER_NONE;
+  private int westBorderType = HSSFCellStyle.BORDER_NONE;
+  private boolean northBorder=false;
+  private boolean eastBorder=false;
+  private boolean southBorder=false;
+  private boolean westBorder=false;
+  private boolean selected = false;
+
+   public void setBorder(Color northColor, Color eastColor,
+                         Color southColor, Color westColor,
+                         int northBorderType, int eastBorderType,
+                         int southBorderType, int westBorderType,
+                         boolean selected) {
      this.eastColor = eastColor;
      this.southColor = southColor;
      this.westColor = westColor;
      this.northBorderType = northBorderType;
      this.eastBorderType = eastBorderType;
      this.southBorderType = southBorderType;
-     this.westBorderType = westBorderType; 
-     this.northBorder=northBorder;
-     this.eastBorder=eastBorder;
-     this.southBorder=southBorder;
-     this.westBorder=westBorder;
+     this.westBorderType = westBorderType;
+     this.northBorder=northBorderType != HSSFCellStyle.BORDER_NONE;
+     this.eastBorder=eastBorderType != HSSFCellStyle.BORDER_NONE;
+     this.southBorder=southBorderType != HSSFCellStyle.BORDER_NONE;
+     this.westBorder=westBorderType != HSSFCellStyle.BORDER_NONE;
+     this.selected = selected;
    }
 
    public void paintBorder(Component c, Graphics g, int x, int y, int width,
                            int height) {
       Color oldColor = g.getColor();
-      int i;
 
-    // System.err.println("northBorder="+northBorderType);
-     paintNormalBorders(g, x, y, width, height); 
-     paintDottedBorders(g, x, y, width, height); 
+
+     paintSelectedBorder(g, x, y, width, height);
+     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);    
+     g.setColor(oldColor);
    }
 
-   private void paintNormalBorders(Graphics g, int x, int y, int width, 
+   private void paintSelectedBorder(Graphics g, int x, int y, int width,
                                   int height) {
-       
-      if (northBorder && 
+     if (selected) {
+       //Need to setup thickness of 2
+       g.setColor(Color.black);
+       //paint the border
+       g.drawRect(x,y,width-1,height-1);
+
+       //paint the filled rectangle at the bottom left hand position
+       g.fillRect(x+width-5, y+height-5, 5, 5);
+     }
+   }
+
+
+   private void paintNormalBorders(Graphics g, int x, int y, int width,
+                                  int height) {
+
+      if (northBorder &&
              ((northBorderType == HSSFCellStyle.BORDER_THIN) ||
               (northBorderType == HSSFCellStyle.BORDER_MEDIUM) ||
-              (northBorderType == HSSFCellStyle.BORDER_THICK) 
+              (northBorderType == HSSFCellStyle.BORDER_THICK)
              )
          ) {
 
         int thickness = getThickness(northBorderType);
 
-       g.setColor(northColor); 
+       g.setColor(northColor);
 
         for (int k=0; k < thickness; k++) {
            g.drawLine(x,y+k,width,y+k);
         }
       }
 
-      if (eastBorder && 
+      if (eastBorder &&
              ((eastBorderType == HSSFCellStyle.BORDER_THIN) ||
               (eastBorderType == HSSFCellStyle.BORDER_MEDIUM) ||
-              (eastBorderType == HSSFCellStyle.BORDER_THICK) 
+              (eastBorderType == HSSFCellStyle.BORDER_THICK)
              )
          ) {
 
         int thickness = getThickness(eastBorderType);
 
-       g.setColor(eastColor); 
+       g.setColor(eastColor);
 
         for (int k=0; k < thickness; k++) {
            g.drawLine(width-k,y,width-k,height);
         }
       }
 
-      if (southBorder && 
+      if (southBorder &&
               ((southBorderType == HSSFCellStyle.BORDER_THIN) ||
                (southBorderType == HSSFCellStyle.BORDER_MEDIUM) ||
                (southBorderType == HSSFCellStyle.BORDER_THICK)
@@ -108,22 +118,22 @@ public class SVBorder extends AbstractBorder {
 
         int thickness = getThickness(southBorderType);
 
-       g.setColor(southColor); 
+       g.setColor(southColor);
         for (int k=0; k < thickness; k++) {
            g.drawLine(x,height - k,width,height - k);
         }
       }
 
-      if (westBorder && 
+      if (westBorder &&
              ((westBorderType == HSSFCellStyle.BORDER_THIN) ||
               (westBorderType == HSSFCellStyle.BORDER_MEDIUM) ||
-              (westBorderType == HSSFCellStyle.BORDER_THICK) 
+              (westBorderType == HSSFCellStyle.BORDER_THICK)
              )
          ) {
 
         int thickness = getThickness(westBorderType);
 
-       g.setColor(westColor); 
+       g.setColor(westColor);
 
         for (int k=0; k < thickness; k++) {
            g.drawLine(x+k,y,x+k,height);
@@ -131,13 +141,13 @@ public class SVBorder extends AbstractBorder {
       }
    }
 
-   private void paintDottedBorders(Graphics g, int x, int y, int width, 
+   private void paintDottedBorders(Graphics g, int x, int y, int width,
                                   int height) {
-      if (northBorder && 
+      if (northBorder &&
              northBorderType == HSSFCellStyle.BORDER_DOTTED) {
         int thickness = getThickness(northBorderType);
 
-       g.setColor(northColor); 
+       g.setColor(northColor);
 
         for (int k=0; k < thickness; k++) {
            for (int xc = x; xc < width; xc=xc+2) {
@@ -146,14 +156,14 @@ public class SVBorder extends AbstractBorder {
         }
       }
 
-      if (eastBorder && 
+      if (eastBorder &&
               eastBorderType == HSSFCellStyle.BORDER_DOTTED
          ) {
 
         int thickness = getThickness(eastBorderType);
         thickness++; //need for dotted borders to show up east
 
-       g.setColor(eastColor); 
+       g.setColor(eastColor);
 
         for (int k=0; k < thickness; k++) {
            for (int yc=y;yc < height; yc=yc+2) {
@@ -162,13 +172,13 @@ public class SVBorder extends AbstractBorder {
         }
       }
 
-      if (southBorder && 
+      if (southBorder &&
               southBorderType == HSSFCellStyle.BORDER_DOTTED
          ) {
 
         int thickness = getThickness(southBorderType);
         thickness++;
-       g.setColor(southColor); 
+       g.setColor(southColor);
         for (int k=0; k < thickness; k++) {
            for (int xc = x; xc < width; xc=xc+2) {
              g.drawLine(xc,height-k,xc,height-k);
@@ -176,14 +186,14 @@ public class SVBorder extends AbstractBorder {
         }
       }
 
-      if (westBorder && 
+      if (westBorder &&
             westBorderType == HSSFCellStyle.BORDER_DOTTED
          ) {
 
         int thickness = getThickness(westBorderType);
 //        thickness++;
 
-       g.setColor(westColor); 
+       g.setColor(westColor);
 
         for (int k=0; k < thickness; k++) {
            for (int yc=y;yc < height; yc=yc+2) {
@@ -194,20 +204,20 @@ public class SVBorder extends AbstractBorder {
    }
 
 
-   private void paintDashedBorders(Graphics g, int x, int y, int width, 
+   private void paintDashedBorders(Graphics g, int x, int y, int width,
                                   int height) {
-      if (northBorder && 
+      if (northBorder &&
              ((northBorderType == HSSFCellStyle.BORDER_DASHED) ||
               (northBorderType == HSSFCellStyle.BORDER_HAIR))
          ) {
         int thickness = getThickness(northBorderType);
 
         int dashlength = 1;
-       
+
         if (northBorderType == HSSFCellStyle.BORDER_DASHED)
-           dashlength = 2; 
+           dashlength = 2;
 
-       g.setColor(northColor); 
+       g.setColor(northColor);
 
         for (int k=0; k < thickness; k++) {
            for (int xc = x; xc < width; xc=xc+5) {
@@ -216,9 +226,9 @@ public class SVBorder extends AbstractBorder {
         }
       }
 
-      if (eastBorder && 
+      if (eastBorder &&
               ((eastBorderType == HSSFCellStyle.BORDER_DASHED) ||
-               (eastBorderType == HSSFCellStyle.BORDER_HAIR)) 
+               (eastBorderType == HSSFCellStyle.BORDER_HAIR))
          ) {
 
         int thickness = getThickness(eastBorderType);
@@ -226,11 +236,11 @@ public class SVBorder extends AbstractBorder {
 
 
         int dashlength = 1;
-       
+
         if (eastBorderType == HSSFCellStyle.BORDER_DASHED)
-           dashlength = 2; 
+           dashlength = 2;
 
-       g.setColor(eastColor); 
+       g.setColor(eastColor);
 
         for (int k=0; k < thickness; k++) {
            for (int yc=y;yc < height; yc=yc+5) {
@@ -239,7 +249,7 @@ public class SVBorder extends AbstractBorder {
         }
       }
 
-      if (southBorder && 
+      if (southBorder &&
               ((southBorderType == HSSFCellStyle.BORDER_DASHED) ||
                (southBorderType == HSSFCellStyle.BORDER_HAIR))
          ) {
@@ -248,11 +258,11 @@ public class SVBorder extends AbstractBorder {
         thickness++;
 
         int dashlength = 1;
-       
+
         if (southBorderType == HSSFCellStyle.BORDER_DASHED)
-           dashlength = 2; 
+           dashlength = 2;
 
-       g.setColor(southColor); 
+       g.setColor(southColor);
         for (int k=0; k < thickness; k++) {
            for (int xc = x; xc < width; xc=xc+5) {
              g.drawLine(xc,height-k,xc+dashlength,height-k);
@@ -260,7 +270,7 @@ public class SVBorder extends AbstractBorder {
         }
       }
 
-      if (westBorder && 
+      if (westBorder &&
             ((westBorderType == HSSFCellStyle.BORDER_DASHED) ||
              (westBorderType == HSSFCellStyle.BORDER_HAIR))
          ) {
@@ -269,11 +279,11 @@ public class SVBorder extends AbstractBorder {
 //        thickness++;
 
         int dashlength = 1;
-       
+
         if (westBorderType == HSSFCellStyle.BORDER_DASHED)
-           dashlength = 2; 
+           dashlength = 2;
 
-       g.setColor(westColor); 
+       g.setColor(westColor);
 
         for (int k=0; k < thickness; k++) {
            for (int yc=y;yc < height; yc=yc+5) {
@@ -284,12 +294,12 @@ public class SVBorder extends AbstractBorder {
    }
 
 
-   private void paintDoubleBorders(Graphics g, int x, int y, int width, 
+   private void paintDoubleBorders(Graphics g, int x, int y, int width,
                                   int height) {
-      if (northBorder && 
+      if (northBorder &&
              northBorderType == HSSFCellStyle.BORDER_DOUBLE) {
 
-       g.setColor(northColor); 
+       g.setColor(northColor);
 
         int leftx=x;
         int rightx=width;
@@ -306,56 +316,56 @@ public class SVBorder extends AbstractBorder {
            g.drawLine(leftx,y+2,rightx,y+2);
       }
 
-      if (eastBorder && 
+      if (eastBorder &&
               eastBorderType == HSSFCellStyle.BORDER_DOUBLE
          ) {
 
         int thickness = getThickness(eastBorderType);
         thickness++; //need for dotted borders to show up east
 
-       g.setColor(eastColor); 
+       g.setColor(eastColor);
 
         int topy=y;
         int bottomy=height;
 
         if (northBorder)
           topy=y+3;
+
         if (southBorder)
-            bottomy=height-3; 
+            bottomy=height-3;
 
         g.drawLine(width-1,y,width-1,height);
         g.drawLine(width-3,topy,width-3,bottomy);
       }
 
-      if (southBorder && 
+      if (southBorder &&
               southBorderType == HSSFCellStyle.BORDER_DOUBLE
          ) {
 
-       g.setColor(southColor); 
+       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(leftx,height - 3,rightx,height - 3);
       }
 
-      if (westBorder && 
+      if (westBorder &&
             westBorderType == HSSFCellStyle.BORDER_DOUBLE
          ) {
 
         int thickness = getThickness(westBorderType);
 //        thickness++;
 
-       g.setColor(westColor); 
+       g.setColor(westColor);
 
         int topy=y;
         int bottomy=height-3;
@@ -372,29 +382,29 @@ public class SVBorder extends AbstractBorder {
    }
 
 
-   private void paintDashDotDotBorders(Graphics g, int x, int y, int width, 
+   private void paintDashDotDotBorders(Graphics g, int x, int y, int width,
                                   int height) {
-      if (northBorder && 
+      if (northBorder &&
              ((northBorderType == HSSFCellStyle.BORDER_DASH_DOT_DOT) ||
               (northBorderType == HSSFCellStyle.BORDER_MEDIUM_DASH_DOT_DOT))
          ) {
         int thickness = getThickness(northBorderType);
 
-       g.setColor(northColor); 
+       g.setColor(northColor);
         for (int l=x; l < width;) {
           l=l+drawDashDotDot(g, l, y, thickness, true, true);
         }
 
       }
 
-      if (eastBorder && 
+      if (eastBorder &&
               ((eastBorderType == HSSFCellStyle.BORDER_DASH_DOT_DOT) ||
                (eastBorderType == HSSFCellStyle.BORDER_MEDIUM_DASH_DOT_DOT))
          ) {
 
         int thickness = getThickness(eastBorderType);
 
-       g.setColor(eastColor); 
+       g.setColor(eastColor);
 
         for (int l=y;l < height;) {
           //System.err.println("drawing east");
@@ -402,14 +412,14 @@ public class SVBorder extends AbstractBorder {
         }
       }
 
-      if (southBorder && 
+      if (southBorder &&
               ((southBorderType == HSSFCellStyle.BORDER_DASH_DOT_DOT) ||
                (southBorderType == HSSFCellStyle.BORDER_MEDIUM_DASH_DOT_DOT))
          ) {
 
         int thickness = getThickness(southBorderType);
 
-       g.setColor(southColor); 
+       g.setColor(southColor);
 
         for (int l=x; l < width;) {
           //System.err.println("drawing south");
@@ -417,14 +427,14 @@ public class SVBorder extends AbstractBorder {
         }
       }
 
-      if (westBorder && 
+      if (westBorder &&
             ((westBorderType == HSSFCellStyle.BORDER_DASH_DOT_DOT) ||
              (westBorderType == HSSFCellStyle.BORDER_MEDIUM_DASH_DOT_DOT))
          ) {
 
         int thickness = getThickness(westBorderType);
 
-       g.setColor(westColor); 
+       g.setColor(westColor);
 
         for (int l=y;l < height;) {
           //System.err.println("drawing west");
@@ -436,25 +446,25 @@ public class SVBorder extends AbstractBorder {
 
    /**
     *  Draws one dash dot dot horizontally or vertically with thickness drawn
-    *  incrementally to either the right or left. 
+    *  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 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 
+    *         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 
+    *         Just set to true for north and west, and false for east and
     *         south.
-    *  @returns length - returns the length of the line.  
+    *  @returns length - returns the length of the line.
     */
-   private int drawDashDotDot(Graphics g,int x, int y, int thickness, 
+   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
@@ -500,7 +510,7 @@ public class SVBorder extends AbstractBorder {
            default:
              retval=1;
        }
-       return retval; 
+       return retval;
    }
 
 
index 6b3a1128083820f49e51047ec88742ed027d5d2c..91b03ea1b8f5fb52cf24008cf0001fbe43620dc1 100644 (file)
@@ -67,15 +67,11 @@ import java.awt.Rectangle;
 import java.awt.Font;
 
 import java.io.Serializable;
+import java.text.*;
 
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.usermodel.HSSFSheet;
-import org.apache.poi.hssf.usermodel.HSSFRow;
-import org.apache.poi.hssf.usermodel.HSSFCell;
-import org.apache.poi.hssf.usermodel.HSSFCellStyle;
-import org.apache.poi.hssf.usermodel.HSSFFont;
+import org.apache.poi.hssf.usermodel.*;
 import org.apache.poi.hssf.util.HSSFColor;
-import org.apache.poi.hssf.util.HSSFColor.WHITE;
+
 
 
 /**
@@ -87,10 +83,93 @@ import org.apache.poi.hssf.util.HSSFColor.WHITE;
 public class SVTableCellRenderer extends JLabel
     implements TableCellRenderer, Serializable
 {
+  private static final Color black = getAWTColor(new HSSFColor.BLACK());
+  private static final Color white = getAWTColor(new HSSFColor.WHITE());
+
     protected static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);
+    protected SVBorder cellBorder = new SVBorder();
+
+
     private HSSFWorkbook wb = null;
     private Hashtable colors = HSSFColor.getIndexHash();
 
+    /** This class holds the references to the predefined cell formats.
+     */
+    private class CellFormatter {
+      private Format[] textFormatter;
+
+      private DecimalFormat generalNumberFormat = new DecimalFormat("0");
+
+      public CellFormatter() {
+        textFormatter = new Format[0x31];
+
+        textFormatter[0x01] = new DecimalFormat("0");
+        textFormatter[0x02] = new DecimalFormat("0.00");
+        textFormatter[0x03] = new DecimalFormat("#,##0");
+        textFormatter[0x04] = new DecimalFormat("#,##0.00");
+        textFormatter[0x05] = new DecimalFormat("$#,##0;$#,##0");
+        textFormatter[0x06] = new DecimalFormat("$#,##0;$#,##0");
+        textFormatter[0x07] = new DecimalFormat("$#,##0.00;$#,##0.00");
+        textFormatter[0x08] = new DecimalFormat("$#,##0.00;$#,##0.00");
+        textFormatter[0x09] = new DecimalFormat("0%");
+        textFormatter[0x0A] = new DecimalFormat("0.00%");
+        textFormatter[0x0B] = new DecimalFormat("0.00E0");
+//??        textFormatter[0x0C] = new DecimalFormat("# ?/?");
+//??        textFormatter[0x0D] = new DecimalFormat("# ??/??");
+        textFormatter[0x0E] = new SimpleDateFormat("M/d/yy");
+        textFormatter[0x0F] = new SimpleDateFormat("d-MMM-yy");
+        textFormatter[0x10] = new SimpleDateFormat("d-MMM");
+        textFormatter[0x11] = new SimpleDateFormat("MMM-yy");
+        textFormatter[0x12] = new SimpleDateFormat("h:mm a");
+        textFormatter[0x13] = new SimpleDateFormat("h:mm:ss a");
+        textFormatter[0x14] = new SimpleDateFormat("h:mm");
+        textFormatter[0x15] = new SimpleDateFormat("h:mm:ss");
+        textFormatter[0x16] = new SimpleDateFormat("M/d/yy h:mm");
+        // 0x17 - 0x24 reserved for international and undocumented 0x25, "(#,##0_);(#,##0)"
+        //start at 0x26
+        //jmh need to do colour
+        //"(#,##0_);[Red](#,##0)"
+        textFormatter[0x26] = new DecimalFormat("#,##0;#,##0");
+        //jmh need to do colour
+        //(#,##0.00_);(#,##0.00)
+        textFormatter[0x27] = new DecimalFormat("#,##0.00;#,##0.00");
+        textFormatter[0x28] = new DecimalFormat("#,##0.00;#,##0.00");
+//??        textFormatter[0x29] = new DecimalFormat("_(*#,##0_);_(*(#,##0);_(* \"-\"_);_(@_)");
+//??        textFormatter[0x2A] = new DecimalFormat("_($*#,##0_);_($*(#,##0);_($* \"-\"_);_(@_)");
+//??        textFormatter[0x2B] = new DecimalFormat("_(*#,##0.00_);_(*(#,##0.00);_(*\"-\"??_);_(@_)");
+//??        textFormatter[0x2C] = new DecimalFormat("_($*#,##0.00_);_($*(#,##0.00);_($*\"-\"??_);_(@_)");
+        textFormatter[0x2D] = new SimpleDateFormat("mm:ss");
+//??        textFormatter[0x2E] = new SimpleDateFormat("[h]:mm:ss");
+        textFormatter[0x2F] = new SimpleDateFormat("mm:ss.0");
+        textFormatter[0x30] = new DecimalFormat("##0.0E0");
+      }
+
+      public String format(short index, Object value) {
+        if (index == 0)
+          return value.toString();
+        if (textFormatter[index] == null)
+          throw new RuntimeException("Sorry. I cant handle the format code :"+Integer.toHexString(index));
+        return textFormatter[index].format(value);
+      }
+
+      public String format(short index, double value) {
+        if (index == 0)
+          return generalNumberFormat.format(value);
+        if (textFormatter[index] == null)
+          throw new RuntimeException("Sorry. I cant handle the format code :"+Integer.toHexString(index));
+        if (textFormatter[index] instanceof DecimalFormat) {
+          return ((DecimalFormat)textFormatter[index]).format(value);
+        }
+        else throw new RuntimeException("Sorry. I cant handle a non decimal formatter for a decimal value :"+Integer.toHexString(index));
+      }
+
+      public boolean useRedColor(short index, double value) {
+        return (((index == 0x06)||(index == 0x08)||(index == 0x26) || (index == 0x27)) && (value < 0));
+      }
+    }
+
+    private final CellFormatter cellFormatter = new CellFormatter();
+
     public SVTableCellRenderer(HSSFWorkbook wb) {
        super();
        setOpaque(true);
@@ -102,17 +181,11 @@ public class SVTableCellRenderer extends JLabel
                           boolean isSelected, boolean hasFocus, int row, int column) {
        boolean isBorderSet = false;
 
-       if (isSelected) {
-          setForeground(table.getSelectionForeground());
-          setBackground(table.getSelectionBackground());
-       }
-
         //If the JTables default cell renderer has been setup correctly the
         //value will be the HSSFCell that we are trying to render
         HSSFCell c = (HSSFCell)value;
 
         if (c != null) {
-
           HSSFCellStyle s = c.getCellStyle();
           HSSFFont f = wb.getFontAt(s.getFontIndex());
           boolean isbold = f.getBoldweight() > HSSFFont.BOLDWEIGHT_NORMAL;
@@ -128,98 +201,87 @@ public class SVTableCellRenderer extends JLabel
 
           Font font = new Font(f.getFontName(),fontstyle,fontheight);
           setFont(font);
-          
-          HSSFColor clr = null;
+
           if (s.getFillPattern() == HSSFCellStyle.SOLID_FOREGROUND) {
-            clr = (HSSFColor)colors.get(new Integer(s.getFillForegroundColor()));
-          }
-          if (clr == null) clr = new HSSFColor.WHITE();
-
-          short[] rgb = clr.getTriplet();
-          Color awtcolor = new Color(rgb[0],rgb[1],rgb[2]);
-
-          setBackground(awtcolor);
-
-          clr = (HSSFColor)colors.get(new Integer(f.getColor()));
-          if (clr == null) clr = new HSSFColor.BLACK();
-          rgb = clr.getTriplet();
-          awtcolor = new Color(rgb[0],rgb[1],rgb[2]);
-          setForeground(awtcolor);
-
-/*          if (s.getBorderBottom() != HSSFCellStyle.BORDER_NONE ||
-              s.getBorderTop()    != HSSFCellStyle.BORDER_NONE ||
-              s.getBorderLeft()   != HSSFCellStyle.BORDER_NONE ||
-              s.getBorderRight()  != HSSFCellStyle.BORDER_NONE) {
-*/
-              int borderTop = s.getBorderTop();
-              int borderRight = s.getBorderRight();
-              int borderBottom = s.getBorderBottom();
-              int borderLeft = s.getBorderLeft();
-              
-              //OUCH! This could causing rendering performance problems.
-              //Need to somehow create once and store
-              SVBorder border = new SVBorder(Color.black, Color.black,
-                                           Color.black, Color.black,
-                                           borderTop, borderRight,
-                                           borderBottom, borderLeft,
-                                           s.getBorderTop() != HSSFCellStyle.BORDER_NONE,
-                                           s.getBorderRight() != HSSFCellStyle.BORDER_NONE,
-                                           s.getBorderBottom() != HSSFCellStyle.BORDER_NONE,
-                                           s.getBorderLeft() != HSSFCellStyle.BORDER_NONE);
-              setBorder(border);
-              isBorderSet=true;
-
-              //Set the value that is rendered for the cell
-          switch (c.getCellType()) {
-            case HSSFCell.CELL_TYPE_BLANK:
-              setValue("");
-            break;
-            case HSSFCell.CELL_TYPE_BOOLEAN:
-              if (c.getBooleanCellValue()) {
-                setValue("true");
-              } else {
-                setValue("false");
-              }
-            break;
-            case HSSFCell.CELL_TYPE_FORMULA:
-            case HSSFCell.CELL_TYPE_NUMERIC:
-              setValue(""+c.getNumericCellValue());
-            break;
-            case HSSFCell.CELL_TYPE_STRING:
-              setValue(c.getStringCellValue());
-            break;
-            default:
-              setValue("?");
-          }
-              //Set the text alignment of the cell
-              switch (s.getAlignment()) {
-                case HSSFCellStyle.ALIGN_GENERAL:
-                case HSSFCellStyle.ALIGN_LEFT:
-                case HSSFCellStyle.ALIGN_JUSTIFY:
-                case HSSFCellStyle.ALIGN_FILL:
-                  setHorizontalAlignment(SwingConstants.LEFT);
-                  break;
-                case HSSFCellStyle.ALIGN_CENTER:
-                case HSSFCellStyle.ALIGN_CENTER_SELECTION:
-                  setHorizontalAlignment(SwingConstants.CENTER);
-                  break;
-                case HSSFCellStyle.ALIGN_RIGHT:
-                  setHorizontalAlignment(SwingConstants.RIGHT);
-                  break;
-                default:
-                  setHorizontalAlignment(SwingConstants.LEFT);
-                  break;
-              }
-//          }
-       } else {
-           setValue("");
-          setBackground(Color.white);
-       }
+            setBackground(getAWTColor(s.getFillForegroundColor(), white));
+          } else setBackground(white);
+
+          setForeground(getAWTColor(f.getColor(), black));
+
+          cellBorder.setBorder(getAWTColor(s.getTopBorderColor(), black),
+                               getAWTColor(s.getRightBorderColor(), black),
+                               getAWTColor(s.getBottomBorderColor(), black),
+                               getAWTColor(s.getLeftBorderColor(), black),
+                               s.getBorderTop(), s.getBorderRight(),
+                               s.getBorderBottom(), s.getBorderLeft(),
+                               hasFocus);
+            setBorder(cellBorder);
+            isBorderSet=true;
+
+            //Set the value that is rendered for the cell
+            switch (c.getCellType()) {
+              case HSSFCell.CELL_TYPE_BLANK:
+                setValue("");
+              break;
+              case HSSFCell.CELL_TYPE_BOOLEAN:
+                if (c.getBooleanCellValue()) {
+                  setValue("true");
+                } else {
+                  setValue("false");
+                }
+              break;
+              case HSSFCell.CELL_TYPE_FORMULA:
+              case HSSFCell.CELL_TYPE_NUMERIC:
+                short format = s.getDataFormat();
+                double numericValue = c.getNumericCellValue();
+                if (cellFormatter.useRedColor(format, numericValue))
+                  setForeground(Color.red);
+                else setForeground(null);
+                setValue(cellFormatter.format(format, c.getNumericCellValue()));
+              break;
+              case HSSFCell.CELL_TYPE_STRING:
+                setValue(c.getStringCellValue());
+              break;
+              default:
+                setValue("?");
+            }
+            //Set the text alignment of the cell
+            switch (s.getAlignment()) {
+              case HSSFCellStyle.ALIGN_LEFT:
+              case HSSFCellStyle.ALIGN_JUSTIFY:
+              case HSSFCellStyle.ALIGN_FILL:
+                setHorizontalAlignment(SwingConstants.LEFT);
+                break;
+              case HSSFCellStyle.ALIGN_CENTER:
+              case HSSFCellStyle.ALIGN_CENTER_SELECTION:
+                setHorizontalAlignment(SwingConstants.CENTER);
+                break;
+              case HSSFCellStyle.ALIGN_GENERAL:
+              case HSSFCellStyle.ALIGN_RIGHT:
+                setHorizontalAlignment(SwingConstants.RIGHT);
+                break;
+              default:
+                setHorizontalAlignment(SwingConstants.LEFT);
+                break;
+            }
+        } else {
+          setValue("");
+          setBackground(white);
+        }
 
 
        if (hasFocus) {
             if (!isBorderSet) {
-               setBorder( UIManager.getBorder("Table.focusCellHighlightBorder") );
+              cellBorder.setBorder(black,
+                                   black,
+                                   black,
+                                   black,
+                                   HSSFCellStyle.BORDER_NONE,
+                                   HSSFCellStyle.BORDER_NONE,
+                                   HSSFCellStyle.BORDER_NONE,
+                                   HSSFCellStyle.BORDER_NONE,
+                                   isSelected);
+              setBorder(cellBorder);
             }
            if (table.isCellEditable(row, column)) {
                setForeground( UIManager.getColor("Table.focusCellForeground") );
@@ -234,11 +296,9 @@ public class SVTableCellRenderer extends JLabel
        boolean colorMatch = (back != null) && ( back.equals(table.getBackground()) ) && table.isOpaque();
         setOpaque(!colorMatch);
        // ---- end optimization to aviod painting background ----
-
        return this;
     }
 
-
     public void validate() {}
 
     public void revalidate() {}
@@ -263,4 +323,20 @@ public class SVTableCellRenderer extends JLabel
     protected void setValue(Object value) {
        setText((value == null) ? "" : value.toString());
     }
+
+    /** This method retrieves the AWT Color representation from the colour hash table
+     *
+     */
+    private final Color getAWTColor(int index, Color deflt) {
+      HSSFColor clr = (HSSFColor)colors.get(new Integer(index));
+      if (clr == null) return deflt;
+      return getAWTColor(clr);
+    }
+
+    private static final Color getAWTColor(HSSFColor clr) {
+      short[] rgb = clr.getTriplet();
+      return new Color(rgb[0],rgb[1],rgb[2]);
+    }
+
+
 }