PageRenderTime 89ms CodeModel.GetById 35ms RepoModel.GetById 0ms app.codeStats 0ms

/JNetAnalyzer/test/tnviet/proj/jna/test/ListProperties.java

http://jnetanalyzer.googlecode.com/
Java | 408 lines | 329 code | 70 blank | 9 comment | 69 complexity | 50c13f35c3652b02ecce32047e985a56 MD5 | raw file
  1. package tnviet.proj.jna.test;
  2. /*
  3. Definitive Guide to Swing for Java 2, Second Edition
  4. By John Zukowski
  5. ISBN: 1-893115-78-X
  6. Publisher: APress
  7. */
  8. import java.awt.BorderLayout;
  9. import java.awt.Container;
  10. import java.awt.event.ActionEvent;
  11. import java.awt.event.ActionListener;
  12. import java.awt.event.InputEvent;
  13. import java.awt.event.MouseAdapter;
  14. import java.awt.event.MouseEvent;
  15. import java.util.Date;
  16. import java.util.Enumeration;
  17. import java.util.Vector;
  18. import javax.swing.JButton;
  19. import javax.swing.JFrame;
  20. import javax.swing.JOptionPane;
  21. import javax.swing.JScrollPane;
  22. import javax.swing.JTable;
  23. import javax.swing.JToolBar;
  24. import javax.swing.SwingUtilities;
  25. import javax.swing.UIDefaults;
  26. import javax.swing.UIManager;
  27. import javax.swing.event.TableModelEvent;
  28. import javax.swing.event.TableModelListener;
  29. import javax.swing.table.AbstractTableModel;
  30. import javax.swing.table.JTableHeader;
  31. import javax.swing.table.TableColumnModel;
  32. import javax.swing.table.TableModel;
  33. public class ListProperties {
  34. static class CustomTableModel extends AbstractTableModel {
  35. Vector keys = new Vector();
  36. Vector values = new Vector();
  37. private static final String columnNames[] = { "Property String",
  38. "Value" };
  39. public int getColumnCount() {
  40. return columnNames.length;
  41. }
  42. public String getColumnName(int column) {
  43. return columnNames[column];
  44. }
  45. public int getRowCount() {
  46. return keys.size();
  47. }
  48. public Object getValueAt(int row, int column) {
  49. Object returnValue = null;
  50. if (column == 0) {
  51. returnValue = keys.elementAt(row);
  52. } else if (column == 1) {
  53. returnValue = values.elementAt(row);
  54. }
  55. return returnValue;
  56. }
  57. public synchronized void uiDefaultsUpdate(UIDefaults defaults) {
  58. Enumeration newKeys = defaults.keys();
  59. keys.removeAllElements();
  60. while (newKeys.hasMoreElements()) {
  61. keys.addElement(newKeys.nextElement());
  62. }
  63. Enumeration newValues = defaults.elements();
  64. values.removeAllElements();
  65. while (newValues.hasMoreElements()) {
  66. values.addElement(newValues.nextElement());
  67. }
  68. fireTableDataChanged();
  69. }
  70. }
  71. public static void main(String args[]) {
  72. final JFrame frame = new JFrame("List Properties");
  73. final CustomTableModel model = new CustomTableModel();
  74. model.uiDefaultsUpdate(UIManager.getDefaults());
  75. TableSorter sorter = new TableSorter(model);
  76. JTable table = new JTable(sorter);
  77. TableHeaderSorter.install(sorter, table);
  78. table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
  79. UIManager.LookAndFeelInfo looks[] = UIManager
  80. .getInstalledLookAndFeels();
  81. ActionListener actionListener = new ActionListener() {
  82. public void actionPerformed(ActionEvent actionEvent) {
  83. final String lafClassName = actionEvent.getActionCommand();
  84. Runnable runnable = new Runnable() {
  85. public void run() {
  86. try {
  87. UIManager.setLookAndFeel(lafClassName);
  88. SwingUtilities.updateComponentTreeUI(frame);
  89. // Added
  90. model.uiDefaultsUpdate(UIManager.getDefaults());
  91. } catch (Exception exception) {
  92. JOptionPane.showMessageDialog(frame,
  93. "Can't change look and feel",
  94. "Invalid PLAF", JOptionPane.ERROR_MESSAGE);
  95. }
  96. }
  97. };
  98. SwingUtilities.invokeLater(runnable);
  99. }
  100. };
  101. JToolBar toolbar = new JToolBar();
  102. for (int i = 0, n = looks.length; i < n; i++) {
  103. JButton button = new JButton(looks[i].getName());
  104. button.setActionCommand(looks[i].getClassName());
  105. button.addActionListener(actionListener);
  106. toolbar.add(button);
  107. }
  108. Container content = frame.getContentPane();
  109. content.add(toolbar, BorderLayout.NORTH);
  110. JScrollPane scrollPane = new JScrollPane(table);
  111. content.add(scrollPane, BorderLayout.CENTER);
  112. frame.setSize(400, 400);
  113. frame.setVisible(true);
  114. }
  115. }
  116. class TableSorter extends TableMap implements TableModelListener {
  117. int indexes[] = new int[0];
  118. Vector sortingColumns = new Vector();
  119. boolean ascending = true;
  120. public TableSorter() {
  121. }
  122. public TableSorter(TableModel model) {
  123. setModel(model);
  124. }
  125. public void setModel(TableModel model) {
  126. super.setModel(model);
  127. reallocateIndexes();
  128. sortByColumn(0);
  129. fireTableDataChanged();
  130. }
  131. public int compareRowsByColumn(int row1, int row2, int column) {
  132. Class type = model.getColumnClass(column);
  133. TableModel data = model;
  134. // Check for nulls
  135. Object o1 = data.getValueAt(row1, column);
  136. Object o2 = data.getValueAt(row2, column);
  137. // If both values are null return 0
  138. if (o1 == null && o2 == null) {
  139. return 0;
  140. } else if (o1 == null) { // Define null less than everything.
  141. return -1;
  142. } else if (o2 == null) {
  143. return 1;
  144. }
  145. if (type.getSuperclass() == Number.class) {
  146. Number n1 = (Number) data.getValueAt(row1, column);
  147. double d1 = n1.doubleValue();
  148. Number n2 = (Number) data.getValueAt(row2, column);
  149. double d2 = n2.doubleValue();
  150. if (d1 < d2)
  151. return -1;
  152. else if (d1 > d2)
  153. return 1;
  154. else
  155. return 0;
  156. } else if (type == String.class) {
  157. String s1 = (String) data.getValueAt(row1, column);
  158. String s2 = (String) data.getValueAt(row2, column);
  159. int result = s1.compareTo(s2);
  160. if (result < 0)
  161. return -1;
  162. else if (result > 0)
  163. return 1;
  164. else
  165. return 0;
  166. } else if (type == java.util.Date.class) {
  167. Date d1 = (Date) data.getValueAt(row1, column);
  168. long n1 = d1.getTime();
  169. Date d2 = (Date) data.getValueAt(row2, column);
  170. long n2 = d2.getTime();
  171. if (n1 < n2)
  172. return -1;
  173. else if (n1 > n2)
  174. return 1;
  175. else
  176. return 0;
  177. } else if (type == Boolean.class) {
  178. Boolean bool1 = (Boolean) data.getValueAt(row1, column);
  179. boolean b1 = bool1.booleanValue();
  180. Boolean bool2 = (Boolean) data.getValueAt(row2, column);
  181. boolean b2 = bool2.booleanValue();
  182. if (b1 == b2)
  183. return 0;
  184. else if (b1) // Define false < true
  185. return 1;
  186. else
  187. return -1;
  188. } else {
  189. Object v1 = data.getValueAt(row1, column);
  190. String s1 = v1.toString();
  191. Object v2 = data.getValueAt(row2, column);
  192. String s2 = v2.toString();
  193. int result = s1.compareTo(s2);
  194. if (result < 0)
  195. return -1;
  196. else if (result > 0)
  197. return 1;
  198. else
  199. return 0;
  200. }
  201. }
  202. public int compare(int row1, int row2) {
  203. for (int level = 0, n = sortingColumns.size(); level < n; level++) {
  204. Integer column = (Integer) sortingColumns.elementAt(level);
  205. int result = compareRowsByColumn(row1, row2, column.intValue());
  206. if (result != 0) {
  207. return (ascending ? result : -result);
  208. }
  209. }
  210. return 0;
  211. }
  212. public void reallocateIndexes() {
  213. int rowCount = model.getRowCount();
  214. indexes = new int[rowCount];
  215. for (int row = 0; row < rowCount; row++) {
  216. indexes[row] = row;
  217. }
  218. }
  219. public void tableChanged(TableModelEvent tableModelEvent) {
  220. super.tableChanged(tableModelEvent);
  221. reallocateIndexes();
  222. sortByColumn(0);
  223. fireTableStructureChanged();
  224. }
  225. public void checkModel() {
  226. if (indexes.length != model.getRowCount()) {
  227. System.err.println("Sorter not informed of a change in model.");
  228. }
  229. }
  230. public void sort() {
  231. checkModel();
  232. shuttlesort((int[]) indexes.clone(), indexes, 0, indexes.length);
  233. fireTableDataChanged();
  234. }
  235. public void shuttlesort(int from[], int to[], int low, int high) {
  236. if (high - low < 2) {
  237. return;
  238. }
  239. int middle = (low + high) / 2;
  240. shuttlesort(to, from, low, middle);
  241. shuttlesort(to, from, middle, high);
  242. int p = low;
  243. int q = middle;
  244. for (int i = low; i < high; i++) {
  245. if (q >= high || (p < middle && compare(from[p], from[q]) <= 0)) {
  246. to[i] = from[p++];
  247. } else {
  248. to[i] = from[q++];
  249. }
  250. }
  251. }
  252. private void swap(int first, int second) {
  253. int temp = indexes[first];
  254. indexes[first] = indexes[second];
  255. indexes[second] = temp;
  256. }
  257. public Object getValueAt(int row, int column) {
  258. checkModel();
  259. return model.getValueAt(indexes[row], column);
  260. }
  261. public void setValueAt(Object aValue, int row, int column) {
  262. checkModel();
  263. model.setValueAt(aValue, indexes[row], column);
  264. }
  265. public void sortByColumn(int column) {
  266. sortByColumn(column, true);
  267. }
  268. public void sortByColumn(int column, boolean ascending) {
  269. this.ascending = ascending;
  270. sortingColumns.removeAllElements();
  271. sortingColumns.addElement(new Integer(column));
  272. sort();
  273. super.tableChanged(new TableModelEvent(this));
  274. }
  275. }
  276. class TableHeaderSorter extends MouseAdapter {
  277. private TableSorter sorter;
  278. private JTable table;
  279. private TableHeaderSorter() {
  280. }
  281. public static void install(TableSorter sorter, JTable table) {
  282. TableHeaderSorter tableHeaderSorter = new TableHeaderSorter();
  283. tableHeaderSorter.sorter = sorter;
  284. tableHeaderSorter.table = table;
  285. JTableHeader tableHeader = table.getTableHeader();
  286. tableHeader.addMouseListener(tableHeaderSorter);
  287. }
  288. public void mouseClicked(MouseEvent mouseEvent) {
  289. TableColumnModel columnModel = table.getColumnModel();
  290. int viewColumn = columnModel.getColumnIndexAtX(mouseEvent.getX());
  291. int column = table.convertColumnIndexToModel(viewColumn);
  292. if (mouseEvent.getClickCount() == 1 && column != -1) {
  293. System.out.println("Sorting ...");
  294. int shiftPressed = (mouseEvent.getModifiers() & InputEvent.SHIFT_MASK);
  295. boolean ascending = (shiftPressed == 0);
  296. sorter.sortByColumn(column, ascending);
  297. }
  298. }
  299. }
  300. class TableMap extends AbstractTableModel implements TableModelListener {
  301. TableModel model;
  302. public TableModel getModel() {
  303. return model;
  304. }
  305. public void setModel(TableModel model) {
  306. if (this.model != null) {
  307. this.model.removeTableModelListener(this);
  308. }
  309. this.model = model;
  310. if (this.model != null) {
  311. this.model.addTableModelListener(this);
  312. }
  313. }
  314. public Class getColumnClass(int column) {
  315. return model.getColumnClass(column);
  316. }
  317. public int getColumnCount() {
  318. return ((model == null) ? 0 : model.getColumnCount());
  319. }
  320. public String getColumnName(int column) {
  321. return model.getColumnName(column);
  322. }
  323. public int getRowCount() {
  324. return ((model == null) ? 0 : model.getRowCount());
  325. }
  326. public Object getValueAt(int row, int column) {
  327. return model.getValueAt(row, column);
  328. }
  329. public void setValueAt(Object value, int row, int column) {
  330. model.setValueAt(value, row, column);
  331. }
  332. public boolean isCellEditable(int row, int column) {
  333. return model.isCellEditable(row, column);
  334. }
  335. public void tableChanged(TableModelEvent tableModelEvent) {
  336. fireTableChanged(tableModelEvent);
  337. }
  338. }