package jdepend.client.report.way.mapui; import java.awt.Component; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.geom.Rectangle2D; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.HashSet; import java.util.Iterator; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import jdepend.framework.ui.util.JDependUIUtil; import jdepend.framework.util.BundleUtil; import jdepend.client.report.way.mapui.layout.LayoutInfo; import jdepend.client.report.way.mapui.layout.LayoutMgr; import prefuse.Visualization; import prefuse.action.Action; import prefuse.action.ActionList; import prefuse.action.layout.Layout; import prefuse.controls.ControlAdapter; import prefuse.util.ColorLib; import prefuse.util.GraphicsLib; import prefuse.util.display.DisplayLib; import prefuse.visual.EdgeItem; import prefuse.visual.NodeItem; import prefuse.visual.VisualItem; public class MainMenuControl extends ControlAdapter { private GraphJDepend display; public MainMenuControl(GraphJDepend display) { this.display = display; } @Override public void mouseClicked(MouseEvent e) { if (e.getButton() == 3) { getMenus().show((Component) e.getSource(), e.getX(), e.getY()); } else { super.mouseClicked(e); } } private JPopupMenu getMenus() { return createMenus(); } private JPopupMenu createMenus() { final JPopupMenu popupMenu = new JPopupMenu(); JMenuItem zoomToFit = new JMenuItem(BundleUtil.getString(BundleUtil.Command_ZoomToFit)); zoomToFit.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ZoomToFit(); } }); popupMenu.add(zoomToFit); JMenuItem showProblemRelation = new JMenuItem(BundleUtil.getString(BundleUtil.Command_ShowProblemRelation)); showProblemRelation.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { showProblemRelation(); } }); popupMenu.add(showProblemRelation); popupMenu.addSeparator(); JMenuItem unStepHideItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_UnStepHide)); unStepHideItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { display.getHideVisualItemMgr().unStepHide(); display.getHideVisualItemMgr().repaint(); } }); popupMenu.add(unStepHideItem); JMenuItem nextStepHideItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_NextStepHide)); nextStepHideItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { display.getHideVisualItemMgr().nextStepHide(); display.getHideVisualItemMgr().repaint(); } }); popupMenu.add(nextStepHideItem); JMenuItem unHideItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_UnHide)); unHideItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { display.getHideVisualItemMgr().reset(); display.getHideVisualItemMgr().repaint(); } }); popupMenu.add(unHideItem); popupMenu.addSeparator(); LayoutInfo currentLayout = this.display.getLayoutMgr().getCurrentLayout(); for (final LayoutInfo layout : this.display.getLayoutMgr().getLayouts()) { if (!layout.equals(currentLayout)) { final JMenuItem changeLayouttem = new JMenuItem(layout.getName()); changeLayouttem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { display.getLayoutMgr().setCurrentLayout(layout); display.getVisualization().run("filter"); } }); popupMenu.add(changeLayouttem); } } popupMenu.addSeparator(); if (this.display.getPrinter() != null) { JMenuItem packageTreeItem = null; if (!this.display.getPrinter().isPackageTreeVisible()) { packageTreeItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_ViewPackageTree)); } else { packageTreeItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_ClosePackageTree)); } packageTreeItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { packageTree(); } }); popupMenu.add(packageTreeItem); popupMenu.addSeparator(); } JMenuItem saveItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_SaveAsPic)); saveItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { saveAs(); } }); popupMenu.add(saveItem); return popupMenu; } private void saveAs() { File selectedFile = JDependUIUtil.getSelectedFile(".png", this.display); if (selectedFile != null) { OutputStream stream = null; try { stream = new FileOutputStream(selectedFile); this.display.saveImage(stream, "png", 1); } catch (FileNotFoundException e) { e.printStackTrace(); } finally { if (stream != null) { try { stream.close(); } catch (IOException e) { e.printStackTrace(); } } } } } private void packageTree() { if (this.display.getPrinter() != null && !this.display.getPrinter().isPackageTreeVisible()) { display.getPrinter().showPackageTree(); } else { display.getPrinter().hiddenPackageTree(); } } private void showProblemRelation() { HashSet<VisualItem> currentHideItems = new HashSet<VisualItem>(); Iterator iter = display.getVisualization().items(); while (iter.hasNext()) { VisualItem item = (VisualItem) iter.next(); if (item.getStrokeColor() == ColorLib.rgb(100, 200, 200)) { currentHideItems.add(item); } } Boolean isVisible; NodeItem item; EdgeItem eitem; Iterator it; Iterator nodeIter = display.getVisualization().items(GraphJDepend.treeNodes); while (nodeIter.hasNext()) { item = (NodeItem) nodeIter.next(); it = item.edges(); isVisible = false; L: while (it.hasNext()) { eitem = (EdgeItem) it.next(); if (eitem.getStrokeColor() != ColorLib.rgb(100, 200, 200)) { isVisible = true; break L; } } if (!isVisible) { currentHideItems.add(item); } } display.getHideVisualItemMgr().addStepHideItems(currentHideItems); display.getHideVisualItemMgr().repaint(); } private void ZoomToFit() { if (!display.isTranformInProgress()) { long m_duration = 2000; int m_margin = 50; Visualization vis = display.getVisualization(); Rectangle2D bounds = vis.getBounds(Visualization.ALL_ITEMS); GraphicsLib.expand(bounds, m_margin + (int) (1 / display.getScale())); DisplayLib.fitViewToBounds(display, bounds, m_duration); } } }