001// License: GPL. For details, see LICENSE file.
002
003package org.openstreetmap.josm.gui.widgets;
004
005import java.awt.Color;
006import java.awt.Component;
007import java.awt.event.ActionEvent;
008import java.awt.event.ActionListener;
009
010import javax.swing.AbstractCellEditor;
011import javax.swing.Action;
012import javax.swing.Icon;
013import javax.swing.JButton;
014import javax.swing.JTable;
015import javax.swing.UIManager;
016import javax.swing.border.LineBorder;
017import javax.swing.table.TableCellEditor;
018import javax.swing.table.TableCellRenderer;
019
020/**
021 *
022 * Class based on:  http://www.camick.com/java/source/ButtonColumn.java
023 * https://tips4java.wordpress.com/2009/07/12/table-button-column/
024 *
025 */
026public class ButtonColumn extends AbstractCellEditor implements TableCellRenderer, TableCellEditor, ActionListener {
027    private final Action action;
028    private final JButton renderButton;
029    private final JButton editButton;
030    private Object editorValue;
031    private String buttonName;
032
033    /**
034     * Creates a column that is rendered as a button with no action bound to the click event
035     */
036    public ButtonColumn() {
037        this(null);
038    }
039
040    public ButtonColumn(Action action, String buttonName) {
041        this(action);
042        this.buttonName = buttonName;
043    }
044
045
046    /**
047     * Creates a column that is rendered as a button
048     *
049     * @param action action to be performed when button is pressed
050     */
051    public ButtonColumn(Action action) {
052        this.action = action;
053        renderButton = new JButton();
054        editButton = new JButton();
055        editButton.setFocusPainted(false);
056        editButton.addActionListener(this);
057        editButton.setBorder(new LineBorder(Color.BLUE));
058    }
059
060    @Override
061    public Object getCellEditorValue() {
062        return editorValue;
063    }
064
065    @Override
066    public void actionPerformed(ActionEvent e) {
067        this.action.actionPerformed(e);
068    }
069
070    @Override
071    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
072        this.editorValue = value;
073        if (buttonName != null) {
074            editButton.setText(buttonName);
075            editButton.setIcon(null);
076        } else if (value == null) {
077            editButton.setText("");
078            editButton.setIcon(null);
079        } else if (value instanceof Icon) {
080            editButton.setText("");
081            editButton.setIcon((Icon) value);
082        } else {
083            editButton.setText(value.toString());
084            editButton.setIcon(null);
085        }
086        this.editorValue = value;
087        return editButton;
088    }
089
090    @Override
091    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
092            boolean hasFocus, int row, int column) {
093        if (isSelected) {
094            renderButton.setForeground(table.getSelectionForeground());
095            renderButton.setBackground(table.getSelectionBackground());
096        } else {
097            renderButton.setForeground(table.getForeground());
098            renderButton.setBackground(UIManager.getColor("Button.background"));
099        }
100
101        renderButton.setFocusPainted(hasFocus);
102
103        if (buttonName != null) {
104            renderButton.setText(buttonName);
105            renderButton.setIcon(null);
106        } else if (value == null) {
107            renderButton.setText("");
108            renderButton.setIcon(null);
109        } else if (value instanceof Icon) {
110            renderButton.setText("");
111            renderButton.setIcon((Icon) value);
112        } else {
113            renderButton.setText(value.toString());
114            renderButton.setIcon(null);
115        }
116        return renderButton;
117    }
118
119}