/* ******************************************************************* * Copyright (c) 1999-2001 Xerox Corporation, * 2002 Palo Alto Research Center, Incorporated (PARC). * All rights reserved. * This program and the accompanying materials are made available * under the terms of the Eclipse Public License v 2.0 * which accompanies this distribution and is available at * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt * * Contributors: * Xerox/PARC initial implementation * Helen Hawkins Converted to new interface (bug 148190) * ******************************************************************/ package org.aspectj.ajde.ui.swing; import java.awt.event.ActionEvent; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.ArrayList; import java.util.List; import javax.swing.AbstractAction; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import org.aspectj.ajde.Ajde; import org.aspectj.asm.IProgramElement; /** * @author Mik Kersten */ class BrowserViewTreeListener implements TreeSelectionListener, MouseListener { private StructureTree tree = null; public BrowserViewTreeListener(StructureTree tree) { this.tree = tree; } public void valueChanged(TreeSelectionEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseClicked(MouseEvent e) { singleClickNavigation(e); //doubleClickNavigation(e); maybeShowPopup(e); } public void singleClickNavigation(MouseEvent e) { SwingTreeViewNode treeNode = (SwingTreeViewNode)tree.getLastSelectedPathComponent(); if (treeNode != null && !e.isControlDown() && !e.isShiftDown() && e.getModifiers() != 4) { IProgramElement currNode = (IProgramElement)treeNode.getUserObject(); if (currNode!=null && !e.isControlDown() && !e.isShiftDown() && e.getModifiers() != 4) { //AjdeUIManager.getDefault().getViewManager().showNodeInMasterView((ProgramElementNode)currNode); //if (AjdeUIManager.getDefault().getViewManager().isSplitViewMode()) { // AjdeUIManager.getDefault().getViewManager().showNodeInSlaveView((ProgramElementNode)currNode); //} } // else if (currNode instanceof LinkNode) { //if (!AjdeUIManager.getDefault().getViewManager().isSplitViewMode()) { // AjdeUIManager.getDefault().getViewManager().showNodeInMasterView((LinkNode)currNode); //} else { // AjdeUIManager.getDefault().getViewManager().showNodeInSlaveView(((LinkNode)currNode).getProgramElementNode()); //} // } } } public void doubleClickNavigation(MouseEvent e) { // int clickCount = e.getClickCount(); SwingTreeViewNode treeNode = (SwingTreeViewNode)tree.getLastSelectedPathComponent(); if (treeNode != null) { IProgramElement currNode = (IProgramElement)treeNode.getUserObject(); if (currNode!=null && !e.isControlDown() && !e.isShiftDown() && e.getModifiers() != 4) { //AjdeUIManager.getDefault().getViewManager().showNodeInMasterView(((LinkNode)currNode).getProgramElementNode()); //AjdeUIManager.getDefault().getViewManager().showNodeInSlaveView(((LinkNode)currNode).getProgramElementNode()); } // else if (currNode instanceof LinkNode) { // if (clickCount == 1) { // //AjdeUIManager.getDefault().getViewManager().showLink((LinkNode)currNode); // } else if (clickCount == 2) { // //navigationAction((ProgramElementNode)((LinkNode)currNode).getProgramElementNode(), true, true); // } // } } } /** * @todo this should probably use e.isPopupTrigger() but that * doesn't work for some reason, so we just check if the right mouse button * has been clicked. */ private void maybeShowPopup(MouseEvent e) { if (e.getModifiers() == InputEvent.BUTTON3_MASK && tree.getSelectionCount() > 0) { // TreePath[] selectionPaths = tree.getSelectionPaths(); final List signatures = new ArrayList(); // for (int i = 0; i < selectionPaths.length; i++) { // IProgramElement currNode = (IProgramElement)((SwingTreeViewNode)selectionPaths[i].getLastPathComponent()).getUserObject(); //// if (currNode instanceof LinkNode || currNode instanceof IProgramElement) { //// signatures.add(currNode); //// } // } JPopupMenu popup = new JPopupMenu(); JMenuItem showSourcesItem = new JMenuItem("Display sources", Ajde.getDefault().getIconRegistry().getStructureSwingIcon(IProgramElement.Kind.CODE)); showSourcesItem.setFont(new java.awt.Font("Dialog", 0, 11)); showSourcesItem.addActionListener(new AbstractAction() { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { //AjdeUIManager.getDefault().getViewManager().showSourcesNodes(signatures); // USED THE FOLLOWING FROM: BrowserViewManager: // public void showSourcesNodes(java.util.List nodes) { // for (Iterator it = nodes.iterator(); it.hasNext(); ) { // ProgramElementNode currNode = null; // IProgramElement IProgramElement = (IProgramElement)it.next(); // if (IProgramElement instanceof LinkNode) { // currNode = ((LinkNode)IProgramElement).getProgramElementNode(); // } else { // currNode = (ProgramElementNode)IProgramElement; // } // ISourceLocation sourceLoc = currNode.getSourceLocation(); // if (null != sourceLoc) { // Ajde.getDefault().getEditorManager().addViewForSourceLine( // sourceLoc.getSourceFile().getAbsolutePath(), // sourceLoc.getLine()); // } // } // } } }); popup.add(showSourcesItem); popup.addSeparator(); JMenuItem generatePCD = new JMenuItem("Pointcut Wizard (alpha)...", Ajde.getDefault().getIconRegistry().getStructureSwingIcon(IProgramElement.Kind.POINTCUT)); generatePCD.setFont(new java.awt.Font("Dialog", 0, 11)); generatePCD.addActionListener(new AbstractAction() { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { Ajde.getDefault().getViewManager().extractAndInsertSignatures(signatures, true); } }); popup.add(generatePCD); popup.show(e.getComponent(), e.getX(), e.getY()); } } }