r3413 committed - menu: experiemental nested menu code
Revision: 3413
Author: joern.zaefferer
Date: Sat Nov 7 02:04:59 2009
Log: menu: experiemental nested menu code
http://code.google.com/p/jquery-ui/source/detail?r=3413
Added:
/branches/dev/tests/visual/menu/nested.html
=======================================
--- /dev/null
+++ /branches/dev/tests/visual/menu/nested.html Sat Nov 7 02:04:59 2009
@@ -0,0 +1,165 @@
+<!doctype html>
+<html>
+<head>
+ <title>Menu Visual Test: Default</title>
+ <link rel="stylesheet" href="../static.css" type="text/css" />
+ <link rel="stylesheet" href="../../../themes/base/ui.base.css"
type="text/css" />
+ <link rel="stylesheet" href="../../../themes/base/ui.theme.css"
type="text/css" title="ui-theme" />
+ <script type="text/javascript" src="../../../jquery-1.3.2.js"></script>
+ <script type="text/javascript"
src="../../../ui/jquery.ui.core.js"></script>
+ <script type="text/javascript"
src="../../../ui/jquery.ui.menu.js"></script>
+ <script type="text/javascript"
src="../../../ui/jquery.ui.position.js"></script>
+ <script type="text/javascript"
src="http://jqueryui.com/themeroller/themeswitchertool/"></script>
+ <script type="text/javascript">
+ $(function() {
+ $.fn.themeswitcher && $('<div/>').css({
+ position: "absolute",
+ right: 10,
+ top: 10
+ }).appendTo(document.body).themeswitcher();
+
+
+ var restore;
+ var menu = $("#menu").menu({
+ selected: function(event, ui) {
+ $("#log").append("<div>Selected " + ui.item.text() + "</div>");
+ },
+ focus: function(event, ui) {
+ var nested = $("ul", ui.item);
+ if (restore) {
+ restore.child.appendTo(restore.parent).hide();
+ restore = null;
+ }
+ if (nested.length) {
+ nested.menu().appendTo(document.body).show().position({
+ my: "left top",
+ at: "right top",
+ of: ui.item
+ });
+ restore = {
+ child: nested,
+ parent: ui.item
+ }
+ }
+ }
+ }).hide();
+ menu.find("ul").hide();
+
+
+ $("button").click(function(event) {
+ // TODO required to prevent the click handler below from handling this
event
+ event.stopPropagation();
+ $("#menu").menu("deactivate").show().position({
+ my: "left top",
+ at: "right top",
+ of: event.pageX > 0 ? event : this
+ });
+ $().one("click", function() {
+ menu.hide();
+ if (restore) {
+ restore.child.appendTo(restore.parent).hide();
+ restore = null;
+ }
+ })
+ }).keydown(function(event) {
+ var menu = $("#menu" + this.id).data("menu");
+ if (menu.widget().is(":hidden"))
+ return;
+ event.stopPropagation();
+ switch (event.keyCode) {
+ case $.ui.keyCode.PAGE_UP:
+ menu.previousPage();
+ break;
+ case $.ui.keyCode.PAGE_DOWN:
+ menu.nextPage();
+ break;
+ case $.ui.keyCode.UP:
+ menu.previous();
+ break;
+ case $.ui.keyCode.DOWN:
+ menu.next();
+ event.preventDefault();
+ break;
+ case $.ui.keyCode.ENTER:
+ case $.ui.keyCode.TAB:
+ menu.select();
+ menu.widget().hide();
+ event.preventDefault();
+ break;
+ case $.ui.keyCode.ESCAPE:
+ menu.widget().hide();
+ break;
+ default:
+ clearTimeout(menu.filterTimer);
+ var prev = menu.previousFilter || "";
+ var character = String.fromCharCode(event.keyCode);
+ var skip = false;
+ if (character == prev) {
+ skip = true;
+ } else {
+ character = prev + character;
+ }
+
+ var match = menu.widget().children("li").filter(function() {
+ return new RegExp("^" + character, "i").test($("a", this).text());
+ });
+ var match = skip && match.index(menu.active.next()) != -1 ?
match.next() : match;
+ if (!match.length) {
+ character = String.fromCharCode(event.keyCode);
+ match = menu.widget().children("li").filter(function() {
+ return new RegExp("^" + character, "i").test($(this).text());
+ });
+ }
+ if (match.length) {
+ menu.activate(match);
+ if (match.length > 1) {
+ menu.previousFilter = character;
+ menu.filterTimer = setTimeout(function() {
+ delete menu.previousFilter;
+ }, 1000);
+ } else {
+ delete menu.previousFilter;
+ }
+ } else {
+ delete menu.previousFilter;
+ }
+ }
+ });
+ });
+ </script>
+ <style>
+ body { font-size:62.5%; }
+ .ui-menu { width: 200px; position: absolute; }
+ </style>
+</head>
+<body>
+
+<button>Show context menu</button>
+
+<ul id="menu">
+ <li>
+ <a href="#">Amsterdam</a>
+ <ul>
+ <li><a href="#">Aberdeen</a></li>
+ <li><a href="#">Ada</a></li>
+ <li><a href="#">Adamsville</a></li>
+ <li><a href="#">Addyston</a></li>
+ <li><a href="#">Amesville</a></li>
+ </ul>
+ </li>
+ <li><a href="#">Anaheim</a></li>
+ <li><a href="#">Cologne</a></li>
+ <li><a href="#">Frankfurt</a></li>
+ <li><a href="#">Magdeburg</a></li>
+ <li><a href="#">Munich</a></li>
+ <li><a href="#">Utrecht</a></li>
+ <li><a href="#">Zurich</a></li>
+</ul>
+
+<div class="ui-widget" style="margin-top:2em; font-family:Arial">
+ Log:
+ <div id="log" style="height: 400px; width: 300px; overflow: auto;"
class="ui-widget-content"></div>
+</div>
+
+</body>
+</html>