summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--client/src/com/vaadin/client/ui/menubar/MenuBarConnector.java2
-rw-r--r--client/src/com/vaadin/client/ui/menubar/VMenuBar.java178
-rw-r--r--uitest/src/com/vaadin/tests/components/menubar/MenuBarPrimaryStylenames.html217
-rw-r--r--uitest/src/com/vaadin/tests/components/menubar/MenuBarPrimaryStylenames.java48
4 files changed, 395 insertions, 50 deletions
diff --git a/client/src/com/vaadin/client/ui/menubar/MenuBarConnector.java b/client/src/com/vaadin/client/ui/menubar/MenuBarConnector.java
index 29030fbd7d..817e027283 100644
--- a/client/src/com/vaadin/client/ui/menubar/MenuBarConnector.java
+++ b/client/src/com/vaadin/client/ui/menubar/MenuBarConnector.java
@@ -96,7 +96,7 @@ public class MenuBarConnector extends AbstractComponentConnector implements
getWidget().collapsedRootItems = new VMenuBar(true, getWidget());
getWidget().moreItem.setSubMenu(getWidget().collapsedRootItems);
- getWidget().moreItem.addStyleName(VMenuBar.CLASSNAME
+ getWidget().moreItem.addStyleName(getWidget().getStylePrimaryName()
+ "-more-menuitem");
}
diff --git a/client/src/com/vaadin/client/ui/menubar/VMenuBar.java b/client/src/com/vaadin/client/ui/menubar/VMenuBar.java
index a4878724a8..e38e6816ad 100644
--- a/client/src/com/vaadin/client/ui/menubar/VMenuBar.java
+++ b/client/src/com/vaadin/client/ui/menubar/VMenuBar.java
@@ -64,6 +64,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
/** Set the CSS class name to allow styling. */
public static final String CLASSNAME = "v-menubar";
+ public static final String SUBMENU_CLASSNAME_PREFIX = "-submenu";
/** For server connections **/
protected String uidlId;
@@ -128,19 +129,51 @@ public class VMenuBar extends SimpleFocusablePanel implements
items = new ArrayList<CustomMenuItem>();
popup = null;
visibleChildMenu = null;
+ this.subMenu = subMenu;
containerElement = getElement();
- if (!subMenu) {
+ sinkEvents(Event.ONCLICK | Event.ONMOUSEOVER | Event.ONMOUSEOUT
+ | Event.ONLOAD);
+
+ if (parentMenu == null) {
+ // Root menu
setStyleName(CLASSNAME);
} else {
- setStyleName(CLASSNAME + "-submenu");
- this.parentMenu = parentMenu;
+ // Child menus inherits style name
+ setStyleName(parentMenu.getStyleName());
}
- this.subMenu = subMenu;
+ }
- sinkEvents(Event.ONCLICK | Event.ONMOUSEOVER | Event.ONMOUSEOUT
- | Event.ONLOAD);
+ @Override
+ public void setStyleName(String style) {
+ super.setStyleName(style);
+ updateStyleNames();
+ }
+
+ @Override
+ public void setStylePrimaryName(String style) {
+ super.setStylePrimaryName(style);
+ updateStyleNames();
+ }
+
+ protected void updateStyleNames() {
+ String primaryStyleName = getParentMenu() != null ? getParentMenu()
+ .getStylePrimaryName() : getStylePrimaryName();
+
+ // Reset the style name for all the items
+ for (CustomMenuItem item : items) {
+ item.setStyleName(primaryStyleName + "-menuitem");
+ }
+
+ if (subMenu
+ && !getStylePrimaryName().endsWith(SUBMENU_CLASSNAME_PREFIX)) {
+ /*
+ * Sub-menus should get the sub-menu prefix
+ */
+ super.setStylePrimaryName(primaryStyleName
+ + SUBMENU_CLASSNAME_PREFIX);
+ }
}
@Override
@@ -178,11 +211,11 @@ public class VMenuBar extends SimpleFocusablePanel implements
// Add submenu indicator
if (item.getChildCount() > 0) {
String bgStyle = "";
- itemHTML.append("<span class=\"" + CLASSNAME
+ itemHTML.append("<span class=\"" + getStylePrimaryName()
+ "-submenu-indicator\"" + bgStyle + ">&#x25BA;</span>");
}
- itemHTML.append("<span class=\"" + CLASSNAME
+ itemHTML.append("<span class=\"" + getStylePrimaryName()
+ "-menuitem-caption\">");
if (item.hasAttribute("icon")) {
itemHTML.append("<img src=\""
@@ -261,7 +294,6 @@ public class VMenuBar extends SimpleFocusablePanel implements
CustomMenuItem item = GWT.create(CustomMenuItem.class);
item.setHTML(html);
item.setCommand(cmd);
-
addItem(item);
return item;
}
@@ -528,6 +560,18 @@ public class VMenuBar extends SimpleFocusablePanel implements
popup = new VOverlay(true, false, true);
+ /*
+ * Use parents primary style name if possible and remove the submenu
+ * prefix if needed
+ */
+ String primaryStyleName = parentMenu != null ? parentMenu
+ .getStylePrimaryName() : getStylePrimaryName();
+ if (subMenu) {
+ primaryStyleName = primaryStyleName.replace(
+ SUBMENU_CLASSNAME_PREFIX, "");
+ }
+ popup.setStyleName(primaryStyleName + "-popup");
+
// Setting owner and handlers to support tooltips. Needed for tooltip
// handling of overlay widgets (will direct queries to parent menu)
if (parentMenu == null) {
@@ -543,7 +587,6 @@ public class VMenuBar extends SimpleFocusablePanel implements
client.getVTooltip().connectHandlersToWidget(popup);
}
- popup.setStyleName(CLASSNAME + "-popup");
popup.setWidget(item.getSubMenu());
popup.addCloseHandler(this);
popup.addAutoHidePartner(item.getElement());
@@ -737,6 +780,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
protected boolean isSeparator = false;
protected boolean checkable = false;
protected boolean checked = false;
+ protected boolean selected = false;
protected String description = null;
/**
@@ -765,48 +809,31 @@ public class VMenuBar extends SimpleFocusablePanel implements
setHTML(html);
setCommand(cmd);
setSelected(false);
- setStyleName(CLASSNAME + "-menuitem");
+ }
+ @Override
+ public void setStyleName(String style) {
+ super.setStyleName(style);
+ updateStyleNames();
+
+ // Pass stylename down to submenus
+ if (getSubMenu() != null) {
+ getSubMenu().setStyleName(style);
+ }
}
public void setSelected(boolean selected) {
- if (selected && isSelectable()) {
- addStyleDependentName("selected");
- // needed for IE6 to have a single style name to match for an
- // element
- // TODO Can be optimized now that IE6 is not supported any more
- if (checkable) {
- if (checked) {
- removeStyleDependentName("selected-unchecked");
- addStyleDependentName("selected-checked");
- } else {
- removeStyleDependentName("selected-checked");
- addStyleDependentName("selected-unchecked");
- }
- }
- } else {
- removeStyleDependentName("selected");
- // needed for IE6 to have a single style name to match for an
- // element
- removeStyleDependentName("selected-checked");
- removeStyleDependentName("selected-unchecked");
- }
+ this.selected = selected;
+ updateStyleNames();
}
public void setChecked(boolean checked) {
if (checkable && !isSeparator) {
this.checked = checked;
-
- if (checked) {
- addStyleDependentName("checked");
- removeStyleDependentName("unchecked");
- } else {
- addStyleDependentName("unchecked");
- removeStyleDependentName("checked");
- }
} else {
this.checked = false;
}
+ updateStyleNames();
}
public boolean isChecked() {
@@ -840,6 +867,65 @@ public class VMenuBar extends SimpleFocusablePanel implements
public void setParentMenu(VMenuBar parentMenu) {
this.parentMenu = parentMenu;
+ updateStyleNames();
+ }
+
+ protected void updateStyleNames() {
+ if (parentMenu == null) {
+ // Style names depend on the parent menu's primary style name so
+ // don't do updates until the item has a parent
+ return;
+ }
+
+ String primaryStyleName = parentMenu.getStylePrimaryName();
+ if (parentMenu.subMenu) {
+ primaryStyleName = primaryStyleName.replace(
+ SUBMENU_CLASSNAME_PREFIX, "");
+ }
+
+ if (isSeparator) {
+ super.setStyleName(primaryStyleName + "-separator");
+ } else {
+ super.setStyleName(primaryStyleName + "-menuitem");
+ }
+
+ if (enabled) {
+ removeStyleDependentName("disabled");
+ } else {
+ addStyleDependentName("disabled");
+ }
+
+ if (selected && isSelectable()) {
+ addStyleDependentName("selected");
+ // needed for IE6 to have a single style name to match for an
+ // element
+ // TODO Can be optimized now that IE6 is not supported any more
+ if (checkable) {
+ if (checked) {
+ removeStyleDependentName("selected-unchecked");
+ addStyleDependentName("selected-checked");
+ } else {
+ removeStyleDependentName("selected-checked");
+ addStyleDependentName("selected-unchecked");
+ }
+ }
+ } else {
+ removeStyleDependentName("selected");
+ // needed for IE6 to have a single style name to match for an
+ // element
+ removeStyleDependentName("selected-checked");
+ removeStyleDependentName("selected-unchecked");
+ }
+
+ if (checkable && !isSeparator) {
+ if (checked) {
+ addStyleDependentName("checked");
+ removeStyleDependentName("unchecked");
+ } else {
+ addStyleDependentName("unchecked");
+ removeStyleDependentName("checked");
+ }
+ }
}
public VMenuBar getParentMenu() {
@@ -881,11 +967,7 @@ public class VMenuBar extends SimpleFocusablePanel implements
public void setEnabled(boolean enabled) {
this.enabled = enabled;
- if (enabled) {
- removeStyleDependentName("disabled");
- } else {
- addStyleDependentName("disabled");
- }
+ updateStyleNames();
}
public boolean isEnabled() {
@@ -894,10 +976,8 @@ public class VMenuBar extends SimpleFocusablePanel implements
private void setSeparator(boolean separator) {
isSeparator = separator;
- if (separator) {
- setStyleName(CLASSNAME + "-separator");
- } else {
- setStyleName(CLASSNAME + "-menuitem");
+ updateStyleNames();
+ if (!separator) {
setEnabled(enabled);
}
}
diff --git a/uitest/src/com/vaadin/tests/components/menubar/MenuBarPrimaryStylenames.html b/uitest/src/com/vaadin/tests/components/menubar/MenuBarPrimaryStylenames.html
new file mode 100644
index 0000000000..1232418978
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/menubar/MenuBarPrimaryStylenames.html
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head profile="http://selenium-ide.openqa.org/profiles/test-case">
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<link rel="selenium.base" href="http://localhost:8888/" />
+<title>New Test</title>
+</head>
+<body>
+<table cellpadding="1" cellspacing="1" border="1">
+<thead>
+<tr><td rowspan="1" colspan="3">New Test</td></tr>
+</thead><tbody>
+<tr>
+ <td>open</td>
+ <td>/run/com.vaadin.tests.components.menubar.MenuBarPrimaryStylenames?restartApplication</td>
+ <td></td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VMenuBar[0]</td>
+ <td>my-menu-bar</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VMenuBar[0]/domChild[0]</td>
+ <td>my-menu-bar-menuitem</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VMenuBar[0]/domChild[1]</td>
+ <td>my-menu-bar-menuitem</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VMenuBar[0]/domChild[1]/domChild[0]</td>
+ <td>my-menu-bar-submenu-indicator</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VMenuBar[0]/domChild[1]/domChild[1]</td>
+ <td>my-menu-bar-menuitem-caption</td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VMenuBar[0]#item0</td>
+ <td>24,9</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::Root/VOverlay[0]/</td>
+ <td>my-menu-bar-popup</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::Root/VOverlay[0]/VMenuBar[0]</td>
+ <td>my-menu-bar-submenu</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::Root/VOverlay[0]/VMenuBar[0]/domChild[0]</td>
+ <td>my-menu-bar-menuitem</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::Root/VOverlay[0]/VMenuBar[0]/domChild[0]/domChild[0]</td>
+ <td>my-menu-bar-menuitem-caption</td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VMenuBar[0]#item0</td>
+ <td>24,9</td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VMenuBar[0]#item1</td>
+ <td>44,6</td>
+</tr>
+<tr>
+ <td>pressSpecialKey</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VMenuBar[0]</td>
+ <td>down</td>
+</tr>
+<tr>
+ <td>pressSpecialKey</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VMenuBar[0]</td>
+ <td>right</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::Root/VOverlay[1]</td>
+ <td>my-menu-bar-popup</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::Root/VOverlay[1]/VMenuBar[0]</td>
+ <td>my-menu-bar-submenu</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::Root/VOverlay[1]/VMenuBar[0]/domChild[0]</td>
+ <td>my-menu-bar-menuitem</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::Root/VOverlay[1]/VMenuBar[0]/domChild[0]/domChild[0]</td>
+ <td>my-menu-bar-menuitem-caption</td>
+</tr>
+<tr>
+ <td>pressSpecialKey</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VMenuBar[0]#item0</td>
+ <td>[tab]</td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VButton[0]/domChild[0]/domChild[0]</td>
+ <td></td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VMenuBar[0]</td>
+ <td>my-other-menu</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VMenuBar[0]/domChild[0]</td>
+ <td>my-other-menu-menuitem</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VMenuBar[0]/domChild[1]</td>
+ <td>my-other-menu-menuitem</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VMenuBar[0]/domChild[1]/domChild[0]</td>
+ <td>my-other-menu-submenu-indicator</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VMenuBar[0]/domChild[1]/domChild[1]</td>
+ <td>my-other-menu-menuitem-caption</td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VMenuBar[0]#item0</td>
+ <td>24,9</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::Root/VOverlay[0]/</td>
+ <td>my-other-menu-popup</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::Root/VOverlay[0]/VMenuBar[0]</td>
+ <td>my-other-menu-submenu</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::Root/VOverlay[0]/VMenuBar[0]/domChild[0]</td>
+ <td>my-other-menu-menuitem</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::Root/VOverlay[0]/VMenuBar[0]/domChild[0]/domChild[0]</td>
+ <td>my-other-menu-menuitem-caption</td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VMenuBar[0]#item0</td>
+ <td>24,9</td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VMenuBar[0]#item1</td>
+ <td>44,6</td>
+</tr>
+<tr>
+ <td>pressSpecialKey</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VMenuBar[0]</td>
+ <td>down</td>
+</tr>
+<tr>
+ <td>pressSpecialKey</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VMenuBar[0]</td>
+ <td>right</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::Root/VOverlay[1]</td>
+ <td>my-other-menu-popup</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::Root/VOverlay[1]/VMenuBar[0]</td>
+ <td>my-other-menu-submenu</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::Root/VOverlay[1]/VMenuBar[0]/domChild[0]</td>
+ <td>my-other-menu-menuitem</td>
+</tr>
+<tr>
+ <td>assertCSSClass</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::Root/VOverlay[1]/VMenuBar[0]/domChild[0]/domChild[0]</td>
+ <td>my-other-menu-menuitem-caption</td>
+</tr>
+<tr>
+ <td>pressSpecialKey</td>
+ <td>vaadin=runcomvaadintestscomponentsmenubarMenuBarPrimaryStylenames::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[0]/VMenuBar[0]#item0</td>
+ <td>[tab]</td>
+</tr>
+
+</tbody></table>
+</body>
+</html>
diff --git a/uitest/src/com/vaadin/tests/components/menubar/MenuBarPrimaryStylenames.java b/uitest/src/com/vaadin/tests/components/menubar/MenuBarPrimaryStylenames.java
new file mode 100644
index 0000000000..79bec2e65e
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/menubar/MenuBarPrimaryStylenames.java
@@ -0,0 +1,48 @@
+package com.vaadin.tests.components.menubar;
+
+import com.vaadin.tests.components.TestBase;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.MenuBar;
+import com.vaadin.ui.MenuBar.MenuItem;
+
+public class MenuBarPrimaryStylenames extends TestBase {
+
+ @Override
+ protected void setup() {
+ final MenuBar mainMenu = new MenuBar();
+ mainMenu.setPrimaryStyleName("my-menu-bar");
+
+ MenuItem submenu1 = mainMenu.addItem("Submenu1", null);
+ MenuItem item1 = submenu1.addItem("Item1", null);
+ item1.setCheckable(true);
+ item1.setStyleName("my-menu-item");
+ submenu1.addItem("Item2", null);
+
+ MenuItem submenu2 = mainMenu.addItem("Submenu2", null);
+ MenuItem menu1 = submenu2.addItem("Menu1", null);
+ menu1.addItem("Item11", null);
+
+ addComponent(mainMenu);
+
+ addComponent(new Button("Change primary stylename",
+ new Button.ClickListener() {
+ @Override
+ public void buttonClick(ClickEvent event) {
+ mainMenu.setPrimaryStyleName("my-other-menu");
+ }
+ }));
+
+ }
+
+ @Override
+ protected String getDescription() {
+ return "Menubar should support primary stylenames both initially and dynamically";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 9908;
+ }
+
+}