- ~
- jbidwatcher
- trunk
- src
- com
- jbidwatcher
- ui
- table
- AuctionTable.java
| AuctionTable.java |
|---|
mrs 1 package com.jbidwatcher.ui.table; mrs 2 mrs 3 import com.jbidwatcher.auction.AuctionEntry; mrs 4 import com.jbidwatcher.util.config.JConfig; mrs 5 import com.jbidwatcher.util.Constants; mrs 6 import com.jbidwatcher.util.Pair; mrs 7 import com.jbidwatcher.util.queue.SuperQueue; mrs 8 mrs 9 import javax.swing.*; mrs 10 import javax.swing.table.TableModel; mrs 11 import javax.swing.table.TableColumn; mrs 12 import java.awt.event.MouseEvent; mrs 13 import java.awt.event.MouseListener; mrs 14 import java.awt.Point; mrs 15 import java.awt.Dimension; mrs 16 import java.util.*; mrs 17 mrs 18 /** mrs 19 * Created by IntelliJ IDEA. mrs 20 * User: Morgan mrs 21 * Date: Jun 20, 2008 mrs 22 * Time: 12:06:56 PM mrs 23 * Handle tooltips, at least. A very cool feature. mrs 24 */ mrs 25 public class AuctionTable extends JTable { mrs 26 mrs 27 /** mrs 28 * @brief Constructs a JTable out of a prefix to search for in the mrs 29 * configuration, and a TableModel to apply to the table. mrs 30 * mrs 31 * The TableModel has the list of column names, and when you add mrs 32 * "prefix." to the front of them, it makes a configuration entry mrs 33 * which says the size of that column. mrs 34 * mrs 35 * Returns a new JTable, properly spaced and filled out according to mrs 36 * the configuration preferences. mrs 37 * mrs 38 * @param name - A string that gets prepended to the column name mrs 39 * in order to produce a display property showing mrs 40 * the preferred width of that column. mrs 41 * @param atm - A TableModel that will be used for rendering the table. mrs 42 */ mrs 43 public AuctionTable(String name, TableModel atm) { mrs 44 super(); mrs 45 createDefaultRenderers(); mrs 46 setShowGrid(false); mrs 47 setIntercellSpacing(new Dimension(0, 0)); mrs 48 setDoubleBuffered(true); mrs 49 setAutoCreateColumnsFromModel(false); mrs 50 mrs 51 setModel(atm); mrs 52 loadColumnSettings(name, atm); mrs 53 doLayout(); mrs 54 } mrs 55 mrs 56 public String getToolTipText(MouseEvent event) { mrs 57 Point point = new Point(event.getX(), event.getY()); mrs 58 int rowPoint = rowAtPoint(point); mrs 59 String result = null; mrs 60 int colPoint = columnAtPoint(point); mrs 61 mrs 62 if(rowPoint != -1) { mrs 63 AuctionEntry ae = (AuctionEntry) getValueAt(rowPoint, -1); mrs 64 boolean showThumbnail = true; mrs 65 mrs 66 if(getRowHeight() == Constants.MICROTHUMBNAIL_ROW_HEIGHT) { mrs 67 showThumbnail = getColumnName(colPoint).equals("Thumbnail"); mrs 68 } mrs 69 mrs 70 result = ae.buildHTMLComment(showThumbnail); mrs 71 } mrs 72 mrs 73 return result == null ? super.getToolTipText(event) : result; mrs 74 } mrs 75 mrs 76 static class MouseListenerSelectProxy implements MouseListener { mrs 77 private MouseListener m_peer; mrs 78 mrs 79 MouseListenerSelectProxy(MouseListener ml) { m_peer = ml; } mrs 80 mrs 81 public MouseListener getPeer() { return m_peer; } mrs 82 mrs 83 /** mrs 84 * Invoked when the mouse button has been clicked (pressed mrs 85 * and released) on a component. mrs 86 */ mrs 87 public void mouseClicked(MouseEvent e) { if (!e.isPopupTrigger()) m_peer.mouseClicked(e); } mrs 88 mrs 89 /** mrs 90 * Invoked when the mouse enters a component. mrs 91 */ mrs 92 public void mouseEntered(MouseEvent e) { m_peer.mouseEntered(e); } mrs 93 mrs 94 /** mrs 95 * Invoked when the mouse exits a component. mrs 96 */ mrs 97 public void mouseExited(MouseEvent e) { m_peer.mouseExited(e); } mrs 98 mrs 99 /** mrs 100 * Invoked when a mouse button has been pressed on a component. mrs 101 */ mrs 102 public void mousePressed(MouseEvent e) { if (!e.isPopupTrigger()) m_peer.mousePressed(e); } mrs 103 mrs 104 /** mrs 105 * Invoked when a mouse button has been released on a component. mrs 106 */ mrs 107 public void mouseReleased(MouseEvent e) { if (!e.isPopupTrigger()) m_peer.mouseReleased(e); } mrs 108 } mrs 109 mrs 110 private final static String METAL_MOUSE_LISTENER = "javax.swing.plaf.basic.BasicTableUI$MouseInputHandler"; mrs 111 private final static String AQUA_MOUSE_LISTENER = "apple.laf.AquaTableUI$MouseInputHandler"; mrs 112 mrs 113 /** @noinspection InstanceVariableMayNotBeInitialized*/ mrs 114 // DO NOT INITIALIZE proxyMouseListener!!!!! mrs 115 // It is used in addMouseListener BEFORE the constuctor is run mrs 116 // (called from the base class constructor). If it is set here mrs 117 // or in the constructor, it will clobber the value set by the mrs 118 // call from the base class constructor. mrs 119 private MouseListenerSelectProxy proxyMouseListener; mrs 120 mrs 121 public synchronized void addMouseListener(MouseListener ml) { mrs 122 String mlClass = ml.getClass().getName(); mrs 123 if ((proxyMouseListener == null) && mrs 124 (mlClass.equals(METAL_MOUSE_LISTENER) || mrs 125 mlClass.equals(AQUA_MOUSE_LISTENER))) { mrs 126 proxyMouseListener = new MouseListenerSelectProxy(ml); mrs 127 super.addMouseListener(proxyMouseListener); mrs 128 } else { mrs 129 super.addMouseListener(ml); mrs 130 } mrs 131 } mrs 132 mrs 133 public synchronized void removeMouseListener(MouseListener ml) { mrs 134 //noinspection ObjectEquality mrs 135 if ((proxyMouseListener != null) && (ml == proxyMouseListener.getPeer())) { mrs 136 super.removeMouseListener(proxyMouseListener); mrs 137 proxyMouseListener = null; mrs 138 } else { mrs 139 super.removeMouseListener(ml); mrs 140 } mrs 141 } mrs 142 mrs 143 private static final String[][] DEFAULT_COLUMNS = new String[][]{ mrs 144 {"Number", "100"}, mrs 145 {"Current", "89"}, mrs 146 {"Max", "62"}, mrs 147 {"Description", "297"}, mrs 148 {"Time left", "127"}, mrs 149 {"Status", "67"}, mrs 150 {"Seller", "147"}, mrs 151 }; mrs 152 mrs 153 private static int notify_delay = 0; mrs 154 mrs 155 private class ColumnIndex extends Pair<String,Integer> { mrs 156 public ColumnIndex(String s, Integer i) { super(s, i); } mrs 157 } mrs 158 mrs 159 private void loadColumnSettings(String prefix, TableModel atm) { mrs 160 String curColumnName = ""; mrs 161 int columnCount = 0; mrs 162 mrs 163 List<ColumnIndex> initialToSaved = new LinkedList<ColumnIndex>(); mrs 164 // This code would need to be somewhat revamped if we allowed mrs 165 // arbitrary, or user-selected column names. mrs 166 try { mrs 167 for(int i = 0; i<atm.getColumnCount(); i++) { mrs 168 curColumnName = atm.getColumnName(i); mrs 169 //noinspection StringContatenationInLoop mrs 170 String colWidth = JConfig.queryDisplayProperty(prefix + '.' + curColumnName); mrs 171 if(colWidth == null) { mrs 172 colWidth = JConfig.queryDisplayProperty(curColumnName); mrs 173 } mrs 174 if(colWidth != null) { mrs 175 int dotIndex = colWidth.indexOf('.'); mrs 176 if (dotIndex != -1) { mrs 177 String colIndex = colWidth.substring(0, dotIndex); mrs 178 colWidth = colWidth.substring(dotIndex + 1); mrs 179 initialToSaved.add(new ColumnIndex(curColumnName, Integer.parseInt(colIndex))); mrs 180 } mrs 181 columnCount++; mrs 182 makeNewColumn(curColumnName, colWidth); mrs 183 } mrs 184 } mrs 185 } catch(Exception e) { mrs 186 // If we encountered any errors in earlier columns, don't try mrs 187 // to set later columns. mrs 188 JConfig.log().handleException("In display configuration for table " + prefix +", column \"" + curColumnName + "\" has an invalid property.", e); mrs 189 JConfig.log().logDebug("No longer loading column widths from configuration."); mrs 190 } mrs 191 mrs 192 // If there are less than 2 columns, freak out and refresh. mrs 193 if(columnCount < 2) { mrs 194 SuperQueue.getInstance().preQueue("NOTIFY Column data for '" + prefix + "' was corrupted; resetting to defaults", "Swing", System.currentTimeMillis() + Constants.ONE_SECOND * 12 + notify_delay); mrs 195 JConfig.log().logMessage("Column data for '" + prefix + "' was corrupted; resetting to defaults"); mrs 196 notify_delay += 2 * Constants.ONE_SECOND; mrs 197 for(String[] column : DEFAULT_COLUMNS) { mrs 198 String column_name = column[0]; mrs 199 String column_width = column[1]; mrs 200 mrs 201 if (column_name.equals("Time left") && prefix.equals("complete")) continue; mrs 202 makeNewColumn(column_name, column_width); mrs 203 } mrs 204 } mrs 205 mrs 206 if(!initialToSaved.isEmpty()) { mrs 207 Collections.sort(initialToSaved, new Comparator<ColumnIndex>() { mrs 208 public int compare(ColumnIndex o1, ColumnIndex o2) { mrs 209 if(o1.getLast() < o2.getLast()) return -1; mrs 210 if(o1.getLast() > o2.getLast()) return 1; mrs 211 return 0; mrs 212 } mrs 213 }); mrs 214 for (ColumnIndex pair : initialToSaved) { mrs 215 int colFrom = getColumnModel().getColumnIndex(pair.getFirst()); mrs 216 int colTo = pair.getLast(); mrs 217 try { mrs 218 moveColumn(colFrom, colTo); mrs 219 } catch (IllegalArgumentException iae) { mrs 220 // Ignore it, and move on. mrs 221 } mrs 222 } mrs 223 } mrs 224 } mrs 225 mrs 226 private void makeNewColumn(String curColumnName, String colWidth) { mrs 227 TableColumn tc = new TableColumn(TableColumnController.getInstance().getColumnNumber(curColumnName)); mrs 228 tc.setHeaderValue(curColumnName); mrs 229 tc.setIdentifier(curColumnName); mrs 230 addColumn(tc); mrs 231 getColumn(curColumnName).setPreferredWidth(Integer.parseInt(colWidth)); mrs 232 getColumn(curColumnName).setWidth(Integer.parseInt(colWidth)); mrs 233 } mrs 234 }
Check out the code: svn co jbidwatcher/trunk/src/com/jbidwatcher/ui/table/AuctionTable.java
