/** * */ package org.javabuilders.swing.handler.event; import static org.javabuilders.swing.SwingBuilder.ON_MOUSE_CLICKED; import static org.javabuilders.swing.SwingBuilder.ON_MOUSE_DOUBLE_CLICKED; import static org.javabuilders.swing.SwingBuilder.ON_MOUSE_ENTERED; import static org.javabuilders.swing.SwingBuilder.ON_MOUSE_EXITED; import static org.javabuilders.swing.SwingBuilder.ON_MOUSE_PRESSED; import static org.javabuilders.swing.SwingBuilder.ON_MOUSE_RELEASED; import static org.javabuilders.swing.SwingBuilder.ON_MOUSE_RIGHT_CLICKED; import static org.javabuilders.swing.SwingBuilder.POPUP_MENU; import java.awt.Component; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.List; import javax.swing.JPopupMenu; import org.javabuilders.BuildException; import org.javabuilders.BuildProcess; import org.javabuilders.BuildResult; import org.javabuilders.BuilderConfig; import org.javabuilders.IPropertyList; import org.javabuilders.Node; import org.javabuilders.ValueListDefinition; import org.javabuilders.Values; import org.javabuilders.event.ObjectMethod; import org.javabuilders.handler.AbstractPropertyHandler; import org.javabuilders.util.BuilderUtils; /** * Handler for all the onMouse* event that simplifies creating MouseListeners * @author Jacek Furmankiewicz */ public class ComponentMouseListenerHandler extends AbstractPropertyHandler implements IPropertyList{ private static final ComponentMouseListenerHandler singleton = new ComponentMouseListenerHandler(); private final static List<ValueListDefinition> defs = ValueListDefinition.getCommonEventDefinitions(MouseEvent.class); /** * @return Singleton */ public static ComponentMouseListenerHandler getInstance() { return singleton; } /** * Constructor */ public ComponentMouseListenerHandler() { super(ON_MOUSE_CLICKED, ON_MOUSE_DOUBLE_CLICKED, ON_MOUSE_RIGHT_CLICKED, ON_MOUSE_ENTERED, ON_MOUSE_EXITED, ON_MOUSE_PRESSED, ON_MOUSE_RELEASED, POPUP_MENU); } /* (non-Javadoc) * @see org.javabuilders.handler.IPropertyHandler#handle(org.javabuilders.BuilderConfig, org.javabuilders.BuildResult, org.javabuilders.Node, java.lang.String) */ @SuppressWarnings("unchecked") public void handle(final BuilderConfig config, final BuildProcess process, final Node node, String key) throws BuildException { final Values<String,ObjectMethod> onMouseClicked = (Values<String,ObjectMethod>)node.getProperty(ON_MOUSE_CLICKED); final Values<String,ObjectMethod> onMouseDoubleClicked = (Values<String,ObjectMethod>)node.getProperty(ON_MOUSE_DOUBLE_CLICKED); final Values<String,ObjectMethod> onMouseEntered = (Values<String,ObjectMethod>)node.getProperty(ON_MOUSE_ENTERED); final Values<String,ObjectMethod> onMouseExited = (Values<String,ObjectMethod>)node.getProperty(ON_MOUSE_EXITED); final Values<String,ObjectMethod> onMousePressed = (Values<String,ObjectMethod>)node.getProperty(ON_MOUSE_PRESSED); final Values<String,ObjectMethod> onMouseReleased = (Values<String,ObjectMethod>)node.getProperty(ON_MOUSE_RELEASED); final Values<String,ObjectMethod> onMouseRightClicked = (Values<String,ObjectMethod>)node.getProperty(ON_MOUSE_RIGHT_CLICKED); final String popupMenu = node.getStringProperty(POPUP_MENU); //validate popup menu is valid, if specified if (popupMenu != null) { Object menu = process.getBuildResult().get(popupMenu); if (menu == null) { throw new BuildException("Unable to find an instance of JPopupMenu for {0}",popupMenu); } else if (!(menu instanceof JPopupMenu)) { throw new BuildException("Unable to find an instance of JPopupMenu for {0}: {0} is of type {1} instead", popupMenu, menu.getClass()); } } final Component component = (Component)node.getMainObject(); component.addMouseListener(new MouseListener() { public void mouseClicked(MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON1) { if (e.getClickCount() == 2) { if (onMouseDoubleClicked != null) { BuilderUtils.invokeCallerEventMethods(process.getBuildResult(), node, onMouseDoubleClicked.values(), e); } } else { if (onMouseClicked != null) { BuilderUtils.invokeCallerEventMethods(process.getBuildResult(), node, onMouseClicked.values(), e); } } } else if (e.getButton() == MouseEvent.BUTTON3 && onMouseRightClicked != null) { BuilderUtils.invokeCallerEventMethods(process.getBuildResult(), node, onMouseRightClicked.values(), e); } } public void mouseEntered(MouseEvent e) { if (onMouseEntered != null) { BuilderUtils.invokeCallerEventMethods(process.getBuildResult(), node, onMouseEntered.values(), e); } } public void mouseExited(MouseEvent e) { if (onMouseExited != null) { BuilderUtils.invokeCallerEventMethods(process.getBuildResult(), node, onMouseExited.values(), e); } } public void mousePressed(MouseEvent e) { if (onMousePressed != null) { BuilderUtils.invokeCallerEventMethods(process.getBuildResult(), node, onMousePressed.values(), e); } if (e.isPopupTrigger()) { showPopup(process.getBuildResult(), component, e, popupMenu); } } public void mouseReleased(MouseEvent e) { if (onMouseReleased != null) { BuilderUtils.invokeCallerEventMethods(process.getBuildResult(), node, onMouseReleased.values(), e); } if (e.isPopupTrigger()) { showPopup(process.getBuildResult(), component, e, popupMenu); } } }); } //shows the popup private void showPopup(BuildResult result, Component component, MouseEvent e, String popupMenu) { if (popupMenu != null) { Object menu = result.get(popupMenu); if (menu instanceof JPopupMenu) { ((JPopupMenu)menu).show(component, e.getX(), e.getY()); } else { throw new BuildException("Unable to find JPopupMenu corresponding to: {0}",popupMenu); } } } /* (non-Javadoc) * @see org.javabuilders.IKeyValueConsumer#getApplicableClass() */ public Class<?> getApplicableClass() { return Component.class; } /* (non-Javadoc) * @see org.javabuilders.IPropertyList#isList(java.lang.String) */ public boolean isList(String propertyName) { if (POPUP_MENU.equals(propertyName)) { return false; } else { return true; } } /* (non-Javadoc) * @see org.javabuilders.IPropertyList#getValueListDefinitions(java.lang.String) */ public List<ValueListDefinition> getValueListDefinitions(String propertyName) { return defs; } }