1 14 package org.compiere.swing; 15 16 import java.awt.Component ; 17 import java.awt.event.MouseAdapter ; 18 import java.awt.event.MouseEvent ; 19 import java.util.ArrayList ; 20 import java.util.Collections ; 21 22 import javax.swing.JTable ; 23 import javax.swing.ListSelectionModel ; 24 import javax.swing.event.ChangeEvent ; 25 import javax.swing.table.DefaultTableCellRenderer ; 26 import javax.swing.table.DefaultTableModel ; 27 import javax.swing.table.TableCellRenderer ; 28 import javax.swing.table.TableColumn ; 29 import javax.swing.table.TableModel ; 30 31 import org.compiere.util.MSort; 32 33 40 public class CTable extends JTable 41 { 42 45 public CTable() 46 { 47 super(new DefaultTableModel ()); 48 setColumnSelectionAllowed(false); 49 setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 50 setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 51 getTableHeader().addMouseListener(new CTableMouseListener()); 52 53 54 } 56 57 protected int p_lastSortIndex = -1; 58 59 protected boolean p_asc = true; 60 61 62 private final int SLACK = 15; 63 64 private final int MAXSIZE = 250; 65 66 protected int p_keyColumnIndex = -1; 67 68 69 75 public void setKeyColumnIndex (int keyColumnIndex) 76 { 77 p_keyColumnIndex = keyColumnIndex; 78 } 80 84 public int getKeyColumnIndex() 85 { 86 return p_keyColumnIndex; 87 } 89 93 public Object getSelectedKeyColumnValue() 94 { 95 int row = getSelectedRow(); 96 if (row != -1 && p_keyColumnIndex != -1) 97 return getModel().getValueAt(row, p_keyColumnIndex); 98 return null; 99 } 101 105 public Object getSelectedValue() 106 { 107 int row = getSelectedRow(); 108 int col = getSelectedColumn(); 109 if (row == -1 || col == -1) 110 return null; 111 return getValueAt(row, col); 112 } 114 118 public void stopEditor (boolean saveValue) 119 { 120 ChangeEvent ce = new ChangeEvent (this); 122 if (saveValue) 123 editingStopped(ce); 124 else 125 editingCanceled(ce); 126 if (getInputContext() != null) 128 getInputContext().endComposition(); 129 transferFocus(); 131 } 133 134 135 139 public void autoSize() 140 { 141 TableModel model = this.getModel(); 142 int size = model.getColumnCount(); 143 for (int c = 0; c < size; c++) 145 { 146 TableColumn column = getColumnModel().getColumn(c); 147 if (column.getIdentifier() == null 149 || column.getMaxWidth() == 0 150 || column.getIdentifier().toString().length() == 0) 151 continue; 152 153 int width = 0; 154 TableCellRenderer renderer = column.getHeaderRenderer(); 156 Component comp = null; 157 if (renderer == null) 158 renderer = new DefaultTableCellRenderer (); 159 else 160 comp = renderer.getTableCellRendererComponent 161 (this, column.getHeaderValue(), false, false, 0, 0); 162 if (comp != null) 164 { 165 width = comp.getPreferredSize().width + SLACK; 166 width = Math.max(width, comp.getWidth()); 167 168 int col = column.getModelIndex(); 170 int maxRow = Math.min(30, getRowCount()); 171 try 172 { 173 for (int row = 0; row < maxRow; row++) 174 { 175 renderer = getCellRenderer(row, col); 176 comp = renderer.getTableCellRendererComponent 177 (this, getValueAt(row, col), false, false, row, col); 178 int rowWidth = comp.getPreferredSize().width + SLACK; 179 width = Math.max(width, rowWidth); 180 } 181 } 182 catch (Exception e) 183 { 184 System.out.println(column.getIdentifier()); 185 e.printStackTrace(); 186 } 187 width = Math.min(MAXSIZE, width); 189 } 190 column.setPreferredWidth(width); 192 } } 195 199 protected void sort (int modelColumnIndex) 200 { 201 int rows = getRowCount(); 202 if (rows == 0) 203 return; 204 if (modelColumnIndex != p_lastSortIndex) 206 p_asc = true; 207 else 208 p_asc = !p_asc; 209 p_lastSortIndex = modelColumnIndex; 210 213 Object selected = null; 215 int selRow = getSelectedRow(); 216 int selCol = p_keyColumnIndex == -1 ? 0 : p_keyColumnIndex; if (getSelectedRow() >= 0) 218 selected = getValueAt(selRow, selCol); 219 220 DefaultTableModel model = (DefaultTableModel )getModel(); 222 MSort sort = new MSort(0, null); 223 sort.setSortAsc(p_asc); 224 sorting: 226 while (true) 227 { 228 ArrayList sortList = new ArrayList (rows); 230 for (int i = 0; i < rows; i++) 232 { 233 Object value = model.getValueAt(i, modelColumnIndex); 234 sortList.add(new MSort(i, value)); 235 } 236 Collections.sort(sortList, sort); 238 for (int i = 0; i < rows; i++) 240 { 241 int index = ((MSort)sortList.get(i)).index; 242 if (i != index) 243 { 244 model.moveRow(i,i, index); 246 continue sorting; 247 } 248 } 249 break; 252 } 254 clearSelection(); 256 if (selected != null) 257 { 258 for (int r = 0; r < rows; r++) 259 { 260 if (selected.equals(getValueAt(r, selCol))) 261 { 262 setRowSelectionInterval(r,r); 263 break; 264 } 265 } 266 } } 269 273 public String toString() 274 { 275 return new StringBuffer ("CTable[").append(getModel()).append("]").toString(); 276 } 278 279 280 283 class CTableMouseListener extends MouseAdapter 284 { 285 288 public CTableMouseListener() 289 { 290 super(); 291 } 293 297 public void mouseClicked (MouseEvent e) 298 { 299 int vc = getColumnModel().getColumnIndexAtX(e.getX()); 300 int mc = convertColumnIndexToModel(vc); 302 sort(mc); 303 } 304 } 306 } | Popular Tags |