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