/* * Autopsy Forensic Browser * * Copyright 2011 Basis Technology Corp. * Contact: carrier <at> sleuthkit <dot> org * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.sleuthkit.autopsy.casemodule; /** * @author jantonius * * Taken from: http://tips4java.wordpress.com/2009/07/12/table-button-column/ * Note: everything is the same, except I edited the buttonName */ import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; import javax.swing.table.*; /** * The ButtonColumn class provides a renderer and an editor that looks like a * JButton. The renderer and editor will then be used for a specified column in * the table. The TableModel will contain the String to be displayed on the * button. * * The button can be invoked by a mouse click or by pressing the space bar when * the cell has focus. Optionally a mnemonic can be set to invoke the button. * When the button is invoked the provided Action is invoked. The source of the * Action will be the table. The action command will contain the model row * number of the button that was clicked. * */ class ButtonColumn extends AbstractCellEditor implements TableCellRenderer, TableCellEditor, ActionListener, MouseListener { private JTable table; private Action action; private int mnemonic; private Border originalBorder; private Border focusBorder; private JButton renderButton; private JButton editButton; private String text; private boolean isButtonColumnEditor; String buttonName; /** * Create the ButtonColumn to be used as a renderer and editor. The renderer * and editor will automatically be installed on the TableColumn of the * specified column. * * @param table the table containing the button renderer/editor * @param action the Action to be invoked when the button is invoked * @param column the column to which the button renderer/editor is added * @param buttonName text displayed on the button */ ButtonColumn(JTable table, Action action, int column, String buttonName) { this.table = table; this.action = action; this.buttonName = buttonName; renderButton = new JButton(); editButton = new JButton(); editButton.setFocusPainted(false); editButton.addActionListener(this); originalBorder = editButton.getBorder(); setFocusBorder(new LineBorder(Color.BLUE)); TableColumnModel columnModel = table.getColumnModel(); columnModel.getColumn(column).setCellRenderer(this); columnModel.getColumn(column).setCellEditor(this); table.addMouseListener(this); } /** * Get foreground color of the button when the cell has focus * * @return the foreground color */ public Border getFocusBorder() { return focusBorder; } /** * The foreground color of the button when the cell has focus * * @param focusBorder the foreground color */ public void setFocusBorder(Border focusBorder) { this.focusBorder = focusBorder; editButton.setBorder(focusBorder); } public int getMnemonic() { return mnemonic; } /** * The mnemonic to activate the button when the cell has focus * * @param mnemonic the mnemonic */ public void setMnemonic(int mnemonic) { this.mnemonic = mnemonic; renderButton.setMnemonic(mnemonic); editButton.setMnemonic(mnemonic); } @Override public Component getTableCellEditorComponent( JTable table, Object value, boolean isSelected, int row, int column) { text = (value == null) ? "" : value.toString(); editButton.setText(text); return editButton; } @Override public Object getCellEditorValue() { return text; } // // Implement TableCellRenderer interface // @Override public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (isSelected) { renderButton.setForeground(table.getSelectionForeground()); renderButton.setBackground(table.getSelectionBackground()); } else { renderButton.setForeground(table.getForeground()); renderButton.setBackground(UIManager.getColor("Button.background")); } if (hasFocus) { renderButton.setBorder(focusBorder); } else { renderButton.setBorder(originalBorder); } //renderButton.setText( (value == null) ? "" : value.toString() ); renderButton.setText(buttonName); return renderButton; } // // Implement ActionListener interface // /* * The button has been pressed. Stop editing and invoke the custom Action */ @Override public void actionPerformed(ActionEvent e) { int row = table.convertRowIndexToModel(table.getEditingRow()); fireEditingStopped(); // Invoke the Action ActionEvent event = new ActionEvent( table, ActionEvent.ACTION_PERFORMED, "" + row); action.actionPerformed(event); } // // Implement MouseListener interface // /* * When the mouse is pressed the editor is invoked. If you then then drag * the mouse to another cell before releasing it, the editor is still * active. Make sure editing is stopped when the mouse is released. */ @Override public void mousePressed(MouseEvent e) { if (table.isEditing() && table.getCellEditor() == this) { isButtonColumnEditor = true; } } @Override public void mouseReleased(MouseEvent e) { if (isButtonColumnEditor && table.isEditing()) { table.getCellEditor().stopCellEditing(); } isButtonColumnEditor = false; } @Override public void mouseClicked(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }