package com.gwt.ui.client.groupboxpanel; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.HasAllMouseHandlers; 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.Timer; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; public class Tooltip implements MouseOverHandler, MouseOutHandler { private static final int DELAY_TO_SHOW = 300; private static TooltipPanel tooltipPanel; private String text; private final Widget target; public static Tooltip tooltip(HasTooltipMouseHandlers sender, String text) { return new Tooltip(sender, text); } public static Tooltip tooltip(HasAllMouseHandlers sender, String text) { return new Tooltip(sender, text); } private static class TooltipPanel extends PopupPanel { private final HTML textPane; private Timer delayShowTimer; private Timer delayHideTimer; private long hideTimeStamp; public TooltipPanel() { super(true); SimplePanel content = new SimplePanel(); content.getElement().getStyle().setProperty("boxShadow", "5px 2px 2px #888"); content.getElement().getStyle().setProperty("MozBoxShadow", "5px 2px 2px #888"); content.getElement().getStyle().setProperty("WebkitBoxShadow", "5px 2px 2px #888"); content.getElement().getStyle().setMargin(20, Unit.PX); add(content); textPane = new HTML(); content.setWidget(textPane); textPane.getElement().getStyle().setZIndex(30); } private void scheduleShow(final Widget target, final String text) { if (delayShowTimer != null) { delayShowTimer.cancel(); } delayShowTimer = new Timer() { @Override public void run() { delayShowTimer = null; if (target.isAttached() && target.isVisible()) { textPane.setHTML(text); setWidth((Math.min(text.length(), 80)) / 2 + "em"); TooltipPanel.this.showRelativeTo(target); } } }; delayShowTimer.schedule((System.currentTimeMillis() - hideTimeStamp > 200) ? DELAY_TO_SHOW : 200); } @Override public void hide() { if (delayShowTimer != null) { delayShowTimer.cancel(); delayShowTimer = null; } if (delayHideTimer != null) { delayHideTimer.cancel(); delayHideTimer = null; } hideTimeStamp = System.currentTimeMillis(); TooltipPanel.super.hide(); } } protected Tooltip(HasTooltipMouseHandlers target, String text) { this.text = text; this.target = (Widget) target; target.addMouseOverHandler(this); target.addMouseOutHandler(this); } protected Tooltip(HasAllMouseHandlers target, String text) { this.text = text; this.target = (Widget) target; target.addMouseOverHandler(this); target.addMouseOutHandler(this); } public void setTooltipText(String text) { this.text = text; //TODO update text if it is shown } @Override public void onMouseOver(MouseOverEvent event) { if (this.text != null) { if (tooltipPanel == null) { tooltipPanel = new TooltipPanel(); } tooltipPanel.setPopupPosition(event.getClientX(), event.getClientY()); tooltipPanel.scheduleShow(target, this.text); } } @Override public void onMouseOut(MouseOutEvent event) { if (tooltipPanel != null) { tooltipPanel.hide(); } } }