package com.eas.ui.events; import java.util.logging.Level; import java.util.logging.Logger; import com.eas.core.HasPublished; import com.eas.core.Utils; import com.eas.ui.EventsPublisher; import com.eas.window.events.HasMoveHandlers; import com.eas.window.events.MoveEvent; import com.eas.window.events.MoveHandler; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.event.dom.client.BlurEvent; import com.google.gwt.event.dom.client.BlurHandler; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.DoubleClickEvent; import com.google.gwt.event.dom.client.DoubleClickHandler; import com.google.gwt.event.dom.client.FocusEvent; import com.google.gwt.event.dom.client.FocusHandler; import com.google.gwt.event.dom.client.HasBlurHandlers; import com.google.gwt.event.dom.client.HasClickHandlers; import com.google.gwt.event.dom.client.HasDoubleClickHandlers; import com.google.gwt.event.dom.client.HasFocusHandlers; import com.google.gwt.event.dom.client.HasKeyDownHandlers; import com.google.gwt.event.dom.client.HasKeyPressHandlers; import com.google.gwt.event.dom.client.HasKeyUpHandlers; import com.google.gwt.event.dom.client.HasMouseDownHandlers; import com.google.gwt.event.dom.client.HasMouseMoveHandlers; import com.google.gwt.event.dom.client.HasMouseOutHandlers; import com.google.gwt.event.dom.client.HasMouseOverHandlers; import com.google.gwt.event.dom.client.HasMouseUpHandlers; import com.google.gwt.event.dom.client.HasMouseWheelHandlers; import com.google.gwt.event.dom.client.KeyDownEvent; import com.google.gwt.event.dom.client.KeyDownHandler; import com.google.gwt.event.dom.client.KeyPressEvent; import com.google.gwt.event.dom.client.KeyPressHandler; import com.google.gwt.event.dom.client.KeyUpEvent; import com.google.gwt.event.dom.client.KeyUpHandler; import com.google.gwt.event.dom.client.MouseDownEvent; import com.google.gwt.event.dom.client.MouseDownHandler; import com.google.gwt.event.dom.client.MouseMoveEvent; import com.google.gwt.event.dom.client.MouseMoveHandler; import com.google.gwt.event.dom.client.MouseOutEvent; import com.google.gwt.event.dom.client.MouseOutHandler; import com.google.gwt.event.dom.client.MouseOverEvent; import com.google.gwt.event.dom.client.MouseOverHandler; import com.google.gwt.event.dom.client.MouseUpEvent; import com.google.gwt.event.dom.client.MouseUpHandler; import com.google.gwt.event.dom.client.MouseWheelEvent; import com.google.gwt.event.dom.client.MouseWheelHandler; import com.google.gwt.event.logical.shared.HasResizeHandlers; import com.google.gwt.event.logical.shared.HasSelectionHandlers; import com.google.gwt.event.logical.shared.HasValueChangeHandlers; import com.google.gwt.event.logical.shared.ResizeEvent; import com.google.gwt.event.logical.shared.ResizeHandler; import com.google.gwt.event.logical.shared.SelectionEvent; import com.google.gwt.event.logical.shared.SelectionHandler; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.ui.UIObject; import com.google.gwt.user.client.ui.Widget; public class EventsExecutor { private JavaScriptObject actionPerformed; private JavaScriptObject mouseExited; private JavaScriptObject mouseClicked; private JavaScriptObject mousePressed; private JavaScriptObject mouseReleased; private JavaScriptObject mouseEntered; private JavaScriptObject mouseWheelMoved; private JavaScriptObject mouseDragged; private JavaScriptObject mouseMoved; private JavaScriptObject componentResized; private JavaScriptObject componentMoved; private JavaScriptObject componentShown; private JavaScriptObject componentHidden; private JavaScriptObject componentAdded; private JavaScriptObject componentRemoved; private JavaScriptObject focusGained; private JavaScriptObject focusLost; private JavaScriptObject keyTyped; private JavaScriptObject keyPressed; private JavaScriptObject keyReleased; private JavaScriptObject itemSelected; private JavaScriptObject valueChanged; private static enum MOUSE { NULL, PRESSED, MOVED, DRAGGED } private MOUSE mouseState = MOUSE.NULL; private UIObject component; private JavaScriptObject eventThis; public EventsExecutor(UIObject aComponent, JavaScriptObject aEventsThis) { super(); component = aComponent; eventThis = aEventsThis; } public void setEventThis(JavaScriptObject aValue) { eventThis = aValue; } public JavaScriptObject getActionPerformed() { return actionPerformed; } public JavaScriptObject getMouseExited() { return mouseExited; } public JavaScriptObject getMouseClicked() { return mouseClicked; } public JavaScriptObject getMousePressed() { return mousePressed; } public JavaScriptObject getMouseReleased() { return mouseReleased; } public JavaScriptObject getMouseEntered() { return mouseEntered; } public JavaScriptObject getMouseWheelMoved() { return mouseWheelMoved; } public JavaScriptObject getMouseDragged() { return mouseDragged; } public JavaScriptObject getMouseMoved() { return mouseMoved; } public JavaScriptObject getComponentResized() { return componentResized; } public JavaScriptObject getComponentMoved() { return componentMoved; } public JavaScriptObject getComponentShown() { return componentShown; } public JavaScriptObject getComponentHidden() { return componentHidden; } public JavaScriptObject getComponentAdded() { return componentAdded; } public JavaScriptObject getComponentRemoved() { return componentRemoved; } public JavaScriptObject getFocusGained() { return focusGained; } public JavaScriptObject getFocusLost() { return focusLost; } public JavaScriptObject getKeyTyped() { return keyTyped; } public JavaScriptObject getKeyPressed() { return keyPressed; } public JavaScriptObject getKeyReleased() { return keyReleased; } public JavaScriptObject getValueChanged() { return valueChanged; } protected HandlerRegistration mouseOutReg; public void setMouseExited(JavaScriptObject aValue) { if (mouseExited != aValue) { if (mouseOutReg != null) { mouseOutReg.removeHandler(); mouseOutReg = null; } mouseExited = aValue; if (mouseExited != null) { MouseOutHandler handler = new MouseOutHandler() { @Override public void onMouseOut(MouseOutEvent event) { if (mouseExited != null) { event.stopPropagation(); executeEvent(mouseExited, EventsPublisher.publish(event)); } } }; if (component instanceof Widget) { mouseOutReg = ((Widget) component).addDomHandler(handler, MouseOutEvent.getType()); } else if (component instanceof HasMouseOutHandlers) { mouseOutReg = ((HasMouseOutHandlers) component).addMouseOutHandler(handler); } } } } protected HandlerRegistration actionPerformedReg; public void setActionPerformed(JavaScriptObject aValue) { if (actionPerformed != aValue) { if (actionPerformedReg != null) { actionPerformedReg.removeHandler(); actionPerformedReg = null; } actionPerformed = aValue; if (actionPerformed != null && component instanceof HasActionHandlers) { actionPerformedReg = ((HasActionHandlers) component).addActionHandler(new ActionHandler() { @Override public void onAction(ActionEvent event) { executeEvent(actionPerformed, EventsPublisher.publish(event)); } }); } } } protected HandlerRegistration mouseClickedReg; protected HandlerRegistration mouseDblClickedReg; public void setMouseClicked(JavaScriptObject aValue) { if (mouseClicked != aValue) { if (mouseClickedReg != null) { mouseClickedReg.removeHandler(); mouseClickedReg = null; } if (mouseDblClickedReg != null) { mouseDblClickedReg.removeHandler(); mouseDblClickedReg = null; } mouseClicked = aValue; if (mouseClicked != null) { ClickHandler cHandler = new ClickHandler() { @Override public void onClick(ClickEvent event) { if (mouseClicked != null) { event.stopPropagation(); executeEvent(mouseClicked, EventsPublisher.publish(event)); } } }; DoubleClickHandler dcHandler = new DoubleClickHandler() { @Override public void onDoubleClick(DoubleClickEvent event) { if (mouseClicked != null) { event.stopPropagation(); executeEvent(mouseClicked, EventsPublisher.publish(event)); } } }; if (component instanceof Widget) { mouseClickedReg = ((Widget) component).addDomHandler(cHandler, ClickEvent.getType()); mouseDblClickedReg = ((Widget) component).addDomHandler(dcHandler, DoubleClickEvent.getType()); } else { if (component instanceof HasClickHandlers) { mouseClickedReg = ((HasClickHandlers) component).addClickHandler(cHandler); } if (component instanceof HasDoubleClickHandlers) { mouseDblClickedReg = ((HasDoubleClickHandlers) component).addDoubleClickHandler(dcHandler); } } } } } protected HandlerRegistration mouseDownReg; public void setMousePressed(JavaScriptObject aValue) { if (mousePressed != aValue) { if (mouseDownReg != null) { mouseDownReg.removeHandler(); mouseDownReg = null; } mousePressed = aValue; if (mousePressed != null) { MouseDownHandler handler = new MouseDownHandler() { @Override public void onMouseDown(MouseDownEvent event) { if (mousePressed != null) { event.stopPropagation(); // Event.setCapture(event.getRelativeElement()); mouseState = MOUSE.PRESSED; executeEvent(mousePressed, EventsPublisher.publish(event)); } } }; if (component instanceof Widget) { mouseDownReg = ((Widget) component).addDomHandler(handler, MouseDownEvent.getType()); } else if (component instanceof HasMouseDownHandlers) { mouseDownReg = ((HasMouseDownHandlers) component).addMouseDownHandler(handler); } } } } protected HandlerRegistration mouseUpReg; public void setMouseReleased(JavaScriptObject aValue) { if (mouseReleased != aValue) { if (mouseUpReg != null) { mouseUpReg.removeHandler(); mouseUpReg = null; } mouseReleased = aValue; if (mouseReleased != null) { MouseUpHandler handler = new MouseUpHandler() { @Override public void onMouseUp(MouseUpEvent event) { // if (mouseState == MOUSE.PRESSED) // Event.releaseCapture(event.getRelativeElement()); if (mouseReleased != null) { event.stopPropagation(); mouseState = MOUSE.NULL; executeEvent(mouseReleased, EventsPublisher.publish(event)); } } }; if (component instanceof Widget) mouseUpReg = ((Widget) component).addDomHandler(handler, MouseUpEvent.getType()); else if (component instanceof HasMouseUpHandlers) mouseUpReg = ((HasMouseUpHandlers) component).addMouseUpHandler(handler); } } } protected HandlerRegistration mouseOverReg; public void setMouseEntered(JavaScriptObject aValue) { if (mouseEntered != aValue) { if (mouseOverReg != null) { mouseOverReg.removeHandler(); mouseOverReg = null; } mouseEntered = aValue; if (mouseEntered != null) { MouseOverHandler handler = new MouseOverHandler() { @Override public void onMouseOver(MouseOverEvent event) { if (mouseEntered != null) { event.stopPropagation(); executeEvent(mouseEntered, EventsPublisher.publish(event)); } } }; if (component instanceof Widget) { mouseOverReg = ((Widget) component).addDomHandler(handler, MouseOverEvent.getType()); } else if (component instanceof HasMouseOverHandlers) { mouseOverReg = ((HasMouseOverHandlers) component).addMouseOverHandler(handler); } } } } protected HandlerRegistration mouseWheelReg; public void setMouseWheelMoved(JavaScriptObject aValue) { if (mouseWheelMoved != aValue) { if (mouseWheelReg != null) { mouseWheelReg.removeHandler(); mouseWheelReg = null; } mouseWheelMoved = aValue; if (mouseWheelMoved != null) { MouseWheelHandler handler = new MouseWheelHandler() { @Override public void onMouseWheel(MouseWheelEvent event) { if (mouseWheelMoved != null) { event.stopPropagation(); executeEvent(mouseWheelMoved, EventsPublisher.publish(event)); } } }; if (component instanceof Widget) { mouseWheelReg = ((Widget) component).addDomHandler(handler, MouseWheelEvent.getType()); } else if (component instanceof HasMouseWheelHandlers) { mouseWheelReg = ((HasMouseWheelHandlers) component).addMouseWheelHandler(handler); } } } } protected HandlerRegistration mouseMoveReg; public void setMouseMoved(JavaScriptObject aValue) { if (mouseMoved != aValue) { if (mouseMoveReg != null) { mouseMoveReg.removeHandler(); mouseMoveReg = null; } mouseMoved = aValue; if (mouseMoved != null) { MouseMoveHandler handler = new MouseMoveHandler() { @Override public void onMouseMove(MouseMoveEvent event) { if (mouseMoved != null || mouseDragged != null) { event.stopPropagation(); if (mouseState == MOUSE.NULL || mouseState == MOUSE.MOVED) { mouseState = MOUSE.MOVED; executeEvent(mouseMoved, EventsPublisher.publish(event)); } else if (mouseState == MOUSE.PRESSED || mouseState == MOUSE.DRAGGED) { mouseState = MOUSE.DRAGGED; executeEvent(mouseDragged, EventsPublisher.publish(event)); } } } }; if (component instanceof Widget) { mouseMoveReg = ((Widget) component).addDomHandler(handler, MouseMoveEvent.getType()); } else if (component instanceof HasMouseMoveHandlers) { mouseMoveReg = ((HasMouseMoveHandlers) component).addMouseMoveHandler(handler); } } } } protected HandlerRegistration componentResizedReg; public void setComponentResized(JavaScriptObject aValue) { if (componentResized != aValue) { if (componentResizedReg != null) { componentResizedReg.removeHandler(); componentResizedReg = null; } componentResized = aValue; if (componentResized != null && component instanceof HasResizeHandlers) componentResizedReg = ((HasResizeHandlers) component).addResizeHandler(new ResizeHandler() { @Override public void onResize(ResizeEvent event) { if (componentResized != null) { executeEvent(componentResized, EventsPublisher.publish(event)); } } }); } } protected HandlerRegistration componentMovedReg; public void setComponentMoved(JavaScriptObject aValue) { if (componentMoved != aValue) { if (componentMovedReg != null) { componentMovedReg.removeHandler(); componentMovedReg = null; } componentMoved = aValue; if (componentMoved != null && component instanceof HasMoveHandlers<?>) componentMovedReg = ((HasMoveHandlers<Object>) component).addMoveHandler(new MoveHandler<Object>() { @Override public void onMove(MoveEvent<Object> event) { if (componentMoved != null) { executeEvent(componentMoved, EventsPublisher.publish(event)); } } }); } } protected HandlerRegistration componentShownReg; public void setComponentShown(JavaScriptObject aValue) { if (componentShown != aValue) { if (componentShownReg != null) { componentShownReg.removeHandler(); componentShownReg = null; } componentShown = aValue; if (componentShown != null && component instanceof HasShowHandlers) componentShownReg = ((HasShowHandlers) component).addShowHandler(new ShowHandler() { @Override public void onShow(ShowEvent event) { if (componentShown != null) { executeEvent(componentShown, EventsPublisher.publish(event)); } } }); } } protected HandlerRegistration componentHiddenReg; public void setComponentHidden(JavaScriptObject aValue) { if (componentHidden != aValue) { if (componentHiddenReg != null) { componentHiddenReg.removeHandler(); componentHiddenReg = null; } componentHidden = aValue; if (componentHidden != null && component instanceof HasHideHandlers) componentHiddenReg = ((HasHideHandlers) component).addHideHandler(new HideHandler() { @Override public void onHide(HideEvent event) { if (componentHidden != null) { executeEvent(componentHidden, EventsPublisher.publish(event)); } } }); } } protected HandlerRegistration componentAddedReg; public void setComponentAdded(JavaScriptObject aValue) { if (componentAdded != aValue) { if (componentAddedReg != null) { componentAddedReg.removeHandler(); componentAddedReg = null; } componentAdded = aValue; if (componentAdded != null && component instanceof HasAddHandlers) componentAddedReg = ((HasAddHandlers) component).addAddHandler(new AddHandler() { @Override public void onAdd(AddEvent event) { if (componentAdded != null) { executeEvent(componentAdded, EventsPublisher.publish(event)); } } }); } } protected HandlerRegistration componentRemovedReg; public void setComponentRemoved(JavaScriptObject aValue) { if (componentRemoved != aValue) { if (componentRemovedReg != null) { componentRemovedReg.removeHandler(); componentRemovedReg = null; } componentRemoved = aValue; if (componentRemoved != null && component instanceof HasRemoveHandlers) componentRemovedReg = ((HasRemoveHandlers) component).addRemoveHandler(new RemoveHandler() { @Override public void onRemove(RemoveEvent event) { if (componentRemoved != null) { executeEvent(componentRemoved, EventsPublisher.publish(event)); } } }); } } public void setMouseDragged(JavaScriptObject aValue) { mouseDragged = aValue; } protected HandlerRegistration focusReg; public void setFocusGained(JavaScriptObject aValue) { if (focusGained != aValue) { if (focusReg != null) { focusReg.removeHandler(); focusReg = null; } focusGained = aValue; if (focusGained != null && component instanceof HasFocusHandlers) { focusReg = ((HasFocusHandlers) component).addFocusHandler(new FocusHandler() { @Override public void onFocus(FocusEvent event) { if (focusGained != null) { executeEvent(focusGained, EventsPublisher.publish(event)); } } }); } } } protected HandlerRegistration blurReg; public void setFocusLost(JavaScriptObject aValue) { if (focusLost != aValue) { if (blurReg != null) { blurReg.removeHandler(); blurReg = null; } focusLost = aValue; if (focusLost != null && component instanceof HasBlurHandlers) { blurReg = ((HasBlurHandlers) component).addBlurHandler(new BlurHandler() { @Override public void onBlur(BlurEvent event) { if (focusLost != null) { executeEvent(focusLost, EventsPublisher.publish(event)); } mouseState = MOUSE.NULL; } }); } } } protected HandlerRegistration keyTypedReg; public void setKeyTyped(JavaScriptObject aValue) { if (keyTyped != aValue) { if (keyTypedReg != null) { keyTypedReg.removeHandler(); keyTypedReg = null; } keyTyped = aValue; if (keyTyped != null && component instanceof HasKeyPressHandlers) { keyTypedReg = ((HasKeyPressHandlers) component).addKeyPressHandler(new KeyPressHandler() { @Override public void onKeyPress(KeyPressEvent event) { if (keyTyped != null) { event.stopPropagation(); executeEvent(keyTyped, EventsPublisher.publish(event)); } } }); } } } protected HandlerRegistration keyDownReg; public void setKeyPressed(JavaScriptObject aValue) { if (keyPressed != aValue) { if (keyDownReg != null) { keyDownReg.removeHandler(); keyDownReg = null; } keyPressed = aValue; if (keyPressed != null && component instanceof HasKeyDownHandlers) { keyDownReg = ((HasKeyDownHandlers) component).addKeyDownHandler(new KeyDownHandler() { @Override public void onKeyDown(KeyDownEvent event) { if (keyPressed != null) { event.stopPropagation(); executeEvent(keyPressed, EventsPublisher.publish(event)); } } }); } } } protected HandlerRegistration keyUpReg; public void setKeyReleased(JavaScriptObject aValue) { if (keyReleased != aValue) { if (keyUpReg != null) { keyUpReg.removeHandler(); keyUpReg = null; } keyReleased = aValue; if (keyReleased != null && component instanceof HasKeyUpHandlers) { keyUpReg = ((HasKeyUpHandlers) component).addKeyUpHandler(new KeyUpHandler() { @Override public void onKeyUp(KeyUpEvent event) { if (keyReleased != null) { event.stopPropagation(); executeEvent(keyReleased, EventsPublisher.publish(event)); } } }); } } } public JavaScriptObject getItemSelected() { return itemSelected; } protected HandlerRegistration selectedItemReg; public void setItemSelected(JavaScriptObject aValue) { if (itemSelected != aValue) { if (selectedItemReg != null) { selectedItemReg.removeHandler(); selectedItemReg = null; } itemSelected = aValue; if (component instanceof HasSelectionHandlers<?>) { selectedItemReg = ((HasSelectionHandlers<Object>) component).addSelectionHandler(new SelectionHandler<Object>() { @Override public void onSelection(SelectionEvent<Object> event) { JavaScriptObject published = ((HasPublished) event.getSource()).getPublished(); Object oItem = event.getSelectedItem(); if (oItem instanceof HasPublished) oItem = ((HasPublished) oItem).getPublished(); executeEvent(itemSelected, EventsPublisher.publishItemEvent(published, oItem instanceof JavaScriptObject ? (JavaScriptObject) oItem : null)); } }); } } } protected HandlerRegistration valueChangedReg; public void setValueChanged(JavaScriptObject aValue) { if (valueChanged != aValue) { if (valueChangedReg != null) { valueChangedReg.removeHandler(); valueChangedReg = null; } valueChanged = aValue; if (component instanceof HasValueChangeHandlers<?>) { valueChangedReg = ((HasValueChangeHandlers<Object>) component).addValueChangeHandler(new ValueChangeHandler<Object>() { @Override public void onValueChange(ValueChangeEvent<Object> event) { JavaScriptObject published = ((HasPublished) event.getSource()).getPublished(); executeEvent(valueChanged, EventsPublisher.publishSourcedEvent(published)); } }); } } } protected void executeEvent(JavaScriptObject aHandler, JavaScriptObject aEvent) { try { Utils.executeScriptEventVoid(eventThis, aHandler, aEvent); } catch (Exception e) { Logger.getLogger(EventsExecutor.class.getName()).log(Level.SEVERE, null, e); } } }