1 14 package org.compiere.report.core; 15 16 import java.awt.*; 17 import java.awt.event.*; 18 import javax.swing.*; 19 import javax.swing.event.*; 20 import javax.swing.table.*; 21 import java.util.*; 22 23 import org.compiere.util.*; 24 25 31 public class ResultTable extends JTable implements MouseListener 32 { 33 36 public ResultTable() 37 { 38 super(); 39 setCellSelectionEnabled(false); 40 setColumnSelectionAllowed(false); 41 setRowSelectionAllowed(false); 42 setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 43 setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 44 45 ResultTableCellEditor rtce = new ResultTableCellEditor(); 47 setCellEditor(rtce); 48 49 addMouseListener(this); 51 getTableHeader().addMouseListener(this); 52 } 54 55 private int m_lastSortIndex = -1; 56 57 private boolean m_asc = true; 58 59 64 public ResultTable (RModel reportModel) 65 { 66 this(); 67 setModel(reportModel); 68 } 70 74 public void setModel (RModel reportModel) 75 { 76 Log.trace(Log.l3_Util, "ResultTable.setModel"); 77 super.setModel(new ResultTableModel(reportModel)); 78 TableColumnModel tcm = getColumnModel(); 80 for (int i = 0; i < tcm.getColumnCount(); i++) 82 { 83 TableColumn tc = tcm.getColumn(i); 84 RColumn rc = reportModel.getRColumn(i); 85 if (rc.getColHeader().equals(tc.getHeaderValue())) 86 { 87 ResultTableCellRenderer rtcr = new ResultTableCellRenderer(reportModel, rc); 88 tc.setCellRenderer(rtcr); 89 } 91 else 92 Log.error("RColumn=" + rc.getColHeader() + " <> TableColumn=" + tc.getHeaderValue()); 93 } 94 autoSize(); 95 } 97 101 public void setModel (TableModel ignored) 102 { 103 super.setModel(ignored); 105 } 107 111 public void tableChanged(TableModelEvent e) 112 { 113 super.tableChanged(e); 114 Log.trace(Log.l6_Database, "ResultTable.tableChanged - Type=" + e.getType()); 115 } 117 118 119 123 public void mouseClicked(MouseEvent e) 124 { 125 int col = getColumnModel().getColumnIndexAtX(e.getX()); 126 Log.trace(Log.l1_User, "ResultTable.mouseClicked", 127 "Column " + col + " = " + getColumnModel().getColumn(col).getHeaderValue() 128 + ", Table r=" + this.getSelectedRow() + " c=" + this.getSelectedColumn()); 129 130 if (e.getSource() == this) 132 { 133 } 134 else 136 { 137 int mc = convertColumnIndexToModel(col); 138 sort(mc); 139 } 140 } 142 public void mousePressed(MouseEvent e) 143 { 144 } 145 public void mouseReleased(MouseEvent e) 146 { 147 } 148 public void mouseEntered(MouseEvent e) 149 { 150 } 151 public void mouseExited(MouseEvent e) 152 { 153 } 154 155 156 157 160 private void autoSize() 161 { 162 Log.trace(Log.l4_Data, "ResultTable.autoSize"); 163 final int SLACK = 8; final int MAXSIZE = 300; TableColumnModel tcm = getColumnModel(); 168 for (int col = 0; col < tcm.getColumnCount(); col++) 170 { 171 TableColumn tc = tcm.getColumn(col); 172 int width = 0; 174 175 TableCellRenderer renderer = tc.getHeaderRenderer(); 177 if (renderer == null) 178 renderer = new DefaultTableCellRenderer(); 179 Component comp = renderer.getTableCellRendererComponent 180 (this, tc.getHeaderValue(), false, false, 0, 0); 181 width = comp.getPreferredSize().width + SLACK; 183 184 int maxRow = Math.min(30, getRowCount()); for (int row = 0; row < maxRow; row++) 187 { 188 renderer = getCellRenderer(row, col); 189 comp = renderer.getTableCellRendererComponent 190 (this, getValueAt(row, col), false, false, row, col); 191 int rowWidth = comp.getPreferredSize().width + SLACK; 192 width = Math.max(width, rowWidth); 193 } 194 width = Math.min(MAXSIZE, width); 196 tc.setPreferredWidth(width); 197 } } 201 205 private void sort (int modelColumnIndex) 206 { 207 int rows = getRowCount(); 208 if (rows == 0) 209 return; 210 if (modelColumnIndex != m_lastSortIndex) 212 m_asc = true; 213 else 214 m_asc = !m_asc; 215 216 m_lastSortIndex = modelColumnIndex; 217 Log.trace(Log.l4_Data, "ResultTable.sort #" + modelColumnIndex, 219 "rows=" + rows + ", asc=" + m_asc); 220 ResultTableModel model = (ResultTableModel)getModel(); 221 222 MSort sort = new MSort(0, null); 224 sort.setSortAsc(m_asc); 225 sorting: 227 while (true) 228 { 229 ArrayList sortList = new ArrayList(rows); 231 for (int i = 0; i < rows; i++) 233 { 234 Object value = model.getValueAt(i, modelColumnIndex); 235 sortList.add(new MSort(i, value)); 236 } 237 Collections.sort(sortList, sort); 239 for (int i = 0; i < rows; i++) 241 { 242 int index = ((MSort)sortList.get(i)).index; 243 if (i != index) 244 { 245 model.moveRow (i, index); 247 continue sorting; 248 } 249 } 250 break; 253 } } 256 } | Popular Tags |