3 The file is used to sort FrameworkModules of Fpd file
5 Copyright (c) 2006, Intel Corporation
6 All rights reserved. This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 package org
.tianocore
.frameworkwizard
.platform
.ui
;
17 import java
.awt
.event
.*;
20 import javax
.swing
.event
.TableModelEvent
;
21 import javax
.swing
.event
.TableModelListener
;
22 import javax
.swing
.table
.*;
25 public class TableSorter
extends AbstractTableModel
{
29 private static final long serialVersionUID
= 1L;
31 protected DefaultTableModel tableModel
;
32 private TableRow
[] rowInView
;
33 private int[] viewPos
;
35 public static final String DESCENDING
= "down";
36 public static final String NOT_SORTED
= "none";
37 public static final String ASCENDING
= "up";
39 private JTableHeader tableHeader
;
40 private MouseListener mouseListener
= new MouseHandler();
41 private TableModelListener tableModelListener
= new TableModelHandler();
43 private HashMap
<Integer
, String
> sortingOrders
= new HashMap
<Integer
, String
>();
45 public TableSorter(DefaultTableModel tableModel
) {
46 setTableModel(tableModel
);
50 private void resetSortState() {
55 public DefaultTableModel
getTableModel() {
59 public void setTableModel(DefaultTableModel dtm
) {
60 if (tableModel
!= null) {
61 tableModel
.removeTableModelListener(tableModelListener
);
65 if (tableModel
!= null) {
66 tableModel
.addTableModelListener(tableModelListener
);
70 fireTableStructureChanged();
73 public JTableHeader
getTableHeader() {
77 public void setTableHeader(JTableHeader th
) {
78 if (tableHeader
!= null) {
79 tableHeader
.removeMouseListener(mouseListener
);
82 if (tableHeader
!= null) {
83 tableHeader
.addMouseListener(mouseListener
);
88 private String
getSortState(int column
) {
90 Integer i
= new Integer(column
);
91 if (sortingOrders
.get(i
) != null) {
92 return sortingOrders
.get(i
);
97 private void sortStateChanged() {
99 fireTableDataChanged();
103 public void setSortState(int column
, String status
) {
104 Integer i
= new Integer(column
);
105 sortingOrders
.put(i
, status
);
109 private TableRow
[] getSortedViewRows() {
110 if (rowInView
== null) {
111 int rowCount
= tableModel
.getRowCount();
112 rowInView
= new TableRow
[rowCount
];
114 while ( i
< rowCount
) {
115 rowInView
[i
] = new TableRow(i
);
119 if (sortingOrders
.size() != 0) {
120 Arrays
.sort(rowInView
);
126 public int getModelRowIndex(int viewIndex
) {
127 TableRow
[] rArray
= getSortedViewRows();
128 return rArray
[viewIndex
].modelIndex
;
131 public int[] getViewIndexArray() {
132 if (viewPos
== null) {
133 int n
= getSortedViewRows().length
;
134 viewPos
= new int[n
];
135 for (int i
= 0; i
< n
; i
++) {
136 viewPos
[getModelRowIndex(i
)] = i
;
144 public int getRowCount() {
145 if (tableModel
== null) {
148 return tableModel
.getRowCount();
151 public String
getColumnName(int col
) {
152 return tableModel
.getColumnName(col
);
155 public int getColumnCount() {
156 if (tableModel
== null) {
159 return tableModel
.getColumnCount();
162 public Class
<?
> getColumnClass(int col
) {
163 return tableModel
.getColumnClass(col
);
166 public boolean isCellEditable(int row
, int col
) {
167 int modelIndex
= getModelRowIndex(row
);
168 return tableModel
.isCellEditable(modelIndex
, col
);
171 public Object
getValueAt(int row
, int col
) {
172 int modelIndex
= getModelRowIndex(row
);
173 return tableModel
.getValueAt(modelIndex
, col
);
176 public void setValueAt(Object val
, int row
, int col
) {
177 int modelIndex
= getModelRowIndex(row
);
178 tableModel
.setValueAt(val
, modelIndex
, col
);
183 private class TableRow
implements Comparable
{
184 private int modelIndex
;
186 public TableRow(int index
) {
187 this.modelIndex
= index
;
190 public int compareTo(Object o
) {
191 int row1
= modelIndex
;
192 int row2
= ((TableRow
) o
).modelIndex
;
194 Iterator
<Integer
> mapIter
= sortingOrders
.keySet().iterator();
196 while (mapIter
.hasNext()) {
198 Integer column
= mapIter
.next();
199 Object o1
= tableModel
.getValueAt(row1
, column
);
200 Object o2
= tableModel
.getValueAt(row2
, column
);
203 if (o1
== null && o2
== null) {
205 } else if (o1
== null) {
207 } else if (o2
== null) {
210 comparison
= o1
.toString().compareTo(o2
.toString());;
212 if (comparison
!= 0) {
213 if (getSortState(column
.intValue()).equals(DESCENDING
)) {
223 private class TableModelHandler
implements TableModelListener
{
224 public void tableChanged(TableModelEvent e
) {
225 if (sortingOrders
.size() != 0) {
230 if (e
.getFirstRow() == TableModelEvent
.HEADER_ROW
) {
235 int column
= e
.getColumn();
236 if (e
.getFirstRow() == e
.getLastRow()
237 && column
!= TableModelEvent
.ALL_COLUMNS
238 && getSortState(column
).equals(NOT_SORTED
)
239 && viewPos
!= null) {
240 int viewIndex
= getViewIndexArray()[e
.getFirstRow()];
241 fireTableChanged(new TableModelEvent(TableSorter
.this,
242 viewIndex
, viewIndex
,
243 column
, e
.getType()));
248 fireTableDataChanged();
253 private class MouseHandler
extends MouseAdapter
{
254 public void mouseClicked(MouseEvent e
) {
255 JTableHeader h
= (JTableHeader
) e
.getSource();
256 TableColumnModel columnModel
= h
.getColumnModel();
257 int viewColumn
= columnModel
.getColumnIndexAtX(e
.getX());
258 int column
= columnModel
.getColumn(viewColumn
).getModelIndex();
260 String status
= getSortState(column
);
263 if (status
.equals(ASCENDING
)) {
266 else if (status
.equals(DESCENDING
)) {
269 else if (status
.equals(NOT_SORTED
)) {
272 setSortState(column
, status
);