package com.aerodynelabs.map; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; 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.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.border.Border; import javax.swing.colorchooser.AbstractColorChooserPanel; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; /** * A default settings panel for MapPanel. * @author Ethan Harstad * */ @SuppressWarnings("serial") public class MapSettingsPanel extends JPanel { private JTable table; private MapPanel map; /** * Allow editing of colors */ class ColorEditor extends AbstractCellEditor implements TableCellEditor, ActionListener { JButton button; JColorChooser chooser; Color curColor; JDialog dialog; public ColorEditor() { button = new JButton(); button.setActionCommand("edit"); button.addActionListener(this); button.setBorderPainted(false); chooser = new JColorChooser(); chooser.setPreviewPanel(new JPanel()); AbstractColorChooserPanel[] panels = chooser.getChooserPanels(); for(int i = 0; i < panels.length; i++) { String name = panels[i].getClass().getName(); if(name != "javax.swing.colorchooser.DefaultSwatchChooserPanel") chooser.removeChooserPanel(panels[i]); } dialog = JColorChooser.createDialog(button, "Pick a Color", true, chooser, this, null); } @Override public Object getCellEditorValue() { return curColor; } @Override public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("edit")) { button.setBackground(curColor); chooser.setColor(curColor); dialog.setVisible(true); fireEditingStopped(); } else { curColor = chooser.getColor(); } } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int r, int c) { curColor = (Color)value; return button; } } /** * Allow rendering of colors */ class ColorRenderer extends JLabel implements TableCellRenderer { Border selectedBorder = BorderFactory.createMatteBorder(2,5,2,5, table.getSelectionBackground()); Border unselectedBorder; public ColorRenderer() { setOpaque(true); } @Override public Component getTableCellRendererComponent(JTable arg0, Object color, boolean isSelected, boolean hasFocus, int r, int c) { Color bg = (Color)color; setBackground(bg); if(isSelected) { setBorder(BorderFactory.createMatteBorder(2, 5, 2, 5, bg)); } else { setBorder(BorderFactory.createMatteBorder(2, 5, 2, 5, table.getBackground())); } return this; } } /** * Custom overlay data model */ class DataModel extends AbstractTableModel { private String[] headers = {"Enable", "Name", "Color", "History"}; @Override public int getColumnCount() { return headers.length; } @Override public String getColumnName(int c) { return headers[c]; } @Override public boolean isCellEditable(int r, int c) { if(c == 0) return true; if(c == 2) return true; if(c == 3) return true; return false; } @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public Class getColumnClass(int c) { if(c == 0) return Boolean.class; if(c == 2) return Color.class; if(c == 3) return Boolean.class; return String.class; } @Override public int getRowCount() { return map.overlays.size(); } @Override public Object getValueAt(int row, int col) { Object[] keys = map.overlays.keySet().toArray(); MapOverlay overlay = map.overlays.get(keys[row]); switch(col) { case 0: return overlay.isEnabled(); case 1: return overlay.getName(); case 2: return overlay.getColor(); case 3: return overlay.getDrawPaths(); } return null; } @Override public void setValueAt(Object o, int r, int c) { Object[] keys = map.overlays.keySet().toArray(); MapOverlay overlay = map.overlays.get(keys[r]); if(c == 0) overlay.setEnabled(o.equals(true)); if(c == 2) overlay.setColor((Color)o); if(c == 3) overlay.setDrawPaths(o.equals(true)); map.updateNotify(); } } /** * Create a settings panel to control the specified map. * @param map */ public MapSettingsPanel(MapPanel map) { super(); super.setPreferredSize(new Dimension(600, 75)); this.map = map; BorderLayout layout = new BorderLayout(); super.setLayout(layout); table = new JTable(new DataModel()); table.setDefaultRenderer(Color.class, new ColorRenderer()); table.setDefaultEditor(Color.class, new ColorEditor()); JScrollPane scroll = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); super.add(scroll, BorderLayout.CENTER); } }