package DisplayProject.swingdisplayer;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.EventObject;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JColorChooser;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.ListCellRenderer;
import javax.swing.plaf.basic.BasicComboBoxEditor;
import DisplayProject.UIutils;
@SuppressWarnings("serial")
public class ColorDisplayer extends PropertyDisplayer {
private static Color[] colors = {
UIutils.White,
UIutils.Gray1,
UIutils.Gray2,
UIutils.Gray3,
UIutils.Gray4,
UIutils.Gray5,
UIutils.Gray6,
UIutils.Gray7,
UIutils.Black,
UIutils.PaleYellow,
UIutils.Yellow,
UIutils.BrightYellow,
UIutils.PaleGreen,
UIutils.Green,
UIutils.BrightGreen,
UIutils.PaleCyan,
UIutils.Cyan,
UIutils.BrightCyan,
UIutils.PaleBlue,
UIutils.Blue,
UIutils.BrightBlue,
UIutils.PaleMagenta,
UIutils.Magenta,
UIutils.BrightMagenta,
UIutils.PaleRed,
UIutils.Red,
UIutils.BrightRed,
UIutils.PaleBrown,
UIutils.Brown,
UIutils.BrightBrown
};
private static String[] colorNames = {
"C_WHITE",
"C_GRAY1",
"C_GRAY2",
"C_GRAY3",
"C_GRAY4",
"C_GRAY5",
"C_GRAY6",
"C_GRAY7",
"C_BLACK",
"C_PALEYELLOW",
"C_YELLOW",
"C_BRIGHTYELLOW",
"C_PALEGREEN",
"C_GREEN",
"C_BRIGHTGREEN",
"C_PALECYAN",
"C_CYAN",
"C_BRIGHTCYAN",
"C_PALEBLUE",
"C_BLUE",
"C_BRIGHTBLUE",
"C_PALEMAGENTA",
"C_MAGENTA",
"C_BRIGHTMAGENTA",
"C_PALERED",
"C_RED",
"C_BRIGHTRED",
"C_PALEBROWN",
"C_BROWN",
"C_BRIGHTBROWN"
};
private String getColorName(Color c) {
if (c == null) {
return "C_INHERIT";
}
else {
for (int i = 0; i < colors.length; i++) {
if (colors[i].equals(c)) {
return colorNames[i];
}
}
return "[r=" + c.getRed() + ",g=" + c.getGreen() + ",b=" + c.getBlue() + "]";
}
}
private class RendererComponent extends JPanel {
private Color color = null;
private JLabel label;
private JPanel panel;
public RendererComponent() {
this.setLayout(new BorderLayout());
this.setOpaque(true);
this.panel = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
int border = 3;
Color oldColor = g.getColor();
if (color != null) {
g.setColor(color);
g.fillRect(border, border, this.getWidth() - 2*border, this.getHeight() - 2*border);
}
else {
g.setColor(Color.black);
g.drawLine(border, border, this.getWidth() - border, this.getHeight() - border);
g.drawLine(this.getWidth() - border, border, border, this.getHeight() - border);
}
g.setColor(Color.black);
g.drawRect(border, border, this.getWidth() - 2*border, this.getHeight() - 2*border);
g.setColor(oldColor);
}
@Override
public Dimension getPreferredSize() {
int height = this.getHeight();
return new Dimension(height, height);
}
};
this.panel.setOpaque(true);
this.label = new JLabel();
this.label.setForeground(null);
this.add(this.panel, BorderLayout.WEST);
this.add(this.label, BorderLayout.CENTER);
}
public void setColor(Color c) {
this.color = c;
this.label.setText(getColorName(c));
}
}
private RendererComponent colorRenderer = new RendererComponent();
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean isFocused, boolean isReadOnly, Component owningComp, int row, int column) {
if (value instanceof Color) {
colorRenderer.setColor((Color)value);
return colorRenderer;
}
return new JLabel("not a color");
}
private class EditorComponent extends JComboBox {
private Color color;
private JTable table;
private final String otherSelection = "Other...";
private final String inheritSelection = "Inherit";
private RendererComponent colorEditor = new RendererComponent();
public EditorComponent(JTable t, Color c) {
super();
this.setBorder(null);
color = c;
this.table = t;
this.setEditor(new BasicComboBoxEditor() {
public Component getEditorComponent() {
return colorEditor;
}
public Object getItem() {
return color;
}
public void setItem(Object anObject) {
if (anObject instanceof Color) {
color = (Color)anObject;
}
else if (anObject instanceof String) {
color = Color.CYAN;
}
}
});
this.setRenderer(new ListCellRenderer() {
public Component getListCellRendererComponent(JList list,
Object value, int index, boolean isSelected,
boolean cellHasFocus) {
Component result;
if (value instanceof Color || value == null) {
colorRenderer.setColor((Color)value);
result = colorRenderer;
}
else if (value instanceof String) {
String str = (String)value;
if (inheritSelection.equals(str)) {
colorRenderer.setColor(null);
result = colorRenderer;
}
else {
result = new JLabel((String)value);
((JLabel)result).setOpaque(true);
}
}
else {
return null;
}
if (isSelected) {
result.setBackground(table.getSelectionBackground());
result.setForeground(table.getSelectionForeground());
}
else {
result.setBackground(table.getBackground());
result.setForeground(table.getForeground());
}
return result;
}
});
this.setModel(new DefaultComboBoxModel() {
@Override
public Object getElementAt(int index) {
if (index >= 0 && index < colors.length) {
return colors[index];
}
else if (index == colors.length) {
return null; // C_INHERIT
}
return otherSelection;
}
@Override
public int getSize() {
return colors.length + 2;
}
@Override
public void setSelectedItem(Object anObject) {
if (anObject instanceof String) {
Color result = JColorChooser.showDialog(EditorComponent.this, "Choose a color", color);
if (result != null) {
color = result;
super.setSelectedItem(color);
}
}
else if (anObject == null) {
color = null;
super.setSelectedItem(inheritSelection);
}
else if (anObject instanceof Color) {
color = (Color)anObject;
super.setSelectedItem(color);
}
else {
super.setSelectedItem(anObject);
}
}
@Override
public Object getSelectedItem() {
Object result = super.getSelectedItem();
if (result == null) {
if (hasFocus() && !isPopupVisible()) {
return color;
}
else {
return otherSelection;
}
}
else {
return result;
}
}
});
this.getModel().setSelectedItem(c);
this.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (descriptor != null) {
Method writer = descriptor.getWriteMethod();
try {
writer.invoke(owningComponent, editorComponent.color);
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
});
}
}
private PropertyDescriptor descriptor;
private Component owningComponent;
private EditorComponent editorComponent;
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
editorComponent = new EditorComponent(table, (Color)value);
return editorComponent;
}
public void cancelCellEditing() {
super.cancelCellEditing();
editorComponent = null;
}
public Object getCellEditorValue() {
if (editorComponent != null) {
return editorComponent.getSelectedItem();
}
return null;
}
public boolean isCellEditable(EventObject anEvent) {
return true;
}
public boolean stopCellEditing() {
// Do nothing as this was already mapped during the change event
return true;
}
public void setEditingInformation(Component c, PropertyDescriptor pd) {
this.owningComponent = c;
this.descriptor = pd;
}
}