1 package org.simantics.spreadsheet.ui;
3 import java.awt.Component;
4 import java.awt.Graphics;
6 import java.awt.Rectangle;
8 import javax.swing.JComponent;
9 import javax.swing.plaf.ComponentUI;
10 import javax.swing.plaf.basic.BasicTableUI;
11 import javax.swing.table.TableCellRenderer;
13 import org.simantics.spreadsheet.ClientModel;
15 public class SpreadsheetTableUI extends BasicTableUI {
18 public void paint(Graphics g, JComponent c) {
19 SpreadsheetTable t = ((SpreadsheetTable)table);
20 ClientModel clientModel = t.getClientModel();
21 if (clientModel == null) return;
23 Rectangle clip = g.getClipBounds();
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));
28 int row0 = t.rowAtPointWithoutSpan(corner0);
29 if (row0 == -1) row0 = 0;
31 int row1 = t.rowAtPointWithoutSpan(corner1);
32 if (row1 == -1) row1 = t.getRowCount() - 1;
34 int col0 = t.columnAtPointWithoutSpan(corner0);
35 if (col0 == -1) col0 = 0;
37 int col1 = t.columnAtPointWithoutSpan(corner1);
38 if (col1 == -1) col1 = t.getColumnCount() - 1;
40 for (int row = row0; row <= row1; row++) {
41 for (int col = col0; col <= col1; col++) {
42 Rectangle span = clientModel.getSpan(row, col);
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));
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);
61 TableCellRenderer renderer = table.getCellRenderer(row, column);
62 Component component = table.prepareRenderer(renderer, row, column);
63 if (component.getParent() == null) {
64 rendererPane.add(component);
66 rendererPane.paintComponent(g, component, table, rect.x, rect.y, rect.width, rect.height, false);
70 public static ComponentUI createUI(JComponent c) {
71 return new SpreadsheetTableUI();