package jdepend.client.ui.result.panel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
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.framework.util.MetricsFormat;
import jdepend.model.Element;
import jdepend.model.JDependUnitMgr;
import jdepend.model.Relation;
import jdepend.model.result.AnalysisResult;
import jdepend.client.report.ui.CohesionDialog;
import jdepend.client.report.ui.RelationDetailDialog;
import jdepend.client.report.util.ReportConstant;
import jdepend.client.ui.framework.CompareTableCellRenderer;
import jdepend.client.ui.result.framework.JDependTable;
import jdepend.util.refactor.CompareObject;
public final class RelationListPanel extends JPanel {
private Collection<Relation> relations;
private List<String> extendUnits = new ArrayList<String>();
private DefaultTableModel model;
private TableSorter sorter;
private JTable table;
private JDependFrame frame;
public RelationListPanel(JDependFrame frame, Collection<Relation> relations) {
this.setLayout(new BorderLayout());
this.frame = frame;
this.relations = relations;
for (Element element : Relation.calElements(this.relations)) {
if (!element.getComponent().isInner()) {
extendUnits.add(element.getComponent().getName());
}
}
initTable();
loadTableData();
this.add(new JScrollPane(table));
}
private void initTable() {
model = new DefaultTableModel() {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
model.addColumn(ReportConstant.Relation_CurrentName);
model.addColumn(ReportConstant.Relation_DependName);
model.addColumn(ReportConstant.Relation_Intensity);
model.addColumn(ReportConstant.Relation_CurrentCohesion);
model.addColumn(ReportConstant.Relation_DependCohesion);
model.addColumn(ReportConstant.Relation_Balance);
model.addColumn(ReportConstant.Relation_AttentionType);
model.addColumn(ReportConstant.Relation_AttentionLevel);
model.addColumn(ReportConstant.Relation_isProblem);
sorter = new TableSorter(model);
table = new JDependTable(sorter);
sorter.setTableHeader(table.getTableHeader());
table.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
final JTable table = (JTable) e.getSource();
int currentRow = table.rowAtPoint(e.getPoint());
if (currentRow >= 0) {
table.setRowSelectionInterval(currentRow, currentRow);
}
if (e.getButton() == 3) {
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(table);
}
});
popupMenu.add(saveAsItem);
popupMenu.show(e.getComponent(), e.getX(), e.getY());
}
}
@Override
public void mousePressed(MouseEvent e) {
if (e.getClickCount() == 2) {
JTable table = (JTable) e.getSource();
String currentCol = (String) table.getColumnModel().getColumn(table.columnAtPoint(e.getPoint()))
.getHeaderValue();
if (currentCol.equals(ReportConstant.Relation_Intensity)) {
String current = (String) table.getValueAt(table.rowAtPoint(e.getPoint()), 0);
String depend = (String) table.getValueAt(table.rowAtPoint(e.getPoint()), 1);
jdepend.model.Component currentComponent = JDependUnitMgr.getInstance().getResult()
.getTheComponent(current);
jdepend.model.Component dependComponent = JDependUnitMgr.getInstance().getResult()
.getTheComponent(depend);
RelationDetailDialog d = new RelationDetailDialog(frame, currentComponent, dependComponent);
d.setModal(true);
d.setVisible(true);
} else if (currentCol.equals(ReportConstant.Relation_CurrentName)
|| currentCol.equals(ReportConstant.Relation_DependName)) {
String element = (String) table.getValueAt(table.rowAtPoint(e.getPoint()),
table.columnAtPoint(e.getPoint()));
jdepend.model.Component component = JDependUnitMgr.getInstance().getResult()
.getTheComponent(element);
CohesionDialog d = new CohesionDialog(component);
d.setModal(true);
d.setVisible(true);
}
}
}
});
List<String> colNames = new ArrayList<String>();
colNames.add(ReportConstant.Relation_CurrentName);
colNames.add(ReportConstant.Relation_DependName);
colNames.add(ReportConstant.Relation_Intensity);
table.addMouseMotionListener(new TableMouseMotionAdapter(table, colNames));
for (int i = 0; i < table.getColumnCount(); i++) {
table.getColumn(table.getColumnName(i)).setCellRenderer(new RelationTableRenderer());
}
}
private void loadTableData() {
Object[] arg;
for (Relation relation : relations) {
arg = new Object[9];
arg[0] = relation.getCurrent().getName();
arg[1] = relation.getDepend().getName();
arg[2] = MetricsFormat.toFormattedMetrics(relation.getIntensity());
arg[3] = MetricsFormat.toFormattedMetrics(relation.getCurrent().getIntensity());
arg[4] = MetricsFormat.toFormattedMetrics(relation.getDepend().getIntensity());
arg[5] = MetricsFormat.toFormattedMetrics(relation.getBalance());
arg[6] = relation.getAttentionType();
arg[7] = MetricsFormat.toFormattedMetrics(relation.getAttentionLevel());
arg[8] = relation.isNormality() ? "" : "是";
model.addRow(arg);
}
sorter.setSortingStatus(7, TableSorter.DESCENDING);
List<String> fitColNames = new ArrayList<String>();
fitColNames.add(ReportConstant.Relation_CurrentName);
fitColNames.add(ReportConstant.Relation_DependName);
JTableUtil.fitTableColumns(table, fitColNames);
}
class RelationTableRenderer extends CompareTableCellRenderer {
public RelationTableRenderer() {
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (this.getComponentCount() > 0) {
Component component = this.getComponent(0);
if (extendUnits.contains(value)) {
component.setForeground(Color.GRAY);
}
}
return this;
}
@Override
protected String getValue(Object value, int row, int column) {
if (column != 6) {
return super.getValue(value, row, column);
} else {
return Relation.AttentionTypeList.get(value);
}
}
@Override
protected Object getOriginality(Object originality, int row, int column) {
if (column != 6) {
return super.getOriginality(originality, row, column);
} else {
return Relation.AttentionTypeList.get(originality);
}
}
@Override
protected CompareObject getCompareObject(Object value, String id, String metrics) {
return new CompareObject(value, id, metrics) {
@Override
public Object getOriginalityValue(AnalysisResult result) {
String current = this.getId().substring(0, this.getId().indexOf('|'));
String depend = this.getId().substring(this.getId().indexOf('|') + 1);
Relation relation = result.getTheRelation(current, depend);
if (relation != null) {
return relation.getValue(this.getMetrics());
} else {
return null;
}
}
};
}
@Override
protected String getRowObjectId(JTable table, int row) {
return (String) table.getValueAt(row, 0) + "|" + (String) table.getValueAt(row, 1);
}
}
}