--- /dev/null
+package org.simantics.spreadsheet.ui;\r
+\r
+import java.awt.Color;\r
+import java.awt.Component;\r
+import java.awt.Graphics;\r
+import java.awt.Insets;\r
+\r
+import javax.swing.border.AbstractBorder;\r
+import javax.swing.border.Border;\r
+\r
+public class TableBorder extends AbstractBorder {\r
+\r
+ private static final long serialVersionUID = -2732591061826521471L;\r
+ private static Border blackLine;\r
+ private static Border grayLine;\r
+\r
+ protected int thickness;\r
+ protected Color lineColor;\r
+ protected boolean roundedCorners;\r
+\r
+ final public static TableBorder BORDER = new TableBorder(DefaultLookup.BORDER, 0);\r
+\r
+ /** Convenience method for getting the Color.black LineBorder of thickness 1.\r
+ */\r
+ public static Border createBlackLineBorder() {\r
+ if (blackLine == null) {\r
+ blackLine = new TableBorder(Color.black, 1);\r
+ }\r
+ return blackLine;\r
+ }\r
+\r
+ /** Convenience method for getting the Color.gray LineBorder of thickness 1.\r
+ */\r
+ public static Border createGrayLineBorder() {\r
+ if (grayLine == null) {\r
+ grayLine = new TableBorder(Color.gray, 1);\r
+ }\r
+ return grayLine;\r
+ }\r
+\r
+ /** \r
+ * Creates a line border with the specified color and a \r
+ * thickness = 1.\r
+ * @param color the color for the border\r
+ */\r
+ public TableBorder(Color color) {\r
+ this(color, 1, false);\r
+ }\r
+\r
+ /**\r
+ * Creates a line border with the specified color and thickness.\r
+ * @param color the color of the border\r
+ * @param thickness the thickness of the border\r
+ */\r
+ public TableBorder(Color color, int thickness) {\r
+ this(color, thickness, false);\r
+ }\r
+\r
+ /**\r
+ * Creates a line border with the specified color, thickness,\r
+ * and corner shape.\r
+ * @param color the color of the border\r
+ * @param thickness the thickness of the border\r
+ * @param roundedCorners whether or not border corners should be round\r
+ * @since 1.3\r
+ */\r
+ public TableBorder(Color color, int thickness, boolean roundedCorners) {\r
+ lineColor = color;\r
+ this.thickness = thickness;\r
+ this.roundedCorners = roundedCorners;\r
+ }\r
+\r
+ /**\r
+ * Paints the border for the specified component with the \r
+ * specified position and size.\r
+ * @param c the component for which this border is being painted\r
+ * @param g the paint graphics\r
+ * @param x the x position of the painted border\r
+ * @param y the y position of the painted border\r
+ * @param width the width of the painted border\r
+ * @param height the height of the painted border\r
+ */\r
+ public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {\r
+\r
+ Color oldColor = g.getColor();\r
+ int i;\r
+\r
+ /// PENDING(klobad) How/should do we support Roundtangles?\r
+ g.setColor(lineColor);\r
+ g.drawLine(1, height-1, 1 + width-1, height-1);\r
+ g.drawLine(width-1, 0, width-1, height-1);\r
+ // for(i = 0; i < thickness; i++) {\r
+ // if(!roundedCorners)\r
+ // g.drawRect(x+i, y+i, width-i-i-1, height-i-i-1);\r
+ // else\r
+ // g.drawRoundRect(x+i, y+i, width-i-i-1, height-i-i-1, thickness, thickness);\r
+ // }\r
+ g.setColor(oldColor);\r
+\r
+ }\r
+\r
+ /**\r
+ * Returns the insets of the border.\r
+ * @param c the component for which this border insets value applies\r
+ */\r
+ public Insets getBorderInsets(Component c) {\r
+ return new Insets(thickness, thickness, thickness, thickness);\r
+ }\r
+\r
+ /** \r
+ * Reinitialize the insets parameter with this Border's current Insets. \r
+ * @param c the component for which this border insets value applies\r
+ * @param insets the object to be reinitialized\r
+ */\r
+ public Insets getBorderInsets(Component c, Insets insets) {\r
+ insets.left = insets.top = insets.right = insets.bottom = thickness;\r
+ return insets;\r
+ }\r
+\r
+ /**\r
+ * Returns the color of the border.\r
+ */\r
+ public Color getLineColor() {\r
+ return lineColor;\r
+ }\r
+\r
+ /**\r
+ * Returns the thickness of the border.\r
+ */\r
+ public int getThickness() {\r
+ return thickness;\r
+ }\r
+\r
+ /**\r
+ * Returns whether this border will be drawn with rounded corners.\r
+ * @since 1.3\r
+ */\r
+ public boolean getRoundedCorners() {\r
+ return roundedCorners;\r
+ }\r
+\r
+ /**\r
+ * Returns whether or not the border is opaque.\r
+ */\r
+ public boolean isBorderOpaque() { \r
+ return !roundedCorners; \r
+ }\r
+\r
+}\r