JXTableHeader.java
上传用户:zhengdagz
上传日期:2014-03-06
资源大小:1956k
文件大小:6k
源码类别:

xml/soap/webservice

开发平台:

Java

  1. /*
  2.  * $Id: JXTableHeader.java,v 1.8 2005/10/12 11:26:55 kleopatra Exp $
  3.  *
  4.  * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
  5.  * Santa Clara, California 95054, U.S.A. All rights reserved.
  6.  *
  7.  * This library is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU Lesser General Public
  9.  * License as published by the Free Software Foundation; either
  10.  * version 2.1 of the License, or (at your option) any later version.
  11.  * 
  12.  * This library is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * Lesser General Public License for more details.
  16.  * 
  17.  * You should have received a copy of the GNU Lesser General Public
  18.  * License along with this library; if not, write to the Free Software
  19.  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  20.  */
  21. package org.jdesktop.swingx;
  22. import java.awt.event.MouseEvent;
  23. import javax.swing.JComponent;
  24. import javax.swing.JTable;
  25. import javax.swing.SwingUtilities;
  26. import javax.swing.event.MouseInputListener;
  27. import javax.swing.table.JTableHeader;
  28. import javax.swing.table.TableCellRenderer;
  29. import javax.swing.table.TableColumn;
  30. import javax.swing.table.TableColumnModel;
  31. import org.jdesktop.swingx.table.ColumnHeaderRenderer;
  32. /**
  33.  * TableHeader with extended functionality if associated Table is of
  34.  * type JXTable.<p>
  35.  * 
  36.  * The enhancements:
  37.  * <ul>
  38.  * <li> toggles sort of column on mouseClicked if table isSortable
  39.  * <li> uses ColumnHeaderRenderer which can show the sort icon
  40.  * <li> triggers column pack (== auto-resize to exactly fit the contents)
  41.  *  on double-click in resize region.
  42.  * </ul>
  43.  * 
  44.  * @author Jeanette Winzenburg
  45.  */
  46. public class JXTableHeader extends JTableHeader {
  47.     public JXTableHeader() {
  48.         super();
  49.     }
  50.     public JXTableHeader(TableColumnModel columnModel) {
  51.         super(columnModel);
  52.     }
  53.     /**
  54.      * Sets the associated JTable. Enables enhanced header
  55.      * features if table is of type JXTable.<p>
  56.      * 
  57.      * PENDING: who is responsible for synching the columnModel?
  58.      */
  59.     public void setTable(JTable table) {
  60.         super.setTable(table);
  61. //        setColumnModel(table.getColumnModel());
  62.         // the additional listening option makes sense only if the table
  63.         // actually is a JXTable
  64.         if (getXTable() != null) {
  65.             installHeaderListener();
  66.         } else {
  67.             uninstallHeaderListener();
  68.         }
  69.     }
  70.     public JXTable getXTable() {
  71.         if (!(getTable() instanceof JXTable))
  72.             return null;
  73.         return (JXTable) getTable();
  74.     }
  75.     
  76.     public void updateUI() {
  77.         super.updateUI();
  78.         if (getDefaultRenderer() instanceof JComponent) {
  79.             ((JComponent) getDefaultRenderer()).updateUI();
  80.          
  81.         }
  82.     }
  83.     /**
  84.      * returns the (visible) view index for the given column
  85.      * or -1 if not visible or not contained in this header's
  86.      * columnModel.
  87.      * 
  88.      * 
  89.      * @param aColumn
  90.      * @return
  91.      */
  92.     private int getViewIndexForColumn(TableColumn aColumn) {
  93.         if (aColumn == null)
  94.             return -1;
  95.         TableColumnModel cm = getColumnModel();
  96.         for (int column = 0; column < cm.getColumnCount(); column++) {
  97.             if (cm.getColumn(column) == aColumn) {
  98.                 return column;
  99.             }
  100.         }
  101.         return -1;
  102.     }
  103.     protected TableCellRenderer createDefaultRenderer() {
  104.         return ColumnHeaderRenderer.createColumnHeaderRenderer();
  105.     }
  106.     protected void installHeaderListener() {
  107.         if (headerListener == null) {
  108.             headerListener = new HeaderListener();
  109.             addMouseListener(headerListener);
  110.             addMouseMotionListener(headerListener);
  111.         }
  112.     }
  113.     protected void uninstallHeaderListener() {
  114.         if (headerListener != null) {
  115.             removeMouseListener(headerListener);
  116.             removeMouseMotionListener(headerListener);
  117.             headerListener = null;
  118.         }
  119.     }
  120.     private MouseInputListener headerListener;
  121.     private class HeaderListener implements MouseInputListener {
  122.         private TableColumn cachedResizingColumn;
  123.         public void mouseClicked(MouseEvent e) {
  124.             if (shouldIgnore(e)) {
  125.                 return;
  126.             }
  127.             if (isInResizeRegion(e)) {
  128.                 doResize(e);
  129.             } else {
  130.                 doSort(e);
  131.             }
  132.         }
  133.         private boolean shouldIgnore(MouseEvent e) {
  134.             return !SwingUtilities.isLeftMouseButton(e)
  135.               || !table.isEnabled();
  136.         }
  137.         private void doSort(MouseEvent e) {
  138.             JXTable table = getXTable();
  139.             if (!table.isSortable() || (e.getClickCount() != 1))
  140.                 return;
  141.             if ((e.getModifiersEx() & e.SHIFT_DOWN_MASK) == e.SHIFT_DOWN_MASK) {
  142.                 table.resetSorter();
  143.             } else {
  144.                 int column = columnAtPoint(e.getPoint());
  145.                 if (column >= 0) {
  146.                     table.setSorter(column);
  147.                 }
  148.                 uncacheResizingColumn();
  149.             }
  150.             repaint();
  151.         }
  152.         private void doResize(MouseEvent e) {
  153.             if (e.getClickCount() != 2)
  154.                 return;
  155.             int column = getViewIndexForColumn(cachedResizingColumn);
  156.             if (column >= 0) {
  157.                 (getXTable()).packColumn(column, 5);
  158.             }
  159.             uncacheResizingColumn();
  160.         }
  161.         public void mouseReleased(MouseEvent e) {
  162.             cacheResizingColumn(e);
  163.         }
  164.         public void mousePressed(MouseEvent e) {
  165.             cacheResizingColumn(e);
  166.         }
  167.         private void cacheResizingColumn(MouseEvent e) {
  168.             if (e.getClickCount() != 1)
  169.                 return;
  170.             TableColumn column = getResizingColumn();
  171.             if (column != null) {
  172.                 cachedResizingColumn = column;
  173.             }
  174.         }
  175.         private void uncacheResizingColumn() {
  176.             cachedResizingColumn = null;
  177.         }
  178.         private boolean isInResizeRegion(MouseEvent e) {
  179.             return cachedResizingColumn != null; // inResize;
  180.         }
  181.         public void mouseEntered(MouseEvent e) {
  182.         }
  183.         public void mouseExited(MouseEvent e) {
  184.             uncacheResizingColumn();
  185.         }
  186.         public void mouseDragged(MouseEvent e) {
  187.             uncacheResizingColumn();
  188.         }
  189.         public void mouseMoved(MouseEvent e) {
  190.         }
  191.     }
  192. }