]> source.dussan.org Git - vaadin-framework.git/commitdiff
initial commit for formatted tooltips
authorMatti Tahvonen <matti.tahvonen@itmill.com>
Fri, 6 Jun 2008 13:16:29 +0000 (13:16 +0000)
committerMatti Tahvonen <matti.tahvonen@itmill.com>
Fri, 6 Jun 2008 13:16:29 +0000 (13:16 +0000)
svn changeset:4777/svn branch:trunk

13 files changed:
WebContent/ITMILL/themes/default/common/common.css
WebContent/ITMILL/themes/default/styles.css
src/com/itmill/toolkit/terminal/gwt/client/ApplicationConnection.java
src/com/itmill/toolkit/terminal/gwt/client/Caption.java
src/com/itmill/toolkit/terminal/gwt/client/Tooltip.java [new file with mode: 0644]
src/com/itmill/toolkit/terminal/gwt/client/TooltipInfo.java [new file with mode: 0644]
src/com/itmill/toolkit/terminal/gwt/client/ui/IButton.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ICheckBox.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IDateField.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IFilterSelect.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IListSelect.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IOptionGroupBase.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ITextField.java

index d449aa5ba475a43bee1ac80c33ed4ee53eff4800..3762175daeba59fa98649b6b7ef0180fa18b7b43 100644 (file)
@@ -82,6 +82,26 @@ input.i-modified,
        background-color: #FFE0E0;\r
 }
 
+/**
+ * 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 
  */
index 63f297fa09047890e98050dae665c666218fb36e..d0fb32e0dfa0736314fbab64b21a340ab93102d7 100644 (file)
@@ -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 
  */
index 40df796e8bde27124479c972d921cee0c045e190..d0f2a631ee0c38b5dce0a2a3de54761ab111837e 100755 (executable)
@@ -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);
+
+    }
 }
index 1d3be76a71f4f0d114cd682792db931deb93f2f3..1d245ab7e2948e950dfb654949c36ead95b478e8 100644 (file)
@@ -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 (file)
index 0000000..87fc198
--- /dev/null
@@ -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 (file)
index 0000000..ea75e21
--- /dev/null
@@ -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;
+    }
+
+}
index 4d0a27e2dcaa7b1ad99459e29d39aababab70bec..6f1b3012c27bec9f63de8305561f4d3f84a24c84 100644 (file)
@@ -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);
         }
     }
 
index 46ce4eeaa2e4a9729348d2f015d0f448009f0c8e..191db6023a5f2c71d6f317b836e4c913d8ed9aec 100644 (file)
@@ -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);
         }
     }
 
index 0fbc50524b1e07170503eeed040d006d6dcade3e..83ea040c0282d2b33494a6f4610fa926e0fa7521 100644 (file)
@@ -6,11 +6,13 @@ package com.itmill.toolkit.terminal.gwt.client.ui;
 \r
 import java.util.Date;\r
 \r
+import com.google.gwt.user.client.Event;\r
 import com.google.gwt.user.client.ui.FlowPanel;\r
 import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;\r
 import com.itmill.toolkit.terminal.gwt.client.DateTimeService;\r
 import com.itmill.toolkit.terminal.gwt.client.LocaleNotLoadedException;\r
 import com.itmill.toolkit.terminal.gwt.client.Paintable;\r
+import com.itmill.toolkit.terminal.gwt.client.Tooltip;\r
 import com.itmill.toolkit.terminal.gwt.client.UIDL;\r
 \r
 public class IDateField extends FlowPanel implements Paintable, Field {\r
@@ -48,6 +50,14 @@ public class IDateField extends FlowPanel implements Paintable, Field {
     public IDateField() {\r
         setStyleName(CLASSNAME);\r
         dts = new DateTimeService();\r
+        sinkEvents(Tooltip.TOOLTIP_EVENTS);\r
+    }\r
+\r
+    public void onBrowserEvent(Event event) {\r
+        super.onBrowserEvent(event);\r
+        if (client != null) {\r
+            client.handleTooltipEvent(event, this);\r
+        }\r
     }\r
 \r
     public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {\r
index b6d28ee0109451006309ac28c95f471a50d8be7a..7f2ec7aa3369762fa735f9d106981abb1ec96d20 100644 (file)
@@ -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);
index 0f07921cfb186bc9958bfe700a1adc1a3b32a07c..b49cc1c24ac6b45979fd2b3524d7e0b3b6bb9e5a 100644 (file)
@@ -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);
index d639c075e8b9082e30e1c5216df9429ed84f4939..04ac2cee788d47eae71590706bbf3a4cd717fa19 100644 (file)
@@ -22,9 +22,9 @@ abstract class IOptionGroupBase extends Composite implements Paintable, Field,
 \r
     public static final String CLASSNAME_OPTION = "i-select-option";\r
 \r
-    ApplicationConnection client;\r
+    protected ApplicationConnection client;\r
 \r
-    String id;\r
+    protected String id;\r
 \r
     protected Set selectedKeys;\r
 \r
index d1aa4c176943be874a123cfd9452e9f3d1982527..b024e37c6d710a36dc80ffc215cd4849faa352e1 100644 (file)
@@ -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) {