001    /*
002      Copyright (C) 2001-2003 Renaud Pawlak <renaud@aopsys.com>
003                              Laurent Martelli  <laurent@aopsys.com>
004      
005      This program is free software; you can redistribute it and/or modify
006      it under the terms of the GNU Lesser General Public License as
007      published by the Free Software Foundation; either version 2 of the
008      License, or (at your option) any later version.
009    
010      This program is distributed in the hope that it will be useful,
011      but WITHOUT ANY WARRANTY; without even the implied warranty of
012      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
013      GNU Lesser General Public License for more details.
014    
015      You should have received a copy of the GNU Lesser General Public License
016      along with this program; if not, write to the Free Software
017      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
018    
019    package org.objectweb.jac.aspects.gui.swing;
020    
021    import java.awt.Point;
022    import java.awt.event.InputEvent;
023    import java.awt.event.MouseAdapter;
024    import java.awt.event.MouseEvent;
025    import javax.swing.JComponent;
026    import javax.swing.ListSelectionModel;
027    import javax.swing.event.ListSelectionListener;
028    import javax.swing.table.DefaultTableCellRenderer;
029    import javax.swing.table.JTableHeader;
030    import javax.swing.table.TableCellRenderer;
031    import javax.swing.table.TableColumnModel;
032    import org.apache.log4j.Logger;
033    import org.objectweb.jac.aspects.gui.*;
034    import org.objectweb.jac.core.rtti.CollectionItem;
035    import org.objectweb.jac.core.rtti.MemberItem;
036    
037    public class SwingTableView extends AbstractCollection
038        implements ListSelectionListener
039    {
040        static Logger logger = Logger.getLogger("gui.table");
041    
042        // swing table component
043        JTable table;
044    
045        public SwingTableView(ViewFactory factory, DisplayContext context,
046                              CollectionItem collection, Object substance,
047                              ExtendedTableModel model, 
048                              org.objectweb.jac.aspects.gui.CollectionItemView itemView) 
049        {
050            super(factory,context,collection,substance,model,itemView);
051          
052            // ensure that 'table' is not null
053            getInnerComponent(model);
054            setCellRenderers(table);
055            table.setPreferredRowHeights(1);
056            addMouseListenerToHeaderInTable((TableSorter)model);
057        }
058    
059        /**
060         * Sets some mouse listeners on the columns headers.  <p>"Click"
061         * sorts in ascending order, "Shift+Click" sort in descending
062         * order.
063         */
064        void addMouseListenerToHeaderInTable(final TableSorter sorter) { 
065            final JTable tableView = table; 
066            tableView.setColumnSelectionAllowed(false); 
067            MouseAdapter listMouseListener = new MouseAdapter() {
068                    public void mouseClicked(MouseEvent e) {
069                        TableColumnModel columnModel = tableView.getColumnModel();
070                        int viewColumn = columnModel.getColumnIndexAtX(e.getX()); 
071                        int column = tableView.convertColumnIndexToModel(viewColumn); 
072                        if (e.getClickCount() == 1 && column != -1) {
073                            //System.out.println("Sorting ..."); 
074                            boolean shiftPressed = (e.getModifiers() & InputEvent.SHIFT_MASK) != 0;
075                            if (shiftPressed) {
076                                sorter.sortByColumn(column, false); 
077                            } else {
078                                SortCriteria criteria = sorter.getSortCriteria(column);
079                                if (criteria!=null) {
080                                    sorter.sortByColumn(-1,criteria.isAscending());            
081                                } else {
082                                    sorter.sortByColumn(column, true); 
083                                }
084                            }
085                        }
086                    }
087                };
088            JTableHeader th = tableView.getTableHeader(); 
089            th.addMouseListener(listMouseListener); 
090        }
091    
092        /**
093         * Set the cell renderer to use for each column of the table.
094         */
095        protected void setCellRenderers(JTable table) {
096            ExtendedTableModel tableModel = (ExtendedTableModel)table.getModel();
097            //      ClassItem[] viewerClasses = tableModel.getViewerClasses();
098            MemberItem[] members = tableModel.getMembers();
099            String[] headers = tableModel.getHeaders();
100          
101            for (int i=0; i<members.length; i++) {
102                //if(members[i] instanceof FieldItem)
103                Object cellRenderer = tableModel.getCellRenderer(this,i,factory,context);
104                if (cellRenderer instanceof TableCellRenderer) {
105                    logger.debug("setCellRenderer for "+
106                                 members[i].getLongName()+" -> "+cellRenderer);
107                    table.getColumnModel().getColumn(i).setCellRenderer(
108                        (TableCellRenderer)cellRenderer);
109                } else {
110                    logger.debug("setCellRenderer for "+members[i].getLongName());
111                    table.getColumnModel().getColumn(i).setCellRenderer(new ToStringTableCellRenderer());
112                }
113            }
114        }
115    
116        protected JComponent getInnerComponent(Model model) {
117            if (table==null) {
118                table = new JTable();
119                table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
120                BetterListSelectionModel selModel = new BetterListSelectionModel(table);
121                table.setSelectionModel(selModel);         
122                table.setModel((javax.swing.table.TableModel)model);
123                selModel.addListSelectionListener(this);
124            }
125            return table;
126        }
127    
128        protected void onRemove() {
129            table.clearSelection();
130        }
131    
132        protected int[] getSelectedIndices() {
133            return table.getSelectedRows();
134        }
135    
136        protected Model getModel() {
137            return (Model)table.getModel();
138        }
139    
140        protected ListSelectionModel getSelectionModel() {
141            return table.getSelectionModel();
142        }
143    
144        protected CollectionUpdate getCollectionUpdate() {
145            return (CollectionUpdate)((TableSorter)model).getModel();
146        }
147    
148        int locationToIndex(Point location) {
149            return table.rowAtPoint(location);
150        }   
151    
152        // CollectionView interface
153    
154        public void setSelected(int index) {
155            table.changeSelection(index,-1,false,false);
156        }
157    }