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}