package hep.aida.ref.plotter.style.editor; import java.awt.Color; import java.awt.Component; import java.awt.Font; import javax.swing.Icon; import javax.swing.JTable; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import org.freehep.swing.ColorConverter; import com.l2fprod.common.propertysheet.PropertySheetTable; import com.l2fprod.common.propertysheet.PropertySheetTableModel.Item; import com.l2fprod.common.swing.renderer.ColorCellRenderer; public class StylePropertyTable extends PropertySheetTable { public StylePropertyTable(StylePropertyTableModel dm) { super(dm); this.getColumnModel().getColumn(StylePropertyTableModel.EDIT_COLUMN).setPreferredWidth(60); this.getColumnModel().getColumn(StylePropertyTableModel.EDIT_COLUMN).setMaxWidth(60); } public TableCellRenderer getCellRenderer(int row, int column) { TableCellRenderer tcr = null; Object value = getValueAt(row, StylePropertyTableModel.VALUE_COLUMN); if (column == StylePropertyTableModel.EDIT_COLUMN) { if (value instanceof StylePropertyState) { DefaultTableCellRenderer cr = new DefaultTableCellRenderer(); cr.setBackground(Color.yellow); cr.setAlignmentX(0.5f); return cr; } else tcr = super.getCellRenderer(row, column); } else if (column == StylePropertyTableModel.VALUE_COLUMN) { if (value instanceof StylePropertyState && ((StylePropertyState) value).type == Color.class) { tcr = new ColorCellRenderer() { protected String convertToString(Object value) { Color c = null; if (value == null) { return null; } else if (value instanceof StylePropertyState) { try { Object val = ((StylePropertyState) value).currentValue; if (val == null) val = ((StylePropertyState) value).defaultValue; if (val == null) return null; c = ColorConverter.get( (String) val); } catch (Exception e) { throw new RuntimeException(e); } } else { c = (Color)value; } return ColorConverter.get(c); } protected Icon convertToIcon(Object value) { if (value == null) { return null; } else if (value instanceof StylePropertyState) { Color c = null; try { Object val = ((StylePropertyState) value).currentValue; if (val == null) val = ((StylePropertyState) value).defaultValue; if (val == null) return null; c = ColorConverter.get( (String) val); } catch (Exception e) { throw new RuntimeException(e); } return super.convertToIcon(c); } else return super.convertToIcon(value); } }; } else tcr = super.getCellRenderer(row, column); } else if (column == StylePropertyTableModel.NAME_COLUMN) { tcr = super.getCellRenderer(row, column); return new StyleTableCellRenderer(tcr); } return tcr; } public TableCellEditor getCellEditor(int row, int column) { if (column == StylePropertyTableModel.EDIT_COLUMN) { if (getValueAt(row, StylePropertyTableModel.VALUE_COLUMN) instanceof StylePropertyState) return new StylePropertyEditColumnEditor(this, row, column); else return null; } return super.getCellEditor(row, column); } class StyleTableCellRenderer implements TableCellRenderer { private TableCellRenderer tcr; StyleTableCellRenderer(TableCellRenderer tcr) { this.tcr = tcr; } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component c = tcr.getTableCellRendererComponent(table, value, isSelected, false, row, column); Font font = c.getFont(); String propertyName = null; if (font != null) { boolean normal = !font.isItalic(); String name = font.getName(); int size = font.getSize(); int style = Font.PLAIN; boolean isSet = false; boolean isSetHere = false; StyleProperty sp = null; if (value instanceof StyleProperty) sp = (StyleProperty) value; else if (value instanceof Item) sp = (StyleProperty) ((Item) value).getProperty(); if (sp != null) { isSet = sp.isParameterSet(true); isSetHere = sp.isParameterSet(false); propertyName = sp.getName(); } if (isSetHere) { style = Font.PLAIN; if (isSelected) c.setForeground(Color.white); else c.setForeground(Color.black); } else if (isSet) { style = Font.PLAIN; if (isSelected) c.setForeground(Color.green); else c.setForeground(Color.blue); } else { style = Font.ITALIC; if (isSelected) c.setForeground(Color.yellow); else c.setForeground(Color.red); } //System.out.println("StyleTableCellRenderer :: name="+propertyName+", isSetHere="+isSetHere+", isSet="+isSet+", Color="+c.getForeground()+", Column="+column+", Value="+value); Font newFont = new Font(name, style, size); c.setFont(newFont); } return c; } } }