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