package jada.ngeditor.guiviews.editors;
import java.awt.Color;
import java.awt.Component;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.EventObject;
import java.util.Hashtable;
import javax.swing.AbstractCellEditor;
import javax.swing.Icon;
import javax.swing.JColorChooser;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JSlider;
import javax.swing.JTable;
import javax.swing.Timer;
import javax.swing.colorchooser.AbstractColorChooserPanel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.table.TableCellEditor;
public class HexColorCellEditor extends AbstractCellEditor implements TableCellEditor {
private class AlphaChooserPanel extends AbstractColorChooserPanel implements ChangeListener {
private JSlider slider = new JSlider(0, 255, 255);
public AlphaChooserPanel() {
slider.setPaintTicks(true);
slider.setMajorTickSpacing(85);
slider.setMinorTickSpacing(17);
Hashtable<Integer, JComponent> labels = new Hashtable<Integer, JComponent>();
labels.put(0, new JLabel("0"));
labels.put(85, new JLabel("85"));
labels.put(170, new JLabel("170"));
labels.put(255, new JLabel("255"));
slider.setLabelTable(labels);
slider.setPaintLabels(true);
slider.addChangeListener(this);
add(slider);
}
@Override
public void updateChooser() {
Color color = getColorFromModel();
if (color.getAlpha() != slider.getValue()) {
slider.setValue(color.getAlpha());
}
}
@Override
protected void buildChooser() {
}
@Override
public String getDisplayName() {
return "Alpha";
}
@Override
public Icon getSmallDisplayIcon() {
return null;
}
@Override
public Icon getLargeDisplayIcon() {
return null;
}
public void stateChanged(ChangeEvent e) {
int newAlpha = slider.getValue();
alpha = newAlpha;
}
};
private int alpha = 255;
private JDialog colorDialog;
private JColorChooser colorChooser = new JColorChooser();
private ActionListener okListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
Color color = colorChooser.getColor();
if (color != null) {
editedValue = colorToJunk(new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha));
}
colorDialog.dispose();
fireEditingStopped();
}
};
private ActionListener cancelListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
colorDialog.dispose();
fireEditingCanceled();
}
};
private Timer timer = new Timer(100, new ActionListener() {
public void actionPerformed(ActionEvent e) {
colorDialog = JColorChooser.createDialog(frame, "Choose A Color", true, colorChooser, okListener, cancelListener);
colorDialog.setVisible(true);
}
});
private String editedValue;
private Frame frame;
public HexColorCellEditor() {
timer.setInitialDelay(100);
timer.setRepeats(false);
colorChooser.addChooserPanel(new AlphaChooserPanel());
}
public Object getCellEditorValue() {
return editedValue;
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
editedValue = (String) value;
if(value != null && !editedValue.isEmpty()) {
Color c = junkToColor(editedValue);
colorChooser.setColor(c);
alpha = c.getAlpha();
}
frame = JOptionPane.getFrameForComponent(table);
timer.start();
return new JLabel(String.valueOf(editedValue));
}
@Override
public boolean isCellEditable(EventObject e) {
return true;
}
public static String colorToJunk(Color c) {
return
"#" +
intToJunk(c.getRed()) +
intToJunk(c.getGreen()) +
intToJunk(c.getBlue()) +
intToJunk(c.getAlpha());
}
public static String intToJunk(int value) {
String s = Integer.toHexString(value & 0xff);
return s.length() == 1 ? "0" + s : s;
}
public static Color junkToColor(String editedValue) {
if(editedValue == null) {
return Color.RED;
} else {
if(editedValue.startsWith("#")) {
editedValue = editedValue.substring(1);
}
try {
long rgba = Long.parseLong(editedValue, 16);
int r = (int)((rgba >> 24) & 0xff);
int g = (int)((rgba >> 16) & 0xff);
int b = (int)((rgba >> 8) & 0xff);
int a = (int)((rgba & 0xff));
if(editedValue.length() == 2) {//only red
return new Color(r, 0, 0, 255);
} else if(editedValue.length() == 4) {//rg
return new Color(r, g, 0, 255);
} else if(editedValue.length() == 6) {
return new Color(r, g, b, 255);
} else if(editedValue.length() == 8) {
return new Color(r, g, b, a);
} else {
System.out.println("Unrecognized pattern: " + editedValue);
return Color.RED;
}
} catch(Exception ex) {
System.out.println("Unrecognized hexadecimal: " + editedValue);
return Color.RED;
}
}
}
}