package krasa.grepconsole.gui.table.column; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.EventObject; import javax.swing.*; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import krasa.grepconsole.model.GrepColor; import org.jetbrains.annotations.Nullable; import com.intellij.util.ui.AbstractTableCellEditor; public class ColorChooserJavaBeanColumnInfo<Item> extends JavaBeanColumnInfo<Item, GrepColor> { public ColorChooserJavaBeanColumnInfo(String name, String propertyName) { super(name, propertyName); } @Nullable @Override public GrepColor valueOf(Item o) { return getProperty(o); } @Override public void setValue(Item o, GrepColor value) { setPropertyValue(o, value); } @Nullable @Override public TableCellRenderer getRenderer(final Item o) { return new TableCellRenderer() { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { return getCheckBoxWithColorChooser((GrepColor) value, null); } }; } @Nullable @Override public TableCellEditor getEditor(final Item o) { AbstractTableCellEditor abstractTableCellEditor = new AbstractTableCellEditor() { protected CheckBoxWithColorChooser checkBoxWithColorChooser; @Override public boolean shouldSelectCell(EventObject anEvent) { return true; } @Override public Object getCellEditorValue() { return new GrepColor(checkBoxWithColorChooser.isSelected(), checkBoxWithColorChooser.getColor()); } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { return checkBoxWithColorChooser = getCheckBoxWithColorChooser((GrepColor) value, this); } }; return abstractTableCellEditor; } private CheckBoxWithColorChooser getCheckBoxWithColorChooser(GrepColor color, final AbstractTableCellEditor abstractTableCellEditor) { if (color == null) { color = new GrepColor(); } CheckBoxWithColorChooser checkBoxWithColorChooser = new CheckBoxWithColorChooser(null, color.isEnabled(), color.getColorAsAWT()) { @Override public void onColorChanged() { abstractTableCellEditor.stopCellEditing(); } }; // hack for updating color in the table after it has been selected in the dialog Component[] components = checkBoxWithColorChooser.getComponents(); for (Component component : components) { if (component instanceof JCheckBox) { ((JCheckBox) component).addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (abstractTableCellEditor != null) { abstractTableCellEditor.stopCellEditing(); } } }); } } return checkBoxWithColorChooser; } }