--- /dev/null
+package org.simantics.spreadsheet.ui;\r
+\r
+import java.awt.Component;\r
+import java.awt.Graphics;\r
+import java.awt.Point;\r
+import java.awt.Rectangle;\r
+\r
+import javax.swing.JComponent;\r
+import javax.swing.plaf.ComponentUI;\r
+import javax.swing.plaf.basic.BasicTableUI;\r
+import javax.swing.table.TableCellRenderer;\r
+\r
+import org.simantics.spreadsheet.ClientModel;\r
+\r
+public class SpreadsheetTableUI extends BasicTableUI {\r
+\r
+ @Override\r
+ public void paint(Graphics g, JComponent c) {\r
+ SpreadsheetTable t = ((SpreadsheetTable)table); \r
+ ClientModel clientModel = t.getClientModel();\r
+ if (clientModel == null) return;\r
+ \r
+ Rectangle clip = g.getClipBounds();\r
+ \r
+ Point corner0 = new Point(clip.x, clip.y);\r
+ Point corner1 = new Point(new Point(clip.x + clip.width - 1, clip.y + clip.height - 1));\r
+ \r
+ int row0 = t.rowAtPointWithoutSpan(corner0);\r
+ if (row0 == -1) row0 = 0;\r
+ \r
+ int row1 = t.rowAtPointWithoutSpan(corner1);\r
+ if (row1 == -1) row1 = t.getRowCount() - 1;\r
+ \r
+ int col0 = t.columnAtPointWithoutSpan(corner0);\r
+ if (col0 == -1) col0 = 0;\r
+ \r
+ int col1 = t.columnAtPointWithoutSpan(corner1);\r
+ if (col1 == -1) col1 = t.getColumnCount() - 1;\r
+ \r
+ for (int row = row0; row <= row1; row++) {\r
+ for (int col = col0; col <= col1; col++) {\r
+ Rectangle span = clientModel.getSpan(row, col);\r
+ if (span == null) {\r
+ paintCell(row, col, g, t.getCellRect(row, col, true));\r
+ } else if ((col == span.x) && (row == span.y)) {\r
+ paintCell(span.y, span.x, g, t.getCellRect(span.y, span.x, true));\r
+ } else if ((row == row0) || (col == col0)) {\r
+ // this condition is not optimal as it draws multi-span boundary cells many times\r
+ paintCell(span.y, span.x, g, t.getCellRect(span.y, span.x, true));\r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ private void paintCell(int row, int column, Graphics g, Rectangle rect) {\r
+ if (table.isEditing() && (table.getEditingRow() == row) && (table.getEditingColumn() == column)) {\r
+ Component component = table.getEditorComponent();\r
+ component.setBounds(rect);\r
+ component.validate();\r
+ } else {\r
+ TableCellRenderer renderer = table.getCellRenderer(row, column);\r
+ Component component = table.prepareRenderer(renderer, row, column);\r
+ if (component.getParent() == null) {\r
+ rendererPane.add(component);\r
+ }\r
+ rendererPane.paintComponent(g, component, table, rect.x, rect.y, rect.width, rect.height, false);\r
+ }\r
+ }\r
+ \r
+ public static ComponentUI createUI(JComponent c) {\r
+ return new SpreadsheetTableUI();\r
+ }\r
+}\r