001    package nl.cwi.sen1.visplugin.table.model;
002    
003    import java.awt.Component;
004    
005    import java.util.Hashtable;
006    
007    import javax.swing.ImageIcon;
008    import javax.swing.JButton;
009    import javax.swing.JTable;
010    import javax.swing.table.TableCellRenderer;
011    /**
012     * Sort button renderer. Class responsible for the button in the header.
013     * These buttons will show the order in which the current sort applies.
014     * This will be either descending or ascending, the initial state is no sorting.
015     *
016     * @author Anton Gerdessen
017     * @date 12-03-2007
018     */
019    public class SortButtonRenderer extends JButton implements TableCellRenderer {
020    
021        private static final long serialVersionUID = 1L;
022    
023        // Define the button states.
024        public static final int NONE = 0;
025        public static final int ASC = 1;
026        public static final int DEC = 2;
027    
028        private Hashtable<Integer, Integer> state;
029        private JButton ascButton;
030        private JButton decButton;
031    
032        /**
033         * Constructor.
034         *
035         * @author Anton Gerdessen
036         * @date 12-03-2007
037         */
038        public SortButtonRenderer() {
039            state = new Hashtable<Integer, Integer>();
040    
041            // Create the ascending button with icon.
042            ascButton = new JButton();
043            ascButton.setHorizontalTextPosition(LEFT);
044            ImageIcon aicon = new ImageIcon(getClass().getResource(
045                    "/resources/images/sortAsc.gif"));
046            ascButton.setIcon(aicon);
047    
048            // Create the descending button with icon.
049            decButton = new JButton();
050            decButton.setHorizontalTextPosition(LEFT);
051            ImageIcon bicon = new ImageIcon(getClass().getResource(
052                    "/resources/images/sortDec.gif"));
053            decButton.setIcon(bicon);
054    
055        }
056    
057        /**
058         * Method inherited from the TableCellRenderer
059         * Only the column and value attributes are used.
060         *
061         * @param table <not used>
062         * @param value The header buttons text
063         * @param isSelected <not used>
064         * @param hasFocus <not used>
065         * @param row <not used>
066         * @param column The column for which to change the header.
067         * @author Anton Gerdessen
068         * @date 12-03-2007
069         */
070        public Component getTableCellRendererComponent(JTable table, Object value,
071                boolean isSelected, boolean hasFocus, int row, int column) {
072    
073            JButton button = this;
074    
075            // Determine the state for sorting.
076            Object obj = state.get(new Integer(column));
077            if (obj != null) {
078                if (((Integer) obj).intValue() == ASC) {
079                    button = ascButton;
080                } else {
081                    button = decButton;
082                }
083            }
084    
085            // Copy the text from the 'old' to on the 'new' button.
086            button.setText((value == null) ? "" : value.toString());
087    
088            return button;
089        }
090    
091        /**
092         * Set the column on which the current sort is based.
093         *
094         * @param column The column for which sort will be based
095         * @author Anton Gerdessen
096         * @date 12-03-2007
097         */
098        @SuppressWarnings("unchecked")
099        public void setSelectedColumn(int column) {
100    
101            if (column < 0)
102                return;
103    
104            // Inial state will be ascending. if a sorting order is already
105            // 'active', swap the sorting.
106            Integer value = null;
107            Object obj = state.get(new Integer(column));
108            if (obj == null) {
109                value = new Integer(ASC);
110            } else {
111                if (((Integer) obj).intValue() == ASC) {
112                    value = new Integer(DEC);
113                } else {
114                    value = new Integer(ASC);
115                }
116            }
117    
118            // Clear the state and add the current column and its order to state.
119            state.clear();
120            state.put(new Integer(column), value);
121        }
122    
123        /**
124         * Retrieve the current state for a given column.
125         *
126         * @param col The column for which to retrieve the sort order.
127         * @author Anton Gerdessen
128         * @date 12-03-2007
129         */
130        public int getState(int col) {
131            // If no sort order is given return none, else return the sort order.
132            int retValue;
133            Object obj = state.get(new Integer(col));
134    
135            if (obj == null) {
136                retValue = NONE;
137            } else {
138                if (((Integer) obj).intValue() == ASC) {
139                    retValue = ASC;
140                } else {
141                    retValue = DEC;
142                }
143            }
144            return retValue;
145        }
146    
147    }