diff options
author | Jouni Koivuviita <jouni.koivuviita@itmill.com> | 2009-11-09 14:36:28 +0000 |
---|---|---|
committer | Jouni Koivuviita <jouni.koivuviita@itmill.com> | 2009-11-09 14:36:28 +0000 |
commit | ff991344bb16604fd60a1302c370edcaaf8f9cd1 (patch) | |
tree | 68be8a51d64b0b6f44dfccc7de78f5789b3dc94e /src | |
parent | 80dc4982a2483b141bd05fa7bc66b685744594df (diff) | |
download | vaadin-framework-ff991344bb16604fd60a1302c370edcaaf8f9cd1.tar.gz vaadin-framework-ff991344bb16604fd60a1302c370edcaaf8f9cd1.zip |
MenuBar fixes & enhancements
* fixes #3507: Menubar.MenuItem needs setEnabled()
* "More" menuitem now presented as an arrow
* menu opening/closing now more intuitive
* client side stylename for menuitems changed to v-menuitem
svn changeset:9688/svn branch:6.2
Diffstat (limited to 'src')
-rw-r--r-- | src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java | 112 | ||||
-rw-r--r-- | src/com/vaadin/ui/MenuBar.java | 21 |
2 files changed, 91 insertions, 42 deletions
diff --git a/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java b/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java index 1a9216c4c8..c3a9c89884 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java @@ -47,6 +47,7 @@ public class VMenuBar extends Widget implements Paintable, protected Element containerElement; protected VOverlay popup; protected VMenuBar visibleChildMenu; + protected boolean menuVisible = false; protected VMenuBar parentMenu; protected CustomMenuItem selected; @@ -125,7 +126,12 @@ public class VMenuBar extends Widget implements Paintable, .getStringAttribute("icon")) + "\" class=\"" + Icon.CLASSNAME + "\" alt=\"\" />"); } - itemHTML.append(moreItemUIDL.getStringAttribute("text")); + + String moreItemText = moreItemUIDL.getStringAttribute("text"); + if ("".equals(moreItemText)) { + moreItemText = "▶"; + } + itemHTML.append(moreItemText); moreItem = new CustomMenuItem(itemHTML.toString(), emptyCommand); collapsedRootItems = new VMenuBar(true); @@ -151,15 +157,6 @@ public class VMenuBar extends Widget implements Paintable, // Construct html from the text and the optional icon StringBuffer itemHTML = new StringBuffer(); - if (item.hasAttribute("icon")) { - itemHTML.append("<img src=\"" - + client.translateVaadinUri(item - .getStringAttribute("icon")) + "\" class=\"" - + Icon.CLASSNAME + "\" alt=\"\" />"); - } - - itemHTML.append(itemText); - // Add submenu indicator if (item.getChildCount() > 0) { // FIXME For compatibility reasons: remove in version 7 @@ -174,6 +171,15 @@ public class VMenuBar extends Widget implements Paintable, + ">▶</span>"); } + if (item.hasAttribute("icon")) { + itemHTML.append("<img src=\"" + + client.translateVaadinUri(item + .getStringAttribute("icon")) + "\" class=\"" + + Icon.CLASSNAME + "\" alt=\"\" />"); + } + + itemHTML.append(itemText); + Command cmd = null; if (itemHasCommand) { @@ -187,6 +193,7 @@ public class VMenuBar extends Widget implements Paintable, } currentItem = currentMenu.addItem(itemHTML.toString(), cmd); + currentItem.setEnabled(!item.hasAttribute("disabled")); if (item.getChildCount() > 0) { menuStack.push(currentMenu); @@ -348,7 +355,6 @@ public class VMenuBar extends Widget implements Paintable, */ @Override public void onBrowserEvent(Event e) { - super.onBrowserEvent(e); Element targetElement = DOM.eventGetTarget(e); CustomMenuItem targetItem = null; @@ -363,11 +369,15 @@ public class VMenuBar extends Widget implements Paintable, switch (DOM.eventGetType(e)) { case Event.ONCLICK: - itemClick(targetItem); + if (targetItem.isEnabled()) { + itemClick(targetItem); + } break; case Event.ONMOUSEOVER: - itemOver(targetItem); + if (targetItem.isEnabled()) { + itemOver(targetItem); + } break; case Event.ONMOUSEOUT: @@ -375,6 +385,8 @@ public class VMenuBar extends Widget implements Paintable, break; } } + + super.onBrowserEvent(e); } /** @@ -390,7 +402,8 @@ public class VMenuBar extends Widget implements Paintable, visibleChildMenu.hideChildren(); } - hideParents(); + hideParents(true); + menuVisible = false; DeferredCommand.addCommand(item.getCommand()); } else { @@ -398,6 +411,11 @@ public class VMenuBar extends Widget implements Paintable, && item.getSubMenu() != visibleChildMenu) { setSelected(item); showChildMenu(item); + menuVisible = true; + } else if (!subMenu) { + setSelected(null); + hideChildren(); + menuVisible = false; } } } @@ -408,15 +426,16 @@ public class VMenuBar extends Widget implements Paintable, * @param item */ public void itemOver(CustomMenuItem item) { - setSelected(item); - - boolean menuWasVisible = visibleChildMenu != null; + if (subMenu || menuVisible) { + setSelected(item); + } - if (menuWasVisible && visibleChildMenu != item.getSubMenu()) { + if (menuVisible && visibleChildMenu != item.getSubMenu() + && popup != null) { popup.hide(); } - if (item.getSubMenu() != null && (parentMenu != null || menuWasVisible) + if (menuVisible && item.getSubMenu() != null && visibleChildMenu != item.getSubMenu()) { showChildMenu(item); } @@ -428,9 +447,11 @@ public class VMenuBar extends Widget implements Paintable, * @param item */ public void itemOut(CustomMenuItem item) { - if (visibleChildMenu != item.getSubMenu() || visibleChildMenu == null) { + if (visibleChildMenu != item.getSubMenu()) { hideChildMenu(item); setSelected(null); + } else if (visibleChildMenu == null) { + setSelected(null); } } @@ -444,6 +465,8 @@ public class VMenuBar extends Widget implements Paintable, popup = new VOverlay(true, false, true); popup.setWidget(item.getSubMenu()); popup.addCloseHandler(this); + popup.addAutoHidePartner(item.getElement()); + int left = 0; int top = 0; if (subMenu) { @@ -486,7 +509,6 @@ public class VMenuBar extends Widget implements Paintable, if (visibleChildMenu != null && !(visibleChildMenu == item.getSubMenu())) { popup.hide(); - } } @@ -499,6 +521,20 @@ public class VMenuBar extends Widget implements Paintable, selected.setSelected(false); selected = null; } + menuVisible = true; + } + + /** + * Listener method, fired when this menu is closed + */ + public void onClose(CloseEvent<PopupPanel> event) { + hideChildren(); + if (event.isAutoClosed()) { + hideParents(true); + menuVisible = false; + } + visibleChildMenu = null; + popup = null; } /** @@ -514,15 +550,15 @@ public class VMenuBar extends Widget implements Paintable, /** * Recursively hide all parent menus */ - public void hideParents() { - + public void hideParents(boolean autoClosed) { if (visibleChildMenu != null) { popup.hide(); setSelected(null); + menuVisible = !autoClosed; } if (getParentMenu() != null) { - getParentMenu().hideParents(); + getParentMenu().hideParents(autoClosed); } } @@ -574,19 +610,6 @@ public class VMenuBar extends Widget implements Paintable, } /** - * Listener method, fired when this menu is closed - */ - public void onClose(CloseEvent<PopupPanel> event) { - hideChildren(); - if (event.isAutoClosed()) { - hideParents(); - } - visibleChildMenu = null; - popup = null; - - } - - /** * * A class to hold information on menu items * @@ -597,6 +620,7 @@ public class VMenuBar extends Widget implements Paintable, protected Command command = null; protected VMenuBar subMenu = null; protected VMenuBar parentMenu = null; + protected boolean enabled = true; public CustomMenuItem(String html, Command cmd) { setElement(DOM.createTD()); @@ -605,7 +629,7 @@ public class VMenuBar extends Widget implements Paintable, setCommand(cmd); setSelected(false); - addStyleName("menuitem"); + setStylePrimaryName(CLASSNAME + "-menuitem"); } public void setSelected(boolean selected) { @@ -659,7 +683,19 @@ public class VMenuBar extends Widget implements Paintable, public void setText(String text) { setHTML(text); + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + if (enabled) { + removeStyleDependentName("disabled"); + } else { + addStyleDependentName("disabled"); + } + } + public boolean isEnabled() { + return enabled; } } diff --git a/src/com/vaadin/ui/MenuBar.java b/src/com/vaadin/ui/MenuBar.java index c0939d23ed..77523f9680 100644 --- a/src/com/vaadin/ui/MenuBar.java +++ b/src/com/vaadin/ui/MenuBar.java @@ -97,6 +97,10 @@ public class MenuBar extends AbstractComponent { target.addAttribute("icon", icon); } + if (!item.isEnabled()) { + target.addAttribute("disabled", true); + } + if (item.hasChildren()) { iteratorStack.push(itr); // For later use @@ -148,7 +152,7 @@ public class MenuBar extends AbstractComponent { }// while // If we got the clicked item, launch the command. - if (found) { + if (found && tmpItem.isEnabled()) { tmpItem.getCommand().menuSelected(tmpItem); } }// if @@ -327,8 +331,7 @@ public class MenuBar extends AbstractComponent { /** * Set the item that is used when collapsing the top level menu. All * "overflowing" items will be added below this. The item command will be - * ignored. If set to null, the default item with the "More..." text is be - * used. + * ignored. If set to null, the default item with a downwards arrow is used. * * The item command (if specified) is ignored. * @@ -338,7 +341,7 @@ public class MenuBar extends AbstractComponent { if (item != null) { moreItem = item; } else { - moreItem = new MenuItem("More...", null, null); + moreItem = new MenuItem("", null, null); } requestRepaint(); } @@ -378,6 +381,7 @@ public class MenuBar extends AbstractComponent { private List<MenuItem> itsChildren; private Resource itsIcon; private MenuItem itsParent; + private boolean enabled = true; /** * Constructs a new menu item that can optionally have an icon and a @@ -625,6 +629,15 @@ public class MenuBar extends AbstractComponent { itsParent = parent; } + public void setEnabled(boolean enabled) { + this.enabled = enabled; + requestRepaint(); + } + + public boolean isEnabled() { + return enabled; + } + }// class MenuItem }// class MenuBar |