package jdepend.client.report.ui;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import jdepend.framework.ui.component.TableMouseMotionAdapter;
import jdepend.framework.ui.component.TableSorter;
import jdepend.framework.ui.dialog.CooperDialog;
import jdepend.framework.ui.util.JTableUtil;
import jdepend.framework.util.MetricsFormat;
import jdepend.metadata.InvokeItem;
import jdepend.metadata.JavaClassRelationItem;
import jdepend.model.JDependUnitMgr;
import jdepend.model.JavaClassUnit;
import jdepend.model.result.AnalysisResult;
import jdepend.model.util.JavaClassUnitUtil;
import jdepend.client.report.util.ReportConstant;
public class JavaClassCaCeDetailDialog extends CooperDialog {
private JavaClassUnit javaClass;
private Collection<JavaClassUnit> javaClasses;
private String metrics;
private JLabel couplingLabel;
private JLabel outerCouplingLabel;
private JLabel inCouplingLabel;
private JTable listTable;
private DefaultTableModel listModel;
private boolean includeInner;
public JavaClassCaCeDetailDialog(JavaClassUnit javaClass, String metrics, boolean includeInner) {
super(javaClass.getName() + " " + metrics + " list" + (includeInner ? "(全部)" : "(组件外)"));
this.javaClass = javaClass;
this.metrics = metrics;
this.includeInner = includeInner;
init();
}
public JavaClassCaCeDetailDialog(Collection<JavaClassUnit> javaClasses, String metrics) {
this.javaClasses = javaClasses;
this.metrics = metrics;
init();
}
private void init() {
getContentPane().setLayout(new BorderLayout());
this.add(BorderLayout.NORTH, this.createTitlePanel());
initList();
showList();
this.add(BorderLayout.CENTER, new JScrollPane(listTable));
}
private JPanel createTitlePanel() {
JPanel titlePanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
titlePanel.add(new JLabel("耦合值:"));
this.couplingLabel = new JLabel();
titlePanel.add(this.couplingLabel);
titlePanel.add(new JLabel("外部耦合值:"));
this.outerCouplingLabel = new JLabel();
titlePanel.add(this.outerCouplingLabel);
titlePanel.add(new JLabel("内部耦合值:"));
this.inCouplingLabel = new JLabel();
titlePanel.add(this.inCouplingLabel);
return titlePanel;
}
private void showList() {
listModel.setRowCount(0);
this.loadList();
}
private void loadList() {
Object[] row;
Collection<JavaClassRelationItem> items = new ArrayList<JavaClassRelationItem>();
if (metrics.equals(ReportConstant.Ca)) {
if (javaClass != null) {
items = javaClass.getJavaClass().getCaItems();
} else {
for (JavaClassUnit javaClass : javaClasses) {
for (JavaClassRelationItem item : javaClass.getJavaClass().getCaItems()) {
if (!javaClasses.contains(javaClass.getResult().getTheClass(item.getSource().getId()))) {
items.add(item);
}
}
}
}
} else if (metrics.equals(ReportConstant.Ce)) {
if (javaClass != null) {
items = javaClass.getJavaClass().getCeItems();
} else {
for (JavaClassUnit javaClass : javaClasses) {
for (JavaClassRelationItem item : javaClass.getJavaClass().getCeItems()) {
if (!javaClasses.contains(javaClass.getResult().getTheClass(item.getTarget().getId()))) {
items.add(item);
}
}
}
}
}
AnalysisResult result = JDependUnitMgr.getInstance().getResult();
boolean isInner;
String metrics1 = null;
float coupling = 0F;
float inCoupling = 0F;
float outerCoupling = 0F;
for (JavaClassRelationItem item : items) {
isInner = !JavaClassUnitUtil.crossComponent(item, result);
// 判断是否是环境外的
if ((javaClass != null && (includeInner || !isInner)) || (javaClasses != null)) {
row = new Object[listTable.getColumnCount()];
for (int i = 0; i < listTable.getColumnCount(); i++) {
if (i == 0) {
row[0] = item.getId();
} else if (i == 3) {
row[3] = item.getType().getName();
} else if (i == 4) {
if (isInner) {
inCoupling += item.getRelationIntensity();
row[4] = "否";
} else {
outerCoupling += item.getRelationIntensity();
row[4] = "是";
}
} else {
metrics1 = ReportConstant.toMetrics(listTable.getColumnName(i));
if (metrics.equals(ReportConstant.Ca)) {
row[i] = result.getTheClass(item.getSource().getId()).getValue(metrics1);
} else {
row[i] = result.getTheClass(item.getTarget().getId()).getValue(metrics1);
}
}
}
listModel.addRow(row);
coupling += item.getRelationIntensity();
}
}
List<String> fitColNames = new ArrayList<String>();
fitColNames.add(ReportConstant.Name);
fitColNames.add(ReportConstant.DependType);
JTableUtil.fitTableColumns(listTable, fitColNames);
this.couplingLabel.setText(MetricsFormat.toFormattedMetrics(coupling).toString());
this.inCouplingLabel.setText(MetricsFormat.toFormattedMetrics(inCoupling).toString());
this.outerCouplingLabel.setText(MetricsFormat.toFormattedMetrics(outerCoupling).toString());
}
private void initList() {
listModel = new DefaultTableModel() {
@Override
public boolean isCellEditable(int row, int column) {
if (column == 2) {
return true;
} else {
return false;
}
}
};
TableSorter sorter = new TableSorter(listModel);
listTable = new JTable(sorter);
sorter.setTableHeader(listTable.getTableHeader());
listTable.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
final JTable table = (JTable) e.getSource();
Point p = new Point(e.getX(), e.getY());
int col = table.columnAtPoint(p);
int row = table.rowAtPoint(p);
String currentCol = (String) table.getColumnModel().getColumn(col).getHeaderValue();
if (currentCol.equals(ReportConstant.DependType)) {
String id = (String) table.getValueAt(row, 0);
AnalysisResult result = JDependUnitMgr.getInstance().getResult();
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);
}
}
}
});
listModel.addColumn("id");
listModel.addColumn(ReportConstant.JavaClass_Place);
listModel.addColumn(ReportConstant.Name);
listModel.addColumn(ReportConstant.DependType);
listModel.addColumn(ReportConstant.JavaClass_isExt);
listModel.addColumn(ReportConstant.LC);
listModel.addColumn(ReportConstant.AC);
listModel.addColumn(ReportConstant.Ca);
listModel.addColumn(ReportConstant.Ce);
listModel.addColumn(ReportConstant.Coupling);
listModel.addColumn(ReportConstant.Cohesion);
listModel.addColumn(ReportConstant.Cycle);
listModel.addColumn(ReportConstant.JavaClass_State);
listModel.addColumn(ReportConstant.JavaClass_Stable);
listModel.addColumn(ReportConstant.JavaClass_isPrivateElement);
listTable.getColumnModel().getColumn(0).setMinWidth(0);
listTable.getColumnModel().getColumn(0).setMaxWidth(0);
listTable.getColumnModel().getColumn(1).setMinWidth(0);
listTable.getColumnModel().getColumn(1).setMaxWidth(0);
// 增加点击图标
List<String> colNames = new ArrayList<String>();
colNames.add(ReportConstant.DependType);
listTable.addMouseMotionListener(new TableMouseMotionAdapter(listTable, colNames));
}
}