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