001 /* ======================================================================== 002 * JCommon : a free general purpose class library for the Java(tm) platform 003 * ======================================================================== 004 * 005 * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors. 006 * 007 * Project Info: http://www.jfree.org/jcommon/index.html 008 * 009 * This library is free software; you can redistribute it and/or modify it 010 * under the terms of the GNU Lesser General Public License as published by 011 * the Free Software Foundation; either version 2.1 of the License, or 012 * (at your option) any later version. 013 * 014 * This library is distributed in the hope that it will be useful, but 015 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 016 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 017 * License for more details. 018 * 019 * You should have received a copy of the GNU Lesser General Public 020 * License along with this library; if not, write to the Free Software 021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 022 * USA. 023 * 024 * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 025 * in the United States and other countries.] 026 * 027 * -------------------------- 028 * SystemPropertiesPanel.java 029 * -------------------------- 030 * (C) Copyright 2001-2004, by Object Refinery Limited. 031 * 032 * Original Author: David Gilbert (for Object Refinery Limited); 033 * Contributor(s): -; 034 * 035 * $Id: SystemPropertiesPanel.java,v 1.5 2007/11/02 17:50:36 taqua Exp $ 036 * 037 * Changes 038 * ------- 039 * 26-Nov-2001 : Version 1 (DG); 040 * 28-Feb-2002 : Changed package to com.jrefinery.ui.about (DG); 041 * 04-Mar-2002 : Added popup menu code by Carl ?? (DG); 042 * 15-Mar-2002 : Modified to use ResourceBundle for elements that require localisation (DG); 043 * 26-Jun-2002 : Removed unnecessary import (DG); 044 * 08-Oct-2002 : Fixed errors reported by Checkstyle (DG); 045 * 046 */ 047 048 package org.jfree.ui.about; 049 050 import java.awt.BorderLayout; 051 import java.awt.Toolkit; 052 import java.awt.datatransfer.Clipboard; 053 import java.awt.datatransfer.StringSelection; 054 import java.awt.event.ActionEvent; 055 import java.awt.event.ActionListener; 056 import java.awt.event.MouseAdapter; 057 import java.awt.event.MouseEvent; 058 import java.util.ResourceBundle; 059 import javax.swing.JMenuItem; 060 import javax.swing.JPanel; 061 import javax.swing.JPopupMenu; 062 import javax.swing.JScrollPane; 063 import javax.swing.JTable; 064 import javax.swing.KeyStroke; 065 import javax.swing.ListSelectionModel; 066 067 /** 068 * A panel containing a table of system properties. 069 * 070 * @author David Gilbert 071 */ 072 public class SystemPropertiesPanel extends JPanel { 073 074 /** The table that displays the system properties. */ 075 private JTable table; 076 077 /** Allows for a popup menu for copying. */ 078 private JPopupMenu copyPopupMenu; 079 080 /** A copy menu item. */ 081 private JMenuItem copyMenuItem; 082 083 /** A popup listener. */ 084 private PopupListener copyPopupListener; 085 086 /** 087 * Constructs a new panel. 088 */ 089 public SystemPropertiesPanel() { 090 091 final String baseName = "org.jfree.ui.about.resources.AboutResources"; 092 final ResourceBundle resources = ResourceBundle.getBundle(baseName); 093 094 setLayout(new BorderLayout()); 095 this.table = SystemProperties.createSystemPropertiesTable(); 096 add(new JScrollPane(this.table)); 097 098 // Add a popup menu to copy to the clipboard... 099 this.copyPopupMenu = new JPopupMenu(); 100 101 final String label = resources.getString("system-properties-panel.popup-menu.copy"); 102 final KeyStroke accelerator = (KeyStroke) 103 resources.getObject("system-properties-panel.popup-menu.copy.accelerator"); 104 this.copyMenuItem = new JMenuItem(label); 105 this.copyMenuItem.setAccelerator(accelerator); 106 this.copyMenuItem.getAccessibleContext().setAccessibleDescription(label); 107 this.copyMenuItem.addActionListener(new ActionListener() { 108 public void actionPerformed(final ActionEvent e) { 109 copySystemPropertiesToClipboard(); 110 } 111 }); 112 this.copyPopupMenu.add(this.copyMenuItem); 113 114 // add popup Listener to the table 115 this.copyPopupListener = new PopupListener(); 116 this.table.addMouseListener(this.copyPopupListener); 117 118 } 119 120 /** 121 * Copies the selected cells in the table to the clipboard, in tab-delimited format. 122 */ 123 public void copySystemPropertiesToClipboard() { 124 125 final StringBuffer buffer = new StringBuffer(); 126 final ListSelectionModel selection = this.table.getSelectionModel(); 127 final int firstRow = selection.getMinSelectionIndex(); 128 final int lastRow = selection.getMaxSelectionIndex(); 129 if ((firstRow != -1) && (lastRow != -1)) { 130 for (int r = firstRow; r <= lastRow; r++) { 131 for (int c = 0; c < this.table.getColumnCount(); c++) { 132 buffer.append(this.table.getValueAt(r, c)); 133 if (c != 2) { 134 buffer.append("\t"); 135 } 136 } 137 buffer.append("\n"); 138 } 139 } 140 final StringSelection ss = new StringSelection(buffer.toString()); 141 final Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); 142 cb.setContents(ss, ss); 143 144 } 145 146 147 /** 148 * Returns the copy popup menu. 149 * 150 * @return Returns the copyPopupMenu. 151 */ 152 protected final JPopupMenu getCopyPopupMenu() 153 { 154 return copyPopupMenu; 155 } 156 157 /** 158 * Returns the table containing the system properties. 159 * @return Returns the table. 160 */ 161 protected final JTable getTable() 162 { 163 return table; 164 } 165 166 /** 167 * A popup listener. 168 */ 169 private class PopupListener extends MouseAdapter { 170 171 /** 172 * Default constructor. 173 */ 174 public PopupListener() { 175 } 176 177 /** 178 * Mouse pressed event. 179 * 180 * @param e the event. 181 */ 182 public void mousePressed(final MouseEvent e) { 183 maybeShowPopup(e); 184 } 185 186 /** 187 * Mouse released event. 188 * 189 * @param e the event. 190 */ 191 public void mouseReleased(final MouseEvent e) { 192 maybeShowPopup(e); 193 } 194 195 /** 196 * Event handler. 197 * 198 * @param e the event. 199 */ 200 private void maybeShowPopup(final MouseEvent e) { 201 if (e.isPopupTrigger()) { 202 getCopyPopupMenu().show( 203 getTable(), e.getX(), e.getY() 204 ); 205 } 206 } 207 } 208 209 210 } 211