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: + *

+ * + *

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
TagDescriptionExample
<b>boldbold text
<i>italicitalic text
<u>underlinedunderlined text
<br>linebreakN/A
<ul>
+ * <li>item1
+ * <li>item1
+ * </ul>
item list + *
    + *
  • item1 + *
  • item2 + *
+ *
+ *

+ * + *

+ * These tags may be nested. + *

+ * + * @return item's description String + */ + public String getDescription() { + return description; + } + }// class MenuItem }// class MenuBar -- 2.39.5