/* * @(#)JTableRendererAdapter.java * * Copyright 2002 EGANTT LLP. All rights reserved. * PROPRIETARY/QPL. Use is subject to license terms. */ package com.egantt.swing.cell.renderer.adapter; import java.awt.Component; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.event.MouseEvent; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.UIManager; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.JTableHeader; import javax.swing.table.TableCellRenderer; import com.egantt.model.drawing.DrawingState; import com.egantt.swing.cell.CellRenderer; import com.egantt.swing.cell.CellState; import com.egantt.swing.cell.state.BasicCellState; public class JTableRendererAdapter implements TableCellRenderer { protected final CellRenderer renderer; protected final boolean header; protected final boolean editor; protected final DefaultTableCellRenderer defaultRenderer = new DefaultTableCellRenderer(); protected final LocalRenderer localRenderer = new LocalRenderer(); public JTableRendererAdapter(CellRenderer renderer, boolean editor, boolean header) { this.renderer = renderer; this.editor = editor; this.header = header; } // _________________________________________________________________________ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { final BasicCellState state; { Rectangle bounds = table.getCellRect(row, column, false); state = new BasicCellState(table, value, isSelected, hasFocus, row, column, bounds); } if (!(value instanceof DrawingState)) return initialize(defaultRenderer, state); localRenderer.setComponent(renderer.getComponent(state, localRenderer)); localRenderer.setState(state); return initialize(localRenderer, state); } protected Component initialize(DefaultTableCellRenderer renderer, BasicCellState cellState) { renderer = (DefaultTableCellRenderer) renderer .getTableCellRendererComponent((JTable) cellState.getSource(), cellState.getValue(), cellState.isSelected(), cellState .hasFocus(), cellState.getRow(), cellState .getColumn()); if (!header) return renderer; JTable table = (JTable) cellState.getSource(); if (table != null) { JTableHeader header = table.getTableHeader(); if (header != null) { renderer.setForeground(header.getForeground()); renderer.setBackground(header.getBackground()); renderer.setFont(header.getFont()); } } renderer.setHorizontalAlignment(JLabel.CENTER); renderer.setBorder(UIManager.getBorder("TableHeader.cellBorder")); return renderer; } // _________________________________________________________________________ // protected class LocalHeaderRender extends protected class LocalRenderer extends DefaultTableCellRenderer { private static final long serialVersionUID = 4437246647534469820L; protected JComponent component; private CellState cellState; protected LocalRenderer() { } // ____________________________________________________________________ public void setState(CellState cellState) { this.cellState = cellState; } public void setComponent(JComponent component) { this.component = component; } // ____________________________________________________________________ public String getToolTipText() { return null; } public String getToolTipText(MouseEvent event) { return component.getToolTipText(event); } // ____________________________________________________________________ @Override public void paint(Graphics g) { if (editor) { boolean isSelected = ((JTable) cellState.getSource()) .isCellSelected(cellState.getRow(), cellState .getColumn()); getTableCellRendererComponent((JTable) cellState.getSource(), cellState.getValue(), isSelected, cellState.hasFocus(), cellState.getRow(), cellState.getColumn()); } super.setValue(null); // do not allow the parent to render any // text super.paint(g); if (component != null) { component.setOpaque(false); component.setBounds(0, 0, getWidth(), getHeight()); component.paint(g); } } } }