/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright (c) 2001 - 2013 Object Refinery Ltd, Pentaho Corporation and Contributors.. All rights reserved.
*/
package org.pentaho.reporting.engine.classic.core.modules.gui.base.about;
import java.awt.BorderLayout;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import java.util.ResourceBundle;
import java.util.TreeMap;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import org.pentaho.reporting.engine.classic.core.modules.gui.base.SwingPreviewModule;
import org.pentaho.reporting.libraries.base.util.ObjectUtilities;
import org.pentaho.reporting.libraries.base.util.ResourceBundleSupport;
/**
* A panel containing a table of system properties.
*
* @author David Gilbert
*/
public class SystemPropertiesPanel extends JPanel {
private class CopyAction implements ActionListener {
public void actionPerformed( final ActionEvent e ) {
copySystemPropertiesToClipboard();
}
}
/**
* The table that displays the system properties.
*/
private JTable table;
/**
* Allows for a popup menu for copying.
*/
private JPopupMenu copyPopupMenu;
/**
* Constructs a new panel.
*/
public SystemPropertiesPanel() {
final ResourceBundleSupport bundleSupport =
new ResourceBundleSupport( Locale.getDefault(), SwingPreviewModule.BUNDLE_NAME, ObjectUtilities
.getClassLoader( SwingPreviewModule.class ) );
setLayout( new BorderLayout() );
this.table = SystemPropertiesPanel.createSystemPropertiesTable();
add( new JScrollPane( this.table ) );
// Add a popup menu to copy to the clipboard...
this.copyPopupMenu = new JPopupMenu();
final String label = bundleSupport.getString( "system-properties-panel.popup-menu.copy" );
final KeyStroke accelerator = bundleSupport.getKeyStroke( "system-properties-panel.popup-menu.copy.accelerator" );
final JMenuItem copyMenuItem = new JMenuItem( label );
copyMenuItem.setAccelerator( accelerator );
copyMenuItem.getAccessibleContext().setAccessibleDescription( label );
copyMenuItem.addActionListener( new CopyAction() );
this.copyPopupMenu.add( copyMenuItem );
// add popup Listener to the table
final PopupListener copyPopupListener = new PopupListener();
this.table.addMouseListener( copyPopupListener );
}
/**
* Creates and returns a JTable containing all the system properties. This method returns a table that is configured
* so that the user can sort the properties by clicking on the table header.
*
* @return a system properties table.
*/
public static JTable createSystemPropertiesTable() {
final ResourceBundle resources = ResourceBundle.getBundle( SwingPreviewModule.BUNDLE_NAME );
final String[] names =
new String[] { resources.getString( "system-properties-table.column.name" ),
resources.getString( "system-properties-table.column.value" ), };
final Properties sysProps = System.getProperties();
final TreeMap data = new TreeMap( sysProps );
final Map.Entry[] entries = (Map.Entry[]) data.entrySet().toArray( new Map.Entry[data.size()] );
final DefaultTableModel properties = new DefaultTableModel( names, entries.length );
for ( int i = 0; i < entries.length; i++ ) {
final Map.Entry entry = entries[i];
properties.setValueAt( entry.getKey(), i, 0 );
properties.setValueAt( entry.getValue(), i, 1 );
}
final JTable table = new JTable( properties );
final TableColumnModel model = table.getColumnModel();
TableColumn column = model.getColumn( 0 );
column.setPreferredWidth( 200 );
column = model.getColumn( 1 );
column.setPreferredWidth( 350 );
table.setAutoResizeMode( JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS );
return table;
}
/**
* Copies the selected cells in the table to the clipboard, in tab-delimited format.
*/
public void copySystemPropertiesToClipboard() {
final StringBuffer buffer = new StringBuffer( 500 );
final ListSelectionModel selection = this.table.getSelectionModel();
final int firstRow = selection.getMinSelectionIndex();
final int lastRow = selection.getMaxSelectionIndex();
if ( ( firstRow != -1 ) && ( lastRow != -1 ) ) {
for ( int r = firstRow; r <= lastRow; r++ ) {
for ( int c = 0; c < this.table.getColumnCount(); c++ ) {
buffer.append( this.table.getValueAt( r, c ) );
if ( c != 2 ) {
buffer.append( '\t' );
}
}
buffer.append( '\n' );
}
}
final StringSelection ss = new StringSelection( buffer.toString() );
final Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
cb.setContents( ss, ss );
}
/**
* Returns the copy popup menu.
*
* @return Returns the copyPopupMenu.
*/
protected final JPopupMenu getCopyPopupMenu() {
return copyPopupMenu;
}
/**
* Returns the table containing the system properties.
*
* @return Returns the table.
*/
protected final JTable getTable() {
return table;
}
/**
* A popup listener.
*/
private class PopupListener extends MouseAdapter {
/**
* Default constructor.
*/
private PopupListener() {
}
/**
* Mouse pressed event.
*
* @param e
* the event.
*/
public void mousePressed( final MouseEvent e ) {
maybeShowPopup( e );
}
/**
* Mouse released event.
*
* @param e
* the event.
*/
public void mouseReleased( final MouseEvent e ) {
maybeShowPopup( e );
}
/**
* Event handler.
*
* @param e
* the event.
*/
private void maybeShowPopup( final MouseEvent e ) {
if ( e.isPopupTrigger() ) {
getCopyPopupMenu().show( getTable(), e.getX(), e.getY() );
}
}
}
}