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.4 2005/10/18 13:19:13 mungady 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 060 import javax.swing.JMenuItem; 061 import javax.swing.JPanel; 062 import javax.swing.JPopupMenu; 063 import javax.swing.JScrollPane; 064 import javax.swing.JTable; 065 import javax.swing.KeyStroke; 066 import javax.swing.ListSelectionModel; 067 068 /** 069 * A panel containing a table of system properties. 070 * 071 * @author David Gilbert 072 */ 073 public class SystemPropertiesPanel extends JPanel { 074 075 /** The table that displays the system properties. */ 076 private JTable table; 077 078 /** Allows for a popup menu for copying. */ 079 private JPopupMenu copyPopupMenu; 080 081 /** A copy menu item. */ 082 private JMenuItem copyMenuItem; 083 084 /** A popup listener. */ 085 private PopupListener copyPopupListener; 086 087 /** 088 * Constructs a new panel. 089 */ 090 public SystemPropertiesPanel() { 091 092 final String baseName = "org.jfree.ui.about.resources.AboutResources"; 093 final ResourceBundle resources = ResourceBundle.getBundle(baseName); 094 095 setLayout(new BorderLayout()); 096 this.table = SystemProperties.createSystemPropertiesTable(); 097 add(new JScrollPane(this.table)); 098 099 // Add a popup menu to copy to the clipboard... 100 this.copyPopupMenu = new JPopupMenu(); 101 102 final String label = resources.getString("system-properties-panel.popup-menu.copy"); 103 final KeyStroke accelerator = (KeyStroke) 104 resources.getObject("system-properties-panel.popup-menu.copy.accelerator"); 105 this.copyMenuItem = new JMenuItem(label); 106 this.copyMenuItem.setAccelerator(accelerator); 107 this.copyMenuItem.getAccessibleContext().setAccessibleDescription(label); 108 this.copyMenuItem.addActionListener(new ActionListener() { 109 public void actionPerformed(final ActionEvent e) { 110 copySystemPropertiesToClipboard(); 111 } 112 }); 113 this.copyPopupMenu.add(this.copyMenuItem); 114 115 // add popup Listener to the table 116 this.copyPopupListener = new PopupListener(); 117 this.table.addMouseListener(this.copyPopupListener); 118 119 } 120 121 /** 122 * Copies the selected cells in the table to the clipboard, in tab-delimited format. 123 */ 124 public void copySystemPropertiesToClipboard() { 125 126 final StringBuffer buffer = new StringBuffer(); 127 final ListSelectionModel selection = this.table.getSelectionModel(); 128 final int firstRow = selection.getMinSelectionIndex(); 129 final int lastRow = selection.getMaxSelectionIndex(); 130 if ((firstRow != -1) && (lastRow != -1)) { 131 for (int r = firstRow; r <= lastRow; r++) { 132 for (int c = 0; c < this.table.getColumnCount(); c++) { 133 buffer.append(this.table.getValueAt(r, c)); 134 if (c != 2) { 135 buffer.append("\t"); 136 } 137 } 138 buffer.append("\n"); 139 } 140 } 141 final StringSelection ss = new StringSelection(buffer.toString()); 142 final Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); 143 cb.setContents(ss, ss); 144 145 } 146 147 148 /** 149 * Returns the copy popup menu. 150 * 151 * @return Returns the copyPopupMenu. 152 */ 153 protected final JPopupMenu getCopyPopupMenu() 154 { 155 return copyPopupMenu; 156 } 157 158 /** 159 * Returns the table containing the system properties. 160 * @return Returns the table. 161 */ 162 protected final JTable getTable() 163 { 164 return table; 165 } 166 167 /** 168 * A popup listener. 169 */ 170 private class PopupListener extends MouseAdapter { 171 172 /** 173 * Default constructor. 174 */ 175 public PopupListener() { 176 } 177 178 /** 179 * Mouse pressed event. 180 * 181 * @param e the event. 182 */ 183 public void mousePressed(final MouseEvent e) { 184 maybeShowPopup(e); 185 } 186 187 /** 188 * Mouse released event. 189 * 190 * @param e the event. 191 */ 192 public void mouseReleased(final MouseEvent e) { 193 maybeShowPopup(e); 194 } 195 196 /** 197 * Event handler. 198 * 199 * @param e the event. 200 */ 201 private void maybeShowPopup(final MouseEvent e) { 202 if (e.isPopupTrigger()) { 203 getCopyPopupMenu().show( 204 getTable(), e.getX(), e.getY() 205 ); 206 } 207 } 208 } 209 210 211 } 212