001 /* ========================================================================
002 * JCommon : a free general purpose class library for the Java(tm) platform
003 * ========================================================================
004 *
005 * (C) Copyright 2000-2008, 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 * SystemPropertiesTableModel.java
029 * -------------------------------
030 * (C) Copyright 2000-2008, by Object Refinery Limited.
031 *
032 * Original Author: David Gilbert (for Object Refinery Limited);
033 * Contributor(s): -;
034 *
035 * $Id: SystemPropertiesTableModel.java,v 1.6 2008/12/18 09:57:32 mungady Exp $
036 *
037 * Changes (from 26-Oct-2001)
038 * --------------------------
039 * 26-Oct-2001 : Changed package to com.jrefinery.ui (DG);
040 * 28-Feb-2001 : Changed package to com.jrefinery.ui.about (DG);
041 * 15-Mar-2002 : Modified to use a ResourceBundle for elements that require
042 * localisation (DG);
043 * 08-Oct-2002 : Fixed errors reported by Checkstyle (DG);
044 * 18-Dec-2008 : Use ResourceBundleWrapper - see JFreeChart patch 1607918 by
045 * Jess Thrysoee (DG);
046 *
047 */
048
049 package org.jfree.ui.about;
050
051 import java.util.Collections;
052 import java.util.Comparator;
053 import java.util.Iterator;
054 import java.util.List;
055 import java.util.Properties;
056 import java.util.ResourceBundle;
057
058 import org.jfree.ui.SortableTableModel;
059 import org.jfree.util.ResourceBundleWrapper;
060
061 /**
062 * A sortable table model containing the system properties.
063 *
064 * @author David Gilbert
065 */
066 public class SystemPropertiesTableModel extends SortableTableModel {
067
068 /**
069 * Useful class for holding the name and value of a system property.
070 *
071 */
072 protected static class SystemProperty {
073
074 /** The property name. */
075 private String name;
076
077 /** The property value. */
078 private String value;
079
080 /**
081 * Standard constructor - builds a new SystemProperty.
082 *
083 * @param name the property name.
084 * @param value the property value.
085 */
086 public SystemProperty(final String name, final String value) {
087 this.name = name;
088 this.value = value;
089 }
090
091 /**
092 * Returns the property name.
093 *
094 * @return the property name.
095 */
096 public String getName() {
097 return this.name;
098 }
099
100 /**
101 * Returns the property value.
102 *
103 * @return the property value.
104 */
105 public String getValue() {
106 return this.value;
107 }
108
109 }
110
111 /**
112 * A class for comparing SystemProperty objects.
113 *
114 */
115 protected static class SystemPropertyComparator implements Comparator {
116
117 /** Indicates the sort order. */
118 private boolean ascending;
119
120 /**
121 * Standard constructor.
122 *
123 * @param ascending a flag that controls the sort order (ascending or
124 * descending).
125 */
126 public SystemPropertyComparator(final boolean ascending) {
127 this.ascending = ascending;
128 }
129
130 /**
131 * Compares two objects.
132 *
133 * @param o1 the first object.
134 * @param o2 the second object.
135 *
136 * @return an integer that indicates the relative order of the objects.
137 */
138 public int compare(final Object o1, final Object o2) {
139
140 if ((o1 instanceof SystemProperty)
141 && (o2 instanceof SystemProperty)) {
142 final SystemProperty sp1 = (SystemProperty) o1;
143 final SystemProperty sp2 = (SystemProperty) o2;
144 if (this.ascending) {
145 return sp1.getName().compareTo(sp2.getName());
146 }
147 else {
148 return sp2.getName().compareTo(sp1.getName());
149 }
150 }
151 else {
152 return 0;
153 }
154
155 }
156
157 /**
158 * Returns <code>true</code> if this object is equal to the specified
159 * object, and <code>false</code> otherwise.
160 *
161 * @param o the other object.
162 *
163 * @return A boolean.
164 */
165 public boolean equals(final Object o) {
166 if (this == o) {
167 return true;
168 }
169 if (!(o instanceof SystemPropertyComparator)) {
170 return false;
171 }
172
173 final SystemPropertyComparator systemPropertyComparator
174 = (SystemPropertyComparator) o;
175
176 if (this.ascending != systemPropertyComparator.ascending) {
177 return false;
178 }
179
180 return true;
181 }
182
183 /**
184 * Returns a hash code value for the object.
185 *
186 * @return the hashcode
187 */
188 public int hashCode() {
189 return (this.ascending ? 1 : 0);
190 }
191 }
192
193 /** Storage for the properties. */
194 private List properties;
195
196 /** Localised name column label. */
197 private String nameColumnLabel;
198
199 /** Localised property column label. */
200 private String valueColumnLabel;
201
202 /**
203 * Creates a new table model using the properties of the current Java
204 * Virtual Machine.
205 */
206 public SystemPropertiesTableModel() {
207
208 this.properties = new java.util.ArrayList();
209 try {
210 final Properties p = System.getProperties();
211 final Iterator iterator = p.keySet().iterator();
212 while (iterator.hasNext()) {
213 final String name = (String) iterator.next();
214 final String value = System.getProperty(name);
215 final SystemProperty sp = new SystemProperty(name, value);
216 this.properties.add(sp);
217 }
218 }
219 catch (SecurityException se) {
220 // ignore SecurityExceptions
221 }
222
223 Collections.sort(this.properties, new SystemPropertyComparator(true));
224
225 final String baseName = "org.jfree.ui.about.resources.AboutResources";
226 final ResourceBundle resources = ResourceBundleWrapper.getBundle(
227 baseName);
228
229 this.nameColumnLabel = resources.getString(
230 "system-properties-table.column.name");
231 this.valueColumnLabel = resources.getString(
232 "system-properties-table.column.value");
233
234 }
235
236 /**
237 * Returns true for the first column, and false otherwise - sorting is only
238 * allowed on the first column.
239 *
240 * @param column the column index.
241 *
242 * @return true for column 0, and false for all other columns.
243 */
244 public boolean isSortable(final int column) {
245
246 if (column == 0) {
247 return true;
248 }
249 else {
250 return false;
251 }
252
253 }
254
255 /**
256 * Returns the number of rows in the table model (that is, the number of
257 * system properties).
258 *
259 * @return the row count.
260 */
261 public int getRowCount() {
262 return this.properties.size();
263 }
264
265 /**
266 * Returns the number of columns in the table model. In this case, there
267 * are two columns: one for the property name, and one for the property
268 * value.
269 *
270 * @return the column count (always 2 in this case).
271 */
272 public int getColumnCount() {
273 return 2;
274 }
275
276 /**
277 * Returns the name of the specified column.
278 *
279 * @param column the column index.
280 *
281 * @return the column name.
282 */
283 public String getColumnName(final int column) {
284
285 if (column == 0) {
286 return this.nameColumnLabel;
287 }
288 else {
289 return this.valueColumnLabel;
290 }
291
292 }
293
294 /**
295 * Returns the value at the specified row and column. This method supports
296 * the TableModel interface.
297 *
298 * @param row the row index.
299 * @param column the column index.
300 *
301 * @return the value.
302 */
303 public Object getValueAt(final int row, final int column) {
304
305 final SystemProperty sp = (SystemProperty) this.properties.get(row);
306 if (column == 0) {
307 return sp.getName();
308 }
309 else {
310 if (column == 1) {
311 return sp.getValue();
312 }
313 else {
314 return null;
315 }
316 }
317
318 }
319
320 /**
321 * Sorts on the specified column.
322 *
323 * @param column the column index.
324 * @param ascending a flag that controls the sort order.
325 *
326 */
327 public void sortByColumn(final int column, final boolean ascending) {
328
329 if (isSortable(column)) {
330 super.sortByColumn(column, ascending);
331 Collections.sort(this.properties,
332 new SystemPropertyComparator(ascending));
333 }
334
335 }
336
337
338 }