]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.spreadsheet.ui;\r
2 \r
3 import java.awt.Component;\r
4 import java.awt.Graphics;\r
5 import java.awt.Point;\r
6 import java.awt.Rectangle;\r
7 \r
8 import javax.swing.JComponent;\r
9 import javax.swing.plaf.ComponentUI;\r
10 import javax.swing.plaf.basic.BasicTableUI;\r
11 import javax.swing.table.TableCellRenderer;\r
12 \r
13 import org.simantics.spreadsheet.ClientModel;\r
14 \r
15 public class SpreadsheetTableUI extends BasicTableUI {\r
16 \r
17         @Override\r
18         public void paint(Graphics g, JComponent c) {\r
19                 SpreadsheetTable t = ((SpreadsheetTable)table);         \r
20                 ClientModel clientModel = t.getClientModel();\r
21                 if (clientModel == null) return;\r
22                 \r
23                 Rectangle clip = g.getClipBounds();\r
24                 \r
25                 Point corner0 = new Point(clip.x, clip.y);\r
26                 Point corner1 = new Point(new Point(clip.x + clip.width - 1, clip.y + clip.height - 1));\r
27                 \r
28                 int row0 = t.rowAtPointWithoutSpan(corner0);\r
29                 if (row0 == -1) row0 = 0;\r
30                 \r
31                 int row1 = t.rowAtPointWithoutSpan(corner1);\r
32                 if (row1 == -1) row1 = t.getRowCount() - 1;\r
33                 \r
34                 int col0 = t.columnAtPointWithoutSpan(corner0);\r
35                 if (col0 == -1) col0 = 0;\r
36                 \r
37                 int col1 = t.columnAtPointWithoutSpan(corner1);\r
38                 if (col1 == -1) col1 = t.getColumnCount() - 1;\r
39                 \r
40                 for (int row = row0; row <= row1; row++) {\r
41                         for (int col = col0; col <= col1; col++) {\r
42                                 Rectangle span = clientModel.getSpan(row, col);\r
43                                 if (span == null) {\r
44                                         paintCell(row, col, g, t.getCellRect(row, col, true));\r
45                                 } else if ((col == span.x) && (row == span.y)) {\r
46                                         paintCell(span.y, span.x, g, t.getCellRect(span.y, span.x, true));\r
47                                 } else if ((row == row0) || (col == col0)) {\r
48                                         // this condition is not optimal as it draws multi-span boundary cells many times\r
49                                         paintCell(span.y, span.x, g, t.getCellRect(span.y, span.x, true));\r
50                                 }\r
51                         }\r
52                 }\r
53         }\r
54                 \r
55         private void paintCell(int row, int column, Graphics g, Rectangle rect) {\r
56                 if (table.isEditing() && (table.getEditingRow() == row) && (table.getEditingColumn() == column)) {\r
57                       Component component = table.getEditorComponent();\r
58                       component.setBounds(rect);\r
59                       component.validate();\r
60             } else {\r
61                         TableCellRenderer renderer = table.getCellRenderer(row, column);\r
62                 Component component = table.prepareRenderer(renderer, row, column);\r
63                         if (component.getParent() == null) {\r
64                                 rendererPane.add(component);\r
65                         }\r
66                         rendererPane.paintComponent(g, component, table, rect.x, rect.y, rect.width, rect.height, false);\r
67             }\r
68         }\r
69         \r
70         public static ComponentUI createUI(JComponent c) {\r
71                 return new SpreadsheetTableUI();\r
72         }\r
73 }\r