r3413 committed - menu: experiemental nested menu code

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>