001    package nl.cwi.sen1.visplugin.table.model;
002    
003    import java.awt.event.MouseAdapter;
004    import java.awt.event.MouseEvent;
005    import javax.swing.table.JTableHeader;
006    
007    /**
008     * Header listener, class which tranforms the header item to buttons. Also
009     * listenens to the button events and redirects them.
010     *
011     * @author Anton Gerdessen
012     * @date 12-03-2007
013     */
014    
015    public class HeaderListener extends MouseAdapter {
016    
017        JTableHeader header;
018        SortButtonRenderer renderer;
019    
020        /**
021         * Constructor
022         *
023         * @param header The header to listen to
024         * @param renderer The rededer to which the incoming events are directed
025         * @author Anton Gerdessen
026         * @date 12-03-2007
027         */
028        public HeaderListener(JTableHeader header, SortButtonRenderer renderer) {
029            this.header = header;
030            this.renderer = renderer;
031        }
032    
033        /**
034         * Handle the incoming mouse event from the header button.
035         * repaint the header with the sort indication and sort the column.
036         *
037         * @param event mousePressed event from the header
038         * @author Anton Gerdessen
039         * @date 12-03-2007
040         */
041        public void mousePressed(MouseEvent event) {
042            // Determine on which column the sort will be based.
043            int coloumToSort = header.columnAtPoint(event.getPoint());
044            int sortCol = header.getTable().convertColumnIndexToModel(coloumToSort);
045            renderer.setSelectedColumn(coloumToSort);
046            header.repaint();
047    
048            // Determine the sort order and sort the table based on the column.
049            boolean isAscent = false;
050            if (renderer.getState(coloumToSort) == SortButtonRenderer.ASC ) {
051                isAscent = true;
052            }
053    
054            ((SortableTableModel) header.getTable().getModel()).sortByColumn(
055                    sortCol, isAscent);
056        }
057    
058        /**
059         * Handle the mouse released from the header button.
060         * Force a repaint to show the 'new' button.
061         *
062         * @param event mouseReleased event from the header
063         * @author Anton Gerdessen
064         * @date 12-03-2007
065         */
066        public void mouseReleased(MouseEvent event) {
067            header.repaint();
068        }
069    }