1 package org.simantics.spreadsheet.ui;
\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
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
13 import org.simantics.spreadsheet.ClientModel;
\r
15 public class SpreadsheetTableUI extends BasicTableUI {
\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
23 Rectangle clip = g.getClipBounds();
\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
28 int row0 = t.rowAtPointWithoutSpan(corner0);
\r
29 if (row0 == -1) row0 = 0;
\r
31 int row1 = t.rowAtPointWithoutSpan(corner1);
\r
32 if (row1 == -1) row1 = t.getRowCount() - 1;
\r
34 int col0 = t.columnAtPointWithoutSpan(corner0);
\r
35 if (col0 == -1) col0 = 0;
\r
37 int col1 = t.columnAtPointWithoutSpan(corner1);
\r
38 if (col1 == -1) col1 = t.getColumnCount() - 1;
\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
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
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
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
66 rendererPane.paintComponent(g, component, table, rect.x, rect.y, rect.width, rect.height, false);
\r
70 public static ComponentUI createUI(JComponent c) {
\r
71 return new SpreadsheetTableUI();
\r