package jdepend.client.report.ui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import jdepend.framework.ui.component.JDependFrame;
import jdepend.framework.ui.component.TableMouseMotionAdapter;
import jdepend.framework.ui.component.TableSorter;
import jdepend.framework.ui.util.JTableUtil;
import jdepend.framework.util.BundleUtil;
import jdepend.metadata.CandidateUtil;
import jdepend.metadata.InvokeItem;
import jdepend.metadata.JavaClassRelationItem;
import jdepend.metadata.relationtype.TableRelation;
import jdepend.model.JDependUnit;
import jdepend.model.JDependUnitMgr;
import jdepend.model.JavaClassUnit;
import jdepend.model.RelationDetail;
import jdepend.model.result.AnalysisResult;
import jdepend.client.report.util.ReportConstant;
public final class RelationDetailPanel extends JPanel {
private JDependFrame frame;
private JTable listTable;
private DefaultTableModel listModel;
private RelationDetail currentRelation;
private List<String> extendUnits = new ArrayList<String>();
private AnalysisResult result;
public RelationDetailPanel(JDependFrame frame, JDependUnit current, JDependUnit depend) {
this.frame = frame;
this.result = JDependUnitMgr.getInstance().getResult();
this.currentRelation = current.ceCouplingDetail(depend);
if (this.currentRelation == null) {
return;
}
display();
}
public RelationDetailPanel(JDependFrame frame, RelationDetail relation) {
this.frame = frame;
this.result = JDependUnitMgr.getInstance().getResult();
this.currentRelation = relation;
display();
}
private void display() {
for (JavaClassUnit unit : result.getClasses()) {
if (!unit.isInner()) {
extendUnits.add(unit.getName());
}
}
this.setLayout(new BorderLayout());
initList();
if (this.currentRelation != null) {
showList();
}
List<String> fitColNames = new ArrayList<String>();
fitColNames.add(ReportConstant.CurrentJC);
fitColNames.add(ReportConstant.DependJC);
JTableUtil.fitTableColumns(listTable, fitColNames);
this.add(new JScrollPane(listTable));
}
public void showList() {
listModel.setRowCount(0);
this.loadList();
}
public void loadList() {
Object[] row;
Collection<JavaClassRelationItem> items = currentRelation.getItems();
if (items != null && items.size() != 0) {
for (JavaClassRelationItem item : items) {
row = new Object[7];
row[0] = item.getId();
row[1] = item.getSource().getPlace();
row[2] = item.getSource().getName();
row[3] = item.getTarget().getPlace();
row[4] = item.getTarget().getName();
row[5] = item.getType().getName();
row[6] = item.getRelationIntensity();
listModel.addRow(row);
}
}
}
private void initList() {
listModel = new DefaultTableModel() {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
TableSorter sorter = new TableSorter(listModel);
listTable = new JTable(sorter);
final JPopupMenu popupMenu = new JPopupMenu();
JMenuItem saveAsItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_SaveAs));
saveAsItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JTableUtil.exportTableToExcel(listTable);
}
});
popupMenu.add(saveAsItem);
listTable.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
JTable table = (JTable) e.getSource();
Point p = new Point(e.getX(), e.getY());
int col = table.columnAtPoint(p);
int row = table.rowAtPoint(p);
if (e.getClickCount() == 2) {
String currentCol = (String) table.getColumnModel().getColumn(col).getHeaderValue();
if (currentCol.equals(ReportConstant.CurrentJC) || currentCol.equals(ReportConstant.DependJC)) {
String current;
if (currentCol.equals(ReportConstant.CurrentJC)) {
current = CandidateUtil.getId((String) table.getValueAt(row, 1),
(String) table.getValueAt(row, 2));
} else {
current = CandidateUtil.getId((String) table.getValueAt(row, 3),
(String) table.getValueAt(row, 4));
}
JavaClassUnit currentClass = result.getTheClass(current);
JavaClassRelationGraphDialog d = new JavaClassRelationGraphDialog(frame, currentClass);
d.setModal(true);
d.setVisible(true);
} else if (currentCol.equals(ReportConstant.DependType)) {
String id = (String) table.getValueAt(row, 0);
JavaClassRelationItem item = result.getTheJavaClassRelationItem(id);
Collection<InvokeItem> invokedItems = item.getInvokeDetail();
if (invokedItems.size() > 0) {
InvokeItemListDialog d = new InvokeItemListDialog(invokedItems);
d.setModal(true);
d.setVisible(true);
}
}
} else if (e.getButton() == 3) {
popupMenu.show(listTable, e.getX(), e.getY());
}
}
});
// 监听鼠标移动,修改TIP
listTable.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseMoved(MouseEvent e) {
Point point = e.getPoint();
int row = listTable.rowAtPoint(point);
int column = listTable.columnAtPoint(point);
String currentCol = (String) listTable.getColumnModel().getColumn(column).getHeaderValue();
if (currentCol.equals(ReportConstant.DependType) && listTable.getValueAt(row, column) != null
&& ((String) listTable.getValueAt(row, column)).equals("Table")) {
String source = CandidateUtil.getId((String) listTable.getValueAt(row, 1), (String) listTable.getValueAt(row, 2));
String target = CandidateUtil.getId((String) listTable.getValueAt(row, 3), (String) listTable.getValueAt(row, 4));
JavaClassRelationItem item = currentRelation.getTheJavaClassRelationItem(source, target);
if (item != null && item.getType() instanceof TableRelation) {
listTable.setToolTipText(((TableRelation) item
.getType()).getTableName());
}
} else {
listTable.setToolTipText(null);
}
}
});
sorter.setTableHeader(listTable.getTableHeader());
listModel.addColumn("id");
listModel.addColumn(ReportConstant.CurrentJC_Place);
listModel.addColumn(ReportConstant.CurrentJC);
listModel.addColumn(ReportConstant.DependJC_Place);
listModel.addColumn(ReportConstant.DependJC);
listModel.addColumn(ReportConstant.DependType);
listModel.addColumn(ReportConstant.Relation_Intensity);
listTable.getColumnModel().getColumn(0).setMinWidth(0);
listTable.getColumnModel().getColumn(0).setMaxWidth(0);
listTable.getColumnModel().getColumn(1).setMinWidth(0);
listTable.getColumnModel().getColumn(1).setMaxWidth(0);
listTable.getColumnModel().getColumn(3).setMinWidth(0);
listTable.getColumnModel().getColumn(3).setMaxWidth(0);
for (int i = 0; i < listTable.getColumnCount(); i++) {
listTable.getColumn(listTable.getColumnName(i)).setCellRenderer(new JavaClassRelationTableRenderer());
}
// 增加点击图标
List<String> colNames = new ArrayList<String>();
colNames.add(ReportConstant.CurrentJC);
colNames.add(ReportConstant.DependJC);
colNames.add(ReportConstant.DependType);
listTable.addMouseMotionListener(new TableMouseMotionAdapter(listTable, colNames));
}
class JavaClassRelationTableRenderer extends DefaultTableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (extendUnits.contains(value)) {
component.setForeground(Color.GRAY);
}
return component;
}
}
}