package org.droiddraw.gui; import java.awt.Color; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Hashtable; import javax.swing.AbstractCellEditor; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JColorChooser; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.border.Border; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import org.droiddraw.AndroidEditor; import org.droiddraw.Main; import org.droiddraw.util.ColorHandler; public class ColorsPanel extends AbstractDataPanel { private static final long serialVersionUID = 1L; public static class ColorRenderer implements TableCellRenderer { Border selectedBorder; Border unselectedBorder; public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Color color = (Color)value; JLabel lb = new JLabel("#"+ Integer.toString(color.getRed(), 16)+ Integer.toString(color.getGreen(), 16)+ Integer.toString(color.getBlue(), 16)+ Integer.toString(color.getAlpha(), 16)); lb.setOpaque(true); lb.setBackground(color); if (isSelected) { if (selectedBorder == null) { selectedBorder = BorderFactory.createMatteBorder(1,1,1,1, table.getSelectionBackground()); } lb.setBorder(selectedBorder); } else { if (unselectedBorder == null) { unselectedBorder = BorderFactory.createMatteBorder(1,1,1,1, table.getBackground()); } lb.setBorder(unselectedBorder); } lb.setToolTipText("Red: "+ color.getRed() + ", Green: " + color.getGreen() + ", Blue: " + color.getBlue()); return lb; } } public class ColorEditor extends AbstractCellEditor implements TableCellEditor, ActionListener { private static final long serialVersionUID = 1L; Color current; JButton b; JColorChooser cc; JDialog dl; public ColorEditor() { b = new JButton("Edit"); b.addActionListener(this); cc = new JColorChooser(); dl = JColorChooser.createDialog(b, "Choose a Color", true, cc, this, null); } public void actionPerformed(ActionEvent e) { if ("Edit".equals(e.getActionCommand())) { b.setBackground(current); cc.setColor(current); dl.setVisible(true); fireEditingStopped(); } else { current = cc.getColor(); } } public Object getCellEditorValue() { return current; } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { current = (Color)value; return b; } } public ColorsPanel() { super(new Class<?>[] {String.class, Color.class}); dataTable.setDefaultRenderer(Color.class, new ColorRenderer()); dataTable.setDefaultEditor(Color.class, new ColorEditor()); } @Override protected int parentRowCount() { Hashtable<String,Color> colors = AndroidEditor.instance().getColors(); return colors.size(); } @Override protected Object parentValueAt(int row, int col) { Hashtable<String,Color> colors = AndroidEditor.instance().getColors(); ArrayList<String> sorted = Collections.list(colors.keys()); Collections.sort(sorted); if (col == 0) { return sorted.get(row); } else if (col == 1) { return colors.get(sorted.get(row)); } return null; } @Override protected void parentSetValueAt(Object value, int rowIndex, int columnIndex) { String key = (String)parentValueAt(rowIndex, 0); Hashtable<String,Color> colors = AndroidEditor.instance().getColors(); if (columnIndex == 1) { colors.put(key, (Color)value); } else { Color val = colors.get(key); colors.remove(key); colors.put((String)value, val); } } @Override protected void parentDeleteRow(int row) { String key = (String)parentValueAt(row, 0); Hashtable<String,Color> colors = AndroidEditor.instance().getColors(); colors.remove(key); } @Override protected void doSave() { File out = AndroidEditor.instance().getColorFile(); if (out == null) { out = Main.doSaveBasic(); } if (out != null) { try { ColorHandler.dump(new FileWriter(out), AndroidEditor.instance().getColors()); } catch (IOException ex) { AndroidEditor.instance().error(ex); } } } @Override protected void addValue(String name) { AndroidEditor.instance().getColors().put(name, new Color(128,128,128)); } }