From: Matti Tahvonen Date: Fri, 6 Jun 2008 13:16:29 +0000 (+0000) Subject: initial commit for formatted tooltips X-Git-Tag: 6.7.0.beta1~4648 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=2c5c21d514bfa9d3958b0b2de5af93d167c141ea;p=vaadin-framework.git initial commit for formatted tooltips svn changeset:4777/svn branch:trunk --- diff --git a/WebContent/ITMILL/themes/default/common/common.css b/WebContent/ITMILL/themes/default/common/common.css index d449aa5ba4..3762175dae 100644 --- a/WebContent/ITMILL/themes/default/common/common.css +++ b/WebContent/ITMILL/themes/default/common/common.css @@ -82,6 +82,26 @@ input.i-modified, background-color: #FFE0E0; } +/** + * Custom toolktip + */ + .i-tooltip { + background-color: #ffffcc; + border: 1px solid #464f52; + font-size: 12px; + font-family: "Trebuchet MS", geneva, helvetica, arial, tahoma, verdana, sans-serif; + color: #464f52; + } + +.i-tooltip-text { + margin: 4px; +} + + .i-tooltip .i-errormessage { + padding: 4px; + border-width: 0 0 1px 0; + } + /** * Context menu styles */ diff --git a/WebContent/ITMILL/themes/default/styles.css b/WebContent/ITMILL/themes/default/styles.css index 63f297fa09..d0fb32e0df 100644 --- a/WebContent/ITMILL/themes/default/styles.css +++ b/WebContent/ITMILL/themes/default/styles.css @@ -173,6 +173,27 @@ input.i-modified, background-color: #FFE0E0; } +/** + * Custom toolktip + */ + .i-tooltip { + background-color: #ffffcc; + border: 1px solid #464f52; + font-size: 12px; + font-family: "Trebuchet MS", geneva, helvetica, arial, tahoma, verdana, sans-serif; + color: #464f52; + } + + .i-tooltip-text { + margin: 4px; +} + + .i-tooltip .i-errormessage { + padding: 4px; + border-width: 0 0 1px 0; + } + + /** * Context menu styles */ diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ApplicationConnection.java b/src/com/itmill/toolkit/terminal/gwt/client/ApplicationConnection.java index 40df796e8b..d0f2a631ee 100755 --- a/src/com/itmill/toolkit/terminal/gwt/client/ApplicationConnection.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ApplicationConnection.java @@ -24,6 +24,7 @@ import com.google.gwt.user.client.Command; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.DeferredCommand; import com.google.gwt.user.client.Element; +import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.WindowCloseListener; @@ -60,6 +61,9 @@ public class ApplicationConnection { private final HashMap paintableToId = new HashMap(); + /** Contains ExtendedTitleInfo by paintable id */ + private final HashMap paintableToTitle = new HashMap(); + private final WidgetSet widgetSet; private ContextMenu contextMenu = null; @@ -533,7 +537,9 @@ public class ApplicationConnection { } public void unregisterPaintable(Paintable p) { - idToPaintable.remove(paintableToId.get(p)); + Object id = paintableToId.get(p); + idToPaintable.remove(id); + paintableToTitle.remove(id); paintableToId.remove(p); if (p instanceof HasWidgets) { @@ -788,11 +794,21 @@ public class ApplicationConnection { styleBuf.append(" "); styleBuf.append(MODIFIED_CLASSNAME); } + + TooltipInfo tooltipInfo = getTitleInfo((Paintable) component); + if (uidl.hasAttribute("description")) { + tooltipInfo.setTitle(uidl.getStringAttribute("description")); + } + // add error classname to components w/ error if (uidl.hasAttribute("error")) { styleBuf.append(" "); styleBuf.append(primaryName); styleBuf.append(ERROR_CLASSNAME_EXT); + + tooltipInfo.setErrorUidl(uidl.getErrors()); + } else { + tooltipInfo.setErrorUidl(null); } // Styles + disabled & readonly @@ -903,4 +919,39 @@ public class ApplicationConnection { } } + + /* Extended title handling */ + + /** + * Data showed in tooltips are stored centrilized as it may be needed in + * varios place: caption, layouts, and in owner components themselves. + * + * Updating TooltipInfo is done in updateComponent method. + * + */ + public TooltipInfo getTitleInfo(Paintable titleOwner) { + TooltipInfo info = (TooltipInfo) paintableToTitle.get(titleOwner); + if (info == null) { + info = new TooltipInfo(); + paintableToTitle.put(titleOwner, info); + } + return info; + } + + private final Tooltip tooltip = new Tooltip(this); + + /** + * Component may want to delegate Tooltip handling to client. Layouts add + * Tooltip (description, errors) to caption, but some components may want + * them to appear one other elements too. + * + * Events wanted by this handler are same as in Tooltip.TOOLTIP_EVENTS + * + * @param event + * @param owner + */ + public void handleTooltipEvent(Event event, Paintable owner) { + tooltip.handleTooltipEvent(event, owner); + + } } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/Caption.java b/src/com/itmill/toolkit/terminal/gwt/client/Caption.java index 1d3be76a71..1d245ab7e2 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/Caption.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/Caption.java @@ -24,8 +24,6 @@ public class Caption extends HTML { private Element captionText; - private ErrorMessage errorMessage; - private final ApplicationConnection client; /** @@ -51,8 +49,6 @@ public class Caption extends HTML { if (uidl.hasAttribute("error")) { isEmpty = false; - final UIDL errorUidl = uidl.getErrors(); - if (errorIndicatorElement == null) { errorIndicatorElement = DOM.createDiv(); if (Util.isIE()) { @@ -62,11 +58,6 @@ public class Caption extends HTML { "i-errorindicator"); DOM.appendChild(getElement(), errorIndicatorElement); } - if (errorMessage == null) { - errorMessage = new ErrorMessage(); - } - errorMessage.updateFromUIDL(errorUidl); - } else if (errorIndicatorElement != null) { DOM.removeChild(getElement(), errorIndicatorElement); errorIndicatorElement = null; @@ -85,7 +76,6 @@ public class Caption extends HTML { DOM.removeChild(getElement(), icon.getElement()); icon = null; } - } if (uidl.hasAttribute("caption")) { @@ -108,11 +98,8 @@ public class Caption extends HTML { if (uidl.hasAttribute("description")) { if (captionText != null) { - DOM.setElementProperty(captionText, "title", uidl - .getStringAttribute("description")); addStyleDependentName("hasdescription"); } else { - setTitle(uidl.getStringAttribute("description")); removeStyleDependentName("hasdescription"); } } @@ -150,38 +137,13 @@ public class Caption extends HTML { public void onBrowserEvent(Event event) { final Element target = DOM.eventGetTarget(event); - if (errorIndicatorElement != null - && DOM.compare(target, errorIndicatorElement)) { - switch (DOM.eventGetType(event)) { - case Event.ONMOUSEOVER: - showErrorMessage(); - break; - case Event.ONMOUSEOUT: - hideErrorMessage(); - break; - case Event.ONCLICK: - ApplicationConnection.getConsole().log( - DOM.getInnerHTML(errorMessage.getElement())); - default: - break; - } + if (client != null && !DOM.compare(target, getElement())) { + client.handleTooltipEvent(event, owner); } else { super.onBrowserEvent(event); } } - private void hideErrorMessage() { - if (errorMessage != null) { - errorMessage.hide(); - } - } - - private void showErrorMessage() { - if (errorMessage != null) { - errorMessage.showAt(errorIndicatorElement); - } - } - public static boolean isNeeded(UIDL uidl) { if (uidl.getStringAttribute("caption") != null) { return true; diff --git a/src/com/itmill/toolkit/terminal/gwt/client/Tooltip.java b/src/com/itmill/toolkit/terminal/gwt/client/Tooltip.java new file mode 100644 index 0000000000..87fc1987b5 --- /dev/null +++ b/src/com/itmill/toolkit/terminal/gwt/client/Tooltip.java @@ -0,0 +1,161 @@ +package com.itmill.toolkit.terminal.gwt.client; + +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.Element; +import com.google.gwt.user.client.Event; +import com.google.gwt.user.client.Timer; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.FlowPanel; +import com.itmill.toolkit.terminal.gwt.client.ui.ToolkitOverlay; + +/** + * TODO open for extension + */ +public class Tooltip extends ToolkitOverlay { + private static final String CLASSNAME = "i-tooltip"; + private static final int MARGIN = 4; + public static final int TOOLTIP_EVENTS = Event.ONKEYDOWN + | Event.ONMOUSEOVER | Event.ONMOUSEOUT | Event.ONMOUSEMOVE + | Event.ONCLICK; + protected static final int MAX_WIDTH = 280; + ErrorMessage em = new ErrorMessage(); + Element description = DOM.createDiv(); + private Paintable tooltipOwner; + private boolean closing; + private boolean opening; + private ApplicationConnection ac; + + public Tooltip(ApplicationConnection client) { + ac = client; + setStyleName(CLASSNAME); + FlowPanel layout = new FlowPanel(); + setWidget(layout); + layout.add(em); + DOM.setElementProperty(description, "className", CLASSNAME + "-text"); + DOM.appendChild(layout.getElement(), description); + } + + private void show(TooltipInfo info) { + boolean hasContent = false; + if (info.getErrorUidl() != null) { + em.setVisible(true); + em.updateFromUIDL(info.getErrorUidl()); + hasContent = true; + } else { + em.setVisible(false); + } + if (info.getTitle() != null && !"".equals(info.getTitle())) { + DOM.setInnerHTML(description, info.getTitle()); + hasContent = true; + } else { + DOM.setInnerHTML(description, ""); + } + if (hasContent) { + setPopupPositionAndShow(new PositionCallback() { + public void setPosition(int offsetWidth, int offsetHeight) { + + if (offsetWidth > MAX_WIDTH) { + setWidth(MAX_WIDTH + "px"); + } + + offsetWidth = getOffsetWidth(); + + int x = tooltipEventMouseX + 10; + int y = tooltipEventMouseY + 10; + + if (x + offsetWidth + MARGIN - Window.getScrollLeft() > Window + .getClientWidth()) { + x = Window.getClientWidth() - offsetWidth - MARGIN; + } + + if (y + offsetHeight + MARGIN - Window.getScrollTop() > Window + .getClientHeight()) { + y = tooltipEventMouseY - 5 - offsetHeight; + } + + setPopupPosition(x, y); + } + }); + } else { + hide(); + } + } + + public void showTooltip(Paintable owner, Event event) { + if (closing && tooltipOwner == owner) { + closeTimer.cancel(); + closing = false; + return; + } + updatePosition(event); + + if (opening) { + showTimer.cancel(); + } + tooltipOwner = owner; + showTimer.schedule(1000); + opening = true; + + } + + private Timer showTimer = new Timer() { + public void run() { + TooltipInfo info = ac.getTitleInfo(tooltipOwner); + show(info); + opening = false; + + } + }; + + private Timer closeTimer = new Timer() { + public void run() { + hide(); + closing = false; + tooltipOwner = null; + setWidth(""); + } + }; + + public void hideTooltip() { + if (opening) { + showTimer.cancel(); + opening = false; + tooltipOwner = null; + } + if (!isAttached()) { + return; + } + if (closing) { + // already about to close + return; + } + closeTimer.schedule(300); + } + + private int tooltipEventMouseX; + private int tooltipEventMouseY; + + public void updatePosition(Event event) { + tooltipEventMouseX = DOM.eventGetClientX(event); + tooltipEventMouseY = DOM.eventGetClientY(event); + + } + + public void handleTooltipEvent(Event event, Paintable owner) { + final int type = DOM.eventGetType(event); + if ((Tooltip.TOOLTIP_EVENTS & type) == type) { + if (type == Event.ONMOUSEOVER) { + showTooltip(owner, event); + } else if (type == Event.ONMOUSEMOVE) { + updatePosition(event); + } else { + hideTooltip(); + } + } else { + ApplicationConnection.getConsole().log( + "Hiding tooltip on" + DOM.eventGetTypeString(event)); + hideTooltip(); + } + } + +} diff --git a/src/com/itmill/toolkit/terminal/gwt/client/TooltipInfo.java b/src/com/itmill/toolkit/terminal/gwt/client/TooltipInfo.java new file mode 100644 index 0000000000..ea75e21af7 --- /dev/null +++ b/src/com/itmill/toolkit/terminal/gwt/client/TooltipInfo.java @@ -0,0 +1,25 @@ +package com.itmill.toolkit.terminal.gwt.client; + +public class TooltipInfo { + + private String title; + + private UIDL errorUidl; + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public UIDL getErrorUidl() { + return errorUidl; + } + + public void setErrorUidl(UIDL errorUidl) { + this.errorUidl = errorUidl; + } + +} diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IButton.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IButton.java index 4d0a27e2dc..6f1b3012c2 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IButton.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IButton.java @@ -11,8 +11,8 @@ import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.ClickListener; import com.google.gwt.user.client.ui.Widget; import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection; -import com.itmill.toolkit.terminal.gwt.client.ErrorMessage; import com.itmill.toolkit.terminal.gwt.client.Paintable; +import com.itmill.toolkit.terminal.gwt.client.Tooltip; import com.itmill.toolkit.terminal.gwt.client.UIDL; public class IButton extends Button implements Paintable { @@ -27,8 +27,6 @@ public class IButton extends Button implements Paintable { private final Element captionElement = DOM.createSpan(); - private ErrorMessage errorMessage; - private Icon icon; public IButton() { @@ -49,6 +47,7 @@ public class IButton extends Button implements Paintable { client.updateVariable(id, "state", true, true); } }); + sinkEvents(Tooltip.TOOLTIP_EVENTS); } public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { @@ -68,25 +67,18 @@ public class IButton extends Button implements Paintable { // handle error if (uidl.hasAttribute("error")) { - final UIDL errorUidl = uidl.getErrors(); if (errorIndicatorElement == null) { errorIndicatorElement = DOM.createDiv(); DOM.setElementProperty(errorIndicatorElement, "className", "i-errorindicator"); - DOM.sinkEvents(errorIndicatorElement, Event.MOUSEEVENTS); - sinkEvents(Event.MOUSEEVENTS); } DOM.insertChild(getElement(), errorIndicatorElement, 0); - if (errorMessage == null) { - errorMessage = new ErrorMessage(); - } - errorMessage.updateFromUIDL(errorUidl); } else if (errorIndicatorElement != null) { DOM.removeChild(getElement(), errorIndicatorElement); errorIndicatorElement = null; } - + if (uidl.hasAttribute("readonly")) { setEnabled(false); } @@ -103,14 +95,6 @@ public class IButton extends Button implements Paintable { icon = null; } } - - // handle description - if (uidl.hasAttribute("description")) { - setTitle(uidl.getStringAttribute("description")); - } else { - setTitle(null); - } - } public void setText(String text) { @@ -118,34 +102,9 @@ public class IButton extends Button implements Paintable { } public void onBrowserEvent(Event event) { - final Element target = DOM.eventGetTarget(event); - if (errorIndicatorElement != null - && DOM.compare(target, errorIndicatorElement)) { - switch (DOM.eventGetType(event)) { - case Event.ONMOUSEOVER: - showErrorMessage(); - break; - case Event.ONMOUSEOUT: - hideErrorMessage(); - break; - case Event.ONCLICK: - ApplicationConnection.getConsole().log( - DOM.getInnerHTML(errorMessage.getElement())); - return; - default: - break; - } - } super.onBrowserEvent(event); - } - - private void hideErrorMessage() { - errorMessage.hide(); - } - - private void showErrorMessage() { - if (errorMessage != null) { - errorMessage.showAt(errorIndicatorElement); + if (client != null) { + client.handleTooltipEvent(event, this); } } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ICheckBox.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ICheckBox.java index 46ce4eeaa2..191db6023a 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/ICheckBox.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ICheckBox.java @@ -10,8 +10,8 @@ import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.ClickListener; import com.google.gwt.user.client.ui.Widget; import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection; -import com.itmill.toolkit.terminal.gwt.client.ErrorMessage; import com.itmill.toolkit.terminal.gwt.client.Paintable; +import com.itmill.toolkit.terminal.gwt.client.Tooltip; import com.itmill.toolkit.terminal.gwt.client.UIDL; public class ICheckBox extends com.google.gwt.user.client.ui.CheckBox implements @@ -29,8 +29,6 @@ public class ICheckBox extends com.google.gwt.user.client.ui.CheckBox implements private Icon icon; - private ErrorMessage errorMessage; - private boolean isBlockMode = false; public ICheckBox() { @@ -45,7 +43,7 @@ public class ICheckBox extends com.google.gwt.user.client.ui.CheckBox implements } }); - + sinkEvents(Tooltip.TOOLTIP_EVENTS); } public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { @@ -59,28 +57,16 @@ public class ICheckBox extends com.google.gwt.user.client.ui.CheckBox implements } if (uidl.hasAttribute("error")) { - final UIDL errorUidl = uidl.getErrors(); - if (errorIndicatorElement == null) { errorIndicatorElement = DOM.createDiv(); - DOM.sinkEvents(errorIndicatorElement, Event.MOUSEEVENTS); DOM.setElementProperty(errorIndicatorElement, "className", "i-errorindicator"); DOM.appendChild(getElement(), errorIndicatorElement); } - if (errorMessage == null) { - errorMessage = new ErrorMessage(); - } - errorMessage.updateFromUIDL(errorUidl); - } else if (errorIndicatorElement != null) { DOM.setStyleAttribute(errorIndicatorElement, "display", "none"); } - if (uidl.hasAttribute("description")) { - setTitle(uidl.getStringAttribute("description")); - } - if (uidl.hasAttribute("readonly")) { setEnabled(false); } @@ -105,22 +91,8 @@ public class ICheckBox extends com.google.gwt.user.client.ui.CheckBox implements public void onBrowserEvent(Event event) { super.onBrowserEvent(event); - final Element target = DOM.eventGetTarget(event); - if (errorIndicatorElement != null - && DOM.compare(target, errorIndicatorElement)) { - switch (DOM.eventGetType(event)) { - case Event.ONMOUSEOVER: - errorMessage.showAt(errorIndicatorElement); - break; - case Event.ONMOUSEOUT: - errorMessage.hide(); - break; - case Event.ONCLICK: - ApplicationConnection.getConsole().log( - DOM.getInnerHTML(errorMessage.getElement())); - default: - break; - } + if (client != null) { + client.handleTooltipEvent(event, this); } } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IDateField.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IDateField.java index 0fbc50524b..83ea040c02 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IDateField.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IDateField.java @@ -6,11 +6,13 @@ package com.itmill.toolkit.terminal.gwt.client.ui; import java.util.Date; +import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.FlowPanel; import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection; import com.itmill.toolkit.terminal.gwt.client.DateTimeService; import com.itmill.toolkit.terminal.gwt.client.LocaleNotLoadedException; import com.itmill.toolkit.terminal.gwt.client.Paintable; +import com.itmill.toolkit.terminal.gwt.client.Tooltip; import com.itmill.toolkit.terminal.gwt.client.UIDL; public class IDateField extends FlowPanel implements Paintable, Field { @@ -48,6 +50,14 @@ public class IDateField extends FlowPanel implements Paintable, Field { public IDateField() { setStyleName(CLASSNAME); dts = new DateTimeService(); + sinkEvents(Tooltip.TOOLTIP_EVENTS); + } + + public void onBrowserEvent(Event event) { + super.onBrowserEvent(event); + if (client != null) { + client.handleTooltipEvent(event, this); + } } public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IFilterSelect.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IFilterSelect.java index b6d28ee010..7f2ec7aa33 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IFilterSelect.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IFilterSelect.java @@ -30,6 +30,7 @@ import com.google.gwt.user.client.ui.SuggestOracle.Suggestion; import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection; import com.itmill.toolkit.terminal.gwt.client.Focusable; import com.itmill.toolkit.terminal.gwt.client.Paintable; +import com.itmill.toolkit.terminal.gwt.client.Tooltip; import com.itmill.toolkit.terminal.gwt.client.UIDL; import com.itmill.toolkit.terminal.gwt.client.Util; @@ -426,7 +427,14 @@ public class IFilterSelect extends Composite implements Paintable, Field, private final FlowPanel panel = new FlowPanel(); - private final TextBox tb = new TextBox(); + private final TextBox tb = new TextBox() { + public void onBrowserEvent(Event event) { + super.onBrowserEvent(event); + if (client != null) { + client.handleTooltipEvent(event, IFilterSelect.this); + } + } + }; private final SuggestionPopup suggestionPopup = new SuggestionPopup(); @@ -465,6 +473,7 @@ public class IFilterSelect extends Composite implements Paintable, Field, public IFilterSelect() { selectedItemIcon.setVisible(false); panel.add(selectedItemIcon); + tb.sinkEvents(Tooltip.TOOLTIP_EVENTS); panel.add(tb); panel.add(popupOpener); initWidget(panel); diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IListSelect.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IListSelect.java index 0f07921cfb..b49cc1c24a 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IListSelect.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IListSelect.java @@ -7,8 +7,10 @@ package com.itmill.toolkit.terminal.gwt.client.ui; import java.util.Iterator; import java.util.Vector; +import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.Widget; +import com.itmill.toolkit.terminal.gwt.client.Tooltip; import com.itmill.toolkit.terminal.gwt.client.UIDL; public class IListSelect extends IOptionGroupBase { @@ -21,7 +23,22 @@ public class IListSelect extends IOptionGroupBase { private int lastSelectedIndex = -1; + private class MyListBox extends ListBox { + MyListBox() { + super(); + sinkEvents(Tooltip.TOOLTIP_EVENTS); + } + + public void onBrowserEvent(Event event) { + super.onBrowserEvent(event); + if (client != null) { + client.handleTooltipEvent(event, IListSelect.this); + } + } + } + public IListSelect() { + // TODO use myListBox to have Tooltips super(new ListBox(), CLASSNAME); select = (ListBox) optionsContainer; select.addChangeListener(this); diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IOptionGroupBase.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IOptionGroupBase.java index d639c075e8..04ac2cee78 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IOptionGroupBase.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IOptionGroupBase.java @@ -22,9 +22,9 @@ abstract class IOptionGroupBase extends Composite implements Paintable, Field, public static final String CLASSNAME_OPTION = "i-select-option"; - ApplicationConnection client; + protected ApplicationConnection client; - String id; + protected String id; protected Set selectedKeys; diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITextField.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITextField.java index d1aa4c1769..b024e37c6d 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITextField.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITextField.java @@ -6,12 +6,14 @@ package com.itmill.toolkit.terminal.gwt.client.ui; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; +import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.ChangeListener; import com.google.gwt.user.client.ui.FocusListener; import com.google.gwt.user.client.ui.TextBoxBase; import com.google.gwt.user.client.ui.Widget; import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection; import com.itmill.toolkit.terminal.gwt.client.Paintable; +import com.itmill.toolkit.terminal.gwt.client.Tooltip; import com.itmill.toolkit.terminal.gwt.client.UIDL; /** @@ -47,6 +49,14 @@ public class ITextField extends TextBoxBase implements Paintable, Field, setStyleName(CLASSNAME); addChangeListener(this); addFocusListener(this); + sinkEvents(Tooltip.TOOLTIP_EVENTS); + } + + public void onBrowserEvent(Event event) { + super.onBrowserEvent(event); + if (client != null) { + client.handleTooltipEvent(event, this); + } } public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {