1 package org.columba.addressbook.gui.table.model; 19 20 import java.util.Map ; 21 22 import javax.swing.event.TableModelEvent ; 23 import javax.swing.table.TableModel ; 24 25 import org.columba.addressbook.model.IContactModelPartial; 26 27 36 public class SortDecorator extends TableModelDecorator { 37 38 private int[] indexes; 39 40 private int selectedColumn; 41 42 private boolean sortOrder; 43 44 public SortDecorator(ContactItemTableModel model) { 45 super(model); 46 47 selectedColumn = 0; 48 sortOrder = false; 49 50 allocate(); 51 } 52 53 56 public void setContactItemMap(Map <String ,IContactModelPartial> list) { 57 58 super.setContactItemMap(list); 59 60 sort(selectedColumn); 61 62 } 63 64 67 public IContactModelPartial getContactItem(int index) { 68 return getRealModel().getContactItem(indexes[index]); 69 } 70 71 public void tableChanged(TableModelEvent e) { 72 allocate(); 73 } 74 75 public Object getValueAt(int row, int column) { 76 return getRealModel().getValueAt(indexes[row], column); 77 } 78 79 public void setValueAt(Object aValue, int row, int column) { 80 getRealModel().setValueAt(aValue, indexes[row], column); 81 } 82 83 public void sort(int column) { 84 85 selectedColumn = column; 86 87 int rowCount = getRowCount(); 88 89 for (int i = 0; i < rowCount; i++) { 90 for (int j = i + 1; j < rowCount; j++) { 91 int c = compare(indexes[i], indexes[j], column); 92 if (!sortOrder) { 93 if (c < 0) 94 swap(i, j); 95 } else { 96 if (c > 0) 97 swap(i, j); 98 } 99 } 100 } 101 } 102 103 private void swap(int i, int j) { 104 int tmp = indexes[i]; 105 indexes[i] = indexes[j]; 106 indexes[j] = tmp; 107 } 108 109 private int compare(int i, int j, int column) { 110 TableModel realModel = getRealModel(); 111 Object io = realModel.getValueAt(i, column); 112 Object jo = realModel.getValueAt(j, column); 113 114 if ((io == null) || (jo == null)) { 115 return 0; 116 } 117 118 int c = jo.toString().compareTo(io.toString()); 119 120 return (c < 0) ? (-1) : ((c > 0) ? 1 : 0); 121 } 122 123 private void allocate() { 124 indexes = new int[getRowCount()]; 125 126 for (int i = 0; i < indexes.length; ++i) { 127 indexes[i] = i; 128 } 129 } 130 131 134 public boolean isSortOrder() { 135 return sortOrder; 136 } 137 138 142 public void setSortOrder(boolean sortOrder) { 143 this.sortOrder = sortOrder; 144 } 145 146 149 public int getSelectedColumn() { 150 return selectedColumn; 151 } 152 153 157 public void setSelectedColumn(int selectedColumn) { 158 this.selectedColumn = selectedColumn; 159 } 160 } | Popular Tags |