/*
* Copyright (C) 2012 Nicolas Peransin. All rights reserved.
* Use is subject to license terms.
*/
package org.mypsycho.swing.app.beans;
import java.awt.Component;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.EventObject;
import javax.swing.JPopupMenu;
/**
* Popup menu used in 'popup' propery of Components.
* <p>
* @see org.mypsycho.swing.app.reflect.ComponentPopupProperty
* </p>
*
* @author Peransin Nicolas
*/
public class ComponentPopupMenu extends JPopupMenu {
private static final long serialVersionUID = -520432491474185193L;
class PopupHandler extends MouseAdapter {
final ComponentPopupMenu parent = ComponentPopupMenu.this;
public void mousePressed(MouseEvent e) {
maybeShowPopup(e);
}
public void mouseReleased(MouseEvent e) {
maybeShowPopup(e);
}
private void maybeShowPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
shown = e.getComponent();
pointed = e.getPoint().getLocation();
ComponentPopupMenu.this.show(e.getComponent(), e.getX(), e.getY());
}
}
}
final PopupHandler popupHandler = new PopupHandler();
private Component shown = null;
private Point pointed = null;
public ComponentPopupMenu() {}
public ComponentPopupMenu(String ignore) {}
public ComponentPopupMenu(Component src) {
register(src);
}
public void register(Component src) {
src.addMouseListener(popupHandler);
}
public static Point getSelectedPoint(Component c) {
if (c == null) {
throw new IllegalArgumentException("Component not bound to menu");
}
if (c instanceof ComponentPopupMenu) {
return ((ComponentPopupMenu) c).pointed;
}
return getSelectedPoint(c.getParent());
}
public static Component getSource(Component c) {
if (c == null) {
throw new IllegalArgumentException("Component not bound to menu");
}
if (c instanceof ComponentPopupMenu) {
return ((ComponentPopupMenu) c).shown;
}
return getSource(c.getParent());
}
private static Component toSource(EventObject e) {
Object source = e.getSource();
if (!(source instanceof Component)) {
throw new IllegalArgumentException("Event not bound to menu");
}
return (Component) source;
}
public static Point getSelectedPoint(EventObject e) {
return getSelectedPoint(toSource(e));
}
public static Component getSource(EventObject e) {
return getSource(toSource(e));
}
public static ComponentPopupMenu getPopMenu(Component c) {
for (MouseListener l : c.getMouseListeners()) {
if (l instanceof PopupHandler) {
return ((PopupHandler) l).parent;
}
}
return null;
}
}