avatar

900

Make the Pair class public and available to the rest of the app in the .util package. by mrs, 16 May, 2009 10:44 PM
Diff this changeset:
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