package com.gwt.ui.client; 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.user.client.DOM; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.Widget; public class MobileTooltipMouseListener implements MouseDownHandler,MouseMoveHandler, MouseOutHandler,MouseOverHandler { public static final int ST_NORMAL = 0; public static final int ST_STICKY = 1; public static final int ST_FORCE_HIDE = 2; private int state; private MobileTooltip mobileTooltip; public MobileTooltipMouseListener(MobileTooltip mobileTooltip){ this.mobileTooltip = mobileTooltip; this.state = ST_NORMAL; } @Override public void onMouseOver(MouseOverEvent arg0) { if(this.state != ST_STICKY && this.state != ST_FORCE_HIDE){ this.state = ST_NORMAL; mobileTooltip.show(); } } @Override public void onMouseMove(MouseMoveEvent event) { Widget sender = (Widget)event.getSource(); int x = event.getRelativeX(sender.getElement()); int y = event.getRelativeY(sender.getElement()); //only update the position of the tooltip in NORMAL state if(this.state == ST_FORCE_HIDE || this.state == ST_STICKY){ return; } //calculate the posistion of the mouse pointer //relative to the client window mobileTooltip.setPopupPosition( this.getDisplayLocationX(sender, x), this.getDisplayLocationY(sender, y)); } private int getDisplayLocationX(Widget sender, int x){ return sender.getAbsoluteLeft() + x + getPageScrollLeft() + mobileTooltip.getOffsetX(); } private int getDisplayLocationY(Widget sender, int y){ return sender.getAbsoluteTop() + y + getPageScrollTop() + mobileTooltip.getOffsetY(); } @Override public void onMouseDown(MouseDownEvent event) { Widget sender = (Widget)event.getSource(); int x = event.getRelativeX(sender.getElement()); int y = event.getRelativeY(sender.getElement()); if(this.state == ST_STICKY){ mobileTooltip.hide(); this.state = ST_FORCE_HIDE; return; } mobileTooltip.setPopupPosition( this.getDisplayLocationX(sender, x), this.getDisplayLocationY(sender, y)); if(this.state == ST_FORCE_HIDE){ mobileTooltip.show(); this.state = ST_NORMAL; }else if(this.state == ST_NORMAL){ mobileTooltip.show(); this.state = ST_STICKY; } } @Override public void onMouseOut(MouseOutEvent arg0) { if(this.state != ST_STICKY){ mobileTooltip.hide(); } } private int getPageScrollTop() { return 0; } /** * Get the offset for the vertical scroll * Again. * http://groups.google.com/group/Google-Web-Toolkit/browse_thread/thread/220a035f47b5ac66/dcfc19a3534f7715?lnk=gst&q=tooltip+listener&rnum=1#dcfc19a3534f7715 */ private int getPageScrollLeft() { return 0; } public MobileTooltip getMobileTooltip() { return mobileTooltip; } }