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;
        }
    }
    
}


 

Ads help maintain this website.