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