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.Collection; import java.util.HashSet; import java.util.Iterator; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import jdepend.client.report.ui.ClassListDialog; import prefuse.controls.ControlAdapter; import prefuse.visual.EdgeItem; import prefuse.visual.NodeItem; import prefuse.visual.VisualItem; import prefuse.visual.tuple.TableNodeItem; public class JDependNodeControl extends ControlAdapter { private GraphJDepend display; public JDependNodeControl(GraphJDepend display) { this.display = display; } @Override public void itemClicked(VisualItem item, MouseEvent e) { if (e.getButton() == 3 && item instanceof NodeItem) { JPopupMenu popupMenu = this.popupMenu((NodeItem) item); popupMenu.show((Component) e.getSource(), e.getX(), e.getY()); } else { display.getLayoutMgr().reset(); super.itemClicked(item, e); } } @Override public void itemEntered(VisualItem item, MouseEvent e) { super.itemEntered(item, e); if (item instanceof TableNodeItem && display.getPrinter() != null && display.getPrinter().isPackageTreeVisible()) { String itemName = item.getString("label"); display.getPrinter().setPackageTreeFocus(itemName); } } private JPopupMenu popupMenu(final NodeItem item) { final JPopupMenu popupMenu = new JPopupMenu(); JMenuItem viewRelation = new JMenuItem("查看类列表"); viewRelation.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String nodeName = item.getString("label"); showClassList(nodeName); } }); popupMenu.add(viewRelation); popupMenu.addSeparator(); JMenuItem hideSelfItem = new JMenuItem("隐藏自己"); hideSelfItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { hideSelf(item); } }); popupMenu.add(hideSelfItem); JMenuItem hidePartOthersItem = new JMenuItem("隐藏其它组件"); hidePartOthersItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { hideOthers(item, false); } }); popupMenu.add(hidePartOthersItem); JMenuItem hideOthersItem = new JMenuItem("隐藏其它组件和关系"); hideOthersItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { hideOthers(item, true); } }); popupMenu.add(hideOthersItem); return popupMenu; } private void showClassList(String source) { ClassListDialog d = new ClassListDialog(display.getGraphPanel().getFrame(), this.display.getTheElement(source) .getComponent()); d.setModal(true); d.setVisible(true); } private void hideSelf(NodeItem item) { // 收集需要隐藏的显示对象 HashSet<VisualItem> currentHideItems = new HashSet<VisualItem>(); currentHideItems.add(item); Iterator iter = item.edges(); while (iter.hasNext()) { EdgeItem eitem = (EdgeItem) iter.next(); currentHideItems.add(eitem); } this.hide(currentHideItems); } private void hideOthers(final NodeItem item, boolean hideOtherNodeEdges) { HashSet<VisualItem> currentHideItems = new HashSet<VisualItem>(); // 收集需要隐藏的显示对象 Collection<NodeItem> nodeItems = new HashSet<NodeItem>(); Collection<EdgeItem> edgeItems = new HashSet<EdgeItem>(); nodeItems.add(item); Iterator iter = item.edges(); while (iter.hasNext()) { EdgeItem eitem = (EdgeItem) iter.next(); edgeItems.add(eitem); nodeItems.add(eitem.getAdjacentItem(item)); } Iterator iter1 = item.getVisualization().items(); while (iter1.hasNext()) { VisualItem i = (VisualItem) iter1.next(); if (!i.equals(item)) { if (hideOtherNodeEdges) { if (!nodeItems.contains(i) && !edgeItems.contains(i)) { currentHideItems.add(i); } } else { if (i instanceof EdgeItem) { EdgeItem eitem = (EdgeItem) i; if (!nodeItems.contains(eitem.getTargetItem()) || !nodeItems.contains(eitem.getSourceNode())) { currentHideItems.add(i); } } else { if (!nodeItems.contains(i)) { currentHideItems.add(i); } } } } } this.hide(currentHideItems); } private void hide(HashSet<VisualItem> currentHideItems) { // 记录本次隐藏的显示对象 display.getHideVisualItemMgr().addStepHideItems(currentHideItems); display.getHideVisualItemMgr().repaint(); } }