summaryrefslogtreecommitdiffstats
path: root/src/com
diff options
context:
space:
mode:
authorJohn Alhroos <john.ahlroos@itmill.com>2010-11-02 08:51:19 +0000
committerJohn Alhroos <john.ahlroos@itmill.com>2010-11-02 08:51:19 +0000
commite4b05efd52361e3b00e1b05521b010ca017875a1 (patch)
tree0b3dcfb8168bee755a950375253994d18cfa2c3e /src/com
parent2292910bfcf099ebd8894229f8c7b06880a6c60c (diff)
downloadvaadin-framework-e4b05efd52361e3b00e1b05521b010ca017875a1.tar.gz
vaadin-framework-e4b05efd52361e3b00e1b05521b010ca017875a1.zip
Adds tooltips to menubar items #5919
svn changeset:15818/svn branch:6.5
Diffstat (limited to 'src/com')
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java76
-rw-r--r--src/com/vaadin/ui/MenuBar.java80
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<PopupPanel>, 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<CustomMenuItem>();
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();
+ }
+
+ /**
+ * <p>
+ * 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:
+ * </p>
+ *
+ * <p>
+ * <table border=1>
+ * <tr>
+ * <td width=120><b>Tag</b></td>
+ * <td width=120><b>Description</b></td>
+ * <td width=120><b>Example</b></td>
+ * </tr>
+ * <tr>
+ * <td>&lt;b></td>
+ * <td>bold</td>
+ * <td><b>bold text</b></td>
+ * </tr>
+ * <tr>
+ * <td>&lt;i></td>
+ * <td>italic</td>
+ * <td><i>italic text</i></td>
+ * </tr>
+ * <tr>
+ * <td>&lt;u></td>
+ * <td>underlined</td>
+ * <td><u>underlined text</u></td>
+ * </tr>
+ * <tr>
+ * <td>&lt;br></td>
+ * <td>linebreak</td>
+ * <td>N/A</td>
+ * </tr>
+ * <tr>
+ * <td>&lt;ul><br>
+ * &lt;li>item1<br>
+ * &lt;li>item1<br>
+ * &lt;/ul></td>
+ * <td>item list</td>
+ * <td>
+ * <ul>
+ * <li>item1
+ * <li>item2
+ * </ul>
+ * </td>
+ * </tr>
+ * </table>
+ * </p>
+ *
+ * <p>
+ * These tags may be nested.
+ * </p>
+ *
+ * @return item's description <code>String</code>
+ */
+ public String getDescription() {
+ return description;
+ }
+
}// class MenuItem
}// class MenuBar