package jdepend.client.report.way.mapui;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import jdepend.model.JDependUnit;
import jdepend.model.JDependUnitMgr;
import jdepend.client.report.ui.RelationDetailDialog;
import prefuse.controls.ControlAdapter;
import prefuse.visual.EdgeItem;
import prefuse.visual.NodeItem;
import prefuse.visual.VisualItem;
public class JDependEdgeControl extends ControlAdapter {
private GraphJDepend display;
public JDependEdgeControl(GraphJDepend display) {
super();
this.display = display;
}
@Override
public void itemClicked(VisualItem item, MouseEvent e) {
if (e.getButton() == 3 && item instanceof EdgeItem) {
JPopupMenu popupMenu = this.popupMenu((EdgeItem) item);
popupMenu.show((Component) e.getSource(), e.getX(), e.getY());
} else {
super.itemClicked(item, e);
}
}
private JPopupMenu popupMenu(final EdgeItem item) {
final NodeItem sourceItem = item.getSourceItem();
final NodeItem targetItem = item.getTargetItem();
final String sourceName = sourceItem.getString("label");
final String targetName = targetItem.getString("label");
final JPopupMenu popupMenu = new JPopupMenu();
JMenuItem viewRelation = new JMenuItem("查看关系信息");
viewRelation.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
viewRelation(sourceName, targetName);
}
});
popupMenu.add(viewRelation);
// 计算是否在循环依赖链上
List<String> currentCycles;
L: for (jdepend.model.Component source : JDependUnitMgr.getInstance().getComponents()) {
// 清空收集集合
currentCycles = new ArrayList<String>();
// 收集循环依赖集合点
for (JDependUnit unit : source.collectCycle()) {
currentCycles.add(unit.getName());
}
if (currentCycles.contains(sourceName) && currentCycles.contains(targetName)) {
final List<String> showCycles = new ArrayList<String>(currentCycles.size());
for (String element : currentCycles) {
showCycles.add(element);
}
JMenuItem viewCycle = new JMenuItem("显示循环依赖链");
viewCycle.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
viewCycle(sourceItem, showCycles);
}
});
popupMenu.add(viewCycle);
break L;
}
}
return popupMenu;
}
private void viewCycle(NodeItem sourceItem, List<String> currentCycles) {
String itemName;
// 遍历所有节点对象,隐藏其他节点对象和线对象
Iterator iter = sourceItem.getVisualization().items();
while (iter.hasNext()) {
VisualItem item = (VisualItem) iter.next();
if (item instanceof NodeItem) {
itemName = item.getString("label");
if (!currentCycles.contains(itemName)) {
item.setVisible(false);
} else {
item.setVisible(true);
}
} else if (item instanceof EdgeItem) {
EdgeItem edgeItem = (EdgeItem) item;
NodeItem sItem = edgeItem.getSourceItem();
NodeItem tItem = edgeItem.getTargetItem();
String sourceName = sItem.getString("label");
String targetName = tItem.getString("label");
int sIndex = -1;
int tIndex = -1;
int i;
i = 0;
for (String element : currentCycles) {
if (element.equals(sourceName)) {
sIndex = i;
}
i++;
}
i = 0;
for (String element : currentCycles) {
if (element.equals(targetName)) {
tIndex = i;
}
i++;
}
if (sIndex != -1 && tIndex != -1
&& (sIndex + 1 == tIndex || sIndex == currentCycles.size() - 1 && tIndex == 0)) {
item.setVisible(true);
} else {
item.setVisible(false);
}
}
}
sourceItem.getVisualization().repaint();
}
private void viewRelation(String source, String target) {
RelationDetailDialog d = new RelationDetailDialog(display, source, target);
d.setModal(true);
d.setVisible(true);
}
}