From e4b05efd52361e3b00e1b05521b010ca017875a1 Mon Sep 17 00:00:00 2001
From: John Alhroos
Date: Tue, 2 Nov 2010 08:51:19 +0000
Subject: [PATCH] Adds tooltips to menubar items #5919
svn changeset:15818/svn branch:6.5
---
.../terminal/gwt/client/ui/VMenuBar.java | 76 +++++++++++++++---
src/com/vaadin/ui/MenuBar.java | 80 +++++++++++++++++++
2 files changed, 144 insertions(+), 12 deletions(-)
diff --git a/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java b/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java
index 1f398eb1f8..0be87963ba 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java
@@ -27,13 +27,15 @@ import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.HasHTML;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.RootPanel;
-import com.google.gwt.user.client.ui.UIObject;
+import com.google.gwt.user.client.ui.Widget;
import com.vaadin.terminal.gwt.client.ApplicationConnection;
import com.vaadin.terminal.gwt.client.BrowserInfo;
import com.vaadin.terminal.gwt.client.ContainerResizedListener;
import com.vaadin.terminal.gwt.client.Paintable;
+import com.vaadin.terminal.gwt.client.TooltipInfo;
import com.vaadin.terminal.gwt.client.UIDL;
import com.vaadin.terminal.gwt.client.Util;
+import com.vaadin.terminal.gwt.client.VTooltip;
public class VMenuBar extends SimpleFocusablePanel implements Paintable,
CloseHandler, ContainerResizedListener, KeyPressHandler,
@@ -72,7 +74,7 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable,
public VMenuBar() {
// Create an empty horizontal menubar
- this(false);
+ this(false, null);
// Navigation is only handled by the root bar
addFocusHandler(this);
@@ -89,7 +91,7 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable,
}
}
- public VMenuBar(boolean subMenu) {
+ public VMenuBar(boolean subMenu, VMenuBar parentMenu) {
items = new ArrayList();
popup = null;
@@ -101,11 +103,14 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable,
setStyleName(CLASSNAME);
} else {
setStyleName(CLASSNAME + "-submenu");
+ this.parentMenu = parentMenu;
}
this.subMenu = subMenu;
sinkEvents(Event.ONCLICK | Event.ONMOUSEOVER | Event.ONMOUSEOUT
| Event.ONLOAD);
+
+ sinkEvents(VTooltip.TOOLTIP_EVENTS);
}
@Override
@@ -181,7 +186,8 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable,
itemHTML.append(moreItemText);
moreItem = new CustomMenuItem(itemHTML.toString(), emptyCommand);
- collapsedRootItems = new VMenuBar(true);
+ collapsedRootItems = new VMenuBar(true,
+ (VMenuBar) client.getPaintable(uidlId));
moreItem.setSubMenu(collapsedRootItems);
moreItem.addStyleName(CLASSNAME + "-more-menuitem");
}
@@ -244,18 +250,13 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable,
}
currentItem = currentMenu.addItem(itemHTML.toString(), cmd);
- currentItem.setSeparator(item.hasAttribute("separator"));
- currentItem.setEnabled(!item.hasAttribute("disabled"));
- if (item.hasAttribute("style")) {
- String itemStyle = item.getStringAttribute("style");
- currentItem.addStyleDependentName(itemStyle);
- }
+ currentItem.updateFromUIDL(item, client);
if (item.getChildCount() > 0) {
menuStack.push(currentMenu);
iteratorStack.push(itr);
itr = item.getChildIterator();
- currentMenu = new VMenuBar(true);
+ currentMenu = new VMenuBar(true, currentMenu);
if (uidl.hasAttribute("style")) {
for (String style : uidl.getStringAttribute("style").split(
" ")) {
@@ -408,6 +409,15 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable,
}
}
+ // Handle tooltips
+ if (targetItem == null && client != null) {
+ // Handle root menubar tooltips
+ client.handleTooltipEvent(e, this);
+ } else {
+ // Handle item tooltips
+ targetItem.onBrowserEvent(e);
+ }
+
if (targetItem != null) {
switch (DOM.eventGetType(e)) {
@@ -716,7 +726,9 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable,
* A class to hold information on menu items
*
*/
- private class CustomMenuItem extends UIObject implements HasHTML {
+ private class CustomMenuItem extends Widget implements HasHTML, Paintable {
+
+ private ApplicationConnection client;
protected String html = null;
protected Command command = null;
@@ -734,6 +746,7 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable,
setSelected(false);
setStyleName(CLASSNAME + "-menuitem");
+ sinkEvents(VTooltip.TOOLTIP_EVENTS);
}
public void setSelected(boolean selected) {
@@ -823,6 +836,45 @@ public class VMenuBar extends SimpleFocusablePanel implements Paintable,
public boolean isSeparator() {
return isSeparator;
}
+
+ public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
+ this.client = client;
+ setSeparator(uidl.hasAttribute("separator"));
+ setEnabled(!uidl.hasAttribute("disabled"));
+
+ if (uidl.hasAttribute("style")) {
+ String itemStyle = uidl.getStringAttribute("style");
+ addStyleDependentName(itemStyle);
+ }
+
+ if (uidl.hasAttribute("description")) {
+ String description = uidl.getStringAttribute("description");
+ TooltipInfo info = new TooltipInfo(description);
+
+ VMenuBar root = findRootMenu();
+ client.registerTooltip(root, this, info);
+ }
+ }
+
+ @Override
+ public void onBrowserEvent(Event event) {
+ super.onBrowserEvent(event);
+ if (client != null) {
+ client.handleTooltipEvent(event, findRootMenu(), this);
+ }
+ }
+
+ private VMenuBar findRootMenu() {
+ VMenuBar menubar = getParentMenu();
+
+ // Traverse up until root menu is found
+ while (menubar.getParentMenu() != null) {
+ menubar = menubar.getParentMenu();
+ }
+
+ return menubar;
+ }
+
}
/**
diff --git a/src/com/vaadin/ui/MenuBar.java b/src/com/vaadin/ui/MenuBar.java
index 3a1ee020b2..b7da82675e 100644
--- a/src/com/vaadin/ui/MenuBar.java
+++ b/src/com/vaadin/ui/MenuBar.java
@@ -115,6 +115,11 @@ public class MenuBar extends AbstractComponent {
target.addAttribute("disabled", true);
}
+ String description = item.getDescription();
+ if (description != null && description.length() > 0) {
+ target.addAttribute("description", description);
+ }
+
if (item.hasChildren()) {
for (MenuItem child : item.getChildren()) {
paintItem(target, child);
@@ -390,6 +395,7 @@ public class MenuBar extends AbstractComponent {
private boolean visible = true;
private boolean isSeparator = false;
private String styleName;
+ private String description;
/**
* Constructs a new menu item that can optionally have an icon and a
@@ -699,6 +705,80 @@ public class MenuBar extends AbstractComponent {
return styleName;
}
+ /**
+ * Sets the items's description. See {@link #getDescription()} for more
+ * information on what the description is. This method will trigger a
+ * {@link com.vaadin.terminal.Paintable.RepaintRequestEvent
+ * RepaintRequestEvent}.
+ *
+ * @param description
+ * the new description string for the component.
+ */
+ public void setDescription(String description) {
+ this.description = description;
+ requestRepaint();
+ }
+
+ /**
+ *
+ * Gets the items's description. The description can be used to briefly
+ * describe the state of the item to the user. The description string
+ * may contain certain XML tags:
+ *
+ *
+ *
+ *
+ *
+ * Tag |
+ * Description |
+ * Example |
+ *
+ *
+ * <b> |
+ * bold |
+ * bold text |
+ *
+ *
+ * <i> |
+ * italic |
+ * italic text |
+ *
+ *
+ * <u> |
+ * underlined |
+ * underlined text |
+ *
+ *
+ * <br> |
+ * linebreak |
+ * N/A |
+ *
+ *
+ * <ul>
+ * <li>item1
+ * <li>item1
+ * </ul> |
+ * item list |
+ *
+ *
+ * |
+ *
+ *
+ *
+ *
+ *
+ * These tags may be nested.
+ *
+ *
+ * @return item's description String
+ */
+ public String getDescription() {
+ return description;
+ }
+
}// class MenuItem
}// class MenuBar
--
2.39.5