]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.spreadsheet.ui/src/org/simantics/spreadsheet/ui/SpreadsheetTableUI.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.spreadsheet.ui / src / org / simantics / spreadsheet / ui / SpreadsheetTableUI.java
diff --git a/bundles/org.simantics.spreadsheet.ui/src/org/simantics/spreadsheet/ui/SpreadsheetTableUI.java b/bundles/org.simantics.spreadsheet.ui/src/org/simantics/spreadsheet/ui/SpreadsheetTableUI.java
new file mode 100644 (file)
index 0000000..c4e5d77
--- /dev/null
@@ -0,0 +1,73 @@
+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