package com.vaadin.tests.components.menubar;
import java.util.Date;
import java.util.LinkedHashMap;
import com.vaadin.server.Resource;
import com.vaadin.server.ThemeResource;
import com.vaadin.tests.components.AbstractComponentTest;
import com.vaadin.ui.MenuBar;
import com.vaadin.ui.MenuBar.MenuItem;
public class MenuBarTest extends AbstractComponentTest<MenuBar> {
private static final String CATEGORY_MENU_ITEMS = "Menu items";
private static final String CATEGORY_MENU_ITEM_STATES = "Menu item states";
private int rootItems = -1;
private int subItems = -1;
private int subLevels = -1;
private int subMenuDensity = -1;
private Integer subMenuSeparatorDensity = null;
private Boolean openRootMenuOnHover = false;
private int iconInterval = -1;
private Integer iconSize;
private Integer disabledDensity;
private Integer invisibleDensity;
private Integer checkableDensity;
@Override
protected Class<MenuBar> getTestClass() {
return MenuBar.class;
}
@Override
protected void createActions() {
super.createActions();
createRootMenuItemSelect(CATEGORY_MENU_ITEMS);
createSubMenuItemSelect(CATEGORY_MENU_ITEMS);
createSubMenuLevelsSelect(CATEGORY_MENU_ITEMS);
createSubMenuDensitySelect(CATEGORY_MENU_ITEMS);
createSubMenuSeparatorDensitySelect(CATEGORY_MENU_ITEMS);
createBooleanAction("OpenRootMenuOnHover", CATEGORY_FEATURES,
openRootMenuOnHover, setOpenRootOnHover);
createMenuItemIconIntervalSelect(CATEGORY_MENU_ITEM_STATES);
createMenuIconsSizeSelect(CATEGORY_MENU_ITEM_STATES);
createMenuItemDisabledDensitySelect(CATEGORY_MENU_ITEM_STATES);
createMenuItemInvisibleDensitySelect(CATEGORY_MENU_ITEM_STATES);
createMenuItemCheckableDensitySelect(CATEGORY_MENU_ITEM_STATES);
}
private void createRootMenuItemSelect(String category) {
createSelectAction("Root menu items", category,
createIntegerOptions(100), "10", createRootMenuItems);
}
private void createSubMenuItemSelect(String category) {
createSelectAction("Sub menu items", category,
createIntegerOptions(100), "10", createSubMenuItems);
}
private void createSubMenuLevelsSelect(String category) {
createSelectAction("Sub menu levels", category,
createIntegerOptions(100), "2", setSubMenuLevels);
}
private void createMenuIconsSizeSelect(String category) {
LinkedHashMap<String, Integer> options = new LinkedHashMap<>();
options.put("16x16", 16);
options.put("32x32", 32);
options.put("64x64", 64);
createSelectAction("Icon size", category, options, "16x16", selectIcon);
}
private void createMenuItemIconIntervalSelect(String category) {
LinkedHashMap<String, Integer> options = new LinkedHashMap<>();
options.put("None", 0);
options.put("All", 1);
options.put("Every second", 2);
options.put("Every third", 3);
createSelectAction("Icons", category, options, "None", setMenuIcons);
}
private void createSubMenuDensitySelect(String category) {
LinkedHashMap<String, Integer> options = new LinkedHashMap<>();
options.put("All", 1);
options.put("Every second", 2);
options.put("Every third", 3);
createSelectAction("Sub sub menus", category, options, "Every third",
setSubMenuDensity);
}
private void createSubMenuSeparatorDensitySelect(String category) {
LinkedHashMap<String, Integer> options = new LinkedHashMap<>();
options.put("No separators", null);
options.put("Between all", 1);
options.put("Between every second", 2);
options.put("Between every third", 3);
createSelectAction("Sub menu separators", category, options,
"No separators", setSubMenuSeparatorDensity);
}
private void createMenuItemDisabledDensitySelect(String category) {
LinkedHashMap<String, Integer> options = new LinkedHashMap<>();
options.put("All enabled", null);
options.put("All disabled", 1);
options.put("Every second", 2);
options.put("Every third", 3);
createSelectAction("Enabled", category, options, "All enabled",
setMenuItemDisabledDensity);
}
private void createMenuItemInvisibleDensitySelect(String category) {
LinkedHashMap<String, Integer> options = new LinkedHashMap<>();
options.put("All visible", null);
options.put("All invisible", 1);
options.put("Every second", 2);
options.put("Every third", 3);
createSelectAction("Visible", category, options, "All visible",
setMenuItemInvisibleDensity);
}
private void createMenuItemCheckableDensitySelect(String category) {
LinkedHashMap<String, Integer> options = new LinkedHashMap<>();
options.put("No items checkable", null);
options.put("All checkable", 1);
options.put("Every second", 2);
options.put("Every third", 3);
createSelectAction("Checkable", category, options, "No items checkable",
setMenuItemCheckableDensity);
}
/* COMMANDS */
Command<MenuBar, Integer> createRootMenuItems = new Command<MenuBar, Integer>() {
@Override
public void execute(MenuBar c, Integer value, Object data) {
rootItems = value;
createRootItems(c);
}
};
Command<MenuBar, Integer> createSubMenuItems = new Command<MenuBar, Integer>() {
@Override
public void execute(MenuBar c, Integer value, Object data) {
subItems = value;
createSubItems(c);
}
};
Command<MenuBar, Integer> setSubMenuLevels = new Command<MenuBar, Integer>() {
@Override
public void execute(MenuBar c, Integer value, Object data) {
subLevels = value;
createSubItems(c);
}
};
private Command<MenuBar, Integer> setMenuIcons = new Command<MenuBar, Integer>() {
@Override
public void execute(MenuBar c, Integer value, Object data) {
iconInterval = value;
updateIcons(c);
}
};
private Command<MenuBar, Integer> setSubMenuDensity = new Command<MenuBar, Integer>() {
@Override
public void execute(MenuBar c, Integer value, Object data) {
subMenuDensity = value;
createSubItems(c);
}
};
private Command<MenuBar, Integer> setMenuItemDisabledDensity = new Command<MenuBar, Integer>() {
@Override
public void execute(MenuBar c, Integer value, Object data) {
disabledDensity = value;
createRootItems(c);
}
};
private Command<MenuBar, Integer> setMenuItemInvisibleDensity = new Command<MenuBar, Integer>() {
@Override
public void execute(MenuBar c, Integer value, Object data) {
invisibleDensity = value;
createRootItems(c);
}
};
private Command<MenuBar, Integer> setMenuItemCheckableDensity = new Command<MenuBar, Integer>() {
@Override
public void execute(MenuBar c, Integer value, Object data) {
checkableDensity = value;
createRootItems(c);
}
};
private Command<MenuBar, Integer> setSubMenuSeparatorDensity = new Command<MenuBar, Integer>() {
@Override
public void execute(MenuBar c, Integer value, Object data) {
subMenuSeparatorDensity = value;
createSubItems(c);
}
};
private Command<MenuBar, Boolean> setOpenRootOnHover = new Command<MenuBar, Boolean>() {
@Override
public void execute(MenuBar c, Boolean value, Object data) {
openRootMenuOnHover = value;
c.setAutoOpen(value);
}
};
private Command<MenuBar, Integer> selectIcon = new Command<MenuBar, Integer>() {
@Override
public void execute(MenuBar c, Integer value, Object data) {
iconSize = value;
updateIcons(c);
}
};
/* End of commands */
private MenuBar.Command menuCommand = new MenuBar.Command() {
@Override
public void menuSelected(MenuItem selectedItem) {
log("Menu item '" + selectedItem.getText() + "' selected");
}
};
protected void createSubItems(MenuBar c) {
for (MenuItem rootItem : c.getItems()) {
createSubItems(rootItem, 1);
}
updateIcons(c);
}
private void createSubItems(MenuItem parent, int level) {
if (level > subLevels) {
return;
}
parent.removeChildren();
for (int i = 0; i < subItems; i++) {
if (subMenuSeparatorDensity != null && i > 0
&& i % subMenuSeparatorDensity == 0) {
parent.addSeparator();
}
MenuItem subMenuItem = parent.addItem(
"Sub menu " + parent.getId() + "/" + (i + 1), menuCommand);
if (disabledDensity != null && i % disabledDensity == 0) {
subMenuItem.setEnabled(false);
}
if (invisibleDensity != null && i % invisibleDensity == 0) {
subMenuItem.setVisible(false);
}
if (i % subMenuDensity == 0 && level < subLevels) {
subMenuItem.setCommand(null);
createSubItems(subMenuItem, level + 1);
}
if (!subMenuItem.hasChildren() && level > 0
&& checkableDensity != null && i % checkableDensity == 0) {
subMenuItem.setCheckable(true);
}
}
}
protected void updateIcons(MenuBar c) {
int idx = 0;
for (MenuItem rootItem : c.getItems()) {
updateIcons(rootItem, idx++);
}
}
private void updateIcons(MenuItem item, int idx) {
if (iconInterval > 0 && idx % iconInterval == 0) {
item.setIcon(getMenuIcon());
} else {
item.setIcon(null);
}
if (item.getChildren() != null) {
int i = 0;
for (MenuItem child : item.getChildren()) {
updateIcons(child, i++);
}
}
}
private long iconCacheIndex = new Date().getTime();
private Resource getMenuIcon() {
String resourceID = null;
if (iconSize == 16) {
resourceID = "../runo/icons/16/user.png";
} else if (iconSize == 32) {
resourceID = "../runo/icons/32/user.png";
} else if (iconSize == 64) {
resourceID = "../runo/icons/64/user.png";
}
if (resourceID != null) {
return new ThemeResource(resourceID + "?" + iconCacheIndex++);
}
return null;
}
protected void createRootItems(MenuBar c) {
// Remove all existing items
c.removeItems();
for (int i = 0; i < rootItems; i++) {
MenuItem rootItem = c.addItem("Root menu " + (i + 1), null);
if (disabledDensity != null && i % disabledDensity == 0) {
rootItem.setEnabled(false);
}
if (invisibleDensity != null && i % invisibleDensity == 0) {
rootItem.setVisible(false);
}
}
createSubItems(c);
}
}