package tk.amberide.ide.gui.editor.map;
import tk.amberide.Amber;
import tk.amberide.engine.data.map.Flag;
import tk.amberide.ide.gui.dialogs.res.NewFlagDialog;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.DefaultCellEditor;
import javax.swing.JColorChooser;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
/**
*
* @author Tudor
*/
public class FlagSelector extends JPanel {
protected JScrollPane scroller;
protected JTable flagTable;
protected DefaultTableModel model = new DefaultTableModel(
new Object[0][0],
new String[]{
"Colour", "Name", "ID"
}) {
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return new boolean[]{
true, true, true
}[columnIndex];
}
@Override
public Class getColumnClass(int columnIndex) {
return new Class[]{
Color.class, String.class, Integer.class
}[columnIndex];
}
};
static {
Flag.registerFlag(new Flag(null, "PASSABLE", 0));
Flag.registerFlag(new Flag(Color.RED, "IMPASSABLE", 1));
Flag.registerFlag(new Flag(Color.GREEN, "GRASS", 2));
Flag.registerFlag(new Flag(Color.CYAN, "SURF", 3));
}
public FlagSelector(final MapContext context) {
super(new BorderLayout());
flagTable = new JTable(model);
scroller = new JScrollPane();
scroller.setViewportView(flagTable);
flagTable.setFillsViewportHeight(true);
flagTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
add(scroller, BorderLayout.CENTER);
JPopupMenu popup = new JPopupMenu();
popup.add(new JMenuItem("New Flag")).addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
NewFlagDialog nfd = new NewFlagDialog(Amber.getUI());
nfd.setVisible(true);
Flag f = nfd.getFlag();
if (f != null) {
Flag.registerFlag(f);
synchronize();
}
}
});
flagTable.setComponentPopupMenu(popup);
flagTable.getColumnModel().getColumn(0).setCellRenderer(new DefaultTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (value instanceof Color) {
JLabel ret = new JLabel();
ret.setOpaque(true);
ret.setBackground((Color) value);
return ret;
} else {
return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
}
});
((DefaultCellEditor) flagTable.getDefaultEditor(String.class)).setClickCountToStart(3);
flagTable.getColumnModel().getColumn(2).setCellEditor(new DefaultCellEditor(new JTextField()) {
private JSpinner spinner = new JSpinner();
private Flag flag;
{
spinner.setBorder(null);
setClickCountToStart(3);
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
int id = Integer.parseInt(value.toString());
spinner.setValue(id);
flag = Flag.byId(id);
return spinner;
}
@Override
public Object getCellEditorValue() {
if (flag != null) {
flag.setId((Integer) spinner.getValue());
synchronize();
}
return String.format("%02d", spinner.getValue());
}
});
flagTable.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent evt) {
if (evt.getClickCount() > 1 && flagTable.columnAtPoint(evt.getPoint()) == 0) {
int row = flagTable.rowAtPoint(evt.getPoint());
Color color = JColorChooser.showDialog(flagTable, "Choose flag colour...", (Color) flagTable.getValueAt(row, 0));
if (color != null) {
flagTable.setValueAt(color, row, 0);
Flag f = Flag.byId(Integer.parseInt(model.getValueAt(2, row).toString()));
if (f != null) {
f.setColor(color);
System.out.println("Set flag colour: " + color);
}
}
}
}
});
flagTable.getModel().addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent evt) {
int column = evt.getColumn();
if (column == 1 && evt.getType() == TableModelEvent.UPDATE) {
int row = evt.getFirstRow();
int id = Integer.parseInt(model.getValueAt(row, 2).toString());
Flag f = Flag.byId(id);
if (f != null) {
f.setName(model.getValueAt(row, column).toString());
}
}
}
});
flagTable.getSelectionModel().addListSelectionListener(
new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) {
EventQueue.invokeLater(new Runnable() {
public void run() {
int selected = flagTable.getSelectedRow();
if (selected == -1 && flagTable.getRowCount() > 0) {
flagTable.getSelectionModel().addSelectionInterval(0, 0);
}
int id = Integer.parseInt(model.getValueAt(flagTable.getSelectedRow(), 2).toString());
System.out.println(id);
context.flag = Flag.byId(id);
}
});
}
}
});
synchronize();
}
public void synchronize() {
model.getDataVector().clear();
for (Flag f : Flag.flags()) {
model.addRow(new Object[]{f.getColor(), f.getName(), String.format("%02d", f.getId())});
}
}
}