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 }