001/** SortableTreeTable.java PortfolioApp 002 * 003 * Created 23/12/2007 12:43:37 PM 004 * 005 * @author Ray Turnbull 006 */ 007// package org.codelutin.jtimer.ui.treetable.sorting; 008package ca.bc.webarts.widgets; 009 010import javax.swing.SortOrder; 011 012import org.jdesktop.swingx.JXTreeTable; 013//import org.jdesktop.swingx.decorator.SortOrder; 014import org.jdesktop.swingx.treetable.TreeTableModel; 015 016/** 017 * Subclassed to allow clicking on column headers to sort, and display sort 018 * indicator in header.<br> 019 * Also hacked to notify model of treetable(this) to allow expanded nodes to 020 * be maintained, and sort indicators in header to be set if sort set or 021 * changed programmatically 022 * <p> 023 * Must be used with SortableTreeTableModel 024 */ 025public class SortableTreeTable extends JXTreeTable 026{ 027 028 /** 029 * 030 */ 031 private boolean started = false; 032 private SortOrder order; 033 private int sortColumn; 034 private SortableTreeTableModel sortModel = null; 035 private boolean suppress = false; 036 037 /** 038 * 039 */ 040 public SortableTreeTable() 041 { 042 super(); 043 started = true; 044 } 045 046 /** 047 * @param treeModel 048 */ 049 public SortableTreeTable(TreeTableModel treeModel) 050 { 051 super(treeModel); 052 if (! (treeModel instanceof SortableTreeTableModel)) 053 { 054 throw new IllegalArgumentException("" + "Model must be a SortableTreeTableModel"); 055 } 056 sortModel = (SortableTreeTableModel) treeModel; 057 addTreeExpansionListener(sortModel); 058 sortModel.setTreeTable(this); 059 started = true; 060 } 061 062 // ==================================================== overridden methods 063 064 @Override 065 public boolean isSortable() 066 { 067 return true; 068 } 069 070 @Override 071 public void resetSortOrder() 072 { 073 if (suppress) 074 { 075 return; 076 } 077 sortModel.setSortOrder(SortOrder.UNSORTED); 078 } 079 080 @Override 081 public SortOrder getSortOrder(int colIndex) 082 { 083 // need this as method called from JXTable constructor and TreeTable 084 // model not setup yet 085 if (! started || sortModel == null) 086 { 087 return SortOrder.UNSORTED; 088 } 089 int x = convertColumnIndexToModel(colIndex); 090 getSortParams(); 091 if (x != sortColumn) 092 { 093 return SortOrder.UNSORTED; 094 } 095 else 096 { 097 return order; 098 } 099 } 100 101 @Override 102 public void toggleSortOrder(int columnIndex) 103 { 104 int x = convertColumnIndexToModel(columnIndex); 105 getSortParams(); 106 if (x == sortColumn) 107 { 108 sortModel.toggleSortOrder(); 109 } 110 else 111 { 112 sortModel.setSortColumn(x); 113 } 114 115 } 116 117 @Override 118 public void setTreeTableModel(TreeTableModel treeModel) 119 { 120 TreeTableModel m = getTreeTableModel(); 121 SortableTreeTableModel old = null; 122 if (m instanceof SortableTreeTableModel) 123 { 124 old = (SortableTreeTableModel) m; 125 } 126 super.setTreeTableModel(treeModel); 127 if (! (treeModel instanceof SortableTreeTableModel)) 128 { 129 throw new IllegalArgumentException("" + "Model must be a SortableTreeTableModel"); 130 } 131 sortModel = (SortableTreeTableModel) treeModel; 132 if (old != null) 133 { 134 removeTreeExpansionListener(old); 135 } 136 addTreeExpansionListener(sortModel); 137 sortModel.setTreeTable(this); 138 } 139 140 //@Override 141 protected boolean isSortable(int columnIndex) 142 { 143 return true; 144 } 145 146 @Override 147 public void setSortOrder(int columnIndex, SortOrder sortOrder) 148 { 149 sortModel.setSortOptions(sortModel.getColumnName(columnIndex), order); 150 } 151 152 // ======================================================= private methods 153 154 private void getSortParams() 155 { 156 if (sortModel == null) 157 { 158 throw new IllegalStateException("No TreeTable Model"); 159 } 160 order = sortModel.getSortOrder(); 161 sortColumn = sortModel.getSortColumnIndex(); 162 } 163 164} 165