001package arcommon.ui.other;
002
003import java.awt.Component;
004import java.awt.event.MouseAdapter;
005import java.awt.event.MouseEvent;
006import java.awt.event.MouseListener;
007
008import javax.swing.JPopupMenu;
009
010/**
011 * A {@link javax.swing.JPopupMenu} with the two convenience methods {@link #addToComponent(Component)} and {@link #removeFromComponent(Component)}.
012 */
013public class MyJPopupMenu extends JPopupMenu {
014    
015    private PopupListener popupListener;
016    
017    public void addToComponent(Component component) {
018        if (popupListener == null) {
019            popupListener = new PopupListener();
020        }
021        
022        MouseListener[] mouseListeners = component.getMouseListeners();
023        for (int i = 0; i < mouseListeners.length; i++) {
024            MouseListener mouseListener = mouseListeners[i];
025            if (mouseListener == popupListener) {
026                return ;
027            }
028        }
029        
030        component.addMouseListener(popupListener);
031    }
032    
033    public void removeFromComponent(Component component) {
034        component.removeMouseListener(popupListener);
035    }
036
037    private class PopupListener extends MouseAdapter {
038        public void mousePressed(MouseEvent e) {
039            maybeShowPopup(e);
040        }
041
042        public void mouseReleased(MouseEvent e) {
043            maybeShowPopup(e);
044        }
045
046        private void maybeShowPopup(MouseEvent e) {
047            if (e.isPopupTrigger()) {
048                show(e.getComponent(), e.getX(), e.getY());
049            }
050        }
051    }
052
053    private static final long serialVersionUID = -6633832906300600048L;
054}