Alexander Wels has uploaded a new change for review.

Change subject: userportal, webadmin: Tooltip infrastructure
......................................................................

userportal, webadmin: Tooltip infrastructure

- Added tooltip infrastructure to make it easier to add tooltips
  to elements that handle mouse over/out events.
- Modified most elements that use 'setTitle' to set the tooltip to
  use the new infrastructure.

Change-Id: I4fc79a6aa132c65d3050499e5f00facbb5c358d3
Signed-off-by: Alexander Wels <[email protected]>
---
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/ElementAwareDecoratedPopupPanel.java
A 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/TooltipPanel.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/AbstractActionButton.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/DropdownActionButton.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/SimpleActionButton.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/dialog/InfoIcon.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelTextBox.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/label/TextBoxLabelBase.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/refresh/BaseRefreshPanel.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/AbstractCellWithTooltip.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/SafeHtmlWithSafeHtmlTooltipColumn.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/StyledImageResourceCell.java
M 
frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/widget/basic/MainTabBasicListItemActionButton.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/label/LabelWithToolTip.java
14 files changed, 254 insertions(+), 116 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/25/27325/1

diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/ElementAwareDecoratedPopupPanel.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/ElementAwareDecoratedPopupPanel.java
index 79da8a2..ba1e860 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/ElementAwareDecoratedPopupPanel.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/ElementAwareDecoratedPopupPanel.java
@@ -10,6 +10,14 @@
  */
 public class ElementAwareDecoratedPopupPanel extends DecoratedPopupPanel {
 
+    public ElementAwareDecoratedPopupPanel() {
+        this(false);
+    }
+
+    public ElementAwareDecoratedPopupPanel(boolean autoHide) {
+        super(autoHide);
+    }
+
     public void showRelativeTo(final Element target) {
         setPopupPositionAndShow(new PositionCallback() {
             @Override
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/TooltipPanel.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/TooltipPanel.java
new file mode 100644
index 0000000..17e8c2c
--- /dev/null
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/TooltipPanel.java
@@ -0,0 +1,177 @@
+package org.ovirt.engine.ui.common.widget;
+
+import com.google.gwt.dom.client.BrowserEvents;
+import com.google.gwt.dom.client.Element;
+import com.google.gwt.dom.client.NativeEvent;
+import com.google.gwt.event.dom.client.HasMouseOutHandlers;
+import com.google.gwt.event.dom.client.HasMouseOverHandlers;
+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.safehtml.shared.SafeHtml;
+import com.google.gwt.user.client.Timer;
+import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.HasHTML;
+import com.google.gwt.user.client.ui.HasText;
+import com.google.gwt.user.client.ui.Widget;
+
+/**
+ * @param <W> Widget that controls whether to show/hide the tool-tip panel.
+ */
+public class TooltipPanel<W extends Widget & HasMouseOverHandlers & 
HasMouseOutHandlers>
+        extends ElementAwareDecoratedPopupPanel {
+
+    protected static final int TOOLTIP_DISPLAY_DELAY = 500; //Wait 500ms 
before displaying tooltip.
+    private Timer displayTooltipTimer = null;
+
+    /**
+     * Constructor.
+     * @param autoHide Auto-hide the panel when leaving it.
+     * @param tooltipSource The {@code Widget} that the tool-tip should be 
applied to.
+     */
+    public TooltipPanel(boolean autoHide, final W tooltipSource) {
+        this(autoHide);
+        applyTo(tooltipSource);
+    }
+
+    /**
+     * Constructor.
+     * @param autoHide Auto-hide the panel when leaving it.
+     */
+    public TooltipPanel(boolean autoHide) {
+        super(autoHide);
+        getElement().getStyle().setZIndex(1);
+    }
+
+    /**
+     * Default constructor, auto-hide is false.
+     */
+    public TooltipPanel() {
+        this(true);
+    }
+
+    /**
+     * Set the tool-tip text, if the owner hasn't provided its own widget. If 
you pass null the text will be a
+     * blank string
+     * @param text The tool-tip text.
+     */
+    public void setText(String text) {
+        text = text != null ? text : ""; //$NON-NLS-1$
+        //If there is no widget and there is some text, add the widget.
+        if (getWidget() == null && isTextNotEmpty(text)) {
+            setWidget(new HTML());
+        } else if (getWidget() != null && !isTextNotEmpty(text)) {
+            setWidget(null);
+        }
+        if (getWidget() instanceof HasText && isTextNotEmpty(text)) {
+            ((HasText) getWidget()).setText(text);
+        }
+    }
+
+    /**
+     * Set the tool-tip text, if the owner hasn't provided its own widget. If 
you pass null the text will be a
+     * blank string
+     * @param text The tool-tip text.
+     */
+    public void setText(SafeHtml text) {
+        //If there is no widget and there is some text, add the widget.
+        if (getWidget() == null && isTextNotEmpty(text)) {
+            setWidget(new HTML());
+        } else if (getWidget() != null && !isTextNotEmpty(text)) {
+            setWidget(null);
+        }
+        if (getWidget() instanceof HasHTML) {
+            //If the above created the widget, then this will be executed, but 
it is possible for either one to not
+            //be true and in that case we need to drop through to the else.
+            if (isTextNotEmpty(text)) {
+                ((HasHTML) getWidget()).setHTML(text.asString());
+            }
+        } else {
+            setText(text.asString());
+        }
+    }
+
+    /**
+     * Determine if the passed in {@code SafeHtml} text is not empty.
+     * @param text The text to check.
+     * @return {@code true} if the text is not empty, false otherwise.
+     */
+    private boolean isTextNotEmpty(SafeHtml text) {
+        return !"".equals(text.asString());
+    }
+
+    /**
+     * Determine if the passed in {@code SafeHtml} text is not empty.
+     * @param text The text to check.
+     * @return {@code true} if the text is not empty, false otherwise.
+     */
+    private boolean isTextNotEmpty(String text) {
+        return !"".equals(text);
+    }
+
+    /**
+     * Apply the tool-tip panel to the supplied source.
+     * @param tooltipSource The {@code Widget} that the panel should be 
applied to.
+     */
+    public void applyTo(final W tooltipSource) {
+        tooltipSource.addMouseOverHandler(new MouseOverHandler() {
+            @Override
+            public void onMouseOver(final MouseOverEvent event) {
+                if(getWidget() != null) {
+                    displayTooltipTimer = new Timer() {
+                        @Override
+                        public void run() {
+                            TooltipPanel.this.onTooltipSourceMouseOver(event);
+                            TooltipPanel.this.showRelativeTo(tooltipSource);
+                        }
+                    };
+                    displayTooltipTimer.schedule(TOOLTIP_DISPLAY_DELAY);
+                }
+            }
+        });
+        tooltipSource.addMouseOutHandler(new MouseOutHandler() {
+            @Override
+            public void onMouseOut(MouseOutEvent event) {
+                if (displayTooltipTimer != null) {
+                    displayTooltipTimer.cancel();
+                }
+                TooltipPanel.this.onTooltipSourceMouseOut(event);
+                TooltipPanel.this.hide(true);
+            }
+        });
+    }
+
+    /**
+     * Allow creators of the tool-tip panel to add extra functionality for 
mouse over events.
+     * @param event The {@code MouseOverEvent}.
+     */
+    protected void onTooltipSourceMouseOver(MouseOverEvent event) {
+        // No-op, override as necessary
+    }
+
+    /**
+     * Allow creators of the tool-tip panel to add extra functionality for 
mouse oout events.
+     * @param event The {@code MouseOutEvent}.
+     */
+    protected void onTooltipSourceMouseOut(MouseOutEvent event) {
+        // No-op, override as necessary
+    }
+
+    public void handleNativeBrowserEvent(final Element tooltipSource, 
NativeEvent event) {
+        if (BrowserEvents.MOUSEOUT.equals(event.getType())) {
+            if (displayTooltipTimer != null) {
+                displayTooltipTimer.cancel();
+            }
+            TooltipPanel.this.hide(true);
+        } else if (getWidget() != null && 
BrowserEvents.MOUSEOVER.equals(event.getType())) {
+            displayTooltipTimer = new Timer() {
+                @Override
+                public void run() {
+                    TooltipPanel.this.showRelativeTo(tooltipSource);
+                }
+            };
+            displayTooltipTimer.schedule(TOOLTIP_DISPLAY_DELAY);
+        }
+    }
+}
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/AbstractActionButton.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/AbstractActionButton.java
index 0bd5718..e06d3ac 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/AbstractActionButton.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/AbstractActionButton.java
@@ -1,5 +1,7 @@
 package org.ovirt.engine.ui.common.widget.action;
 
+import org.ovirt.engine.ui.common.widget.TooltipPanel;
+
 import com.google.gwt.event.dom.client.ClickHandler;
 import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.gwt.safehtml.shared.SafeHtml;
@@ -16,6 +18,8 @@
  * </ul>
  */
 public abstract class AbstractActionButton extends Composite implements 
ActionButton {
+
+    protected final TooltipPanel<ToggleButton> tooltipPanel = new 
TooltipPanel<ToggleButton>();
 
     @UiField
     public ToggleButton button;
@@ -48,7 +52,7 @@
 
     @Override
     public void setTitle(String title) {
-        button.setTitle(title);
+        tooltipPanel.setText(title);
     }
 
     @Override
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/DropdownActionButton.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/DropdownActionButton.java
index fdcacc1..6312bc3 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/DropdownActionButton.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/DropdownActionButton.java
@@ -1,5 +1,9 @@
 package org.ovirt.engine.ui.common.widget.action;
 
+import java.util.List;
+
+import org.ovirt.engine.ui.common.CommonApplicationResources;
+
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.ClickHandler;
@@ -18,9 +22,6 @@
 import com.google.gwt.user.client.ui.MenuItem;
 import com.google.gwt.user.client.ui.PopupPanel;
 import com.google.gwt.user.client.ui.ToggleButton;
-import org.ovirt.engine.ui.common.CommonApplicationResources;
-
-import java.util.List;
 
 public class DropdownActionButton<T> extends AbstractActionButton {
 
@@ -46,6 +47,7 @@
         initWidget(WidgetUiBinder.uiBinder.createAndBindUi(this));
         initMenuPopup(actions, selectedItems);
         addMouseHandlers();
+        this.tooltipPanel.applyTo(button);
     }
 
     private void initDropdownButton() {
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/SimpleActionButton.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/SimpleActionButton.java
index 8ccabbf..91c483f 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/SimpleActionButton.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/action/SimpleActionButton.java
@@ -47,6 +47,7 @@
                 button.addStyleName(style.buttonMouseOut());
             }
         });
+        this.tooltipPanel.applyTo(button);
     }
 
     interface Style extends CssResource {
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/dialog/InfoIcon.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/dialog/InfoIcon.java
index 6f96e51..a3dc4db 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/dialog/InfoIcon.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/dialog/InfoIcon.java
@@ -1,13 +1,11 @@
 package org.ovirt.engine.ui.common.widget.dialog;
 
 import org.ovirt.engine.ui.common.CommonApplicationResources;
+import org.ovirt.engine.ui.common.widget.TooltipPanel;
 
 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.safehtml.shared.SafeHtml;
-import com.google.gwt.user.client.ui.DecoratedPopupPanel;
 import com.google.gwt.user.client.ui.FocusPanel;
 import com.google.gwt.user.client.ui.HTML;
 import com.google.gwt.user.client.ui.Image;
@@ -15,7 +13,7 @@
 public class InfoIcon extends FocusPanel {
     private Image infoImage;
     private Image infoImageHover;
-    private final DecoratedPopupPanel infoPanel = new 
DecoratedPopupPanel(true);
+    private final TooltipPanel<InfoIcon> infoPanel;
 
     public InfoIcon(SafeHtml text, CommonApplicationResources resources) {
         super();
@@ -23,26 +21,21 @@
         initInfoImages(resources);
 
         setWidget(infoImage);
-        infoPanel.setWidget(new HTML(text));
-        infoPanel.getElement().getStyle().setZIndex(1);
-
-        addMouseOutHandler(new MouseOutHandler() {
+        infoPanel = new TooltipPanel<InfoIcon>(true, this) {
 
             @Override
-            public void onMouseOut(MouseOutEvent event) {
-                setWidget(infoImage);
-                infoPanel.hide(true);
-            }
-        });
-
-        addMouseOverHandler(new MouseOverHandler() {
-
-            @Override
-            public void onMouseOver(MouseOverEvent event) {
-                setWidget(infoImageHover);
+            protected void onTooltipSourceMouseOver(MouseOverEvent event) {
+                InfoIcon.this.setWidget(infoImageHover);
                 infoPanel.showRelativeTo(InfoIcon.this);
             }
-        });
+
+            @Override
+            protected void onTooltipSourceMouseOut(MouseOutEvent event) {
+                InfoIcon.this.setWidget(infoImage);
+            }
+
+        };
+        setText(text);
     }
 
     private void initInfoImages(CommonApplicationResources resources) {
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelTextBox.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelTextBox.java
index 005cd66..ac6c3de 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelTextBox.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelTextBox.java
@@ -1,15 +1,19 @@
 package org.ovirt.engine.ui.common.widget.editor.generic;
 
+import org.ovirt.engine.ui.common.widget.TooltipPanel;
+import org.ovirt.engine.ui.common.widget.editor.EditorWidget;
+
 import com.google.gwt.dom.client.Document;
 import com.google.gwt.editor.ui.client.adapters.ValueBoxEditor;
 import com.google.gwt.text.shared.Parser;
 import com.google.gwt.text.shared.Renderer;
 import com.google.gwt.user.client.ui.ValueBox;
-import org.ovirt.engine.ui.common.widget.editor.EditorWidget;
 
 public class EntityModelTextBox<T> extends ValueBox<T> implements 
EditorWidget<T, ValueBoxEditor<T>> {
 
     private ObservableValueBoxEditor<T> editor;
+
+    private final TooltipPanel<EntityModelTextBox<T>> tooltipPanel = new 
TooltipPanel<EntityModelTextBox<T>>(true, this);
 
     public EntityModelTextBox(Renderer<T> renderer, Parser<T> parser) {
         super(Document.get().createTextInputElement(), renderer, parser);
@@ -23,4 +27,8 @@
         return editor;
     }
 
+    @Override
+    public void setTitle(String text) {
+        tooltipPanel.setText(text);
+    }
 }
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/label/TextBoxLabelBase.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/label/TextBoxLabelBase.java
index 06bc208..ef9248f 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/label/TextBoxLabelBase.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/label/TextBoxLabelBase.java
@@ -2,6 +2,8 @@
 
 import java.text.ParseException;
 
+import org.ovirt.engine.ui.common.widget.TooltipPanel;
+
 import com.google.gwt.dom.client.Document;
 import com.google.gwt.dom.client.NativeEvent;
 import com.google.gwt.dom.client.Style.Unit;
@@ -28,6 +30,8 @@
 
     private T value;
     private String tooltipCaption;
+    private final TooltipPanel<TextBoxLabelBase<T>> tooltipPanel = new 
TooltipPanel<TextBoxLabelBase<T>>(true, this);
+
 
     private TextBoxLabelBase(Renderer<T> renderer, Parser<T> parser) {
         super(Document.get().createTextInputElement(), renderer, parser);
@@ -60,7 +64,7 @@
         if (getTooltipCaption() != null) {
             renderedText = getTooltipCaption() + ": " + renderedText; 
//$NON-NLS-1$
         }
-        setTitle(renderedText);
+        tooltipPanel.setText(renderedText);
     }
 
     @Override
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/refresh/BaseRefreshPanel.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/refresh/BaseRefreshPanel.java
index ed4a3fb..a1c54df 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/refresh/BaseRefreshPanel.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/refresh/BaseRefreshPanel.java
@@ -5,6 +5,7 @@
 import org.ovirt.engine.ui.common.CommonApplicationConstants;
 import org.ovirt.engine.ui.common.idhandler.HasElementId;
 import org.ovirt.engine.ui.common.utils.ElementIdUtils;
+import org.ovirt.engine.ui.common.widget.TooltipPanel;
 import org.ovirt.engine.ui.common.widget.renderer.MillisecondRenderer;
 
 import com.google.gwt.core.client.GWT;
@@ -185,6 +186,7 @@
 
     private final BaseRefreshPanelCss style;
 
+    private final TooltipPanel<BaseRefreshPanel> statusTooltipPanel = new 
TooltipPanel<BaseRefreshPanel>(true, this);
 
     /**
      * Create a Panel managed by the specified {@link RefreshManager}<BR>
@@ -290,7 +292,7 @@
     }
 
     public void showStatus(String status) {
-        setTitle(status);
+        statusTooltipPanel.setText(status);
     }
 
     private void createRefreshButton() {
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/AbstractCellWithTooltip.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/AbstractCellWithTooltip.java
index 5918c75..c61ac84 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/AbstractCellWithTooltip.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/AbstractCellWithTooltip.java
@@ -1,5 +1,7 @@
 package org.ovirt.engine.ui.common.widget.table.column;
 
+import org.ovirt.engine.ui.common.widget.TooltipPanel;
+
 import com.google.gwt.cell.client.AbstractCell;
 import com.google.gwt.cell.client.ValueUpdater;
 import com.google.gwt.dom.client.Element;
@@ -15,6 +17,8 @@
  */
 public abstract class AbstractCellWithTooltip<C> extends AbstractCell<C> {
 
+    private final TooltipPanel<?> tooltipPanel = new TooltipPanel();
+
     public AbstractCellWithTooltip(String... consumedEvents) {
         super(consumedEvents);
     }
@@ -24,16 +28,12 @@
             NativeEvent event, ValueUpdater<C> valueUpdater) {
         super.onBrowserEvent(context, parent, value, event, valueUpdater);
 
-        // Skip events other than 'mouseover'
-        if (!"mouseover".equals(event.getType())) { //$NON-NLS-1$
-            return;
-        }
-
         if (value != null && showTooltip(parent, value)) {
-            parent.setTitle(getTooltip(value));
+            tooltipPanel.setText(getTooltip(value));
         } else {
-            parent.setTitle(""); //$NON-NLS-1$
+            tooltipPanel.setText(""); //$NON-NLS-1$
         }
+        tooltipPanel.handleNativeBrowserEvent(parent, event);
     }
 
     /**
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/SafeHtmlWithSafeHtmlTooltipColumn.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/SafeHtmlWithSafeHtmlTooltipColumn.java
index 0fd6f0e..3b2cec3 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/SafeHtmlWithSafeHtmlTooltipColumn.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/SafeHtmlWithSafeHtmlTooltipColumn.java
@@ -1,5 +1,7 @@
 package org.ovirt.engine.ui.common.widget.table.column;
 
+import org.ovirt.engine.ui.common.widget.TooltipPanel;
+
 import com.google.gwt.cell.client.AbstractCell;
 import com.google.gwt.cell.client.Cell.Context;
 import com.google.gwt.cell.client.ValueUpdater;
@@ -8,9 +10,6 @@
 import com.google.gwt.safehtml.shared.SafeHtml;
 import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
 import com.google.gwt.user.cellview.client.Column;
-import com.google.gwt.user.client.ui.DecoratedPopupPanel;
-import com.google.gwt.user.client.ui.HTML;
-import com.google.gwt.user.client.ui.Widget;
 
 public abstract class SafeHtmlWithSafeHtmlTooltipColumn<T> extends Column<T, 
SafeHtml>{
 
@@ -35,13 +34,9 @@
             }
 
         });
-
-        tooltipPanel.setWidget(tooltip);
-        tooltipPanel.getElement().getStyle().setZIndex(1);
     }
 
-    private final HTML tooltip = new HTML();
-    private final DecoratedPopupPanel tooltipPanel = new DecoratedPopupPanel();
+    private final TooltipPanel<?> tooltipPanel = new TooltipPanel();
 
 
     @Override
@@ -54,23 +49,12 @@
         super.onBrowserEvent(context, elem, object, event);
 
         if (event.getType().equals("mouseover")) { //$NON-NLS-1$
-            Widget widget = new Widget(){
-                @Override
-                public com.google.gwt.user.client.Element getElement() {
-                    return (com.google.gwt.user.client.Element) elem;
-                };
-            };
-
-            SafeHtml tooltipHtml= getTooltip(object);
-            if(!"".equals(tooltipHtml.asString())){ //$NON-NLS-1$
-                tooltip.setHTML(getTooltip(object));
-                tooltipPanel.showRelativeTo(widget);
+            SafeHtml tooltipHtml = getTooltip(object);
+            if (!"".equals(tooltipHtml.asString())) { //$NON-NLS-1$
+                tooltipPanel.setText(getTooltip(object));
             }
         }
-        else if (event.getType().equals("mouseout")) { //$NON-NLS-1$
-            tooltipPanel.hide(true);
-        }
-
+        tooltipPanel.handleNativeBrowserEvent(elem, event);
     }
 
 }
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/StyledImageResourceCell.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/StyledImageResourceCell.java
index dbc5432..dca0e54 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/StyledImageResourceCell.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/StyledImageResourceCell.java
@@ -3,12 +3,11 @@
 import java.util.HashSet;
 import java.util.Set;
 
-import org.ovirt.engine.ui.common.widget.ElementAwareDecoratedPopupPanel;
+import org.ovirt.engine.ui.common.widget.TooltipPanel;
 
 import com.google.gwt.cell.client.ImageResourceCell;
 import com.google.gwt.cell.client.ValueUpdater;
 import com.google.gwt.core.client.GWT;
-import com.google.gwt.dom.client.BrowserEvents;
 import com.google.gwt.dom.client.Element;
 import com.google.gwt.dom.client.NativeEvent;
 import com.google.gwt.resources.client.ImageResource;
@@ -17,11 +16,10 @@
 import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
 import com.google.gwt.safehtml.shared.SafeHtmlUtils;
 import com.google.gwt.user.client.ui.AbstractImagePrototype;
-import com.google.gwt.user.client.ui.Label;
 
 /**
  * ImageResourceCell that supports setting a style and displaying a tooltip in 
a
- * DecoratedPopupPanel.
+ * {@code TooltipPanel}.
  *
  */
 public class StyledImageResourceCell extends ImageResourceCell implements 
HasStyleClass {
@@ -33,13 +31,13 @@
 
     private String style = "line-height: 100%; text-align: center; 
vertical-align: middle;"; //$NON-NLS-1$
     private String styleClass = ""; //$NON-NLS-1$
-    private String title = ""; //$NON-NLS-1$
+    private final String title = ""; //$NON-NLS-1$
 
     private static CellTemplate template;
 
-    private ElementAwareDecoratedPopupPanel titlePanel = new 
ElementAwareDecoratedPopupPanel();
+    private final TooltipPanel<?> tooltipPanel = new TooltipPanel();
 
-    private Set<String> consumedEvents;
+    private final Set<String> consumedEvents;
 
     public StyledImageResourceCell() {
         super();
@@ -73,38 +71,23 @@
         this.style = style;
     }
 
+    @Override
     public void setStyleClass(String styleClass) {
         this.styleClass = styleClass == null ? "" : styleClass; //$NON-NLS-1$
     }
 
     /**
-     * Set the text for the tooltip that will show when this cell is hovered 
over.
+     * Set the text for the tool-tip that will show when this cell is hovered 
over.
      * @param title
      */
     public void setTitle(String title) {
-        this.title = title != null ? title : ""; //$NON-NLS-1$
+        tooltipPanel.setText(title);
     }
 
     @Override
     public void onBrowserEvent(Context context, Element parent, ImageResource 
value,
             NativeEvent event, ValueUpdater<ImageResource> valueUpdater) {
-        String eventType = event.getType();
-        handleTitlePanel(eventType, parent);
-    }
-
-    private void handleTitlePanel(String eventType, Element parent) {
-        if (title.isEmpty()) {
-            // no need to show/hide title
-            return;
-        }
-
-        titlePanel.setWidget(new Label(title));
-        if (BrowserEvents.MOUSEOVER.equals(eventType)) {
-            titlePanel.showRelativeTo(parent);
-        }
-        else if (BrowserEvents.MOUSEOUT.equals(eventType)) {
-            titlePanel.hide();
-        }
+        tooltipPanel.handleNativeBrowserEvent(parent, event);
     }
 
 }
diff --git 
a/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/widget/basic/MainTabBasicListItemActionButton.java
 
b/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/widget/basic/MainTabBasicListItemActionButton.java
index 62e08f7..91dfb10 100644
--- 
a/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/widget/basic/MainTabBasicListItemActionButton.java
+++ 
b/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/widget/basic/MainTabBasicListItemActionButton.java
@@ -36,6 +36,7 @@
         
setEnabledHtml(SafeHtmlUtils.fromTrustedString(AbstractImagePrototype.create(enabledImage).getHTML()));
         
setDisabledHtml(SafeHtmlUtils.fromTrustedString(AbstractImagePrototype.create(disabledImage).getHTML()));
         stylableButtonHolder.addStyleName(additionalStyle);
+        this.tooltipPanel.applyTo(button);
     }
 
     @Override
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/label/LabelWithToolTip.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/label/LabelWithToolTip.java
index 50549d9..7e76ffd 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/label/LabelWithToolTip.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/label/LabelWithToolTip.java
@@ -1,18 +1,12 @@
 package org.ovirt.engine.ui.webadmin.widget.label;
 
-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.ui.DecoratedPopupPanel;
-import com.google.gwt.user.client.ui.HTML;
+import org.ovirt.engine.ui.common.widget.TooltipPanel;
+
 import com.google.gwt.user.client.ui.Label;
 
 public class LabelWithToolTip extends Label {
 
-    private final HTML tooltip = new HTML();
-    private final DecoratedPopupPanel tooltipPanel = new DecoratedPopupPanel();
-    private String title;
+    private final TooltipPanel<LabelWithToolTip> tooltipPanel = new 
TooltipPanel<LabelWithToolTip>(true, this);
 
     public LabelWithToolTip() {
         this("", -1); //$NON-NLS-1$
@@ -24,30 +18,7 @@
         if (length > -1 && text.length() > length) {
             setText(text.substring(0, length - 3) + "..."); //$NON-NLS-1$
         }
-        tooltipPanel.setWidget(tooltip);
-        tooltipPanel.getElement().getStyle().setZIndex(1);
         setTitle(text);
-        registerHandlers();
-    }
-
-    private void registerHandlers() {
-        addMouseOverHandler(new MouseOverHandler() {
-
-            @Override
-            public void onMouseOver(MouseOverEvent event) {
-                if(!"".equals(title)){ //$NON-NLS-1$
-                    tooltip.setHTML(title);
-                    tooltipPanel.showRelativeTo(LabelWithToolTip.this);
-                }
-            }
-        });
-        addMouseOutHandler(new MouseOutHandler() {
-
-            @Override
-            public void onMouseOut(MouseOutEvent event) {
-                tooltipPanel.hide(true);
-            }
-        });
     }
 
     public LabelWithToolTip(String text) {
@@ -56,6 +27,6 @@
 
     @Override
     public void setTitle(String text) {
-        this.title = text;
+        tooltipPanel.setText(text);
     }
 }


-- 
To view, visit http://gerrit.ovirt.org/27325
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I4fc79a6aa132c65d3050499e5f00facbb5c358d3
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Alexander Wels <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to